From 63d24ebbd264232c7024b3ca26cef58735b669b2 Mon Sep 17 00:00:00 2001 From: RedHawk989 Date: Sat, 31 May 2025 01:42:54 +0000 Subject: [PATCH] docs: fix led typo in full build --- 404.html | 4 +-- about.html | 10 +++--- archive/fox_ir_v2_build_instructions.html | 12 +++---- ...ut.md.055b7111.js => about.md.ce94d681.js} | 2 +- ...7111.lean.js => about.md.ce94d681.lean.js} | 2 +- assets/{app.b05231e0.js => app.d6426166.js} | 2 +- ...x_ir_v2_build_instructions.md.536f1af3.js} | 2 +- ...v2_build_instructions.md.536f1af3.lean.js} | 2 +- .../chunks/@localSearchIndexroot.01187451.js | 1 + .../chunks/@localSearchIndexroot.42785e48.js | 1 - ...dion.aff4964d.js => Accordion.44247159.js} | 2 +- ...t.80273cd9.js => CheckBoxList.1747249a.js} | 2 +- ...List.b49df916.js => PartsList.a520a26d.js} | 2 +- assets/chunks/VPLocalSearchBox.5befaea8.js | 8 ----- assets/chunks/VPLocalSearchBox.8e2f6eb7.js | 8 +++++ assets/chunks/framework.47aa8d5b.js | 34 ------------------- assets/chunks/framework.ece1a6f0.js | 34 +++++++++++++++++++ .../{index.c1fed1bd.js => index.41b0dfea.js} | 2 +- .../{index.339f98d7.js => index.c19b2931.js} | 2 +- .../{theme.cd06fb64.js => theme.d6d6d431.js} | 2 +- ....md.034a53d4.js => contact.md.11afb62a.js} | 2 +- ...d4.lean.js => contact.md.11afb62a.lean.js} | 2 +- ...2f96c918.js => dev_roadmap.md.881dcb79.js} | 2 +- ...ean.js => dev_roadmap.md.881dcb79.lean.js} | 2 +- ... development_docs_dev_docs.md.a6e54c81.js} | 2 +- ...lopment_docs_dev_docs.md.a6e54c81.lean.js} | 2 +- ... => development_docs_pages.md.d059df93.js} | 2 +- ...evelopment_docs_pages.md.d059df93.lean.js} | 2 +- ...development_docs_standards.md.84a36195.js} | 2 +- ...opment_docs_standards.md.84a36195.lean.js} | 2 +- ...e_guide_configure_firmware.md.7944a4ab.js} | 2 +- ...de_configure_firmware.md.7944a4ab.lean.js} | 2 +- ...irmware_guide_environments.md.4cf0bd9b.js} | 2 +- ...re_guide_environments.md.4cf0bd9b.lean.js} | 2 +- ...=> firmware_guide_firmware.md.300bf02a.js} | 2 +- ...rmware_guide_firmware.md.300bf02a.lean.js} | 2 +- ...rmware_guide_flashing_tool.md.e2b12f74.js} | 2 +- ...e_guide_flashing_tool.md.e2b12f74.lean.js} | 2 +- ....js => firmware_guide_mdns.md.046e48da.js} | 2 +- ...> firmware_guide_mdns.md.046e48da.lean.js} | 2 +- ...=> firmware_guide_rest_api.md.302dda8a.js} | 2 +- ...rmware_guide_rest_api.md.302dda8a.lean.js} | 2 +- ...irmware_guide_setup_vscode.md.b24c20ae.js} | 2 +- ...re_guide_setup_vscode.md.b24c20ae.lean.js} | 2 +- ...re_guide_update_platformio.md.02ea0fb7.js} | 2 +- ...ide_update_platformio.md.02ea0fb7.lean.js} | 2 +- ...upload_and_update_firmware.md.c675cc09.js} | 2 +- ...d_and_update_firmware.md.c675cc09.lean.js} | 2 +- ...s => getting_started_intro.md.1f5b1337.js} | 2 +- ...getting_started_intro.md.1f5b1337.lean.js} | 2 +- ...getting_started_led_safety.md.910fc2df.js} | 2 +- ...ng_started_led_safety.md.910fc2df.lean.js} | 2 +- ...ing_started_things_to_know.md.99db9ad8.js} | 2 +- ...tarted_things_to_know.md.99db9ad8.lean.js} | 2 +- ...headset_guides_valve_index.md.2a84f8ad.js} | 2 +- ...et_guides_valve_index.md.2a84f8ad.lean.js} | 2 +- ...eadset_guides_what_is_this.md.7430c224.js} | 2 +- ...t_guides_what_is_this.md.7430c224.lean.js} | 2 +- ...to_build_3d_printed_mounts.md.26a27ef1.js} | 2 +- ...ild_3d_printed_mounts.md.26a27ef1.lean.js} | 2 +- ...ld_creating_your_own_mount.md.5b60d788.js} | 2 +- ...eating_your_own_mount.md.5b60d788.lean.js} | 2 +- ...=> how_to_build_full_build.md.6f33011b.js} | 2 +- ...w_to_build_full_build.md.6f33011b.lean.js} | 2 +- ... => how_to_build_led_setup.md.5f02b3d6.js} | 2 +- ...ow_to_build_led_setup.md.5f02b3d6.lean.js} | 2 +- ... => how_to_build_part_list.md.69b5aa87.js} | 2 +- ...ow_to_build_part_list.md.69b5aa87.lean.js} | 2 +- ...=> how_to_build_parts_list.md.075e6e8f.js} | 2 +- ...w_to_build_parts_list.md.075e6e8f.lean.js} | 2 +- ...to_build_preparing_cameras.md.e4e61b6c.js} | 2 +- ...ild_preparing_cameras.md.e4e61b6c.lean.js} | 2 +- ...ow_to_build_preparing_xiao.md.840809cc.js} | 2 +- ..._build_preparing_xiao.md.840809cc.lean.js} | 2 +- ...how_to_build_v4_full_build.md.f873c9bf.js} | 6 ++-- ...o_build_v4_full_build.md.f873c9bf.lean.js} | 6 ++-- ...ex.md.269511a8.js => index.md.780db674.js} | 2 +- ...11a8.lean.js => index.md.780db674.lean.js} | 2 +- ...md.a2c23752.js => misc_faq.md.1b8caa13.js} | 2 +- ...2.lean.js => misc_faq.md.1b8caa13.lean.js} | 2 +- ...5e8875c4.js => misc_jlc3dp.md.aa8f0fcf.js} | 2 +- ...ean.js => misc_jlc3dp.md.aa8f0fcf.lean.js} | 2 +- ...s => misc_vrc_avatar_setup.md.b22f00a0.js} | 2 +- ...misc_vrc_avatar_setup.md.b22f00a0.lean.js} | 2 +- ...uide_VRCFT_tracking_module.md.b34c3266.js} | 2 +- ...VRCFT_tracking_module.md.b34c3266.lean.js} | 2 +- ...tware_guide_build_software.md.aa1553be.js} | 2 +- ..._guide_build_software.md.aa1553be.lean.js} | 2 +- ...guide_eyetrackvr_app_guide.md.832069a1.js} | 2 +- ..._eyetrackvr_app_guide.md.832069a1.lean.js} | 2 +- ...> software_guide_osc_setup.md.9f8815ef.js} | 2 +- ...tware_guide_osc_setup.md.9f8815ef.lean.js} | 2 +- contact.html | 10 +++--- dev_roadmap.html | 12 +++---- development/docs/dev_docs.html | 10 +++--- development/docs/pages.html | 10 +++--- development/docs/standards.html | 10 +++--- firmware_guide/configure_firmware.html | 14 ++++---- firmware_guide/environments.html | 12 +++---- firmware_guide/firmware.html | 10 +++--- firmware_guide/flashing_tool.html | 12 +++---- firmware_guide/mdns.html | 10 +++--- firmware_guide/rest_api.html | 10 +++--- firmware_guide/setup_vscode.html | 12 +++---- firmware_guide/update_platformio.html | 12 +++---- .../upload_and_update_firmware.html | 14 ++++---- getting_started/intro.html | 14 ++++---- getting_started/led_safety.html | 10 +++--- getting_started/things_to_know.html | 10 +++--- hashmap.json | 2 +- headset_guides/valve_index.html | 10 +++--- headset_guides/what_is_this.html | 10 +++--- how_to_build/3d_printed_mounts.html | 16 ++++----- how_to_build/creating_your_own_mount.html | 10 +++--- how_to_build/full_build.html | 16 ++++----- how_to_build/led_setup.html | 10 +++--- how_to_build/part_list.html | 10 +++--- how_to_build/parts_list.html | 16 ++++----- how_to_build/preparing_cameras.html | 12 +++---- how_to_build/preparing_xiao.html | 12 +++---- how_to_build/v4_full_build.html | 16 ++++----- index.html | 10 +++--- misc/faq.html | 12 +++---- misc/jlc3dp.html | 10 +++--- misc/vrc_avatar_setup.html | 12 +++---- software_guide/VRCFT_tracking_module.html | 12 +++---- software_guide/build_software.html | 14 ++++---- software_guide/eyetrackvr_app_guide.html | 14 ++++---- software_guide/osc_setup.html | 14 ++++---- 129 files changed, 358 insertions(+), 358 deletions(-) rename assets/{about.md.055b7111.js => about.md.ce94d681.js} (96%) rename assets/{about.md.055b7111.lean.js => about.md.ce94d681.lean.js} (96%) rename assets/{app.b05231e0.js => app.d6426166.js} (91%) rename assets/{archive_fox_ir_v2_build_instructions.md.ebf3c880.lean.js => archive_fox_ir_v2_build_instructions.md.536f1af3.js} (97%) rename assets/{archive_fox_ir_v2_build_instructions.md.ebf3c880.js => archive_fox_ir_v2_build_instructions.md.536f1af3.lean.js} (97%) create mode 100644 assets/chunks/@localSearchIndexroot.01187451.js delete mode 100644 assets/chunks/@localSearchIndexroot.42785e48.js rename assets/chunks/{Accordion.aff4964d.js => Accordion.44247159.js} (93%) rename assets/chunks/{CheckBoxList.80273cd9.js => CheckBoxList.1747249a.js} (92%) rename assets/chunks/{PartsList.b49df916.js => PartsList.a520a26d.js} (97%) delete mode 100644 assets/chunks/VPLocalSearchBox.5befaea8.js create mode 100644 assets/chunks/VPLocalSearchBox.8e2f6eb7.js delete mode 100644 assets/chunks/framework.47aa8d5b.js create mode 100644 assets/chunks/framework.ece1a6f0.js rename assets/chunks/{index.c1fed1bd.js => index.41b0dfea.js} (99%) rename assets/chunks/{index.339f98d7.js => index.c19b2931.js} (97%) rename assets/chunks/{theme.cd06fb64.js => theme.d6d6d431.js} (97%) rename assets/{contact.md.034a53d4.js => contact.md.11afb62a.js} (85%) rename assets/{contact.md.034a53d4.lean.js => contact.md.11afb62a.lean.js} (85%) rename assets/{dev_roadmap.md.2f96c918.js => dev_roadmap.md.881dcb79.js} (92%) rename assets/{dev_roadmap.md.2f96c918.lean.js => dev_roadmap.md.881dcb79.lean.js} (92%) rename assets/{development_docs_dev_docs.md.b7b0d76e.js => development_docs_dev_docs.md.a6e54c81.js} (97%) rename assets/{development_docs_dev_docs.md.b7b0d76e.lean.js => development_docs_dev_docs.md.a6e54c81.lean.js} (97%) rename assets/{development_docs_pages.md.85e22694.js => development_docs_pages.md.d059df93.js} (98%) rename assets/{development_docs_pages.md.85e22694.lean.js => development_docs_pages.md.d059df93.lean.js} (98%) rename assets/{development_docs_standards.md.f9558435.lean.js => development_docs_standards.md.84a36195.js} (98%) rename assets/{development_docs_standards.md.f9558435.js => development_docs_standards.md.84a36195.lean.js} (98%) rename assets/{firmware_guide_configure_firmware.md.4eb536cf.js => firmware_guide_configure_firmware.md.7944a4ab.js} (97%) rename assets/{firmware_guide_configure_firmware.md.4eb536cf.lean.js => firmware_guide_configure_firmware.md.7944a4ab.lean.js} (97%) rename assets/{firmware_guide_environments.md.6b0604e7.js => firmware_guide_environments.md.4cf0bd9b.js} (97%) rename assets/{firmware_guide_environments.md.6b0604e7.lean.js => firmware_guide_environments.md.4cf0bd9b.lean.js} (97%) rename assets/{firmware_guide_firmware.md.6c8e1ae6.js => firmware_guide_firmware.md.300bf02a.js} (94%) rename assets/{firmware_guide_firmware.md.6c8e1ae6.lean.js => firmware_guide_firmware.md.300bf02a.lean.js} (94%) rename assets/{firmware_guide_flashing_tool.md.c180a2ca.js => firmware_guide_flashing_tool.md.e2b12f74.js} (98%) rename assets/{firmware_guide_flashing_tool.md.c180a2ca.lean.js => firmware_guide_flashing_tool.md.e2b12f74.lean.js} (98%) rename assets/{firmware_guide_mdns.md.8a95e855.js => firmware_guide_mdns.md.046e48da.js} (98%) rename assets/{firmware_guide_mdns.md.8a95e855.lean.js => firmware_guide_mdns.md.046e48da.lean.js} (98%) rename assets/{firmware_guide_rest_api.md.8a0ea54a.js => firmware_guide_rest_api.md.302dda8a.js} (99%) rename assets/{firmware_guide_rest_api.md.8a0ea54a.lean.js => firmware_guide_rest_api.md.302dda8a.lean.js} (99%) rename assets/{firmware_guide_setup_vscode.md.fefbbc55.js => firmware_guide_setup_vscode.md.b24c20ae.js} (97%) rename assets/{firmware_guide_setup_vscode.md.fefbbc55.lean.js => firmware_guide_setup_vscode.md.b24c20ae.lean.js} (97%) rename assets/{firmware_guide_update_platformio.md.d52a99e0.js => firmware_guide_update_platformio.md.02ea0fb7.js} (97%) rename assets/{firmware_guide_update_platformio.md.d52a99e0.lean.js => firmware_guide_update_platformio.md.02ea0fb7.lean.js} (97%) rename assets/{firmware_guide_upload_and_update_firmware.md.0806ea0f.lean.js => firmware_guide_upload_and_update_firmware.md.c675cc09.js} (98%) rename assets/{firmware_guide_upload_and_update_firmware.md.0806ea0f.js => firmware_guide_upload_and_update_firmware.md.c675cc09.lean.js} (98%) rename assets/{getting_started_intro.md.d6d8f855.js => getting_started_intro.md.1f5b1337.js} (95%) rename assets/{getting_started_intro.md.d6d8f855.lean.js => getting_started_intro.md.1f5b1337.lean.js} (95%) rename assets/{getting_started_led_safety.md.78277ff3.js => getting_started_led_safety.md.910fc2df.js} (99%) rename assets/{getting_started_led_safety.md.78277ff3.lean.js => getting_started_led_safety.md.910fc2df.lean.js} (99%) rename assets/{getting_started_things_to_know.md.4cd89e47.js => getting_started_things_to_know.md.99db9ad8.js} (96%) rename assets/{getting_started_things_to_know.md.4cd89e47.lean.js => getting_started_things_to_know.md.99db9ad8.lean.js} (96%) rename assets/{headset_guides_valve_index.md.891da17f.js => headset_guides_valve_index.md.2a84f8ad.js} (98%) rename assets/{headset_guides_valve_index.md.891da17f.lean.js => headset_guides_valve_index.md.2a84f8ad.lean.js} (98%) rename assets/{headset_guides_what_is_this.md.60052a7d.js => headset_guides_what_is_this.md.7430c224.js} (97%) rename assets/{headset_guides_what_is_this.md.60052a7d.lean.js => headset_guides_what_is_this.md.7430c224.lean.js} (97%) rename assets/{how_to_build_3d_printed_mounts.md.5d2aa5cb.js => how_to_build_3d_printed_mounts.md.26a27ef1.js} (86%) rename assets/{how_to_build_3d_printed_mounts.md.5d2aa5cb.lean.js => how_to_build_3d_printed_mounts.md.26a27ef1.lean.js} (86%) rename assets/{how_to_build_creating_your_own_mount.md.70ac1088.js => how_to_build_creating_your_own_mount.md.5b60d788.js} (97%) rename assets/{how_to_build_creating_your_own_mount.md.70ac1088.lean.js => how_to_build_creating_your_own_mount.md.5b60d788.lean.js} (97%) rename assets/{how_to_build_full_build.md.f324b1f6.js => how_to_build_full_build.md.6f33011b.js} (98%) rename assets/{how_to_build_full_build.md.f324b1f6.lean.js => how_to_build_full_build.md.6f33011b.lean.js} (98%) rename assets/{how_to_build_led_setup.md.6d99addb.js => how_to_build_led_setup.md.5f02b3d6.js} (97%) rename assets/{how_to_build_led_setup.md.6d99addb.lean.js => how_to_build_led_setup.md.5f02b3d6.lean.js} (97%) rename assets/{how_to_build_part_list.md.3640f4dd.js => how_to_build_part_list.md.69b5aa87.js} (99%) rename assets/{how_to_build_part_list.md.3640f4dd.lean.js => how_to_build_part_list.md.69b5aa87.lean.js} (99%) rename assets/{how_to_build_parts_list.md.d57cd54a.js => how_to_build_parts_list.md.075e6e8f.js} (98%) rename assets/{how_to_build_parts_list.md.d57cd54a.lean.js => how_to_build_parts_list.md.075e6e8f.lean.js} (98%) rename assets/{how_to_build_preparing_cameras.md.0a4aab5a.js => how_to_build_preparing_cameras.md.e4e61b6c.js} (98%) rename assets/{how_to_build_preparing_cameras.md.0a4aab5a.lean.js => how_to_build_preparing_cameras.md.e4e61b6c.lean.js} (98%) rename assets/{how_to_build_preparing_xiao.md.fcacda59.js => how_to_build_preparing_xiao.md.840809cc.js} (96%) rename assets/{how_to_build_preparing_xiao.md.fcacda59.lean.js => how_to_build_preparing_xiao.md.840809cc.lean.js} (96%) rename assets/{how_to_build_v4_full_build.md.0dd3c5e7.js => how_to_build_v4_full_build.md.f873c9bf.js} (94%) rename assets/{how_to_build_v4_full_build.md.0dd3c5e7.lean.js => how_to_build_v4_full_build.md.f873c9bf.lean.js} (94%) rename assets/{index.md.269511a8.js => index.md.780db674.js} (96%) rename assets/{index.md.269511a8.lean.js => index.md.780db674.lean.js} (96%) rename assets/{misc_faq.md.a2c23752.js => misc_faq.md.1b8caa13.js} (96%) rename assets/{misc_faq.md.a2c23752.lean.js => misc_faq.md.1b8caa13.lean.js} (96%) rename assets/{misc_jlc3dp.md.5e8875c4.js => misc_jlc3dp.md.aa8f0fcf.js} (95%) rename assets/{misc_jlc3dp.md.5e8875c4.lean.js => misc_jlc3dp.md.aa8f0fcf.lean.js} (95%) rename assets/{misc_vrc_avatar_setup.md.2d1bc492.js => misc_vrc_avatar_setup.md.b22f00a0.js} (94%) rename assets/{misc_vrc_avatar_setup.md.2d1bc492.lean.js => misc_vrc_avatar_setup.md.b22f00a0.lean.js} (94%) rename assets/{software_guide_VRCFT_tracking_module.md.d148b9dc.js => software_guide_VRCFT_tracking_module.md.b34c3266.js} (99%) rename assets/{software_guide_VRCFT_tracking_module.md.d148b9dc.lean.js => software_guide_VRCFT_tracking_module.md.b34c3266.lean.js} (99%) rename assets/{software_guide_build_software.md.b0d1c681.js => software_guide_build_software.md.aa1553be.js} (94%) rename assets/{software_guide_build_software.md.b0d1c681.lean.js => software_guide_build_software.md.aa1553be.lean.js} (94%) rename assets/{software_guide_eyetrackvr_app_guide.md.dce4a9fb.js => software_guide_eyetrackvr_app_guide.md.832069a1.js} (97%) rename assets/{software_guide_eyetrackvr_app_guide.md.dce4a9fb.lean.js => software_guide_eyetrackvr_app_guide.md.832069a1.lean.js} (97%) rename assets/{software_guide_osc_setup.md.af1d1fce.js => software_guide_osc_setup.md.9f8815ef.js} (95%) rename assets/{software_guide_osc_setup.md.af1d1fce.lean.js => software_guide_osc_setup.md.9f8815ef.lean.js} (95%) diff --git a/404.html b/404.html index 00cf761..66b6cf3 100644 --- a/404.html +++ b/404.html @@ -7,7 +7,7 @@ - + @@ -15,7 +15,7 @@
Skip to content

404

PAGE NOT FOUND

But if you don't change your direction, and if you keep looking, you may end up where you are heading.

Released under the MIT License.

- + \ No newline at end of file diff --git a/about.html b/about.html index 6676a0c..79a5974 100644 --- a/about.html +++ b/about.html @@ -7,18 +7,18 @@ - + - - - + + +
Skip to content

Our Team

The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below.

EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality.

Prohurtz

Prohurtz

Creator / Lead Software Developer / Documentor / Hardware Developer

Summer

Summer

Machine Learning Engineer / Data Scientist / App Developer

lorow

lorow

Lead Firmware Developer / App Developer

DaOfficialWizard

DaOfficialWizard

Firmware Developer / Documentation Manager / App Developer

Contributors

Those who have actively contributed to development.
Community Support

Philosophy

The guides on this website include some of our team's own notes (not all of them are polished) that we disclose for other people to use.

Here, we hope you may find something useful to you.

We advocate the Open Source model.

This is why we strive to make our work open to other people for consultation, replication and reuse.

Released under the MIT License.

- + \ No newline at end of file diff --git a/archive/fox_ir_v2_build_instructions.html b/archive/fox_ir_v2_build_instructions.html index 8315ea4..f51036a 100644 --- a/archive/fox_ir_v2_build_instructions.html +++ b/archive/fox_ir_v2_build_instructions.html @@ -7,19 +7,19 @@ - + - - - - + + + +
Skip to content

Fox IR V2 Buil dInstructions

Step 15: Prepare to solder IR LED PCB V2s

Get your magnifying glass out, it's time to solder very smol things.

Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.

'img'

698ohm resistors and V2 PCBs

Here are the PCB pin-out labels:

'img'

V2

LED labels:

'img'

The green markings and notched corners mark the positive sides of the LEDs pictured above.

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 17: Solder resistors on PCB V2

You only need 1 PCB to have a resistor per eye.

'img'

Tin the resistor pads.

'img'

Hold the resistor in place.

'img'

Solder one end.

'img'

Flip to the other side of the resistor and solder it.

'img'

Solder LEDs on PCB V2

'img'

Tin the pads

'img'

Place the resistor on the pads in the correct orientation.

'img'

Solder each side of the resistor. Be careful not to solder at too high of a temp, recommended soldering temp is 230C with a max of 245C.

'img'

The LED is flipped in this Image, the green dot should face AWAY from the PCB.

Wire up the PCBs V2

Basic full wiring diagram of IR PCBs V2.

'drawing'

The PCB that receives the 5V power is the one with the resistor. The second one, which gets its power from the ground pin of the first, does not have a resistor on it and its power input pin is the AR pin (After-Resistor). The 2nd PCBs ground pin goes to the ground of the system, in the diagram it is the ESPs ground pin.

Released under the MIT License.

- + \ No newline at end of file diff --git a/assets/about.md.055b7111.js b/assets/about.md.ce94d681.js similarity index 96% rename from assets/about.md.055b7111.js rename to assets/about.md.ce94d681.js index ddbebbc..8bf9920 100644 --- a/assets/about.md.055b7111.js +++ b/assets/about.md.ce94d681.js @@ -1 +1 @@ -import{V as i,a as r,b as s,c as u}from"./chunks/theme.cd06fb64.js";import{o as m,c as p,E as n,w as o,l,k as t,a}from"./chunks/framework.47aa8d5b.js";const h=[{name:"Prohurtz",avatar:"https://avatars.githubusercontent.com/u/48768484?v=4",title:"Creator / Lead Software Developer / Documentor / Hardware Developer",links:[{icon:"github",link:"https://github.com/RedHawk989"}]},{name:"Summer",avatar:"https://avatars.githubusercontent.com/u/115666235?v=4",title:"Machine Learning Engineer / Data Scientist / App Developer",links:[{icon:"github",link:"https://github.com/Summer404NotFound"}]},{name:"lorow",avatar:"https://avatars.githubusercontent.com/u/14099558?v=4",title:"Lead Firmware Developer / App Developer",links:[{icon:"github",link:"https://github.com/lorow"}]},{name:"DaOfficialWizard",avatar:"https://avatars.githubusercontent.com/u/45744329?v=4",title:"Firmware Developer / Documentation Manager / App Developer",links:[{icon:"github",link:"https://github.com/ZanzyTHEbar"}]}],b=[{name:"qdot",avatar:"https://avatars.githubusercontent.com/u/34539?v=4",links:[{icon:"github",link:"https://github.com/qdot"}]},{name:"dfgHiatus",avatar:"https://avatars.githubusercontent.com/u/51272212?v=4",links:[{icon:"github",link:"https://github.com/dfgHiatus"}]},{name:"PallasNeko",avatar:"https://avatars.githubusercontent.com/u/124042774?v=4",links:[{icon:"github",link:"https://github.com/PallasNeko"}]}],f=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1700510338000}'),d={name:"about.md"},w=Object.assign(d,{setup(c){return(g,e)=>(m(),p("div",null,[n(l(u),null,{default:o(()=>[n(l(i),null,{title:o(()=>e[0]||(e[0]=[t("div",{class:"text-[#ab5ac7]"}," Our Team ",-1)])),lead:o(()=>e[1]||(e[1]=[a(" The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below."),t("br",null,null,-1),t("br",null,null,-1),a(" EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality. ")])),_:1}),n(l(r),{size:"medium",members:l(h)},null,8,["members"]),n(l(s),null,{title:o(()=>e[2]||(e[2]=[a("Contributors")])),lead:o(()=>e[3]||(e[3]=[a("Those who have actively contributed to development."),t("br",null,null,-1),a(" Community Support")])),members:o(()=>[n(l(r),{size:"small",members:l(b)},null,8,["members"])]),_:1}),n(l(s),null,{title:o(()=>e[4]||(e[4]=[a("Philosophy")])),lead:o(()=>e[5]||(e[5]=[a(" The "),t("a",{class:"custom-links",href:"/intro",target:"_blank"},"guides",-1),a(" on this website include some of our team's own notes (not all of them are polished) that we disclose for other people to use."),t("br",null,null,-1),t("br",null,null,-1),a(" Here, we hope you may find something useful to you."),t("br",null,null,-1),t("br",null,null,-1),a(" We advocate the "),t("a",{class:"custom-links",href:"https://en.wikipedia.org/wiki/Open-source_model",target:"_blank"},"Open Source model",-1),a("."),t("br",null,null,-1),t("br",null,null,-1),a(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")])),_:1})]),_:1})]))}});export{f as __pageData,w as default}; +import{V as i,a as r,b as s,c as u}from"./chunks/theme.d6d6d431.js";import{o as m,c as p,E as n,w as o,l,k as t,a}from"./chunks/framework.ece1a6f0.js";const h=[{name:"Prohurtz",avatar:"https://avatars.githubusercontent.com/u/48768484?v=4",title:"Creator / Lead Software Developer / Documentor / Hardware Developer",links:[{icon:"github",link:"https://github.com/RedHawk989"}]},{name:"Summer",avatar:"https://avatars.githubusercontent.com/u/115666235?v=4",title:"Machine Learning Engineer / Data Scientist / App Developer",links:[{icon:"github",link:"https://github.com/Summer404NotFound"}]},{name:"lorow",avatar:"https://avatars.githubusercontent.com/u/14099558?v=4",title:"Lead Firmware Developer / App Developer",links:[{icon:"github",link:"https://github.com/lorow"}]},{name:"DaOfficialWizard",avatar:"https://avatars.githubusercontent.com/u/45744329?v=4",title:"Firmware Developer / Documentation Manager / App Developer",links:[{icon:"github",link:"https://github.com/ZanzyTHEbar"}]}],b=[{name:"qdot",avatar:"https://avatars.githubusercontent.com/u/34539?v=4",links:[{icon:"github",link:"https://github.com/qdot"}]},{name:"dfgHiatus",avatar:"https://avatars.githubusercontent.com/u/51272212?v=4",links:[{icon:"github",link:"https://github.com/dfgHiatus"}]},{name:"PallasNeko",avatar:"https://avatars.githubusercontent.com/u/124042774?v=4",links:[{icon:"github",link:"https://github.com/PallasNeko"}]}],f=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1700510338000}'),d={name:"about.md"},w=Object.assign(d,{setup(c){return(g,e)=>(m(),p("div",null,[n(l(u),null,{default:o(()=>[n(l(i),null,{title:o(()=>e[0]||(e[0]=[t("div",{class:"text-[#ab5ac7]"}," Our Team ",-1)])),lead:o(()=>e[1]||(e[1]=[a(" The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below."),t("br",null,null,-1),t("br",null,null,-1),a(" EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality. ")])),_:1}),n(l(r),{size:"medium",members:l(h)},null,8,["members"]),n(l(s),null,{title:o(()=>e[2]||(e[2]=[a("Contributors")])),lead:o(()=>e[3]||(e[3]=[a("Those who have actively contributed to development."),t("br",null,null,-1),a(" Community Support")])),members:o(()=>[n(l(r),{size:"small",members:l(b)},null,8,["members"])]),_:1}),n(l(s),null,{title:o(()=>e[4]||(e[4]=[a("Philosophy")])),lead:o(()=>e[5]||(e[5]=[a(" The "),t("a",{class:"custom-links",href:"/intro",target:"_blank"},"guides",-1),a(" on this website include some of our team's own notes (not all of them are polished) that we disclose for other people to use."),t("br",null,null,-1),t("br",null,null,-1),a(" Here, we hope you may find something useful to you."),t("br",null,null,-1),t("br",null,null,-1),a(" We advocate the "),t("a",{class:"custom-links",href:"https://en.wikipedia.org/wiki/Open-source_model",target:"_blank"},"Open Source model",-1),a("."),t("br",null,null,-1),t("br",null,null,-1),a(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")])),_:1})]),_:1})]))}});export{f as __pageData,w as default}; diff --git a/assets/about.md.055b7111.lean.js b/assets/about.md.ce94d681.lean.js similarity index 96% rename from assets/about.md.055b7111.lean.js rename to assets/about.md.ce94d681.lean.js index ddbebbc..8bf9920 100644 --- a/assets/about.md.055b7111.lean.js +++ b/assets/about.md.ce94d681.lean.js @@ -1 +1 @@ -import{V as i,a as r,b as s,c as u}from"./chunks/theme.cd06fb64.js";import{o as m,c as p,E as n,w as o,l,k as t,a}from"./chunks/framework.47aa8d5b.js";const h=[{name:"Prohurtz",avatar:"https://avatars.githubusercontent.com/u/48768484?v=4",title:"Creator / Lead Software Developer / Documentor / Hardware Developer",links:[{icon:"github",link:"https://github.com/RedHawk989"}]},{name:"Summer",avatar:"https://avatars.githubusercontent.com/u/115666235?v=4",title:"Machine Learning Engineer / Data Scientist / App Developer",links:[{icon:"github",link:"https://github.com/Summer404NotFound"}]},{name:"lorow",avatar:"https://avatars.githubusercontent.com/u/14099558?v=4",title:"Lead Firmware Developer / App Developer",links:[{icon:"github",link:"https://github.com/lorow"}]},{name:"DaOfficialWizard",avatar:"https://avatars.githubusercontent.com/u/45744329?v=4",title:"Firmware Developer / Documentation Manager / App Developer",links:[{icon:"github",link:"https://github.com/ZanzyTHEbar"}]}],b=[{name:"qdot",avatar:"https://avatars.githubusercontent.com/u/34539?v=4",links:[{icon:"github",link:"https://github.com/qdot"}]},{name:"dfgHiatus",avatar:"https://avatars.githubusercontent.com/u/51272212?v=4",links:[{icon:"github",link:"https://github.com/dfgHiatus"}]},{name:"PallasNeko",avatar:"https://avatars.githubusercontent.com/u/124042774?v=4",links:[{icon:"github",link:"https://github.com/PallasNeko"}]}],f=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1700510338000}'),d={name:"about.md"},w=Object.assign(d,{setup(c){return(g,e)=>(m(),p("div",null,[n(l(u),null,{default:o(()=>[n(l(i),null,{title:o(()=>e[0]||(e[0]=[t("div",{class:"text-[#ab5ac7]"}," Our Team ",-1)])),lead:o(()=>e[1]||(e[1]=[a(" The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below."),t("br",null,null,-1),t("br",null,null,-1),a(" EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality. ")])),_:1}),n(l(r),{size:"medium",members:l(h)},null,8,["members"]),n(l(s),null,{title:o(()=>e[2]||(e[2]=[a("Contributors")])),lead:o(()=>e[3]||(e[3]=[a("Those who have actively contributed to development."),t("br",null,null,-1),a(" Community Support")])),members:o(()=>[n(l(r),{size:"small",members:l(b)},null,8,["members"])]),_:1}),n(l(s),null,{title:o(()=>e[4]||(e[4]=[a("Philosophy")])),lead:o(()=>e[5]||(e[5]=[a(" The "),t("a",{class:"custom-links",href:"/intro",target:"_blank"},"guides",-1),a(" on this website include some of our team's own notes (not all of them are polished) that we disclose for other people to use."),t("br",null,null,-1),t("br",null,null,-1),a(" Here, we hope you may find something useful to you."),t("br",null,null,-1),t("br",null,null,-1),a(" We advocate the "),t("a",{class:"custom-links",href:"https://en.wikipedia.org/wiki/Open-source_model",target:"_blank"},"Open Source model",-1),a("."),t("br",null,null,-1),t("br",null,null,-1),a(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")])),_:1})]),_:1})]))}});export{f as __pageData,w as default}; +import{V as i,a as r,b as s,c as u}from"./chunks/theme.d6d6d431.js";import{o as m,c as p,E as n,w as o,l,k as t,a}from"./chunks/framework.ece1a6f0.js";const h=[{name:"Prohurtz",avatar:"https://avatars.githubusercontent.com/u/48768484?v=4",title:"Creator / Lead Software Developer / Documentor / Hardware Developer",links:[{icon:"github",link:"https://github.com/RedHawk989"}]},{name:"Summer",avatar:"https://avatars.githubusercontent.com/u/115666235?v=4",title:"Machine Learning Engineer / Data Scientist / App Developer",links:[{icon:"github",link:"https://github.com/Summer404NotFound"}]},{name:"lorow",avatar:"https://avatars.githubusercontent.com/u/14099558?v=4",title:"Lead Firmware Developer / App Developer",links:[{icon:"github",link:"https://github.com/lorow"}]},{name:"DaOfficialWizard",avatar:"https://avatars.githubusercontent.com/u/45744329?v=4",title:"Firmware Developer / Documentation Manager / App Developer",links:[{icon:"github",link:"https://github.com/ZanzyTHEbar"}]}],b=[{name:"qdot",avatar:"https://avatars.githubusercontent.com/u/34539?v=4",links:[{icon:"github",link:"https://github.com/qdot"}]},{name:"dfgHiatus",avatar:"https://avatars.githubusercontent.com/u/51272212?v=4",links:[{icon:"github",link:"https://github.com/dfgHiatus"}]},{name:"PallasNeko",avatar:"https://avatars.githubusercontent.com/u/124042774?v=4",links:[{icon:"github",link:"https://github.com/PallasNeko"}]}],f=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"page"},"headers":[],"relativePath":"about.md","filePath":"about.md","lastUpdated":1700510338000}'),d={name:"about.md"},w=Object.assign(d,{setup(c){return(g,e)=>(m(),p("div",null,[n(l(u),null,{default:o(()=>[n(l(i),null,{title:o(()=>e[0]||(e[0]=[t("div",{class:"text-[#ab5ac7]"}," Our Team ",-1)])),lead:o(()=>e[1]||(e[1]=[a(" The development of EyeTrackVR is guided by an international team, some of whom have chosen to be featured below."),t("br",null,null,-1),t("br",null,null,-1),a(" EyeTrackVR developers are a group of people who are passionate about the field of augmented and virtual reality. ")])),_:1}),n(l(r),{size:"medium",members:l(h)},null,8,["members"]),n(l(s),null,{title:o(()=>e[2]||(e[2]=[a("Contributors")])),lead:o(()=>e[3]||(e[3]=[a("Those who have actively contributed to development."),t("br",null,null,-1),a(" Community Support")])),members:o(()=>[n(l(r),{size:"small",members:l(b)},null,8,["members"])]),_:1}),n(l(s),null,{title:o(()=>e[4]||(e[4]=[a("Philosophy")])),lead:o(()=>e[5]||(e[5]=[a(" The "),t("a",{class:"custom-links",href:"/intro",target:"_blank"},"guides",-1),a(" on this website include some of our team's own notes (not all of them are polished) that we disclose for other people to use."),t("br",null,null,-1),t("br",null,null,-1),a(" Here, we hope you may find something useful to you."),t("br",null,null,-1),t("br",null,null,-1),a(" We advocate the "),t("a",{class:"custom-links",href:"https://en.wikipedia.org/wiki/Open-source_model",target:"_blank"},"Open Source model",-1),a("."),t("br",null,null,-1),t("br",null,null,-1),a(" This is why we strive to make our work open to other people for consultation, replication and reuse. ")])),_:1})]),_:1})]))}});export{f as __pageData,w as default}; diff --git a/assets/app.b05231e0.js b/assets/app.d6426166.js similarity index 91% rename from assets/app.b05231e0.js rename to assets/app.d6426166.js index 9941d3d..5a6e214 100644 --- a/assets/app.b05231e0.js +++ b/assets/app.d6426166.js @@ -1 +1 @@ -import{u as p,v as i,p as s,a1 as c,a2 as l,a3 as d,a4 as f,a5 as m,a6 as h,a7 as g,a8 as A,a9 as v,aa as C,S as P,d as y,j as _,ab as w,ac as T,ad as b,ae as E}from"./chunks/framework.47aa8d5b.js";import{t as R}from"./chunks/theme.cd06fb64.js";const S={};const D={...R,setup(){const{lang:e}=p();i(()=>{s&&(document.cookie=`nf_lang=${e.value}; expires=Mon, 1 Jan 2024 00:00:00 UTC; path=/`)})},...S};function u(e){if(e.extends){const t=u(e.extends);return{...t,...e,async enhanceApp(a){t.enhanceApp&&await t.enhanceApp(a),e.enhanceApp&&await e.enhanceApp(a)}}}return e}const o=u(D),j=y({name:"VitePressApp",setup(){const{site:e}=p();return _(()=>{i(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),w(),T(),b(),o.setup&&o.setup(),()=>E(o.Layout)}});async function x(){const e=$(),t=O();t.provide(l,e);const a=d(e.route);return t.provide(f,a),t.component("Content",m),t.component("ClientOnly",h),Object.defineProperties(t.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}}),o.enhanceApp&&await o.enhanceApp({app:t,router:e,siteData:g}),{app:t,router:e,data:a}}function O(){return A(j)}function $(){let e=s,t;return v(a=>{let n=C(a),r=null;return n&&(e&&(t=n),(e||t===n)&&(n=n.replace(/\.js$/,".lean.js")),r=P(()=>import(n),[])),s&&(e=!1),r},o.NotFound)}s&&x().then(({app:e,router:t,data:a})=>{t.go().then(()=>{c(t.route,a.site),e.mount("#app")})});export{x as createApp}; +import{u as p,v as i,p as s,a1 as c,a2 as l,a3 as d,a4 as f,a5 as m,a6 as h,a7 as g,a8 as A,a9 as v,aa as C,S as P,d as y,j as _,ab as w,ac as T,ad as b,ae as E}from"./chunks/framework.ece1a6f0.js";import{t as R}from"./chunks/theme.d6d6d431.js";const S={};const D={...R,setup(){const{lang:e}=p();i(()=>{s&&(document.cookie=`nf_lang=${e.value}; expires=Mon, 1 Jan 2024 00:00:00 UTC; path=/`)})},...S};function u(e){if(e.extends){const t=u(e.extends);return{...t,...e,async enhanceApp(a){t.enhanceApp&&await t.enhanceApp(a),e.enhanceApp&&await e.enhanceApp(a)}}}return e}const o=u(D),j=y({name:"VitePressApp",setup(){const{site:e}=p();return _(()=>{i(()=>{document.documentElement.lang=e.value.lang,document.documentElement.dir=e.value.dir})}),w(),T(),b(),o.setup&&o.setup(),()=>E(o.Layout)}});async function x(){const e=$(),t=O();t.provide(l,e);const a=d(e.route);return t.provide(f,a),t.component("Content",m),t.component("ClientOnly",h),Object.defineProperties(t.config.globalProperties,{$frontmatter:{get(){return a.frontmatter.value}},$params:{get(){return a.page.value.params}}}),o.enhanceApp&&await o.enhanceApp({app:t,router:e,siteData:g}),{app:t,router:e,data:a}}function O(){return A(j)}function $(){let e=s,t;return v(a=>{let n=C(a),r=null;return n&&(e&&(t=n),(e||t===n)&&(n=n.replace(/\.js$/,".lean.js")),r=P(()=>import(n),[])),s&&(e=!1),r},o.NotFound)}s&&x().then(({app:e,router:t,data:a})=>{t.go().then(()=>{c(t.route,a.site),e.mount("#app")})});export{x as createApp}; diff --git a/assets/archive_fox_ir_v2_build_instructions.md.ebf3c880.lean.js b/assets/archive_fox_ir_v2_build_instructions.md.536f1af3.js similarity index 97% rename from assets/archive_fox_ir_v2_build_instructions.md.ebf3c880.lean.js rename to assets/archive_fox_ir_v2_build_instructions.md.536f1af3.js index c850b7a..d2480cd 100644 --- a/assets/archive_fox_ir_v2_build_instructions.md.ebf3c880.lean.js +++ b/assets/archive_fox_ir_v2_build_instructions.md.536f1af3.js @@ -1 +1 @@ -import{_ as t,i as s}from"./chunks/index.c1fed1bd.js";import{o as l,c as d,k as e,a as r,E as i,l as n,O as p}from"./chunks/framework.47aa8d5b.js";const m=JSON.parse('{"title":"Fox IR V2 Buil dInstructions","description":"","frontmatter":{},"headers":[],"relativePath":"archive/fox_ir_v2_build_instructions.md","filePath":"archive/fox_ir_v2_build_instructions.md","lastUpdated":1676223729000}'),a={name:"archive/fox_ir_v2_build_instructions.md"},b=Object.assign(a,{setup(u){return(f,o)=>(l(),d("div",null,[o[0]||(o[0]=e("h1",{class:"text-[var(--font-accent)]",id:"fox-ir-v2-buil-dinstructions",tabindex:"-1"},[r("Fox IR V2 Buil dInstructions "),e("a",{class:"header-anchor",href:"#fox-ir-v2-buil-dinstructions","aria-label":'Permalink to "Fox IR V2 Buil dInstructions {.text-[var(--font-accent)]}"'},"​")],-1)),o[1]||(o[1]=e("h2",{id:"step-15-prepare-to-solder-ir-led-pcb-v2s",tabindex:"-1"},[r("Step 15: Prepare to solder IR LED PCB V2s "),e("a",{class:"header-anchor",href:"#step-15-prepare-to-solder-ir-led-pcb-v2s","aria-label":'Permalink to "Step 15: Prepare to solder IR LED PCB V2s"'},"​")],-1)),o[2]||(o[2]=e("p",null,"Get your magnifying glass out, it's time to solder very smol things.",-1)),o[3]||(o[3]=e("p",null,"Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.",-1)),i(t,{options:n(s).fox_ir_build_instructions_one},null,8,["options"]),o[4]||(o[4]=e("p",null,"Here are the PCB pin-out labels:",-1)),i(t,{options:n(s).fox_ir_build_instructions_two},null,8,["options"]),o[5]||(o[5]=e("p",null,"LED labels:",-1)),i(t,{options:n(s).fox_ir_build_instructions_three},null,8,["options"]),o[6]||(o[6]=p('

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 17: Solder resistors on PCB V2

You only need 1 PCB to have a resistor per eye.

',10)),i(t,{options:n(s).fox_ir_build_instructions_four},null,8,["options"]),o[7]||(o[7]=e("p",null,"Tin the resistor pads.",-1)),i(t,{options:n(s).fox_ir_build_instructions_five},null,8,["options"]),o[8]||(o[8]=e("p",null,"Hold the resistor in place.",-1)),i(t,{options:n(s).fox_ir_build_instructions_six},null,8,["options"]),o[9]||(o[9]=e("p",null,"Solder one end.",-1)),i(t,{options:n(s).fox_ir_build_instructions_seven},null,8,["options"]),o[10]||(o[10]=e("p",null,"Flip to the other side of the resistor and solder it.",-1)),i(t,{options:n(s).fox_ir_build_instructions_eight},null,8,["options"]),o[11]||(o[11]=e("h2",{id:"solder-leds-on-pcb-v2",tabindex:"-1"},[r("Solder LEDs on PCB V2 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v2","aria-label":'Permalink to "Solder LEDs on PCB V2"'},"​")],-1)),i(t,{options:n(s).fox_ir_build_instructions_nine},null,8,["options"]),o[12]||(o[12]=e("p",null,"Tin the pads",-1)),i(t,{options:n(s).fox_ir_build_instructions_ten},null,8,["options"]),o[13]||(o[13]=e("p",null,"Place the resistor on the pads in the correct orientation.",-1)),i(t,{options:n(s).fox_ir_build_instructions_eleven},null,8,["options"]),o[14]||(o[14]=e("p",null,[r("Solder each side of the resistor. Be careful not to solder at too high of a temp, recommended soldering temp is "),e("code",null,"230C with a max of 245C"),r(".")],-1)),i(t,{options:n(s).fox_ir_build_instructions_twelve},null,8,["options"]),o[15]||(o[15]=e("h2",{id:"wire-up-the-pcbs-v2",tabindex:"-1"},[r("Wire up the PCBs V2 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v2","aria-label":'Permalink to "Wire up the PCBs V2"'},"​")],-1)),o[16]||(o[16]=e("p",null,"Basic full wiring diagram of IR PCBs V2.",-1)),i(t,{options:n(s).fox_ir_build_instructions_thirteen},null,8,["options"]),o[17]||(o[17]=e("p",null,"The PCB that receives the 5V power is the one with the resistor. The second one, which gets its power from the ground pin of the first, does not have a resistor on it and its power input pin is the AR pin (After-Resistor). The 2nd PCBs ground pin goes to the ground of the system, in the diagram it is the ESPs ground pin.",-1))]))}});export{m as __pageData,b as default}; +import{_ as t,i as s}from"./chunks/index.41b0dfea.js";import{o as l,c as d,k as e,a as r,E as i,l as n,O as p}from"./chunks/framework.ece1a6f0.js";const m=JSON.parse('{"title":"Fox IR V2 Buil dInstructions","description":"","frontmatter":{},"headers":[],"relativePath":"archive/fox_ir_v2_build_instructions.md","filePath":"archive/fox_ir_v2_build_instructions.md","lastUpdated":1676223729000}'),a={name:"archive/fox_ir_v2_build_instructions.md"},b=Object.assign(a,{setup(u){return(f,o)=>(l(),d("div",null,[o[0]||(o[0]=e("h1",{class:"text-[var(--font-accent)]",id:"fox-ir-v2-buil-dinstructions",tabindex:"-1"},[r("Fox IR V2 Buil dInstructions "),e("a",{class:"header-anchor",href:"#fox-ir-v2-buil-dinstructions","aria-label":'Permalink to "Fox IR V2 Buil dInstructions {.text-[var(--font-accent)]}"'},"​")],-1)),o[1]||(o[1]=e("h2",{id:"step-15-prepare-to-solder-ir-led-pcb-v2s",tabindex:"-1"},[r("Step 15: Prepare to solder IR LED PCB V2s "),e("a",{class:"header-anchor",href:"#step-15-prepare-to-solder-ir-led-pcb-v2s","aria-label":'Permalink to "Step 15: Prepare to solder IR LED PCB V2s"'},"​")],-1)),o[2]||(o[2]=e("p",null,"Get your magnifying glass out, it's time to solder very smol things.",-1)),o[3]||(o[3]=e("p",null,"Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.",-1)),i(t,{options:n(s).fox_ir_build_instructions_one},null,8,["options"]),o[4]||(o[4]=e("p",null,"Here are the PCB pin-out labels:",-1)),i(t,{options:n(s).fox_ir_build_instructions_two},null,8,["options"]),o[5]||(o[5]=e("p",null,"LED labels:",-1)),i(t,{options:n(s).fox_ir_build_instructions_three},null,8,["options"]),o[6]||(o[6]=p('

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 17: Solder resistors on PCB V2

You only need 1 PCB to have a resistor per eye.

',10)),i(t,{options:n(s).fox_ir_build_instructions_four},null,8,["options"]),o[7]||(o[7]=e("p",null,"Tin the resistor pads.",-1)),i(t,{options:n(s).fox_ir_build_instructions_five},null,8,["options"]),o[8]||(o[8]=e("p",null,"Hold the resistor in place.",-1)),i(t,{options:n(s).fox_ir_build_instructions_six},null,8,["options"]),o[9]||(o[9]=e("p",null,"Solder one end.",-1)),i(t,{options:n(s).fox_ir_build_instructions_seven},null,8,["options"]),o[10]||(o[10]=e("p",null,"Flip to the other side of the resistor and solder it.",-1)),i(t,{options:n(s).fox_ir_build_instructions_eight},null,8,["options"]),o[11]||(o[11]=e("h2",{id:"solder-leds-on-pcb-v2",tabindex:"-1"},[r("Solder LEDs on PCB V2 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v2","aria-label":'Permalink to "Solder LEDs on PCB V2"'},"​")],-1)),i(t,{options:n(s).fox_ir_build_instructions_nine},null,8,["options"]),o[12]||(o[12]=e("p",null,"Tin the pads",-1)),i(t,{options:n(s).fox_ir_build_instructions_ten},null,8,["options"]),o[13]||(o[13]=e("p",null,"Place the resistor on the pads in the correct orientation.",-1)),i(t,{options:n(s).fox_ir_build_instructions_eleven},null,8,["options"]),o[14]||(o[14]=e("p",null,[r("Solder each side of the resistor. Be careful not to solder at too high of a temp, recommended soldering temp is "),e("code",null,"230C with a max of 245C"),r(".")],-1)),i(t,{options:n(s).fox_ir_build_instructions_twelve},null,8,["options"]),o[15]||(o[15]=e("h2",{id:"wire-up-the-pcbs-v2",tabindex:"-1"},[r("Wire up the PCBs V2 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v2","aria-label":'Permalink to "Wire up the PCBs V2"'},"​")],-1)),o[16]||(o[16]=e("p",null,"Basic full wiring diagram of IR PCBs V2.",-1)),i(t,{options:n(s).fox_ir_build_instructions_thirteen},null,8,["options"]),o[17]||(o[17]=e("p",null,"The PCB that receives the 5V power is the one with the resistor. The second one, which gets its power from the ground pin of the first, does not have a resistor on it and its power input pin is the AR pin (After-Resistor). The 2nd PCBs ground pin goes to the ground of the system, in the diagram it is the ESPs ground pin.",-1))]))}});export{m as __pageData,b as default}; diff --git a/assets/archive_fox_ir_v2_build_instructions.md.ebf3c880.js b/assets/archive_fox_ir_v2_build_instructions.md.536f1af3.lean.js similarity index 97% rename from assets/archive_fox_ir_v2_build_instructions.md.ebf3c880.js rename to assets/archive_fox_ir_v2_build_instructions.md.536f1af3.lean.js index c850b7a..d2480cd 100644 --- a/assets/archive_fox_ir_v2_build_instructions.md.ebf3c880.js +++ b/assets/archive_fox_ir_v2_build_instructions.md.536f1af3.lean.js @@ -1 +1 @@ -import{_ as t,i as s}from"./chunks/index.c1fed1bd.js";import{o as l,c as d,k as e,a as r,E as i,l as n,O as p}from"./chunks/framework.47aa8d5b.js";const m=JSON.parse('{"title":"Fox IR V2 Buil dInstructions","description":"","frontmatter":{},"headers":[],"relativePath":"archive/fox_ir_v2_build_instructions.md","filePath":"archive/fox_ir_v2_build_instructions.md","lastUpdated":1676223729000}'),a={name:"archive/fox_ir_v2_build_instructions.md"},b=Object.assign(a,{setup(u){return(f,o)=>(l(),d("div",null,[o[0]||(o[0]=e("h1",{class:"text-[var(--font-accent)]",id:"fox-ir-v2-buil-dinstructions",tabindex:"-1"},[r("Fox IR V2 Buil dInstructions "),e("a",{class:"header-anchor",href:"#fox-ir-v2-buil-dinstructions","aria-label":'Permalink to "Fox IR V2 Buil dInstructions {.text-[var(--font-accent)]}"'},"​")],-1)),o[1]||(o[1]=e("h2",{id:"step-15-prepare-to-solder-ir-led-pcb-v2s",tabindex:"-1"},[r("Step 15: Prepare to solder IR LED PCB V2s "),e("a",{class:"header-anchor",href:"#step-15-prepare-to-solder-ir-led-pcb-v2s","aria-label":'Permalink to "Step 15: Prepare to solder IR LED PCB V2s"'},"​")],-1)),o[2]||(o[2]=e("p",null,"Get your magnifying glass out, it's time to solder very smol things.",-1)),o[3]||(o[3]=e("p",null,"Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.",-1)),i(t,{options:n(s).fox_ir_build_instructions_one},null,8,["options"]),o[4]||(o[4]=e("p",null,"Here are the PCB pin-out labels:",-1)),i(t,{options:n(s).fox_ir_build_instructions_two},null,8,["options"]),o[5]||(o[5]=e("p",null,"LED labels:",-1)),i(t,{options:n(s).fox_ir_build_instructions_three},null,8,["options"]),o[6]||(o[6]=p('

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 17: Solder resistors on PCB V2

You only need 1 PCB to have a resistor per eye.

',10)),i(t,{options:n(s).fox_ir_build_instructions_four},null,8,["options"]),o[7]||(o[7]=e("p",null,"Tin the resistor pads.",-1)),i(t,{options:n(s).fox_ir_build_instructions_five},null,8,["options"]),o[8]||(o[8]=e("p",null,"Hold the resistor in place.",-1)),i(t,{options:n(s).fox_ir_build_instructions_six},null,8,["options"]),o[9]||(o[9]=e("p",null,"Solder one end.",-1)),i(t,{options:n(s).fox_ir_build_instructions_seven},null,8,["options"]),o[10]||(o[10]=e("p",null,"Flip to the other side of the resistor and solder it.",-1)),i(t,{options:n(s).fox_ir_build_instructions_eight},null,8,["options"]),o[11]||(o[11]=e("h2",{id:"solder-leds-on-pcb-v2",tabindex:"-1"},[r("Solder LEDs on PCB V2 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v2","aria-label":'Permalink to "Solder LEDs on PCB V2"'},"​")],-1)),i(t,{options:n(s).fox_ir_build_instructions_nine},null,8,["options"]),o[12]||(o[12]=e("p",null,"Tin the pads",-1)),i(t,{options:n(s).fox_ir_build_instructions_ten},null,8,["options"]),o[13]||(o[13]=e("p",null,"Place the resistor on the pads in the correct orientation.",-1)),i(t,{options:n(s).fox_ir_build_instructions_eleven},null,8,["options"]),o[14]||(o[14]=e("p",null,[r("Solder each side of the resistor. Be careful not to solder at too high of a temp, recommended soldering temp is "),e("code",null,"230C with a max of 245C"),r(".")],-1)),i(t,{options:n(s).fox_ir_build_instructions_twelve},null,8,["options"]),o[15]||(o[15]=e("h2",{id:"wire-up-the-pcbs-v2",tabindex:"-1"},[r("Wire up the PCBs V2 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v2","aria-label":'Permalink to "Wire up the PCBs V2"'},"​")],-1)),o[16]||(o[16]=e("p",null,"Basic full wiring diagram of IR PCBs V2.",-1)),i(t,{options:n(s).fox_ir_build_instructions_thirteen},null,8,["options"]),o[17]||(o[17]=e("p",null,"The PCB that receives the 5V power is the one with the resistor. The second one, which gets its power from the ground pin of the first, does not have a resistor on it and its power input pin is the AR pin (After-Resistor). The 2nd PCBs ground pin goes to the ground of the system, in the diagram it is the ESPs ground pin.",-1))]))}});export{m as __pageData,b as default}; +import{_ as t,i as s}from"./chunks/index.41b0dfea.js";import{o as l,c as d,k as e,a as r,E as i,l as n,O as p}from"./chunks/framework.ece1a6f0.js";const m=JSON.parse('{"title":"Fox IR V2 Buil dInstructions","description":"","frontmatter":{},"headers":[],"relativePath":"archive/fox_ir_v2_build_instructions.md","filePath":"archive/fox_ir_v2_build_instructions.md","lastUpdated":1676223729000}'),a={name:"archive/fox_ir_v2_build_instructions.md"},b=Object.assign(a,{setup(u){return(f,o)=>(l(),d("div",null,[o[0]||(o[0]=e("h1",{class:"text-[var(--font-accent)]",id:"fox-ir-v2-buil-dinstructions",tabindex:"-1"},[r("Fox IR V2 Buil dInstructions "),e("a",{class:"header-anchor",href:"#fox-ir-v2-buil-dinstructions","aria-label":'Permalink to "Fox IR V2 Buil dInstructions {.text-[var(--font-accent)]}"'},"​")],-1)),o[1]||(o[1]=e("h2",{id:"step-15-prepare-to-solder-ir-led-pcb-v2s",tabindex:"-1"},[r("Step 15: Prepare to solder IR LED PCB V2s "),e("a",{class:"header-anchor",href:"#step-15-prepare-to-solder-ir-led-pcb-v2s","aria-label":'Permalink to "Step 15: Prepare to solder IR LED PCB V2s"'},"​")],-1)),o[2]||(o[2]=e("p",null,"Get your magnifying glass out, it's time to solder very smol things.",-1)),o[3]||(o[3]=e("p",null,"Gather 4 PCBs, 4 IR LEDs, and 2 ~700ohm resistors.",-1)),i(t,{options:n(s).fox_ir_build_instructions_one},null,8,["options"]),o[4]||(o[4]=e("p",null,"Here are the PCB pin-out labels:",-1)),i(t,{options:n(s).fox_ir_build_instructions_two},null,8,["options"]),o[5]||(o[5]=e("p",null,"LED labels:",-1)),i(t,{options:n(s).fox_ir_build_instructions_three},null,8,["options"]),o[6]||(o[6]=p('

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 17: Solder resistors on PCB V2

You only need 1 PCB to have a resistor per eye.

',10)),i(t,{options:n(s).fox_ir_build_instructions_four},null,8,["options"]),o[7]||(o[7]=e("p",null,"Tin the resistor pads.",-1)),i(t,{options:n(s).fox_ir_build_instructions_five},null,8,["options"]),o[8]||(o[8]=e("p",null,"Hold the resistor in place.",-1)),i(t,{options:n(s).fox_ir_build_instructions_six},null,8,["options"]),o[9]||(o[9]=e("p",null,"Solder one end.",-1)),i(t,{options:n(s).fox_ir_build_instructions_seven},null,8,["options"]),o[10]||(o[10]=e("p",null,"Flip to the other side of the resistor and solder it.",-1)),i(t,{options:n(s).fox_ir_build_instructions_eight},null,8,["options"]),o[11]||(o[11]=e("h2",{id:"solder-leds-on-pcb-v2",tabindex:"-1"},[r("Solder LEDs on PCB V2 "),e("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v2","aria-label":'Permalink to "Solder LEDs on PCB V2"'},"​")],-1)),i(t,{options:n(s).fox_ir_build_instructions_nine},null,8,["options"]),o[12]||(o[12]=e("p",null,"Tin the pads",-1)),i(t,{options:n(s).fox_ir_build_instructions_ten},null,8,["options"]),o[13]||(o[13]=e("p",null,"Place the resistor on the pads in the correct orientation.",-1)),i(t,{options:n(s).fox_ir_build_instructions_eleven},null,8,["options"]),o[14]||(o[14]=e("p",null,[r("Solder each side of the resistor. Be careful not to solder at too high of a temp, recommended soldering temp is "),e("code",null,"230C with a max of 245C"),r(".")],-1)),i(t,{options:n(s).fox_ir_build_instructions_twelve},null,8,["options"]),o[15]||(o[15]=e("h2",{id:"wire-up-the-pcbs-v2",tabindex:"-1"},[r("Wire up the PCBs V2 "),e("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v2","aria-label":'Permalink to "Wire up the PCBs V2"'},"​")],-1)),o[16]||(o[16]=e("p",null,"Basic full wiring diagram of IR PCBs V2.",-1)),i(t,{options:n(s).fox_ir_build_instructions_thirteen},null,8,["options"]),o[17]||(o[17]=e("p",null,"The PCB that receives the 5V power is the one with the resistor. The second one, which gets its power from the ground pin of the first, does not have a resistor on it and its power input pin is the AR pin (After-Resistor). The 2nd PCBs ground pin goes to the ground of the system, in the diagram it is the ESPs ground pin.",-1))]))}});export{m as __pageData,b as default}; diff --git a/assets/chunks/@localSearchIndexroot.01187451.js b/assets/chunks/@localSearchIndexroot.01187451.js new file mode 100644 index 0000000..d28736c --- /dev/null +++ b/assets/chunks/@localSearchIndexroot.01187451.js @@ -0,0 +1 @@ +const e=`{"documentCount":308,"nextId":308,"documentIds":{"0":"/archive/fox_ir_v2_build_instructions#fox-ir-v2-buil-dinstructions","1":"/archive/fox_ir_v2_build_instructions#step-15-prepare-to-solder-ir-led-pcb-v2s","2":"/archive/fox_ir_v2_build_instructions#step-17-solder-resistors-on-pcb-v2","3":"/archive/fox_ir_v2_build_instructions#solder-leds-on-pcb-v2","4":"/archive/fox_ir_v2_build_instructions#wire-up-the-pcbs-v2","5":"/dev_roadmap#eyetrackvr-development-roadmap","6":"/dev_roadmap#completed","7":"/dev_roadmap#in-progress","8":"/dev_roadmap#planned","9":"/development/docs/dev_docs#development-documentation-for-the-eyetrackvr-docs-site","10":"/development/docs/dev_docs#getting-started","11":"/development/docs/dev_docs#prerequisites","12":"/development/docs/dev_docs#installation","13":"/development/docs/dev_docs#contributing","14":"/development/docs/dev_docs#project-structure","15":"/development/docs/dev_docs#standards","16":"/development/docs/pages#pages","17":"/development/docs/pages#adding-a-page","18":"/development/docs/pages#sub-directories","19":"/development/docs/pages#adding-a-page-to-the-sidebar","20":"/development/docs/pages#title-style","21":"/development/docs/pages#editing-a-page","22":"/development/docs/standards#standards-guide","23":"/development/docs/standards#code-standards","24":"/development/docs/standards#general","25":"/development/docs/standards#git-commit-style","26":"/firmware_guide/configure_firmware#configuring-the-firmware","27":"/firmware_guide/configure_firmware#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","28":"/firmware_guide/configure_firmware#open-the-ini-user-config-ini-file","29":"/firmware_guide/configure_firmware#additional-configuration","30":"/firmware_guide/configure_firmware#mdns","31":"/firmware_guide/configure_firmware#ota","32":"/firmware_guide/configure_firmware#rest-api","33":"/firmware_guide/configure_firmware#environments","34":"/firmware_guide/environments#firmware-environments","35":"/firmware_guide/environments#what-is-it","36":"/firmware_guide/environments#build-types","37":"/firmware_guide/environments#board-types","38":"/firmware_guide/firmware#what-is-this","39":"/firmware_guide/firmware#what-should-i-download-and-where","40":"/firmware_guide/flashing_tool#firmware-flashing-tool","41":"/firmware_guide/flashing_tool#before-we-proceed","42":"/firmware_guide/flashing_tool#step-1-download-and-install-the-firmware-flashing-tool","43":"/firmware_guide/flashing_tool#step-2-run-the-firmware-flashing-tool-app","44":"/firmware_guide/flashing_tool#step-3-select-board","45":"/firmware_guide/flashing_tool#step-4-flash-firmware","46":"/firmware_guide/flashing_tool#step-5-that-s-it","47":"/firmware_guide/flashing_tool#step-6-logs","48":"/firmware_guide/flashing_tool#how-to-configure-wifi","49":"/firmware_guide/flashing_tool#step-1-select-board","50":"/firmware_guide/flashing_tool#step-2-configure-wifi-network","51":"/firmware_guide/flashing_tool#step-3-send-wifi-credentials","52":"/firmware_guide/flashing_tool#step-4-get-working-stream","53":"/firmware_guide/mdns#mdns","54":"/firmware_guide/mdns#what-is-it","55":"/firmware_guide/mdns#how-to-use-it","56":"/firmware_guide/mdns#enable-mdns","57":"/firmware_guide/mdns#connect-to-the-device","58":"/firmware_guide/mdns#prerequisites-bonjour","59":"/firmware_guide/mdns#troubleshooting","60":"/firmware_guide/mdns#can-not-connect-to-the-device","61":"/firmware_guide/rest_api#rest-api","62":"/firmware_guide/rest_api#what-is-it","63":"/firmware_guide/rest_api#how-to-use-it","64":"/firmware_guide/rest_api#rest-api-client","65":"/firmware_guide/rest_api#standard","66":"/firmware_guide/rest_api#endpoints","67":"/firmware_guide/rest_api#params","68":"/firmware_guide/rest_api#wifi","69":"/firmware_guide/rest_api#setdevice","70":"/firmware_guide/rest_api#settxpower","71":"/firmware_guide/rest_api#camera-params","72":"/firmware_guide/setup_vscode#setting-up-the-environment","73":"/firmware_guide/setup_vscode#_1-install-visual-studio-code","74":"/firmware_guide/setup_vscode#download","75":"/firmware_guide/setup_vscode#install","76":"/firmware_guide/setup_vscode#_2-install-the-drivers","77":"/firmware_guide/setup_vscode#_3-install-platformio-ide","78":"/firmware_guide/setup_vscode#_4-clone-the-firmware-project","79":"/firmware_guide/update_platformio#updating-platformio","80":"/firmware_guide/update_platformio#updating-platformio-itself","81":"/firmware_guide/update_platformio#via-cli","82":"/firmware_guide/update_platformio#via-platformio-in-visual-studio-code","83":"/firmware_guide/update_platformio#upgrading-the-sdk","84":"/firmware_guide/update_platformio#upgrading-the-sdk-via-vsc","85":"/firmware_guide/upload_and_update_firmware#building-and-uploading-the-firmware-manually","86":"/firmware_guide/upload_and_update_firmware#_1-connect-your-tracker-to-your-pc","87":"/firmware_guide/upload_and_update_firmware#option-1-connect-esp32-cam-via-the-programmer","88":"/firmware_guide/upload_and_update_firmware#option-2-connect-esp32-s3-via-usb-c-directly","89":"/firmware_guide/upload_and_update_firmware#_2-build-your-firmware","90":"/firmware_guide/upload_and_update_firmware#_3-upload-your-firmware","91":"/firmware_guide/upload_and_update_firmware#uploading-via-ota","92":"/firmware_guide/upload_and_update_firmware#what-is-it","93":"/firmware_guide/upload_and_update_firmware#how-do-i-use-it","94":"/firmware_guide/upload_and_update_firmware#for-firmware-versions-1-1-0-and-up","95":"/firmware_guide/upload_and_update_firmware#for-firmware-versions-of-1-0-0-and-under","96":"/firmware_guide/upload_and_update_firmware#finding-the-ip-address-of-your-tracker","97":"/firmware_guide/upload_and_update_firmware#updating-the-firmware-to-the-newest-version","98":"/firmware_guide/upload_and_update_firmware#troubleshooting","99":"/getting_started/intro#eyetrackvr","100":"/getting_started/intro#get-started","101":"/getting_started/intro#eye-safety-notice","102":"/getting_started/intro#hardware-overview","103":"/getting_started/intro#firmware","104":"/getting_started/intro#headset-compatibility","105":"/getting_started/intro#community-support","106":"/getting_started/led_safety#near‐eye-infrared-ir-emitter-safety","107":"/getting_started/led_safety#relevant-safety-limits","108":"/getting_started/led_safety#why-current-ma-isn-t-enough","109":"/getting_started/led_safety#hardware-exposure-calculations","110":"/getting_started/led_safety#led-xl‐3216hirc‐850","111":"/getting_started/led_safety#v3-module-2-leds-3-2-ma-each","112":"/getting_started/led_safety#v4-module-4-leds-2-4-ma-each","113":"/getting_started/led_safety#worst-case-high-bin-calculations","114":"/getting_started/led_safety#v3-max-bin-2-leds-3-2-ma","115":"/getting_started/led_safety#v4-max-bin-4-leds-2-4-ma","116":"/getting_started/led_safety#your-responsibilities","117":"/getting_started/led_safety#appendix-a-–-formula-summary","118":"/getting_started/led_safety#appendix-b-–-quoted-guideline-icnirp-2013","119":"/getting_started/things_to_know#things-to-know-before-you-start","120":"/getting_started/things_to_know#this-page-is-an-overview-of-things-to-know-and-understand-before-you-start-this-project","121":"/getting_started/things_to_know#software-is-not-final","122":"/getting_started/things_to_know#firmware-may-have-user-difficulties","123":"/getting_started/things_to_know#ir-emitters-can-be-dangerous","124":"/getting_started/things_to_know#documentation-may-be-incomplete","125":"/getting_started/things_to_know#once-you-have-acknowledged-the-items-above-move-on-to-the-full-build-guide","126":"/headset_guides/valve_index#valve-index","127":"/headset_guides/valve_index#recommended-valve-index-lens-mounts","128":"/headset_guides/valve_index#mutethecyberwolf-s-dev-frunk-mod","129":"/headset_guides/valve_index#mod-details","130":"/headset_guides/valve_index#extra-parts-needed","131":"/headset_guides/valve_index#_3d-printed-mounts","132":"/headset_guides/valve_index#assembly-details","133":"/headset_guides/valve_index#_1-heat-inserts","134":"/headset_guides/valve_index#_2-screws","135":"/headset_guides/valve_index#_3-mounting-components","136":"/headset_guides/valve_index#_4-replacing-frunk","137":"/headset_guides/valve_index#physics-dude-s-gumstick-usb-hub-dongle","138":"/headset_guides/valve_index#mod-details-1","139":"/headset_guides/valve_index#installation-instructions-and-bom-available-on-physics-dude-s-repo","140":"/headset_guides/what_is_this#what-are-headset-specific-guides","141":"/headset_guides/what_is_this#guidelines","142":"/headset_guides/what_is_this#headset-name","143":"/headset_guides/what_is_this#xyz-s-mod","144":"/headset_guides/what_is_this#mod-details","145":"/headset_guides/what_is_this#extra-parts-needed","146":"/headset_guides/what_is_this#_3d-printed-mounts","147":"/headset_guides/what_is_this#assembly-details","148":"/headset_guides/what_is_this#abc-s-mod","149":"/headset_guides/what_is_this#mod-details-1","150":"/headset_guides/what_is_this#extra-parts-needed-1","151":"/headset_guides/what_is_this#_3d-printed-mounts-1","152":"/headset_guides/what_is_this#assembly-details-1","153":"/how_to_build/3d_printed_mounts#_3d-printed-mounts","154":"/how_to_build/3d_printed_mounts#dont-see-your-headset","155":"/how_to_build/creating_your_own_mount#creating-your-own-mount","156":"/how_to_build/creating_your_own_mount#this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts","157":"/how_to_build/creating_your_own_mount#step-1-find-a-way-to-mount-to-your-headset-s-lens","158":"/how_to_build/creating_your_own_mount#step-2-find-a-camera-mount","159":"/how_to_build/creating_your_own_mount#step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle","160":"/how_to_build/creating_your_own_mount#step-4-mount-your-leds","161":"/how_to_build/creating_your_own_mount#step-5-test-everything","162":"/how_to_build/creating_your_own_mount#step-6-get-your-mounts-listed","163":"/how_to_build/full_build#v3-build-guide","164":"/how_to_build/full_build#this-page-will-contain-a-step-by-step-assembly-guide","165":"/how_to_build/full_build#updated-documentation-for-v4-is-still-in-progress-and-not-updated-here-please-be-patient","166":"/how_to_build/full_build#step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide","167":"/how_to_build/full_build#step-2-order-all-the-parts-listed-on-our-parts-list","168":"/how_to_build/full_build#step-3-wait-for-things-to-arrive","169":"/how_to_build/full_build#step-4-gather-up-all-of-your-hardware","170":"/how_to_build/full_build#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","171":"/how_to_build/full_build#step-6-attach-cameras-to-esps","172":"/how_to_build/full_build#step-7-connect-esp-to-the-programmer-to-flash","173":"/how_to_build/full_build#step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware","174":"/how_to_build/full_build#step-9-plug-in-your-esp-and-flash-the-firmware","175":"/how_to_build/full_build#step-10-connect-your-power-wires-to-a-usb-type-a-board","176":"/how_to_build/full_build#step-11-cut-wires-for-ir-leds","177":"/how_to_build/full_build#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","178":"/how_to_build/full_build#step-13-solder-the-positive-wire-to-esp","179":"/how_to_build/full_build#step-14-solder-the-negative-wire-to-esp","180":"/how_to_build/full_build#step-15-wire-up-the-2nd-esp","181":"/how_to_build/full_build#step-16-prepare-to-solder-ir-led-pcbs","182":"/how_to_build/full_build#step-18-solder-resistors-on-pcb-v3","183":"/how_to_build/full_build#solder-leds-on-pcb-v3","184":"/how_to_build/full_build#wire-up-the-pcbs-v3","185":"/how_to_build/full_build#step-19-3d-print-mounts","186":"/how_to_build/full_build#type-1","187":"/how_to_build/full_build#type-2","188":"/how_to_build/full_build#ir-led-mounting","189":"/how_to_build/led_setup#how-to-assemble-a-v4-mini-led-hardware-kit","190":"/how_to_build/led_setup#getting-to-know-your-hardware","191":"/how_to_build/led_setup#mainboard","192":"/how_to_build/led_setup#leds","193":"/how_to_build/led_setup#wires","194":"/how_to_build/led_setup#wiring-up-v4-mini","195":"/how_to_build/led_setup#how-to-assemble-v4-lite-led-kit","196":"/how_to_build/led_setup#getting-to-know-v4-lite","197":"/how_to_build/led_setup#wiring-up-v4-lite","198":"/how_to_build/part_list#required-parts","199":"/how_to_build/part_list#additional-parts","200":"/how_to_build/part_list#esp-setup-options","201":"/how_to_build/part_list#option-1-wired-over-usb-serial","202":"/how_to_build/part_list#wired-capable-esps","203":"/how_to_build/part_list#option-2-wireless-over-wifi-2-4-ghz","204":"/how_to_build/part_list#wireless-capable-esps","205":"/how_to_build/parts_list#parts-list","206":"/how_to_build/parts_list#esp-setup-options","207":"/how_to_build/parts_list#option-1-wireless-over-wifi-2-4-ghz","208":"/how_to_build/parts_list#option-2-wired-over-usb-serial-in-beta","209":"/how_to_build/parts_list#required-parts","210":"/how_to_build/parts_list#tracker-boards","211":"/how_to_build/parts_list#recommended","212":"/how_to_build/parts_list#a-cheaper-wireless-only-alternative","213":"/how_to_build/parts_list#cameras","214":"/how_to_build/parts_list#camera-modules","215":"/how_to_build/parts_list#_2x-ov2640-160°-fov-ir-night-vers-75mm-850nm","216":"/how_to_build/parts_list#optional-ribbon-extensions","217":"/how_to_build/parts_list#usb-hubs-for-if-you-are-building-the-wired-version","218":"/how_to_build/parts_list#wires-and-adapters","219":"/how_to_build/parts_list#ir-emitters","220":"/how_to_build/parts_list#recommended-1","221":"/how_to_build/parts_list#alternatively-you-can-source-the-parts-for-v3-yourself","222":"/how_to_build/parts_list#_3d-printed-mounts","223":"/how_to_build/parts_list#misc-parts-tools","224":"/how_to_build/parts_list#other-headsets","225":"/how_to_build/preparing_cameras#ir-filter-removal","226":"/how_to_build/preparing_cameras#_130°-ir-filter-removal","227":"/how_to_build/preparing_cameras#_160°-ir-filter-removal","228":"/how_to_build/preparing_cameras#blurry-camera","229":"/how_to_build/preparing_cameras#protecting-a-camera-ribbon-cable","230":"/how_to_build/preparing_cameras#wrapping-the-camera-ribbon","231":"/how_to_build/preparing_cameras#best-practices-when-handling-cameras","232":"/how_to_build/preparing_cameras#conclusion","233":"/how_to_build/preparing_xiao#how-to-prepare-a-seeed-studio-xiao-sense-esp32","234":"/how_to_build/preparing_xiao#what-s-in-the-box","235":"/how_to_build/preparing_xiao#wired-vs-wireless","236":"/how_to_build/preparing_xiao#wireless-configuration","237":"/how_to_build/preparing_xiao#wired-configuration","238":"/how_to_build/preparing_xiao#connecting-the-camera-hat","239":"/how_to_build/preparing_xiao#removing-the-camera","240":"/how_to_build/preparing_xiao#connecting-the-camera","241":"/how_to_build/preparing_xiao#conclusion","242":"/how_to_build/v4_full_build#v4-build-guide-wip","243":"/how_to_build/v4_full_build#prepare-you-hardware","244":"/how_to_build/v4_full_build#prepare-and-assemble-the-3d-printed-mounts","245":"/how_to_build/v4_full_build#wiring-it-up","246":"/how_to_build/v4_full_build#software","247":"/how_to_build/v4_full_build#wired","248":"/how_to_build/v4_full_build#wireless","249":"/misc/faq#frequently-asked-questions","250":"/misc/jlc3dp#_3d-printing-service-jlc3dp","251":"/misc/jlc3dp#if-you-don-t-own-a-3d-printer-you-can-order-high-quality-prints-by-the-dollar-using-jlc3dp","252":"/misc/jlc3dp#upload-your-stl-files-with-the-following-print-settings","253":"/misc/jlc3dp#choose-a-cheaper-shipping-option-for-me-this-is-global-standard-direct-line","254":"/misc/vrc_avatar_setup#how-to-set-up-your-avatar-for-eye-tracking","255":"/misc/vrc_avatar_setup#we-currently-use-the-following-paramaters","256":"/software_guide/VRCFT_tracking_module#vrcft-etvr-tracking-module-or-simply-the-etvr-tracking-module","257":"/software_guide/VRCFT_tracking_module#what-is-this","258":"/software_guide/VRCFT_tracking_module#what-do-i-need-and-how-do-i-set-this-up","259":"/software_guide/VRCFT_tracking_module#required-programs-files","260":"/software_guide/VRCFT_tracking_module#vrcft","261":"/software_guide/VRCFT_tracking_module#etvr-module","262":"/software_guide/VRCFT_tracking_module#setting-up-etvr-to-use-the-module","263":"/software_guide/VRCFT_tracking_module#sending-the-tracking-data-to-vrcft-running-on-a-separate-pc","264":"/software_guide/VRCFT_tracking_module#reseting-the-module-to-default-settings-in-case-something-went-wrong","265":"/software_guide/VRCFT_tracking_module#there-s-a-breaking-change-reported-what-does-that-mean-what-do-i-do","266":"/software_guide/VRCFT_tracking_module#dev-version-of-the-module-for-testing","267":"/software_guide/VRCFT_tracking_module#building-from-source","268":"/software_guide/VRCFT_tracking_module#download-the-etvr-module-source-from-github","269":"/software_guide/VRCFT_tracking_module#donwload-the-latest-vrcft-source","270":"/software_guide/VRCFT_tracking_module#install-visual-studio-or-jetbrains-rider-and-open-the-project","271":"/software_guide/VRCFT_tracking_module#building-the-module","272":"/software_guide/VRCFT_tracking_module#faq","273":"/software_guide/VRCFT_tracking_module#where-s-the-module-s-configuration-file","274":"/software_guide/VRCFT_tracking_module#what-do-the-fields-in-this-file-mean","275":"/software_guide/build_software#build-the-app-from-source","276":"/software_guide/build_software#this-guide-will-show-how-to-build-the-app-from-source","277":"/software_guide/build_software#requirements","278":"/software_guide/build_software#install-python","279":"/software_guide/build_software#installing-poetry","280":"/software_guide/build_software#install-the-required-python-modules","281":"/software_guide/build_software#build-the-app","282":"/software_guide/eyetrackvr_app_guide#how-to-install-run-and-adjust-the-eyetrackvr-app","283":"/software_guide/eyetrackvr_app_guide#step-1-download-the-eyetrackvr-installer-and-install-the-eyetrackvr-app","284":"/software_guide/eyetrackvr_app_guide#step-2-run-the-eyetrackvr-app","285":"/software_guide/eyetrackvr_app_guide#step-3-getting-familiar-with-settings-and-terminology","286":"/software_guide/eyetrackvr_app_guide#right-eye","287":"/software_guide/eyetrackvr_app_guide#left-eye","288":"/software_guide/eyetrackvr_app_guide#both-eyes","289":"/software_guide/eyetrackvr_app_guide#camera-address","290":"/software_guide/eyetrackvr_app_guide#tracking-mode","291":"/software_guide/eyetrackvr_app_guide#cropping-mode","292":"/software_guide/eyetrackvr_app_guide#threshold","293":"/software_guide/eyetrackvr_app_guide#rotation","294":"/software_guide/eyetrackvr_app_guide#restart-calibration","295":"/software_guide/eyetrackvr_app_guide#recenter-eye","296":"/software_guide/eyetrackvr_app_guide#step-4-adding-your-cameras-to-the-software-and-configuring-them","297":"/software_guide/eyetrackvr_app_guide#wireless-configuration","298":"/software_guide/eyetrackvr_app_guide#wired-configuration-experimental","299":"/software_guide/eyetrackvr_app_guide#note-this-is-a-beta-app-feature-only-please-use-the-latest-open-beta-in-the-discord","300":"/software_guide/eyetrackvr_app_guide#setting-up-roi","301":"/software_guide/eyetrackvr_app_guide#step-5-calibrating-your-eyes","302":"/software_guide/osc_setup#setting-up-recalibration-and-recentering-from-vrchat","303":"/software_guide/osc_setup#setting-up-your-parameters","304":"/software_guide/osc_setup#adding-parameters","305":"/software_guide/osc_setup#adding-buttons-to-the-menu","306":"/software_guide/osc_setup#resetting-the-osc-config-in-case-the-parameters-don-t-work","307":"/software_guide/osc_setup#other-platforms"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[5,1,1],"1":[9,5,86],"2":[7,5,28],"3":[5,5,31],"4":[5,5,45],"5":[3,1,15],"6":[1,3,1],"7":[2,3,1],"8":[1,3,1],"9":[7,1,13],"10":[2,7,1],"11":[1,9,19],"12":[1,9,32],"13":[1,7,1],"14":[2,8,15],"15":[1,10,41],"16":[1,1,33],"17":[3,1,34],"18":[2,4,37],"19":[6,4,63],"20":[2,4,96],"21":[3,1,18],"22":[2,1,19],"23":[2,2,1],"24":[1,3,43],"25":[3,3,160],"26":[3,1,1],"27":[14,3,1],"28":[6,3,126],"29":[2,8,1],"30":[1,10,50],"31":[1,10,67],"32":[2,10,68],"33":[1,10,44],"34":[2,1,1],"35":[4,2,55],"36":[2,2,81],"37":[2,2,113],"38":[4,1,41],"39":[7,4,89],"40":[3,1,1],"41":[3,3,32],"42":[9,6,23],"43":[8,6,30],"44":[5,6,92],"45":[5,6,36],"46":[6,6,17],"47":[4,6,26],"48":[5,3,23],"49":[4,8,13],"50":[5,8,34],"51":[6,8,22],"52":[6,8,43],"53":[1,1,1],"54":[4,1,45],"55":[4,1,1],"56":[2,5,70],"57":[4,5,22],"58":[2,1,33],"59":[1,1,1],"60":[6,2,22],"61":[2,1,1],"62":[4,2,41],"63":[4,2,1],"64":[3,6,39],"65":[1,6,36],"66":[1,6,118],"67":[1,6,54],"68":[2,7,106],"69":[2,7,40],"70":[2,7,57],"71":[2,6,46],"72":[4,1,15],"73":[5,4,10],"74":[1,9,1],"75":[1,9,1],"76":[4,4,29],"77":[4,4,28],"78":[5,4,110],"79":[2,1,46],"80":[3,2,10],"81":[2,4,29],"82":[6,4,53],"83":[3,2,13],"84":[5,5,65],"85":[6,1,27],"86":[6,6,1],"87":[8,12,69],"88":[9,12,52],"89":[4,6,22],"90":[4,6,105],"91":[3,6,1],"92":[4,9,21],"93":[6,9,52],"94":[8,15,134],"95":[9,15,125],"96":[7,6,69],"97":[6,1,83],"98":[1,6,40],"99":[1,1,56],"100":[2,1,58],"101":[3,1,124],"102":[2,1,16],"103":[1,1,21],"104":[2,1,40],"105":[3,1,18],"106":[6,1,146],"107":[3,7,84],"108":[6,7,65],"109":[3,1,1],"110":[4,4,38],"111":[8,4,26],"112":[8,4,26],"113":[5,4,21],"114":[8,8,27],"115":[8,8,27],"116":[2,1,51],"117":[4,1,25],"118":[7,1,74],"119":[6,1,1],"120":[16,6,1],"121":[4,22,29],"122":[5,22,15],"123":[5,22,54],"124":[4,22,33],"125":[10,22,1],"126":[2,1,34],"127":[5,3,37],"128":[6,2,1],"129":[2,10,68],"130":[4,10,43],"131":[3,10,66],"132":[3,8,1],"133":[3,10,82],"134":[2,10,111],"135":[3,10,67],"136":[3,10,90],"137":[7,2,1],"138":[2,12,27],"139":[6,9,1],"140":[7,1,62],"141":[1,7,53],"142":[2,1,1],"143":[4,2,7],"144":[2,6,21],"145":[4,6,28],"146":[3,6,38],"147":[3,6,46],"148":[4,2,7],"149":[2,6,21],"150":[4,6,31],"151":[3,6,38],"152":[3,6,46],"153":[3,1,47],"154":[5,3,20],"155":[4,1,1],"156":[25,4,29],"157":[11,4,43],"158":[6,4,31],"159":[13,4,46],"160":[5,4,28],"161":[4,4,24],"162":[6,4,25],"163":[3,1,1],"164":[10,3,1],"165":[16,3,53],"166":[8,3,18],"167":[9,3,25],"168":[7,3,20],"169":[8,3,9],"170":[13,3,123],"171":[6,3,69],"172":[8,3,35],"173":[12,3,18],"174":[10,3,35],"175":[12,3,67],"176":[7,3,59],"177":[14,3,15],"178":[8,3,12],"179":[8,3,48],"180":[7,3,9],"181":[8,3,87],"182":[7,3,65],"183":[5,3,18],"184":[5,3,28],"185":[5,3,84],"186":[2,8,59],"187":[2,8,19],"188":[3,3,49],"189":[10,1,1],"190":[5,10,16],"191":[1,12,11],"192":[1,12,47],"193":[1,12,39],"194":[4,10,53],"195":[8,1,1],"196":[5,8,88],"197":[4,8,57],"198":[3,1,1],"199":[3,1,16],"200":[4,3,32],"201":[6,3,1],"202":[4,8,93],"203":[7,3,1],"204":[4,9,88],"205":[2,1,48],"206":[4,2,32],"207":[8,6,81],"208":[9,6,58],"209":[2,2,12],"210":[3,4,1],"211":[1,7,46],"212":[6,7,77],"213":[1,4,1],"214":[3,5,51],"215":[10,5,97],"216":[4,5,56],"217":[10,4,120],"218":[3,4,46],"219":[2,4,1],"220":[2,6,28],"221":[10,6,136],"222":[3,2,41],"223":[3,2,34],"224":[2,5,69],"225":[3,1,40],"226":[4,4,1],"227":[4,4,1],"228":[3,1,71],"229":[5,1,53],"230":[4,5,104],"231":[5,5,39],"232":[1,5,18],"233":[9,1,1],"234":[5,9,20],"235":[3,9,19],"236":[2,9,33],"237":[2,9,22],"238":[4,9,48],"239":[3,9,35],"240":[3,9,56],"241":[1,9,13],"242":[5,1,53],"243":[3,5,16],"244":[7,5,63],"245":[3,5,23],"246":[1,5,24],"247":[1,5,52],"248":[1,5,24],"249":[3,1,1],"250":[4,1,1],"251":[18,4,7],"252":[9,20,34],"253":[13,20,27],"254":[10,1,22],"255":[6,10,17],"256":[8,1,1],"257":[4,8,54],"258":[10,8,17],"259":[3,18,1],"260":[1,20,10],"261":[2,20,34],"262":[7,18,38],"263":[12,18,83],"264":[12,18,40],"265":[14,18,55],"266":[7,8,100],"267":[3,13,1],"268":[7,16,27],"269":[5,16,53],"270":[10,16,27],"271":[3,16,53],"272":[1,8,1],"273":[7,9,52],"274":[9,9,137],"275":[5,1,1],"276":[11,5,17],"277":[1,5,1],"278":[2,5,15],"279":[2,5,42],"280":[5,5,25],"281":[3,5,30],"282":[10,1,1],"283":[9,10,19],"284":[6,10,33],"285":[8,10,17],"286":[2,16,9],"287":[2,16,9],"288":[2,16,7],"289":[2,16,30],"290":[2,16,12],"291":[2,16,10],"292":[1,16,15],"293":[1,16,23],"294":[2,16,16],"295":[2,16,13],"296":[11,10,1],"297":[2,17,49],"298":[4,17,1],"299":[16,21,32],"300":[3,17,96],"301":[5,10,66],"302":[8,1,59],"303":[4,8,1],"304":[2,9,85],"305":[5,9,116],"306":[10,8,54],"307":[2,8,48]},"averageFieldLength":[4.759740259740255,6.288961038961039,37.6331168831169],"storedFields":{"0":{"title":"Fox IR V2 Buil dInstructions","titles":[]},"1":{"title":"Step 15: Prepare to solder IR LED PCB V2s","titles":["Fox IR V2 Buil dInstructions"]},"2":{"title":"Step 17: Solder resistors on PCB V2","titles":["Fox IR V2 Buil dInstructions"]},"3":{"title":"Solder LEDs on PCB V2","titles":["Fox IR V2 Buil dInstructions"]},"4":{"title":"Wire up the PCBs V2","titles":["Fox IR V2 Buil dInstructions"]},"5":{"title":"EyeTrackVR Development Roadmap","titles":[]},"6":{"title":"Completed","titles":["EyeTrackVR Development Roadmap"]},"7":{"title":"In Progress","titles":["EyeTrackVR Development Roadmap"]},"8":{"title":"Planned","titles":["EyeTrackVR Development Roadmap"]},"9":{"title":"Development Documentation for the EyeTrackVR Docs Site","titles":[]},"10":{"title":"Getting Started","titles":["Development Documentation for the EyeTrackVR Docs Site"]},"11":{"title":"Prerequisites","titles":["Development Documentation for the EyeTrackVR Docs Site","Getting Started"]},"12":{"title":"Installation","titles":["Development Documentation for the EyeTrackVR Docs Site","Getting Started"]},"13":{"title":"Contributing","titles":["Development Documentation for the EyeTrackVR Docs Site"]},"14":{"title":"Project Structure","titles":["Development Documentation for the EyeTrackVR Docs Site","Contributing"]},"15":{"title":"Standards","titles":["Development Documentation for the EyeTrackVR Docs Site","Contributing","Project Structure"]},"16":{"title":"Pages","titles":[]},"17":{"title":"Adding a Page","titles":["Pages"]},"18":{"title":"Sub-directories","titles":["Pages","Adding a Page"]},"19":{"title":"Adding a Page to the Sidebar","titles":["Pages","Adding a Page"]},"20":{"title":"Title Style","titles":["Pages","Adding a Page"]},"21":{"title":"Editing a Page","titles":["Pages"]},"22":{"title":"Standards Guide","titles":[]},"23":{"title":"Code Standards","titles":["Standards Guide"]},"24":{"title":"General","titles":["Standards Guide","Code Standards"]},"25":{"title":"Git Commit Style","titles":["Standards Guide","Code Standards"]},"26":{"title":"Configuring the firmware","titles":[]},"27":{"title":"Once you have opened the project, you should see something on the left side like this","titles":["Configuring the firmware"]},"28":{"title":"Open the ini/user_config.ini file","titles":["Configuring the firmware"]},"29":{"title":"Additional configuration","titles":["Configuring the firmware","Open the ini/user_config.ini file"]},"30":{"title":"mDNS","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additional configuration"]},"31":{"title":"OTA","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additional configuration"]},"32":{"title":"REST API","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additional configuration"]},"33":{"title":"Environments","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additional configuration"]},"34":{"title":"Firmware Environments","titles":[]},"35":{"title":"What is it?","titles":["Firmware Environments"]},"36":{"title":"Build Types","titles":["Firmware Environments"]},"37":{"title":"Board Types","titles":["Firmware Environments"]},"38":{"title":"What is this?","titles":[]},"39":{"title":"What should I download and where?","titles":["What is this?"]},"40":{"title":"Firmware Flashing Tool","titles":[]},"41":{"title":"Before we proceed","titles":["Firmware Flashing Tool"]},"42":{"title":"Step 1: Download and Install the Firmware Flashing Tool","titles":["Firmware Flashing Tool","Before we proceed"]},"43":{"title":"Step 2: Run the Firmware Flashing Tool app","titles":["Firmware Flashing Tool","Before we proceed"]},"44":{"title":"Step 3: Select board.","titles":["Firmware Flashing Tool","Before we proceed"]},"45":{"title":"Step 4: Flash firmware.","titles":["Firmware Flashing Tool","Before we proceed"]},"46":{"title":"Step 5: That's it!.","titles":["Firmware Flashing Tool","Before we proceed"]},"47":{"title":"Step 6: Logs.","titles":["Firmware Flashing Tool","Before we proceed"]},"48":{"title":"How to configure wifi.","titles":["Firmware Flashing Tool"]},"49":{"title":"Step 1: Select board","titles":["Firmware Flashing Tool","How to configure wifi."]},"50":{"title":"Step 2: Configure wifi network","titles":["Firmware Flashing Tool","How to configure wifi."]},"51":{"title":"Step 3: Send wifi credentials.","titles":["Firmware Flashing Tool","How to configure wifi."]},"52":{"title":"Step 4: Get working stream.","titles":["Firmware Flashing Tool","How to configure wifi."]},"53":{"title":"MDNS","titles":[]},"54":{"title":"What is it?","titles":["MDNS"]},"55":{"title":"How to use it","titles":["MDNS"]},"56":{"title":"Enable mDNS","titles":["MDNS","How to use it"]},"57":{"title":"Connect to the device","titles":["MDNS","How to use it"]},"58":{"title":"Prerequisites Bonjour","titles":["MDNS"]},"59":{"title":"Troubleshooting","titles":["MDNS"]},"60":{"title":"Can not connect to the device","titles":["MDNS","Troubleshooting"]},"61":{"title":"REST API","titles":[]},"62":{"title":"What is it?","titles":["REST API"]},"63":{"title":"How to use it","titles":["REST API"]},"64":{"title":"REST API Client","titles":["REST API","How to use it"]},"65":{"title":"Standard","titles":["REST API","How to use it"]},"66":{"title":"Endpoints","titles":["REST API","How to use it"]},"67":{"title":"Params","titles":["REST API","How to use it"]},"68":{"title":"/wifi","titles":["REST API","How to use it","Params"]},"69":{"title":"/setDevice","titles":["REST API","How to use it","Params"]},"70":{"title":"/setTxPower","titles":["REST API","How to use it","Params"]},"71":{"title":"Camera Params","titles":["REST API","How to use it"]},"72":{"title":"Setting up the environment","titles":[]},"73":{"title":"1. Install Visual Studio Code","titles":["Setting up the environment"]},"74":{"title":"Download","titles":["Setting up the environment","1. Install Visual Studio Code"]},"75":{"title":"Install","titles":["Setting up the environment","1. Install Visual Studio Code"]},"76":{"title":"2. Install the drivers","titles":["Setting up the environment"]},"77":{"title":"3. Install PlatformIO IDE","titles":["Setting up the environment"]},"78":{"title":"4. Clone the firmware project","titles":["Setting up the environment"]},"79":{"title":"Updating Platformio","titles":[]},"80":{"title":"Updating PlatformIO itself","titles":["Updating Platformio"]},"81":{"title":"Via CLI","titles":["Updating Platformio","Updating PlatformIO itself"]},"82":{"title":"Via PlatformIO in Visual Studio Code","titles":["Updating Platformio","Updating PlatformIO itself"]},"83":{"title":"Upgrading the SDK","titles":["Updating Platformio"]},"84":{"title":"Upgrading the SDK via VSC","titles":["Updating Platformio","Upgrading the SDK"]},"85":{"title":"Building and uploading the firmware manually","titles":[]},"86":{"title":"1. Connect your tracker to your PC","titles":["Building and uploading the firmware manually"]},"87":{"title":"Option 1: Connect ESP32-CAM via the programmer","titles":["Building and uploading the firmware manually","1. Connect your tracker to your PC"]},"88":{"title":"Option 2: Connect ESP32-S3 via USB-C directly","titles":["Building and uploading the firmware manually","1. Connect your tracker to your PC"]},"89":{"title":"2. Build your firmware","titles":["Building and uploading the firmware manually"]},"90":{"title":"3. Upload your firmware","titles":["Building and uploading the firmware manually"]},"91":{"title":"Uploading via OTA","titles":["Building and uploading the firmware manually"]},"92":{"title":"What is it?","titles":["Building and uploading the firmware manually","Uploading via OTA"]},"93":{"title":"How do I use it?","titles":["Building and uploading the firmware manually","Uploading via OTA"]},"94":{"title":"For firmware versions 1.1.0 and up:","titles":["Building and uploading the firmware manually","Uploading via OTA","How do I use it?"]},"95":{"title":"For firmware versions of 1.0.0 and under:","titles":["Building and uploading the firmware manually","Uploading via OTA","How do I use it?"]},"96":{"title":"Finding the IP address of your tracker","titles":["Building and uploading the firmware manually"]},"97":{"title":"Updating the firmware to the newest version","titles":[]},"98":{"title":"Troubleshooting","titles":["Updating the firmware to the newest version"]},"99":{"title":"EyeTrackVR","titles":[]},"100":{"title":"Get Started","titles":["EyeTrackVR"]},"101":{"title":"Eye Safety Notice","titles":["EyeTrackVR"]},"102":{"title":"Hardware Overview","titles":["EyeTrackVR"]},"103":{"title":"Firmware","titles":["EyeTrackVR"]},"104":{"title":"Headset Compatibility","titles":["EyeTrackVR"]},"105":{"title":"Community & Support","titles":["EyeTrackVR"]},"106":{"title":"Near‑Eye Infrared (IR) Emitter Safety","titles":[null]},"107":{"title":"Relevant Safety Limits","titles":[null,"Near‑Eye Infrared (IR) Emitter Safety"]},"108":{"title":"Why Current (mA) Isn’t Enough","titles":[null,"Near‑Eye Infrared (IR) Emitter Safety"]},"109":{"title":"Hardware Exposure Calculations","titles":[null]},"110":{"title":"LED: XL‑3216HIRC‑850","titles":[null,"Hardware Exposure Calculations"]},"111":{"title":"V3 Module (2 LEDs @ 3.2 mA each)","titles":[null,"Hardware Exposure Calculations"]},"112":{"title":"V4 Module (4 LEDs @ 2.4 mA each)","titles":[null,"Hardware Exposure Calculations"]},"113":{"title":"Worst-Case (High Bin) Calculations","titles":[null,"Hardware Exposure Calculations"]},"114":{"title":"V3 Max Bin (2 LEDs @ 3.2 mA):","titles":[null,"Hardware Exposure Calculations","Worst-Case (High Bin) Calculations"]},"115":{"title":"V4 Max Bin (4 LEDs @ 2.4 mA):","titles":[null,"Hardware Exposure Calculations","Worst-Case (High Bin) Calculations"]},"116":{"title":"Your Responsibilities","titles":[null]},"117":{"title":"Appendix A – Formula Summary","titles":[null]},"118":{"title":"Appendix B – Quoted Guideline (ICNIRP 2013)","titles":[null]},"119":{"title":"Things To Know Before You Start","titles":[]},"120":{"title":"This page is an overview of things to know and understand before you start this project","titles":["Things To Know Before You Start"]},"121":{"title":"Software is not final","titles":["Things To Know Before You Start","This page is an overview of things to know and understand before you start this project"]},"122":{"title":"Firmware may have user difficulties","titles":["Things To Know Before You Start","This page is an overview of things to know and understand before you start this project"]},"123":{"title":"IR emitters can be dangerous","titles":["Things To Know Before You Start","This page is an overview of things to know and understand before you start this project"]},"124":{"title":"Documentation may be incomplete","titles":["Things To Know Before You Start","This page is an overview of things to know and understand before you start this project"]},"125":{"title":"Once you have acknowledged the items above, move on to the","titles":["Things To Know Before You Start","This page is an overview of things to know and understand before you start this project"]},"126":{"title":"Valve Index","titles":[]},"127":{"title":"Recommended Valve Index lens mounts","titles":["Valve Index",null]},"128":{"title":"MUTEtheCyberwolf's DEV Frunk Mod:","titles":["Valve Index"]},"129":{"title":"Mod Details","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Recommended Valve Index lens mounts"]},"130":{"title":"Extra Parts Needed:","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Recommended Valve Index lens mounts"]},"131":{"title":"3D Printed Mounts","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Recommended Valve Index lens mounts"]},"132":{"title":"Assembly Details:","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:"]},"133":{"title":"1. Heat Inserts","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Assembly Details:"]},"134":{"title":"2. Screws","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Assembly Details:"]},"135":{"title":"3. Mounting components","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Assembly Details:"]},"136":{"title":"4. Replacing frunk","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Assembly Details:"]},"137":{"title":"Physics-Dude's Gumstick USB Hub Dongle","titles":["Valve Index"]},"138":{"title":"Mod Details","titles":["Valve Index","Physics-Dude's Gumstick USB Hub Dongle","Assembly Details:"]},"139":{"title":"Installation instructions and BOM available on","titles":["Valve Index","Physics-Dude's Gumstick USB Hub Dongle"]},"140":{"title":"What are "Headset Specific Guides"?","titles":[]},"141":{"title":"Guidelines","titles":["What are "Headset Specific Guides"?",null]},"142":{"title":"Headset Name","titles":[]},"143":{"title":"Xyz's mod:","titles":["Headset Name"]},"144":{"title":"Mod Details","titles":["Headset Name","Xyz's mod:",null]},"145":{"title":"Extra Parts Needed:","titles":["Headset Name","Xyz's mod:",null]},"146":{"title":"3D Printed Mounts","titles":["Headset Name","Xyz's mod:",null]},"147":{"title":"Assembly Details:","titles":["Headset Name","Xyz's mod:",null]},"148":{"title":"Abc's mod:","titles":["Headset Name"]},"149":{"title":"Mod Details","titles":["Headset Name","Abc's mod:",null]},"150":{"title":"Extra Parts Needed:","titles":["Headset Name","Abc's mod:",null]},"151":{"title":"3D Printed Mounts","titles":["Headset Name","Abc's mod:",null]},"152":{"title":"Assembly Details:","titles":["Headset Name","Abc's mod:",null]},"153":{"title":"3D Printed Mounts","titles":[]},"154":{"title":"Dont see your headset?","titles":["3D Printed Mounts"]},"155":{"title":"Creating Your Own Mount","titles":[]},"156":{"title":"This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts","titles":["Creating Your Own Mount"]},"157":{"title":"Step 1: Find a way to mount to your headset's lens","titles":["Creating Your Own Mount"]},"158":{"title":"Step 2: Find a camera mount","titles":["Creating Your Own Mount"]},"159":{"title":"Step 3: Place the camera mount where it will give a good camera angle","titles":["Creating Your Own Mount"]},"160":{"title":"Step 4: Mount your LEDs","titles":["Creating Your Own Mount"]},"161":{"title":"Step 5: Test everything","titles":["Creating Your Own Mount"]},"162":{"title":"Step 6: Get your mounts listed","titles":["Creating Your Own Mount"]},"163":{"title":"V3 Build Guide","titles":[]},"164":{"title":"This page will contain a step-by-step assembly guide.","titles":["V3 Build Guide"]},"165":{"title":"Updated documentation for V4 is still in progress and not updated here, please be patient.","titles":["V3 Build Guide"]},"166":{"title":"Step 1: Make sure your have read the","titles":["V3 Build Guide"]},"167":{"title":"Step 2: Order all the parts listed on our","titles":["V3 Build Guide"]},"168":{"title":"Step 3: Wait for things to arrive","titles":["V3 Build Guide"]},"169":{"title":"Step 4: Gather up all of your hardware","titles":["V3 Build Guide"]},"170":{"title":"Step 5: Install external antennas or shield ESP antenna with an antistatic bag","titles":["V3 Build Guide"]},"171":{"title":"Step 6: Attach cameras to ESPs","titles":["V3 Build Guide"]},"172":{"title":"Step 7: Connect ESP to the programmer to flash","titles":["V3 Build Guide"]},"173":{"title":"Step 8: Configure Visual Studio Code and prepare to flash the firmware","titles":["V3 Build Guide"]},"174":{"title":"Step 9: Plug in your ESP and flash the firmware","titles":["V3 Build Guide"]},"175":{"title":"Step 10: Connect your power wires to a USB Type-A board","titles":["V3 Build Guide"]},"176":{"title":"Step 11: Cut wires for IR LEDs","titles":["V3 Build Guide"]},"177":{"title":"Step 12: Twist the positive USB wire and positive IR LED wires together and tin them","titles":["V3 Build Guide"]},"178":{"title":"Step 13: Solder the positive wire to ESP","titles":["V3 Build Guide"]},"179":{"title":"Step 14: Solder the negative wire to ESP","titles":["V3 Build Guide"]},"180":{"title":"Step 15: Wire up the 2nd ESP","titles":["V3 Build Guide"]},"181":{"title":"Step 16: Prepare to solder IR LED PCBs","titles":["V3 Build Guide"]},"182":{"title":"Step 18: Solder resistors on PCB V3","titles":["V3 Build Guide"]},"183":{"title":"Solder LEDs on PCB V3","titles":["V3 Build Guide"]},"184":{"title":"Wire up the PCBs V3","titles":["V3 Build Guide"]},"185":{"title":"Step 19: 3D print mounts","titles":["V3 Build Guide"]},"186":{"title":"Type 1","titles":["V3 Build Guide","Step 19: 3D print mounts"]},"187":{"title":"Type 2","titles":["V3 Build Guide","Step 19: 3D print mounts"]},"188":{"title":"IR LED mounting","titles":["V3 Build Guide"]},"189":{"title":"How to assemble a V4 mini LED hardware kit:","titles":[]},"190":{"title":"Getting to know your hardware","titles":["How to assemble a V4 mini LED hardware kit:"]},"191":{"title":"Mainboard","titles":["How to assemble a V4 mini LED hardware kit:","Getting to know your hardware"]},"192":{"title":"LEDs","titles":["How to assemble a V4 mini LED hardware kit:","Getting to know your hardware"]},"193":{"title":"Wires","titles":["How to assemble a V4 mini LED hardware kit:","Getting to know your hardware"]},"194":{"title":"Wiring up V4 mini","titles":["How to assemble a V4 mini LED hardware kit:"]},"195":{"title":"How to assemble V4 Lite LED kit:","titles":[]},"196":{"title":"Getting to know V4 lite","titles":["How to assemble V4 Lite LED kit:"]},"197":{"title":"Wiring up V4 Lite","titles":["How to assemble V4 Lite LED kit:"]},"198":{"title":"Required Parts:","titles":[]},"199":{"title":"Additional Parts:","titles":[]},"200":{"title":"ESP setup options:","titles":["Additional Parts:"]},"201":{"title":"Option 1: Wired over USB Serial","titles":["Additional Parts:"]},"202":{"title":"Wired Capable ESPs:","titles":["Additional Parts:","Option 1: Wired over USB Serial"]},"203":{"title":"Option 2: Wireless over WiFi 2.4 GHz","titles":["Additional Parts:"]},"204":{"title":"Wireless Capable ESPs:","titles":["Additional Parts:","Option 2: Wireless over WiFi 2.4 GHz"]},"205":{"title":"Parts List","titles":[]},"206":{"title":"ESP setup options:","titles":["Parts List"]},"207":{"title":"Option 1: Wireless over WiFi 2.4 GHz","titles":["Parts List","ESP setup options:"]},"208":{"title":"Option 2: Wired over USB Serial (in beta)","titles":["Parts List","ESP setup options:"]},"209":{"title":"Required parts","titles":["Parts List"]},"210":{"title":"Tracker boards:","titles":["Parts List","Required parts"]},"211":{"title":"Recommended","titles":["Parts List","Required parts","Tracker boards:"]},"212":{"title":"A cheaper, wireless only alternative:","titles":["Parts List","Required parts","Tracker boards:"]},"213":{"title":"Cameras","titles":["Parts List","Required parts"]},"214":{"title":"Camera modules:","titles":["Parts List","Required parts","Cameras"]},"215":{"title":"2x OV2640 160° FOV IR / Night vers 75mm (850nm)","titles":["Parts List","Required parts","Cameras"]},"216":{"title":"Optional Ribbon extensions:","titles":["Parts List","Required parts","Cameras"]},"217":{"title":"USB Hubs - for if you are building the wired version","titles":["Parts List","Required parts"]},"218":{"title":"Wires and adapters","titles":["Parts List","Required parts"]},"219":{"title":"IR emitters","titles":["Parts List","Required parts"]},"220":{"title":"Recommended:","titles":["Parts List","Required parts","IR emitters"]},"221":{"title":"Alternatively you can source the parts for V3 yourself:","titles":["Parts List","Required parts","IR emitters"]},"222":{"title":"3D Printed Mounts","titles":["Parts List"]},"223":{"title":"Misc parts/tools","titles":["Parts List"]},"224":{"title":"Other Headsets","titles":["Parts List","Misc parts/tools"]},"225":{"title":"IR Filter Removal","titles":[]},"226":{"title":"130° IR Filter removal","titles":["IR Filter Removal",null]},"227":{"title":"160° IR Filter removal","titles":["IR Filter Removal",null]},"228":{"title":"Blurry Camera?","titles":[]},"229":{"title":"Protecting a Camera Ribbon Cable","titles":[]},"230":{"title":"Wrapping the Camera Ribbon","titles":["Protecting a Camera Ribbon Cable"]},"231":{"title":"Best Practices When Handling Cameras","titles":["Protecting a Camera Ribbon Cable"]},"232":{"title":"Conclusion","titles":["Protecting a Camera Ribbon Cable"]},"233":{"title":"How to prepare a Seeed Studio XIAO Sense ESP32","titles":[]},"234":{"title":"What's in the box","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"235":{"title":"Wired vs Wireless","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"236":{"title":"Wireless Configuration","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"237":{"title":"Wired Configuration","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"238":{"title":"Connecting the Camera Hat","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"239":{"title":"Removing the Camera","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"240":{"title":"Connecting the camera","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"241":{"title":"Conclusion","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"242":{"title":"V4 Build Guide (WIP)","titles":[]},"243":{"title":"Prepare you hardware","titles":["V4 Build Guide (WIP)"]},"244":{"title":"Prepare and assemble the 3d printed mounts","titles":["V4 Build Guide (WIP)"]},"245":{"title":"Wiring it up","titles":["V4 Build Guide (WIP)"]},"246":{"title":"Software","titles":["V4 Build Guide (WIP)"]},"247":{"title":"Wired","titles":["V4 Build Guide (WIP)","Software"]},"248":{"title":"Wireless","titles":["V4 Build Guide (WIP)","Software"]},"249":{"title":"Frequently Asked Questions","titles":[]},"250":{"title":"3D Printing Service JLC3DP","titles":[]},"251":{"title":"If you don't own a 3D Printer, you can order high quality prints by the dollar using JLC3DP","titles":["3D Printing Service JLC3DP"]},"252":{"title":"Upload your STL files with the following print settings","titles":["3D Printing Service JLC3DP","If you don't own a 3D Printer, you can order high quality prints by the dollar using JLC3DP"]},"253":{"title":"Choose a cheaper shipping option, for me this is global standard direct line","titles":["3D Printing Service JLC3DP","If you don't own a 3D Printer, you can order high quality prints by the dollar using JLC3DP"]},"254":{"title":"How to set up your avatar for eye tracking:","titles":[]},"255":{"title":"We currently use the following paramaters","titles":["How to set up your avatar for eye tracking:",null]},"256":{"title":"VRCFT ETVR Tracking module, or simply the ETVR tracking module","titles":[]},"257":{"title":"What is this?","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module"]},"258":{"title":"What do I need and how do I set this up?","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module"]},"259":{"title":"Required programs / Files","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?"]},"260":{"title":"VRCFT","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?","Required programs / Files"]},"261":{"title":"ETVR Module","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?","Required programs / Files"]},"262":{"title":"Setting up ETVR to use the module","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?"]},"263":{"title":"Sending the tracking data to VRCFT running on a separate PC.","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?"]},"264":{"title":"Reseting the module to default settings in case something went wrong.","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?"]},"265":{"title":"There's a breaking change reported, what does that mean? What do I do?","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?"]},"266":{"title":"Dev version of the module for testing","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module"]},"267":{"title":"Building from source","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","Dev version of the module for testing"]},"268":{"title":"Download the ETVR Module source from github","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","Dev version of the module for testing","Building from source"]},"269":{"title":"Donwload the latest VRCFT Source","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","Dev version of the module for testing","Building from source"]},"270":{"title":"Install Visual Studio or Jetbrains Rider, and open the project","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","Dev version of the module for testing","Building from source"]},"271":{"title":"Building the module","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","Dev version of the module for testing","Building from source"]},"272":{"title":"FAQ","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module"]},"273":{"title":"Where's the module's configuration file?","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","FAQ"]},"274":{"title":"WHat do the fields in this file mean?","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","FAQ"]},"275":{"title":"Build the app from source","titles":[]},"276":{"title":"This guide will show how to build the app from source","titles":["Build the app from source"]},"277":{"title":"Requirements","titles":["Build the app from source"]},"278":{"title":"Install Python","titles":["Build the app from source"]},"279":{"title":"Installing Poetry","titles":["Build the app from source"]},"280":{"title":"Install the required Python modules","titles":["Build the app from source"]},"281":{"title":"Build the app","titles":["Build the app from source"]},"282":{"title":"How to install, run and adjust the EyeTrackVR app.","titles":[]},"283":{"title":"Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app","titles":["How to install, run and adjust the EyeTrackVR app.",null]},"284":{"title":"Step 2: Run the EyeTrackVR app","titles":["How to install, run and adjust the EyeTrackVR app."]},"285":{"title":"Step 3: Getting familiar with settings and terminology","titles":["How to install, run and adjust the EyeTrackVR app."]},"286":{"title":"Right eye","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"287":{"title":"Left eye","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"288":{"title":"Both eyes","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"289":{"title":"Camera Address","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"290":{"title":"Tracking Mode","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"291":{"title":"Cropping Mode","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"292":{"title":"Threshold","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"293":{"title":"Rotation","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"294":{"title":"Restart Calibration","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"295":{"title":"Recenter Eye","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"296":{"title":"Step 4: Adding your cameras to the software and configuring them","titles":["How to install, run and adjust the EyeTrackVR app."]},"297":{"title":"Wireless configuration","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them"]},"298":{"title":"Wired configuration (experimental)","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them"]},"299":{"title":"Note this is a Beta app feature only. Please use the latest Open Beta in the Discord.","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them","Wired configuration (experimental)"]},"300":{"title":"Setting up ROI","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them"]},"301":{"title":"Step 5: Calibrating your eyes","titles":["How to install, run and adjust the EyeTrackVR app."]},"302":{"title":"Setting up recalibration and recentering from VRChat.","titles":[]},"303":{"title":"Setting up your parameters","titles":["Setting up recalibration and recentering from VRChat."]},"304":{"title":"Adding parameters","titles":["Setting up recalibration and recentering from VRChat.","Setting up your parameters"]},"305":{"title":"Adding buttons to the menu","titles":["Setting up recalibration and recentering from VRChat.","Setting up your parameters"]},"306":{"title":"Resetting the OSC config in case the parameters don't work","titles":["Setting up recalibration and recentering from VRChat."]},"307":{"title":"Other platforms","titles":["Setting up recalibration and recentering from VRChat."]}},"dirtCount":0,"index":[["+",{"2":{"223":1}}],["9001",{"2":{"307":1}}],["93",{"2":{"274":1}}],["99",{"2":{"274":1}}],["97",{"2":{"274":1}}],["9",{"0":{"174":1}}],["96",{"2":{"115":2,"274":1}}],["qdot",{"2":{"158":1}}],["quite",{"2":{"273":1}}],["quirks",{"2":{"140":1,"147":1,"152":1}}],["quick",{"2":{"82":2,"84":1}}],["quest",{"2":{"157":1,"216":1}}],["questions",{"0":{"249":1},"2":{"98":1,"124":1}}],["question",{"2":{"98":1}}],["query",{"2":{"67":1}}],["quality",{"0":{"251":1},"1":{"252":1,"253":1},"2":{"71":3,"204":1,"207":1,"217":1}}],["quote",{"2":{"251":1}}],["quoted",{"0":{"118":1}}],["quot",{"0":{"140":2},"1":{"141":2},"2":{"19":14,"20":2,"56":2,"95":4,"147":2,"152":2,"157":2,"159":2,"192":6,"215":2,"217":2,"230":2,"274":8,"304":4,"305":6}}],["★",{"2":{"153":1,"222":1}}],["|",{"2":{"130":3,"279":1}}],["λ",{"2":{"118":1}}],["~45",{"2":{"231":1}}],["~350ohm",{"2":{"181":1}}],["~2",{"2":{"143":1,"148":1}}],["~12",{"2":{"115":1}}],["~8",{"2":{"112":1,"114":1}}],["~5",{"2":{"111":1}}],["~700ohm",{"2":{"1":2,"181":1}}],["×",{"2":{"110":1,"111":2,"112":2,"114":2,"115":2,"117":3,"242":6}}],["⇒",{"2":{"110":1}}],["π",{"2":{"108":2,"110":1,"111":1,"112":1,"114":1,"115":1}}],["≈",{"2":{"108":1,"110":1}}],["→",{"2":{"108":2,"111":1,"112":1,"114":1,"115":1}}],["θ",{"2":{"108":2,"110":1}}],["ω",{"2":{"108":4,"110":1,"117":2}}],["≤",{"2":{"107":1}}],["≥10",{"2":{"107":1}}],["µm",{"2":{"101":1,"118":1}}],["zip",{"2":{"78":1,"268":1}}],["jetbrains",{"0":{"270":1}}],["jerk",{"2":{"231":1}}],["jlc",{"2":{"253":1}}],["jlc3dp",{"0":{"250":1,"251":1},"1":{"251":1,"252":2,"253":2},"2":{"251":1}}],["job",{"2":{"159":1}}],["joints",{"2":{"196":1}}],["joint",{"2":{"179":1}}],["join",{"2":{"105":1}}],["just",{"2":{"94":1,"106":1,"134":1,"145":1,"150":1,"160":1,"162":1,"212":1,"215":3,"263":1,"268":1,"270":1,"271":2}}],["jpeg",{"2":{"71":1}}],["json",{"2":{"66":1,"273":1}}],["js",{"2":{"11":1,"19":2}}],["04",{"2":{"274":1}}],["01",{"2":{"274":1}}],["06",{"2":{"274":3}}],["05",{"2":{"274":1}}],["05m",{"2":{"217":1}}],["0+",{"2":{"217":1}}],["0001",{"2":{"162":1,"185":1}}],["0",{"0":{"94":1,"95":2},"2":{"71":3,"94":1,"101":1,"107":1,"111":5,"112":5,"114":3,"115":4,"130":1,"170":1,"202":1,"216":1,"217":1,"263":2,"274":24,"278":1,"279":1}}],["89",{"2":{"274":2}}],["8889",{"2":{"274":1}}],["8mm",{"2":{"130":1,"223":1}}],["8x",{"2":{"130":1}}],["80",{"2":{"111":2}}],["850nm",{"0":{"215":1},"2":{"215":1}}],["850",{"0":{"110":1},"2":{"107":1}}],["8",{"0":{"173":1},"2":{"68":3,"70":3,"107":1,"113":1,"114":1,"115":1}}],["81",{"2":{"65":2,"67":1,"94":1,"114":1}}],["75mm",{"0":{"215":1},"2":{"215":2}}],["70",{"2":{"202":1,"208":1}}],["7",{"0":{"172":1},"2":{"71":1,"107":1,"279":1}}],["7dbm",{"2":{"68":2,"70":2}}],["74",{"2":{"68":1,"70":1}}],["76",{"2":{"68":1,"70":1,"112":1}}],["780",{"2":{"118":1}}],["78",{"2":{"68":1,"70":1}}],["=",{"2":{"56":1,"65":2,"67":2,"68":13,"70":13,"71":2,"95":4,"108":9,"110":3,"111":6,"112":6,"114":6,"115":6,"117":5}}],["65ohm",{"2":{"197":1}}],["6x",{"2":{"130":1}}],["6mm",{"2":{"130":1}}],["62471",{"2":{"107":1}}],["63",{"2":{"71":1}}],["60°",{"2":{"108":2,"110":2}}],["60825",{"2":{"107":1}}],["60",{"2":{"68":1,"70":1,"112":2}}],["68",{"2":{"68":1,"70":1}}],["6",{"0":{"47":1,"162":1,"171":1}}],["357",{"2":{"221":1}}],["350ohm",{"2":{"221":1}}],["3mm",{"2":{"175":1}}],["3653631",{"2":{"157":1}}],["31",{"2":{"115":2}}],["3d",{"0":{"131":1,"146":1,"151":1,"153":1,"185":1,"222":1,"244":1,"250":1,"251":1},"1":{"154":1,"186":1,"187":1,"251":1,"252":2,"253":2},"2":{"104":1,"140":1,"157":1,"185":1,"242":1,"244":1,"251":1}}],["38",{"2":{"101":1}}],["3216hirc",{"0":{"110":1}}],["3232",{"2":{"95":1}}],["32",{"2":{"84":1,"211":1}}],["348",{"2":{"221":1}}],["34",{"2":{"68":1,"70":1,"218":1,"221":1}}],["3",{"0":{"44":1,"51":1,"77":1,"90":1,"111":1,"114":1,"135":1,"159":1,"168":1,"285":1},"1":{"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"68":2,"101":1,"111":1,"114":1,"118":1,"176":1,"190":1,"192":1,"193":1,"197":1,"212":1,"215":1,"217":1,"242":1,"278":1}}],["30mm",{"2":{"130":1}}],["30x30x7mm",{"2":{"129":1}}],["30",{"2":{"11":1}}],["x",{"2":{"230":1}}],["xyz",{"0":{"143":1},"1":{"144":1,"145":1,"146":1,"147":1},"2":{"146":1}}],["xl",{"0":{"110":1}}],["xxx",{"2":{"52":4}}],["xiaos",{"2":{"211":1,"235":1}}],["xiaosenses3",{"2":{"36":2,"37":2}}],["xiao",{"0":{"233":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"41":1,"129":1,"131":3,"134":2,"135":3,"202":1,"204":1,"211":1,"234":1,"238":1,"239":1,"241":1,"243":1}}],["xaio",{"2":{"37":2}}],["knife",{"2":{"230":1}}],["known",{"2":{"106":1,"238":1}}],["know",{"0":{"119":1,"120":1,"190":1,"196":1},"1":{"120":1,"121":2,"122":2,"123":2,"124":2,"125":2,"191":1,"192":1,"193":1},"2":{"19":2,"39":1,"54":1,"100":1,"106":1,"145":1,"150":1,"196":1,"224":2}}],["kick",{"2":{"274":2}}],["kill",{"2":{"229":1}}],["killing",{"2":{"229":1}}],["kind",{"2":{"185":1}}],["kit",{"0":{"189":1,"195":1},"1":{"190":1,"191":1,"192":1,"193":1,"194":1,"196":1,"197":1},"2":{"127":2,"130":1,"135":1,"190":1,"193":1,"194":1,"217":1,"220":3,"242":1}}],["kits",{"2":{"106":1,"123":1,"220":1}}],["key",{"2":{"107":1}}],["keep",{"2":{"20":2,"30":1,"54":1,"96":1,"101":1,"118":1,"135":1,"141":1,"153":1,"177":1,"215":1}}],["mtt",{"2":{"202":1,"217":2}}],["m3",{"2":{"150":1}}],["m2",{"2":{"147":1,"152":1}}],["m4x30",{"2":{"130":1,"134":2}}],["m4x10",{"2":{"130":1,"134":2}}],["m4x8",{"2":{"130":1}}],["m4",{"2":{"130":3}}],["m⁻²",{"2":{"118":1}}],["mrad",{"2":{"107":1}}],["mm",{"2":{"107":1}}],["m²",{"2":{"107":1}}],["mw",{"2":{"101":2,"107":3,"108":1,"110":1,"111":3,"112":3,"113":1,"114":3,"115":3,"118":1}}],["mb",{"2":{"87":1,"90":1}}],["middle",{"2":{"135":1,"136":1,"197":2}}],["mirror",{"2":{"127":1,"153":1,"252":1}}],["minimum",{"2":{"217":1}}],["mini",{"0":{"189":1,"194":1},"1":{"190":1,"191":1,"192":1,"193":1,"194":1},"2":{"191":1,"217":1}}],["mind",{"2":{"96":1,"153":1,"209":1,"215":1}}],["minute",{"2":{"95":1}}],["minus",{"2":{"68":1,"70":1}}],["might",{"2":{"90":1,"244":1}}],["microsoft",{"2":{"263":1}}],["micro",{"2":{"87":1}}],["misc",{"0":{"223":1},"1":{"224":1}}],["miscelleneous",{"2":{"82":1}}],["mishap",{"2":{"221":1}}],["missing",{"2":{"25":2,"36":1,"44":1,"124":1,"194":1}}],["multiplied",{"2":{"274":1}}],["multiple",{"2":{"33":2,"35":1,"129":1,"185":1}}],["mute",{"2":{"216":2}}],["mutethecyberwolf",{"0":{"128":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1},"2":{"131":1}}],["much",{"2":{"129":1,"177":1,"182":1,"202":1,"208":1,"211":1,"265":1,"274":1}}],["must",{"2":{"20":1,"68":1,"70":1,"85":1,"95":1,"101":1,"126":1,"136":1,"147":1,"152":1,"196":2,"279":1}}],["mock",{"2":{"176":1}}],["months",{"2":{"168":1}}],["monitor",{"2":{"95":1,"96":2}}],["monitoring",{"2":{"95":1}}],["mounted",{"2":{"202":1,"208":1,"216":1}}],["mount",{"0":{"155":1,"156":1,"157":1,"158":1,"159":1,"160":1},"1":{"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1},"2":{"104":2,"127":1,"129":2,"131":1,"134":2,"135":2,"140":1,"146":3,"151":3,"156":1,"158":2,"160":1,"161":2,"162":1,"185":1,"186":3,"187":2,"188":2,"216":1,"222":2,"224":5,"231":1,"244":4,"252":1}}],["mounts",{"0":{"127":1,"131":1,"146":1,"151":1,"153":1,"156":1,"162":1,"185":1,"222":1,"244":1},"1":{"129":1,"130":1,"131":1,"154":1,"186":1,"187":1},"2":{"102":1,"140":1,"146":1,"151":1,"153":3,"154":3,"156":1,"159":1,"185":2,"216":1,"222":2,"224":1,"242":1,"244":2}}],["mounting",{"0":{"135":1,"188":1},"2":{"100":1,"129":1,"136":1,"186":1,"228":2}}],["moment",{"2":{"79":1}}],["moving",{"2":{"78":1,"133":1,"300":1,"301":1}}],["movement",{"2":{"274":1}}],["move",{"0":{"125":1},"2":{"14":1,"44":1,"95":1,"134":1,"170":1,"173":1,"274":1,"300":1}}],["mobile",{"2":{"62":1}}],["more",{"2":{"32":1,"33":1,"37":1,"62":1,"68":1,"71":2,"78":1,"94":1,"129":1,"134":1,"138":1,"167":1,"192":1,"202":1,"204":2,"205":1,"207":2,"208":1,"215":1,"228":1,"230":1,"269":1,"274":1,"305":1}}],["mostly",{"2":{"165":1}}],["most",{"2":{"28":1,"37":1,"153":1,"222":1,"261":1}}],["modified",{"2":{"131":2,"199":1,"265":1}}],["modify",{"2":{"25":1,"116":1,"273":1}}],["mod",{"0":{"128":1,"129":1,"138":1,"143":1,"144":1,"148":1,"149":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"144":1,"145":1,"146":1,"147":1,"149":1,"150":1,"151":1,"152":1},"2":{"143":1,"144":1,"148":1,"149":1,"216":1}}],["modules",{"0":{"214":1,"280":1},"2":{"211":1,"212":1,"266":1,"280":1}}],["module",{"0":{"111":1,"112":1,"256":2,"261":1,"262":1,"264":1,"266":1,"268":1,"271":1,"273":1},"1":{"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":3,"268":3,"269":3,"270":3,"271":3,"272":2,"273":2,"274":2},"2":{"207":1,"257":2,"258":1,"261":2,"262":2,"263":2,"264":3,"265":3,"266":6,"269":3,"274":2}}],["modeling",{"2":{"224":1}}],["model",{"2":{"104":1,"225":1}}],["mode",{"0":{"290":1,"291":1},"2":{"28":9,"37":6,"49":1,"68":1,"88":1,"170":1,"290":1,"294":1,"300":2,"301":1}}],["menu",{"0":{"305":1},"2":{"305":3}}],["mentioned",{"2":{"304":1,"305":1,"307":1}}],["mechanism",{"2":{"302":1}}],["melt",{"2":{"244":1}}],["me",{"0":{"253":1},"2":{"140":1,"145":1,"150":1,"162":2,"185":1}}],["mess",{"2":{"175":1,"188":1}}],["messing",{"2":{"106":1}}],["messages",{"2":{"274":1,"302":1,"307":1}}],["message",{"2":{"97":1}}],["measure",{"2":{"108":1}}],["measures",{"2":{"101":1,"106":1}}],["mean",{"0":{"265":1,"274":1},"2":{"265":1}}],["means",{"2":{"31":1,"32":1,"33":1,"54":1,"79":1,"106":1,"221":1,"224":1}}],["meaning",{"2":{"25":1,"304":1}}],["memory",{"2":{"66":1,"68":2,"304":1}}],["members",{"2":{"15":1}}],["method",{"2":{"66":3,"90":1,"186":2,"187":1,"293":1}}],["mdns",{"0":{"30":1,"53":1,"56":1},"1":{"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1},"2":{"30":3,"31":2,"54":2,"56":1,"58":1,"66":1,"69":2,"94":3,"95":2,"248":1}}],["md",{"2":{"17":1,"18":1,"19":1,"20":1,"141":4}}],["my",{"2":{"17":2,"18":4,"19":4,"20":2,"175":1,"182":2}}],["male",{"2":{"136":1,"218":1}}],["matters",{"2":{"197":1}}],["match",{"2":{"123":1}}],["matches",{"2":{"95":1}}],["matures",{"2":{"122":1}}],["ma",{"0":{"108":1,"111":1,"112":1,"114":1,"115":1},"2":{"108":1,"110":2,"113":1,"117":1}}],["manager",{"2":{"247":1,"299":1}}],["manage",{"2":{"207":1,"245":1,"279":1}}],["many",{"2":{"95":1,"99":1,"100":1,"225":1,"228":1,"238":1}}],["manual",{"2":{"93":1}}],["manually",{"0":{"85":1},"1":{"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1},"2":{"30":1,"93":1,"174":1,"215":2}}],["machines",{"2":{"263":1}}],["machine",{"2":{"263":2}}],["macos",{"2":{"58":1}}],["mac",{"2":{"58":1}}],["making",{"2":{"44":1,"99":1,"135":1,"141":1,"185":1,"200":1,"206":1,"224":1,"236":1,"237":1,"274":1}}],["makes",{"2":{"66":1,"177":1}}],["make",{"0":{"166":1},"2":{"15":2,"28":1,"50":1,"56":1,"60":2,"78":1,"87":1,"90":3,"96":1,"122":1,"123":1,"133":1,"147":1,"152":1,"169":1,"170":1,"172":1,"174":1,"176":1,"185":1,"192":1,"204":1,"207":1,"217":1,"224":1,"230":1,"258":1,"263":1,"264":1,"269":1,"270":1,"302":1,"305":1}}],["map",{"2":{"39":1}}],["mainboard",{"0":{"191":1},"2":{"190":1,"191":1,"194":1}}],["mainly",{"2":{"76":1,"300":1}}],["main",{"2":{"38":1,"78":1,"190":1,"194":1,"196":2,"234":1,"238":1}}],["maintain",{"2":{"24":2,"25":1}}],["may",{"0":{"122":1,"124":1,"156":1},"2":{"36":1,"37":1,"44":1,"45":1,"79":2,"88":1,"113":1,"116":1,"121":1,"122":1,"124":1,"153":1,"154":1,"167":1,"185":1,"186":1,"196":1,"211":1,"212":1,"214":1,"216":1,"217":4,"225":1,"247":1,"252":1}}],["made",{"2":{"25":1,"106":1,"185":1}}],["major",{"2":{"15":1,"191":1}}],["mark",{"2":{"176":1}}],["marker",{"2":{"176":1}}],["marked",{"2":{"66":1,"197":2}}],["markdown",{"2":{"15":1,"16":3,"17":1,"21":1}}],["marks",{"2":{"1":2,"181":2}}],["maximize",{"2":{"159":1}}],["max",{"0":{"114":1,"115":1},"2":{"3":1,"110":1}}],["magnifying",{"2":{"1":1,"181":1}}],["yellow",{"2":{"197":1}}],["yes",{"2":{"146":2,"151":2}}],["yet",{"2":{"89":1,"104":1,"121":1,"215":1,"224":1,"266":1,"300":1}}],["yaml",{"2":{"25":1}}],["yarn",{"2":{"11":1,"12":2,"25":1}}],["yml",{"2":{"25":1}}],["youtube",{"2":{"214":1}}],["you",{"0":{"27":2,"119":1,"120":1,"125":1,"217":1,"221":1,"243":1,"251":2},"1":{"120":1,"121":2,"122":2,"123":2,"124":2,"125":2,"252":2,"253":2},"2":{"1":2,"2":1,"17":2,"18":2,"19":5,"20":7,"21":1,"28":15,"30":6,"31":16,"32":2,"33":2,"35":2,"37":3,"39":4,"41":1,"43":2,"44":1,"45":1,"47":1,"48":1,"50":3,"54":5,"56":7,"57":2,"58":4,"60":1,"62":1,"64":1,"65":1,"66":1,"67":2,"68":6,"70":2,"76":1,"77":1,"78":5,"79":1,"81":1,"82":1,"83":1,"84":1,"85":2,"87":2,"88":2,"90":7,"93":4,"94":4,"95":4,"96":2,"97":4,"98":2,"99":2,"100":1,"101":1,"103":1,"104":1,"105":1,"106":5,"118":1,"123":2,"126":1,"127":1,"131":3,"134":4,"135":4,"136":5,"140":1,"141":1,"145":1,"146":1,"147":1,"150":1,"151":1,"152":1,"153":1,"156":2,"157":1,"158":3,"160":3,"161":2,"162":1,"166":1,"169":1,"170":6,"171":1,"172":2,"174":1,"176":1,"179":1,"181":2,"182":1,"185":2,"186":1,"188":1,"192":1,"194":1,"196":3,"197":1,"200":1,"204":1,"206":1,"207":1,"212":2,"214":1,"215":2,"216":1,"217":5,"218":1,"220":2,"221":10,"222":1,"224":4,"228":4,"229":2,"230":1,"232":1,"236":2,"237":2,"240":2,"241":1,"242":2,"244":2,"246":1,"247":3,"248":1,"252":2,"253":2,"258":1,"261":2,"263":2,"266":2,"268":1,"270":1,"273":2,"274":1,"276":1,"278":1,"279":1,"281":1,"284":2,"285":1,"289":1,"291":1,"293":1,"294":1,"295":1,"300":2,"301":2,"302":1,"304":1,"305":7}}],["yourself",{"0":{"221":1},"2":{"14":1,"106":1,"185":1}}],["your",{"0":{"86":2,"89":1,"90":1,"96":1,"116":1,"154":1,"155":1,"156":1,"157":1,"160":1,"162":1,"166":1,"169":1,"174":1,"175":1,"190":1,"252":1,"254":1,"296":1,"301":1,"303":1},"1":{"87":2,"88":2,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"191":1,"192":1,"193":1,"255":1,"297":1,"298":1,"299":1,"300":1,"304":1,"305":1},"2":{"1":1,"12":1,"16":1,"28":8,"30":1,"31":1,"37":1,"38":1,"39":1,"41":1,"43":1,"44":2,"45":3,"47":1,"50":1,"51":1,"52":1,"64":1,"72":2,"80":1,"81":1,"82":1,"85":3,"87":4,"88":2,"90":6,"92":3,"93":4,"94":7,"95":3,"96":2,"97":6,"98":1,"99":1,"100":1,"101":2,"102":1,"104":2,"106":2,"116":1,"118":1,"123":2,"129":1,"133":3,"134":2,"135":3,"136":2,"146":1,"151":1,"157":2,"158":1,"160":1,"170":1,"171":1,"172":1,"174":2,"176":1,"181":1,"182":1,"185":1,"188":1,"196":1,"200":2,"202":1,"205":1,"206":2,"208":1,"214":1,"217":2,"220":1,"224":1,"225":1,"228":1,"229":1,"232":1,"234":1,"241":1,"244":3,"245":3,"246":1,"255":1,"266":3,"269":1,"273":1,"274":2,"284":1,"289":1,"291":1,"292":1,"293":1,"294":1,"295":1,"297":4,"299":1,"300":8,"301":5,"302":2,"304":4,"305":3,"306":1}}],["r",{"2":{"108":1}}],["r²",{"2":{"108":1,"117":1}}],["rider",{"0":{"270":1}}],["ripping",{"2":{"238":1}}],["rings",{"2":{"197":2}}],["rift",{"2":{"157":1}}],["ribbon",{"0":{"216":1,"229":1,"230":1},"1":{"230":1,"231":1,"232":1},"2":{"131":2,"171":1,"229":1,"230":3,"231":2,"239":1,"240":1}}],["risk",{"2":{"106":1,"204":1,"205":2,"207":1,"221":1,"228":1,"229":1}}],["risks",{"2":{"101":1}}],["righteyelidexpandedsqueeze",{"2":{"255":1}}],["righteyex",{"2":{"255":1}}],["right",{"0":{"286":1},"2":{"47":1,"68":1,"70":1,"99":1,"153":1,"194":1,"247":1,"252":1,"266":1,"286":1,"297":2}}],["range",{"2":{"274":9}}],["randomnerdtutorials",{"2":{"90":1}}],["rare",{"2":{"265":1,"273":1}}],["raises",{"2":{"239":1}}],["rated",{"2":{"221":1}}],["radio",{"2":{"204":2,"207":2}}],["radius",{"2":{"133":1}}],["radiation",{"2":{"101":1,"118":2}}],["radiant",{"2":{"101":1,"108":2,"110":2}}],["ram",{"2":{"66":1}}],["rubbing",{"2":{"188":1}}],["runs",{"2":{"263":1}}],["running",{"0":{"263":1},"2":{"212":1,"263":3,"264":1,"271":1}}],["rundown",{"0":{"156":1}}],["run",{"0":{"43":1,"282":1,"284":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"42":1,"78":1,"79":1,"279":1,"280":1,"281":2,"284":1}}],["rule",{"2":{"25":1}}],["rules",{"2":{"24":1}}],["roi",{"0":{"300":1},"2":{"300":2}}],["rotation",{"0":{"293":1},"2":{"300":2}}],["rotate",{"2":{"228":1}}],["roaming",{"2":{"266":1}}],["road",{"2":{"39":1}}],["roadmap",{"0":{"5":1},"1":{"6":1,"7":1,"8":1}}],["roll",{"2":{"230":3}}],["rough",{"2":{"165":1}}],["roughly",{"2":{"110":1}}],["routing",{"2":{"131":1,"244":1}}],["route",{"2":{"123":1,"135":1,"176":1,"244":1}}],["router",{"2":{"28":1,"60":1,"204":1,"207":1,"263":1}}],["rendering",{"2":{"229":1}}],["regenerate",{"2":{"306":1}}],["registry",{"2":{"261":1,"266":2}}],["region",{"2":{"107":2}}],["regular",{"2":{"221":1,"273":1}}],["regulator",{"2":{"197":1,"223":1}}],["remake",{"2":{"306":1}}],["remain",{"2":{"116":1}}],["remember",{"2":{"238":1}}],["remote",{"2":{"221":1}}],["removal",{"0":{"225":1,"226":1,"227":1},"1":{"226":1,"227":1},"2":{"214":1,"225":1}}],["removing",{"0":{"239":1},"2":{"170":1}}],["remove",{"2":{"133":1,"136":1,"147":1,"152":1,"170":1,"188":1,"214":1,"215":2,"230":1,"239":1}}],["removed",{"2":{"69":1,"136":1,"214":1}}],["reduces",{"2":{"205":1}}],["reduce",{"2":{"106":1,"229":1}}],["reacts",{"2":{"274":1}}],["reach",{"2":{"140":1}}],["reasonable",{"2":{"204":1,"207":1}}],["really",{"2":{"200":1,"204":1,"206":1}}],["real",{"2":{"99":1}}],["reality",{"2":{"99":1}}],["read",{"0":{"166":1}}],["ready",{"2":{"41":1,"45":1,"46":1,"241":1,"246":1,"266":1,"281":1}}],["reading",{"2":{"28":1}}],["retention",{"2":{"131":2,"135":4}}],["retinal",{"2":{"107":3}}],["retyping",{"2":{"97":1}}],["retype",{"2":{"97":2}}],["retrieve",{"2":{"95":1}}],["returns",{"2":{"66":2}}],["re",{"2":{"45":1,"50":1,"90":1,"99":2,"100":1,"104":1,"105":1,"134":1,"212":1,"263":2,"265":1,"274":1}}],["refuse",{"2":{"79":1}}],["refer",{"2":{"68":1,"78":1,"263":1}}],["references",{"2":{"101":1}}],["reference",{"2":{"33":1,"228":1}}],["refactor",{"2":{"25":1}}],["requests",{"2":{"32":1,"62":1,"64":1}}],["requirements",{"0":{"277":1}}],["requirement",{"2":{"217":1}}],["requires",{"2":{"186":1,"202":2,"204":2,"207":2,"208":1,"212":2,"217":1,"220":3,"269":1}}],["required",{"0":{"198":1,"209":1,"259":1,"280":1},"1":{"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"260":1,"261":1},"2":{"20":1,"28":1,"32":1,"58":1,"67":1,"170":1,"196":1,"202":2,"208":1,"209":1,"212":1,"217":1,"218":1,"257":1,"276":1,"279":1,"280":1}}],["require",{"2":{"19":1,"37":1,"66":1,"127":1,"138":1,"211":1,"212":1,"215":1,"216":2,"217":1,"225":1}}],["repetitively",{"2":{"231":1}}],["repeat",{"2":{"94":1,"95":1,"134":2,"161":1,"179":1,"180":1,"182":1,"228":1,"300":1,"301":1,"305":1}}],["replacing",{"0":{"136":1},"2":{"129":1}}],["replace",{"2":{"28":1,"239":1}}],["reported",{"0":{"265":1}}],["repository",{"2":{"39":1,"78":1,"102":1}}],["repo",{"2":{"12":1,"97":1,"131":1,"266":1,"269":1}}],["reverts",{"2":{"25":1}}],["revert",{"2":{"25":1}}],["relevant",{"0":{"107":1}}],["releasing",{"2":{"88":1}}],["released",{"2":{"202":1}}],["release",{"2":{"25":3,"35":1,"36":4,"42":1,"44":1,"87":1,"266":2,"283":1}}],["reliable",{"2":{"121":1}}],["reliably",{"2":{"100":1}}],["relies",{"2":{"39":1}}],["related",{"2":{"1":1,"181":1}}],["resolve",{"2":{"306":1}}],["resolution",{"2":{"71":2}}],["resonite",{"2":{"302":1}}],["resource",{"2":{"254":1}}],["resizing",{"2":{"185":1}}],["resistor",{"2":{"1":3,"2":4,"3":2,"4":3,"170":2,"181":3,"182":4,"197":4}}],["resistors",{"0":{"2":1,"182":1},"2":{"1":2,"116":1,"181":1,"182":1,"196":1,"221":2}}],["resulting",{"2":{"271":1}}],["result",{"2":{"101":1,"106":2,"134":1,"170":1,"196":3,"215":1}}],["results",{"2":{"46":1,"175":1}}],["reseting",{"0":{"264":1}}],["resetting",{"0":{"306":1},"2":{"90":1}}],["reset",{"2":{"88":1,"97":2,"264":2}}],["resetconfig",{"2":{"66":1}}],["respected",{"2":{"153":1,"222":1}}],["respectively",{"2":{"28":1}}],["responsibilities",{"0":{"116":1},"2":{"106":1}}],["responsibility",{"2":{"101":1,"106":1}}],["responsible",{"2":{"38":1,"123":1}}],["restartcamera",{"2":{"66":1}}],["restarts",{"2":{"66":2}}],["restartdevice",{"2":{"66":1}}],["restart",{"0":{"294":1},"2":{"60":2,"66":1,"95":1,"96":1,"262":1,"297":1,"299":1,"301":1}}],["rest",{"0":{"32":1,"61":1,"64":1},"1":{"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1},"2":{"20":1,"32":6,"62":2,"64":2,"65":1,"66":1,"67":1,"224":1}}],["recalibrate",{"2":{"302":1,"304":1,"305":2,"307":1}}],["recalibration",{"0":{"302":1},"1":{"303":1,"304":1,"305":1,"306":1,"307":1}}],["recalculate",{"2":{"113":1}}],["rectangle",{"2":{"300":1}}],["recentering",{"0":{"302":1},"1":{"303":1,"304":1,"305":1,"306":1,"307":1}}],["recenter",{"0":{"295":1},"2":{"295":1,"301":2,"302":1,"304":1,"305":2,"307":2}}],["recent",{"2":{"261":1}}],["receive",{"2":{"140":3,"307":1}}],["receives",{"2":{"4":1}}],["reconnect",{"2":{"51":1,"52":1}}],["recommendation",{"2":{"215":1}}],["recommend",{"2":{"36":1,"64":1,"100":1,"130":1,"136":1,"159":1,"215":1,"220":1}}],["recommended",{"0":{"127":1,"211":1,"220":1},"1":{"129":1,"130":1,"131":1},"2":{"1":1,"3":1,"28":2,"31":1,"101":1,"106":1,"140":1,"153":1,"159":1,"181":1,"185":1,"186":1,"202":1,"208":1,"221":4,"222":1,"223":1,"229":1}}],["www",{"2":{"157":1,"214":1}}],["w",{"2":{"107":1,"118":1}}],["won",{"2":{"136":1,"266":1,"304":1,"306":1}}],["worry",{"2":{"253":1}}],["worse",{"2":{"170":1,"185":1}}],["worst",{"0":{"113":1},"1":{"114":1,"115":1},"2":{"107":1,"108":1}}],["worth",{"2":{"165":1,"215":1,"217":1}}],["work",{"0":{"306":1},"2":{"37":2,"90":1,"104":1,"133":1,"156":1,"165":1,"172":1,"175":1,"185":2,"214":1,"217":1,"221":1,"230":1,"258":1,"263":1,"270":2,"274":1,"293":1}}],["working",{"0":{"52":1},"2":{"36":2,"37":2,"38":1,"39":1,"44":1,"93":2,"95":1,"100":1,"124":1,"140":1,"156":1}}],["works",{"2":{"30":1,"99":2,"153":1,"160":1,"188":1,"222":1}}],["would",{"2":{"39":1,"66":1,"95":1,"221":1}}],["wrapped",{"2":{"232":1}}],["wrapping",{"0":{"230":1},"2":{"229":1}}],["wrap",{"2":{"230":2}}],["wroom",{"2":{"202":1,"204":1,"211":1}}],["wrooms3usb",{"2":{"37":1}}],["wrooms3qiousb",{"2":{"37":1}}],["wrooms3qio",{"2":{"37":1}}],["wrooms3",{"2":{"37":1}}],["wrong",{"0":{"264":1},"2":{"97":1,"123":1}}],["writes",{"2":{"66":2}}],["write",{"2":{"66":2}}],["written",{"2":{"15":1,"24":4,"66":1}}],["walls",{"2":{"253":1}}],["walkthrough",{"2":{"165":1}}],["wary",{"2":{"217":1}}],["warm",{"2":{"106":1}}],["warmth",{"2":{"101":1,"106":1}}],["warning",{"2":{"37":1,"175":1,"184":1}}],["watch",{"2":{"96":1,"214":1,"228":1,"271":1,"274":1}}],["wait",{"0":{"168":1},"2":{"81":1,"82":1,"84":1,"94":2,"95":1,"104":1,"270":1,"301":1}}],["washed",{"2":{"116":1}}],["was",{"2":{"32":1,"186":1,"199":1,"284":1}}],["ways",{"2":{"80":1,"126":1}}],["way",{"0":{"157":1},"2":{"24":3,"35":1,"62":1,"87":1,"92":1,"136":2,"138":1,"157":1,"158":1,"182":1,"194":1,"240":1,"273":1,"300":1,"301":1}}],["want",{"2":{"19":1,"35":1,"36":1,"39":1,"44":1,"54":1,"56":1,"62":1,"78":1,"197":1,"293":1,"305":1}}],["who",{"2":{"165":1}}],["why",{"0":{"108":1},"2":{"172":1,"221":1,"225":1}}],["whether",{"2":{"68":1,"71":2,"99":1}}],["wherever",{"2":{"217":1}}],["where",{"0":{"39":1,"159":1,"273":1},"2":{"76":1,"78":1,"93":1,"94":1,"108":1,"134":1,"175":1,"179":1,"186":1,"263":1,"265":1,"273":1,"289":1,"290":1,"291":1,"293":1,"294":1}}],["when",{"0":{"231":1},"2":{"20":2,"28":1,"30":1,"36":1,"44":1,"69":1,"78":1,"79":2,"106":1,"123":1,"133":2,"159":1,"170":1,"186":1,"202":1,"230":1,"248":1,"265":2,"271":1,"274":6}}],["whatever",{"2":{"56":1,"244":1,"295":1}}],["what",{"0":{"35":1,"38":1,"39":1,"54":1,"62":1,"92":1,"140":1,"234":1,"257":1,"258":1,"265":2,"274":1},"1":{"39":1,"141":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1},"2":{"36":1,"106":2,"153":1,"160":1,"166":1,"188":1,"212":1,"221":1,"222":1,"230":1,"297":1}}],["while",{"2":{"28":1,"87":1,"88":1,"96":1,"98":1,"106":2,"134":1,"182":1,"214":1,"228":1,"231":1,"302":1}}],["white",{"2":{"25":1,"197":2}}],["whichever",{"2":{"257":1,"270":1}}],["which",{"2":{"4":1,"66":1,"121":1,"146":1,"151":1,"175":1,"185":1,"193":1,"199":1,"221":1,"247":2,"274":1}}],["weak",{"2":{"179":1}}],["wear",{"2":{"66":1,"214":1,"231":1}}],["weeks",{"2":{"168":1}}],["weight",{"2":{"133":1,"207":1}}],["weirdly",{"2":{"238":1}}],["weird",{"2":{"79":1,"140":1}}],["were",{"2":{"106":1,"215":1}}],["welcome",{"2":{"104":1}}],["well",{"2":{"39":1,"101":1,"107":1,"123":1,"129":1,"156":1,"211":1,"217":1,"221":1}}],["went",{"0":{"264":1},"2":{"97":1}}],["webrequest",{"2":{"279":1}}],["web",{"2":{"52":1,"93":1}}],["website",{"2":{"16":1,"157":1}}],["we",{"0":{"41":1,"255":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1},"2":{"20":1,"24":2,"25":5,"33":1,"35":1,"36":3,"37":2,"38":1,"39":1,"44":2,"62":2,"64":1,"66":1,"68":1,"78":1,"93":2,"94":1,"95":1,"98":1,"100":1,"105":1,"106":3,"107":1,"113":1,"123":1,"124":1,"134":2,"136":1,"158":1,"167":1,"220":1,"239":1,"255":1,"265":2,"266":1,"269":1,"271":1,"300":2,"301":1,"305":1}}],["wiki",{"2":{"254":1}}],["wip",{"0":{"242":1},"1":{"243":1,"244":1,"245":1,"246":1,"247":1,"248":1}}],["wiggle",{"2":{"239":1}}],["widenthresholdv2",{"2":{"274":1}}],["widenthresholdv1",{"2":{"274":1}}],["widen",{"2":{"274":4}}],["wider",{"2":{"207":1}}],["wide",{"2":{"144":1,"149":1}}],["widmovr",{"2":{"127":1}}],["window",{"2":{"78":1,"84":1}}],["windows",{"2":{"30":1,"58":3,"94":1,"247":1,"279":1}}],["wifi",{"0":{"48":1,"50":1,"51":1,"68":1,"203":1,"207":1},"1":{"49":1,"50":1,"51":1,"52":1,"204":1},"2":{"28":4,"56":1,"66":7,"68":15,"70":13,"85":1,"93":1,"204":2,"207":2,"263":1}}],["wi",{"2":{"28":1,"50":2,"94":2,"97":1}}],["wish",{"2":{"20":1,"28":1,"30":1,"31":5,"68":1,"95":1,"118":1,"217":1}}],["willing",{"2":{"224":1}}],["will",{"0":{"156":1,"159":1,"164":1,"276":1},"2":{"5":1,"16":1,"17":3,"18":1,"19":3,"20":2,"21":1,"25":1,"28":7,"30":1,"31":7,"33":1,"37":2,"39":1,"48":1,"54":1,"56":1,"66":3,"67":1,"68":1,"69":1,"72":1,"77":1,"78":2,"79":2,"82":2,"84":1,"88":1,"93":1,"95":2,"98":1,"121":1,"123":2,"127":1,"131":1,"134":1,"135":1,"136":1,"138":1,"140":2,"146":1,"151":1,"156":1,"161":1,"166":1,"170":2,"171":1,"175":1,"176":1,"179":1,"185":1,"188":1,"192":1,"196":1,"202":1,"214":2,"215":1,"216":1,"221":2,"225":1,"236":1,"244":1,"247":3,"248":1,"257":1,"261":2,"262":2,"264":1,"266":1,"269":1,"271":2,"274":4,"285":1,"291":1,"294":1,"295":1,"300":2,"304":1,"305":3,"306":1}}],["wiring",{"0":{"194":1,"197":1,"245":1},"2":{"4":1,"101":1,"165":1}}],["wires",{"0":{"175":1,"176":1,"177":1,"193":1,"218":1},"2":{"175":1,"179":1,"190":1,"193":4,"194":3,"220":3,"244":2}}],["wired",{"0":{"201":1,"202":1,"208":1,"217":1,"235":1,"237":1,"247":1,"298":1},"1":{"202":1,"299":1},"2":{"37":3,"38":1,"47":1,"165":1,"200":1,"202":2,"204":2,"206":1,"207":2,"208":2,"211":2,"235":1,"237":1,"289":1}}],["wireless",{"0":{"203":1,"204":1,"207":1,"212":1,"235":1,"236":1,"248":1,"297":1},"1":{"204":1},"2":{"37":3,"38":1,"49":1,"165":1,"200":1,"202":1,"206":1,"208":1,"211":2,"212":1,"235":1,"236":1}}],["wire",{"0":{"4":1,"177":1,"178":1,"179":1,"180":1,"184":1},"2":{"175":3,"176":5,"178":1,"194":1,"197":1,"217":1,"218":3,"221":1}}],["within",{"2":{"107":1,"123":1,"302":1}}],["without",{"2":{"15":1,"31":2,"51":1,"52":1,"92":1,"94":2,"101":1,"136":1,"179":1,"193":1,"212":1,"242":1,"253":1,"301":1,"302":1}}],["with",{"0":{"170":1,"252":1,"285":1},"1":{"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"3":1,"4":1,"14":1,"20":2,"25":2,"28":2,"31":1,"35":1,"36":1,"37":3,"43":1,"62":1,"64":1,"66":1,"68":1,"78":1,"79":1,"87":1,"90":2,"94":1,"99":1,"100":1,"101":1,"104":1,"106":3,"107":1,"110":1,"113":1,"123":1,"129":1,"133":3,"134":1,"135":1,"136":1,"146":1,"151":1,"153":1,"167":2,"170":2,"179":2,"180":1,"188":1,"191":1,"196":1,"197":3,"202":4,"204":2,"207":1,"208":3,"209":1,"212":1,"214":1,"215":3,"217":2,"218":1,"222":1,"228":2,"230":1,"232":1,"234":2,"239":1,"240":1,"245":1,"257":3,"258":1,"263":1,"266":1,"268":1,"270":1,"274":7,"279":1,"281":1,"284":1,"297":1,"300":1,"302":1}}],["uuid",{"2":{"306":1}}],["uri",{"2":{"279":1}}],["url",{"2":{"17":2,"18":1,"67":3}}],["uwp",{"2":{"273":1}}],["ue",{"2":{"257":1,"262":1}}],["u",{"2":{"168":1}}],["udp",{"2":{"99":1}}],["unfinished",{"2":{"242":1}}],["unfocused",{"2":{"221":1}}],["unfortunately",{"2":{"170":1}}],["unmount",{"2":{"231":1}}],["unmounting",{"2":{"228":1}}],["unusable",{"2":{"170":1,"202":1}}],["unclear",{"2":{"124":2}}],["unsafe",{"2":{"116":1}}],["uninstall",{"2":{"266":3}}],["unified",{"2":{"257":1,"274":2}}],["unity",{"2":{"304":1}}],["unit",{"2":{"108":1,"221":1}}],["unique",{"2":{"68":1}}],["unless",{"2":{"106":1}}],["unlikely",{"2":{"37":1,"161":1}}],["until",{"2":{"84":2,"135":2,"161":1,"186":1,"202":1,"228":1,"236":1,"238":1,"239":1,"240":1,"300":1}}],["undertaking",{"2":{"124":1}}],["undergo",{"2":{"106":1}}],["under",{"0":{"95":1},"2":{"56":1,"100":1,"135":1,"247":2,"248":1,"262":1,"274":1,"281":1,"306":1}}],["understanding",{"2":{"101":1}}],["understand",{"0":{"120":1},"1":{"121":1,"122":1,"123":1,"124":1,"125":1},"2":{"22":1,"24":2,"25":1,"106":1}}],["unplug",{"2":{"51":1,"136":1,"247":1}}],["uplaod",{"2":{"95":1}}],["uploaded",{"2":{"90":1}}],["upload",{"0":{"90":1,"252":1},"2":{"77":1,"90":3,"93":1,"94":1,"95":3,"97":1,"162":1,"252":2,"305":1}}],["uploading",{"0":{"85":1,"91":1},"1":{"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":2,"93":2,"94":2,"95":2,"96":1},"2":{"72":1,"79":1,"85":1,"90":1,"94":1,"97":1,"174":1}}],["upate",{"2":{"93":1}}],["upgrading",{"0":{"83":1,"84":1},"1":{"84":1}}],["upgrade",{"2":{"81":1,"82":1,"83":1}}],["updating",{"0":{"79":1,"80":1,"97":1},"1":{"80":1,"81":2,"82":2,"83":1,"84":1,"98":1},"2":{"31":1}}],["updated",{"0":{"165":2},"2":{"97":1,"305":1}}],["update",{"2":{"31":8,"79":1,"80":1,"81":1,"82":1,"84":1,"85":1,"92":1,"94":1,"97":2}}],["updates",{"2":{"31":2,"84":1,"105":1}}],["up",{"0":{"4":1,"72":1,"94":1,"169":1,"180":1,"184":1,"194":1,"197":1,"245":1,"254":1,"258":1,"262":1,"300":1,"302":1,"303":1},"1":{"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"255":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"303":1,"304":2,"305":2,"306":1,"307":1},"2":{"35":1,"41":1,"46":1,"68":1,"84":1,"87":1,"90":1,"94":1,"96":1,"113":1,"122":1,"129":1,"133":1,"134":1,"136":1,"160":1,"171":1,"173":2,"175":1,"176":1,"182":1,"185":1,"192":1,"197":1,"202":1,"204":1,"207":1,"208":1,"224":1,"225":1,"236":1,"239":2,"240":1,"244":2,"246":1,"269":1,"273":1,"300":1,"301":1,"302":1}}],["usability",{"2":{"121":1}}],["usually",{"2":{"79":1,"265":1}}],["us",{"2":{"36":1,"39":1,"44":1,"58":1,"66":2,"100":1,"118":1,"224":2,"266":1}}],["usb",{"0":{"88":1,"137":1,"175":1,"177":1,"201":1,"208":1,"217":1},"1":{"138":1,"139":1,"202":1},"2":{"28":1,"37":1,"87":1,"88":1,"90":2,"131":1,"136":5,"172":1,"202":3,"204":1,"208":2,"217":13,"218":1,"242":2,"245":2}}],["using",{"0":{"251":1},"1":{"252":1,"253":1},"2":{"1":1,"9":1,"20":2,"28":2,"30":2,"31":1,"32":2,"33":1,"39":1,"54":3,"57":1,"58":2,"62":1,"64":1,"65":1,"67":1,"68":1,"70":1,"82":1,"90":2,"93":1,"94":2,"97":4,"101":1,"106":1,"165":1,"181":1,"196":2,"204":1,"207":1,"217":1,"218":1,"221":1,"240":1,"244":1,"268":1,"278":1}}],["usebasicparsing",{"2":{"279":1}}],["useless",{"2":{"229":1}}],["uses",{"2":{"66":1,"186":1,"204":1,"207":1,"212":1,"279":1,"306":1}}],["users",{"2":{"32":1,"100":1,"101":1,"202":1,"208":1,"266":1,"306":1}}],["user",{"0":{"28":1,"122":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"56":1,"94":1,"95":1,"106":1,"153":1,"179":1,"207":1,"222":1,"306":2}}],["useful",{"2":{"18":1,"35":1,"36":1,"54":2,"62":1}}],["use",{"0":{"55":1,"63":1,"93":1,"255":1,"262":1,"299":1},"1":{"56":1,"57":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"94":1,"95":1},"2":{"1":1,"16":2,"20":3,"24":1,"25":3,"28":1,"31":4,"35":1,"36":1,"37":1,"39":1,"48":1,"56":1,"57":1,"58":1,"64":1,"68":1,"85":1,"93":2,"95":1,"96":1,"101":3,"106":3,"116":2,"127":1,"134":1,"136":2,"144":1,"149":1,"153":1,"170":1,"181":1,"182":1,"184":2,"188":1,"197":2,"200":1,"202":1,"206":1,"212":1,"216":1,"217":1,"221":1,"228":1,"229":1,"244":1,"257":1,"262":1,"266":1,"293":1,"300":1,"302":1,"305":1}}],["used",{"2":{"1":1,"22":2,"25":2,"32":4,"36":1,"50":1,"64":1,"69":1,"123":1,"175":1,"181":1,"230":1,"274":4,"289":1,"292":1}}],["cvr",{"2":{"302":1}}],["center",{"2":{"301":2}}],["certain",{"2":{"106":1,"170":1,"216":1}}],["ctrl+b",{"2":{"271":1}}],["crop",{"2":{"291":1}}],["cropping",{"0":{"291":1},"2":{"300":1}}],["crvft",{"2":{"273":1}}],["crutial",{"2":{"193":1}}],["crevices",{"2":{"231":1}}],["creating",{"0":{"155":1},"1":{"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1}}],["created",{"2":{"158":1,"199":1,"254":1,"305":1}}],["creates",{"2":{"129":1}}],["create",{"0":{"156":1},"2":{"17":2,"18":2,"158":1,"266":1,"284":1,"305":1}}],["creep",{"2":{"122":1}}],["credit",{"2":{"78":1,"98":1,"165":1}}],["credentials",{"0":{"51":1},"2":{"28":1,"51":1,"97":3}}],["cm⁻²",{"2":{"118":1}}],["cm",{"2":{"107":1,"108":2}}],["cm²",{"2":{"107":3,"108":1,"111":2,"112":2,"114":2,"115":2}}],["cycled",{"2":{"95":1}}],["c",{"0":{"88":1},"2":{"78":1,"97":1,"136":2,"217":6,"242":1,"245":1,"266":1,"273":1,"306":1}}],["cd",{"2":{"78":1,"97":1}}],["cpptypedef",{"2":{"68":1,"70":1}}],["cutters",{"2":{"230":1}}],["cuts",{"2":{"176":1}}],["cut",{"0":{"176":1},"2":{"175":1,"176":2,"230":6,"292":1}}],["cutouts",{"2":{"129":1}}],["cura",{"2":{"90":1}}],["current",{"0":{"108":1},"2":{"66":2,"78":1,"94":1,"95":1,"97":1,"108":1,"110":1,"167":1,"266":1}}],["currently",{"0":{"255":1},"2":{"37":2,"38":1,"39":1,"66":1,"93":1,"166":1,"255":1,"278":1}}],["custommodules\`",{"2":{"271":1}}],["customlibs",{"2":{"266":2}}],["customizations",{"2":{"25":2}}],["custom",{"2":{"19":1,"35":1,"95":1,"217":1,"218":1}}],["cheaper",{"0":{"212":1,"253":1},"2":{"204":1,"207":1,"212":1}}],["checked",{"2":{"284":1}}],["checkout",{"2":{"215":1}}],["checking",{"2":{"106":1}}],["checkmark",{"2":{"49":1,"94":1}}],["check",{"2":{"28":1,"39":1,"90":1,"98":1,"104":1,"141":1,"154":1,"173":1,"221":2,"224":1,"265":1}}],["china",{"2":{"168":1}}],["chip",{"2":{"38":1}}],["ch340",{"2":{"76":2}}],["choice",{"2":{"64":1,"129":1,"217":1}}],["chosen",{"2":{"44":1}}],["choose",{"0":{"253":1},"2":{"28":1,"44":1,"47":1,"130":3}}],["chore",{"2":{"25":1}}],["charging",{"2":{"90":1}}],["character",{"2":{"28":1}}],["characters",{"2":{"28":1,"50":1}}],["chance",{"2":{"186":1,"265":1}}],["channel",{"2":{"68":2,"98":1}}],["changing",{"2":{"37":1,"67":1,"116":1}}],["changed",{"2":{"97":1,"265":1,"307":1}}],["changelog",{"2":{"25":1}}],["change",{"0":{"265":1},"2":{"20":1,"25":8,"28":2,"33":1,"37":1,"54":1,"56":3,"78":1,"94":1,"95":2,"167":1,"196":2,"262":1,"263":1,"265":1}}],["changes",{"2":{"15":2,"25":5,"54":1,"66":4,"97":3,"205":1,"290":1,"306":1}}],["circled",{"2":{"171":1,"238":1}}],["ci",{"2":{"25":2}}],["css",{"2":{"20":2}}],["cluttered",{"2":{"305":1}}],["clearer",{"2":{"215":1}}],["clears",{"2":{"66":1}}],["cleanly",{"2":{"138":1}}],["clean",{"2":{"126":1,"129":1}}],["cloning",{"2":{"78":1,"280":1}}],["cloned",{"2":{"78":1,"94":1,"97":1}}],["clone",{"0":{"78":1},"2":{"12":2,"78":5,"268":1}}],["closed",{"2":{"274":1}}],["close",{"2":{"78":1,"96":1,"101":1,"159":1,"194":1,"240":1,"271":1,"297":1}}],["clip",{"2":{"131":2,"135":4,"147":1,"152":1,"244":1}}],["cli",{"0":{"81":1}}],["clicking",{"2":{"84":1,"261":1,"304":1}}],["click",{"2":{"43":1,"44":2,"45":1,"46":1,"52":1,"82":3,"84":3,"94":1,"95":1,"271":1,"284":1,"304":3,"305":2}}],["client",{"0":{"64":1},"2":{"32":2,"64":2,"96":1}}],["class=",{"2":{"20":1}}],["class",{"2":{"20":1}}],["classes",{"2":{"20":4}}],["capable",{"0":{"202":1,"204":1},"2":{"204":1,"207":1}}],["care",{"2":{"264":1}}],["carefully",{"2":{"230":1,"238":1,"244":3}}],["careful",{"2":{"3":1,"230":1,"238":1}}],["carl",{"2":{"199":1}}],["caveats",{"2":{"196":1}}],["cataractogenesis",{"2":{"118":1}}],["categories",{"2":{"18":1,"200":1,"206":1}}],["calibrated",{"2":{"301":1}}],["calibrate",{"2":{"301":1}}],["calibrating",{"0":{"301":1}}],["calibration",{"0":{"294":1},"2":{"294":1,"301":1,"307":1}}],["calculations",{"0":{"109":1,"113":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":2,"115":2},"2":{"118":1}}],["calculated",{"2":{"106":1,"107":1,"123":1}}],["call",{"2":{"66":2}}],["called",{"2":{"17":1,"18":2,"19":1,"39":1,"82":1,"84":1,"103":1,"257":1}}],["causing",{"2":{"205":1}}],["caused",{"2":{"90":1,"123":1}}],["cause",{"2":{"66":1,"90":1,"123":1}}],["caution",{"2":{"39":1,"106":1}}],["cables",{"2":{"90":1,"131":3,"204":1,"207":1,"215":1,"217":3,"218":1,"229":1,"242":1,"244":1,"245":1}}],["cable",{"0":{"229":1},"1":{"230":1,"231":1,"232":1},"2":{"41":1,"85":1,"87":1,"90":5,"136":1,"171":1,"216":2,"230":1,"231":1,"240":2,"245":1}}],["cams",{"2":{"212":1,"224":1}}],["came",{"2":{"87":1}}],["cameras",{"0":{"171":1,"213":1,"231":1,"296":1},"1":{"214":1,"215":1,"216":1,"297":1,"298":1,"299":1,"300":1},"2":{"103":1,"146":1,"151":1,"171":1,"205":1,"212":1,"214":2,"215":3,"225":1,"228":2,"229":1,"231":1,"232":1,"242":1,"243":1,"244":2,"289":1,"297":1}}],["camera",{"0":{"71":1,"156":1,"158":1,"159":2,"214":1,"228":1,"229":1,"230":1,"238":1,"239":1,"240":1,"289":1},"1":{"230":1,"231":1,"232":1},"2":{"41":1,"47":1,"66":2,"71":1,"96":2,"101":1,"106":1,"116":1,"145":2,"146":2,"150":2,"151":2,"158":1,"159":1,"171":3,"172":1,"176":1,"185":1,"186":5,"187":3,"216":2,"222":1,"224":1,"228":1,"229":2,"230":7,"232":1,"234":2,"238":1,"239":4,"240":4,"242":1,"244":2,"289":1,"297":2,"299":1,"300":2}}],["cam",{"0":{"87":1},"2":{"37":2,"87":2,"170":1,"202":2,"204":3,"207":1,"223":1,"289":1}}],["can",{"0":{"60":1,"123":1,"221":1,"251":1},"1":{"252":1,"253":1},"2":{"18":1,"20":4,"28":2,"30":2,"31":3,"32":5,"35":1,"37":1,"39":1,"52":1,"54":2,"56":3,"57":1,"58":2,"60":1,"62":1,"64":2,"65":1,"66":1,"81":1,"82":1,"85":1,"87":1,"90":2,"93":1,"95":1,"96":1,"97":1,"103":1,"104":1,"106":2,"121":1,"123":1,"131":1,"134":1,"135":2,"136":2,"141":1,"145":1,"150":1,"157":1,"158":1,"160":1,"162":1,"170":5,"179":1,"185":1,"196":1,"202":2,"204":1,"207":1,"208":2,"214":1,"215":2,"221":2,"224":3,"229":1,"230":1,"238":1,"247":1,"253":1,"261":1,"263":1,"274":1,"289":1,"297":1,"302":1,"305":1,"307":1}}],["cases",{"2":{"87":1,"170":2,"188":1,"205":1,"265":1,"273":1}}],["case",{"0":{"113":1,"264":1,"306":1},"1":{"114":1,"115":1},"2":{"15":1,"28":1,"87":2,"107":1,"108":1,"134":2,"170":1,"175":1,"200":1,"205":1,"206":1,"293":1}}],["copy",{"2":{"271":1,"297":1}}],["copying",{"2":{"271":1}}],["copied",{"2":{"271":1}}],["copper",{"2":{"175":1}}],["cooresponding",{"2":{"247":1}}],["costly",{"2":{"202":1,"208":1}}],["count",{"2":{"304":1}}],["coupons",{"2":{"140":1}}],["coupon",{"2":{"140":1}}],["couple",{"2":{"36":1,"44":1,"82":1,"84":1,"94":1,"95":1,"97":1}}],["courtesy",{"2":{"133":2,"136":1}}],["could",{"2":{"101":1,"106":1}}],["corners",{"2":{"159":1}}],["corneal",{"2":{"107":1,"111":1,"112":1,"114":1,"115":1}}],["cornea",{"2":{"107":1,"108":1,"118":1}}],["core",{"2":{"82":1,"269":1}}],["corresponds",{"2":{"68":1,"146":1,"151":1}}],["corresponding",{"2":{"45":1,"238":1,"248":1}}],["correctly",{"2":{"28":1,"41":1,"175":1,"271":1}}],["correcting",{"2":{"25":1}}],["correct",{"2":{"3":1,"28":1,"33":1,"47":1,"60":2,"79":1,"106":1,"194":1,"196":1,"221":1}}],["codes",{"2":{"221":1}}],["code",{"0":{"23":1,"73":1,"82":1,"173":1},"1":{"24":1,"25":1,"74":1,"75":1},"2":{"24":4,"25":3,"73":1,"77":1,"79":1,"82":1,"89":1,"95":1,"140":1,"173":2,"270":1}}],["colors",{"2":{"175":1}}],["color",{"2":{"130":1}}],["colons",{"2":{"25":1}}],["colour",{"2":{"20":3}}],["collapsible",{"2":{"19":1}}],["cohesive",{"2":{"20":1}}],["covered",{"2":{"147":1,"152":1,"229":1,"230":2}}],["coverplate",{"2":{"131":1,"135":2}}],["covers",{"2":{"100":1}}],["cover",{"2":{"16":1,"170":1,"182":1,"218":1}}],["com4",{"2":{"247":1,"299":1}}],["combined",{"2":{"129":1,"252":1}}],["coming",{"2":{"93":1,"171":1}}],["comes",{"2":{"170":1,"179":1}}],["come",{"2":{"79":1,"214":1,"215":1,"234":1}}],["community",{"0":{"105":1,"156":1},"2":{"104":1,"105":1,"154":1,"224":1}}],["communicate",{"2":{"62":1,"64":1,"306":1}}],["communication",{"2":{"28":1}}],["command",{"2":{"65":2,"67":1,"78":2,"81":2,"279":1,"280":2,"281":2}}],["commits",{"2":{"25":6}}],["commit",{"0":{"25":1},"2":{"24":1,"25":6}}],["compile",{"2":{"269":1}}],["compared",{"2":{"202":1}}],["compatable",{"2":{"146":1,"151":1}}],["compatibility",{"0":{"104":1}}],["compatible",{"2":{"99":1,"224":1,"257":2,"265":1}}],["compact",{"2":{"144":1,"149":1,"217":1}}],["completions",{"2":{"140":1}}],["completeness",{"2":{"124":1}}],["completely",{"2":{"116":1,"170":2}}],["complete",{"2":{"42":1,"43":1,"45":1,"46":1,"51":1,"52":1,"140":1}}],["completed",{"0":{"6":1},"2":{"5":1,"88":1}}],["compliance",{"2":{"107":1}}],["complain",{"2":{"79":1}}],["comprehensive",{"2":{"44":1}}],["computer",{"2":{"28":2,"30":1,"62":1,"92":1}}],["componentes",{"2":{"15":1}}],["components",{"0":{"135":1},"2":{"15":1,"101":1,"102":1,"116":1,"190":1,"202":1,"220":1,"234":1,"242":1}}],["com",{"2":{"12":1,"76":1,"78":2,"90":1,"157":1,"214":1,"247":2,"251":1,"299":2}}],["convenient",{"2":{"305":1}}],["conventional",{"2":{"25":3}}],["converted",{"2":{"257":1}}],["conclusion",{"0":{"232":1,"241":1}}],["concise",{"2":{"141":1}}],["conflicts",{"2":{"202":1,"208":1}}],["confirm",{"2":{"44":1,"116":1}}],["configs",{"2":{"35":1}}],["config",{"0":{"28":1,"306":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"35":2,"56":2,"66":3,"68":1,"95":2,"97":2,"235":1,"304":2,"306":1}}],["configure",{"0":{"48":1,"50":1,"173":1},"1":{"49":1,"50":1,"51":1,"52":1},"2":{"212":1}}],["configured",{"2":{"33":1}}],["configuring",{"0":{"26":1,"296":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"297":1,"298":1,"299":1,"300":1},"2":{"39":1}}],["configuration",{"0":{"29":1,"236":1,"237":1,"273":1,"297":1,"298":1},"1":{"30":1,"31":1,"32":1,"33":1,"299":1},"2":{"25":1,"101":1,"265":1,"273":1,"306":1}}],["conditions",{"2":{"116":1}}],["cone",{"2":{"107":1,"108":1}}],["congratulations",{"2":{"90":1}}],["connector",{"2":{"171":3,"216":1,"230":2,"236":1,"238":1,"239":2,"240":3}}],["connectors",{"2":{"135":1,"145":1,"150":1,"193":1,"216":1,"217":1,"238":1}}],["connections",{"2":{"170":3,"230":1}}],["connection",{"2":{"88":1,"177":1}}],["connecting",{"0":{"238":1,"240":1},"2":{"87":1,"176":1}}],["connected",{"2":{"47":1,"60":3,"85":1,"94":2,"170":1,"171":1,"235":1,"236":1,"238":1,"263":1}}],["connect",{"0":{"57":1,"60":1,"86":1,"87":1,"88":1,"172":1,"175":1},"1":{"87":1,"88":1},"2":{"28":3,"30":1,"31":1,"45":1,"50":2,"54":2,"56":1,"57":2,"60":1,"65":1,"77":1,"87":1,"88":1,"92":1,"94":1,"96":1,"194":1,"217":1,"236":1,"245":2}}],["consent",{"2":{"253":1}}],["conservatively",{"2":{"113":1}}],["cons",{"2":{"202":1,"204":1,"207":1,"208":1}}],["consider",{"2":{"200":1,"206":1,"217":1}}],["consistent",{"2":{"20":1,"22":1}}],["consultation",{"2":{"15":1}}],["consult",{"2":{"1":1,"181":1}}],["contents",{"2":{"306":1}}],["content",{"2":{"279":1,"304":1}}],["continue",{"2":{"237":1,"278":1}}],["continuing",{"2":{"136":1,"300":1}}],["contact",{"2":{"66":1}}],["contains",{"2":{"305":1}}],["contain",{"0":{"164":1},"2":{"5":1,"50":1}}],["contributor",{"2":{"254":1}}],["contribute",{"2":{"99":1,"118":1}}],["contributing",{"0":{"13":1},"1":{"14":1,"15":1}}],["control",{"2":{"32":1,"62":2,"65":2,"67":1,"305":1}}],["fwvdbdc",{"2":{"214":1}}],["fbt",{"2":{"202":1,"204":1,"207":1,"208":1}}],["f",{"2":{"168":1}}],["familiar",{"0":{"285":1},"1":{"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1}}],["familiarize",{"2":{"14":1}}],["fast",{"2":{"274":4}}],["fail",{"2":{"271":1}}],["failing",{"2":{"265":1}}],["failures",{"2":{"106":1}}],["failure",{"2":{"106":1}}],["fan",{"2":{"134":1,"136":1}}],["fans",{"2":{"129":1,"136":1}}],["facing",{"2":{"171":1,"184":2,"194":1,"240":1}}],["facialtrackerbridgevidevfrunk1",{"2":{"131":1}}],["facialtrackerbeerhingevidevfrunk1",{"2":{"131":1}}],["facial",{"2":{"129":1,"133":1,"134":2,"202":1,"216":1}}],["factory",{"2":{"228":1}}],["fact",{"2":{"167":1}}],["face",{"2":{"129":1,"134":1,"217":3,"254":1,"274":1}}],["falling",{"2":{"136":1}}],["fall",{"2":{"113":1}}],["faq",{"0":{"272":1},"1":{"273":1,"274":1},"2":{"98":1,"265":1}}],["ftdi",{"2":{"87":1,"90":1}}],["fps",{"2":{"71":1,"202":2,"208":1}}],["functioning",{"2":{"196":1}}],["function",{"2":{"121":1}}],["functionality",{"2":{"32":1,"116":1,"307":1}}],["further",{"2":{"106":1}}],["future",{"2":{"66":1,"85":1,"192":1}}],["fully",{"2":{"32":1,"38":1,"58":1,"121":1,"194":1,"205":1,"274":3,"301":1}}],["full",{"2":{"4":1,"32":1,"33":1,"100":1,"108":1,"110":1,"212":2}}],["fetch",{"2":{"279":1}}],["female",{"2":{"136":1}}],["feed",{"2":{"225":1,"228":2,"286":1,"287":1,"288":1,"300":2}}],["feedback",{"2":{"100":1,"118":1,"153":1,"222":1}}],["feeling",{"2":{"106":1}}],["feel",{"2":{"101":1,"106":1,"124":1}}],["featured",{"2":{"32":1}}],["feature",{"0":{"299":1},"2":{"25":3,"30":2,"32":2,"67":1,"94":1}}],["features",{"2":{"5":1,"101":1,"106":1,"121":1,"191":1}}],["feat",{"2":{"25":1}}],["few",{"2":{"24":1,"133":1,"196":1}}],["frequently",{"0":{"249":1}}],["free",{"2":{"64":1,"124":1,"170":1}}],["freenove",{"2":{"37":4,"202":1,"204":1,"211":1}}],["friend",{"2":{"188":1}}],["friendly",{"2":{"94":1,"305":1}}],["frunk",{"0":{"128":1,"136":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1},"2":{"129":2,"131":2,"133":1,"134":1,"136":5,"138":1,"144":1,"146":1,"147":1,"149":1,"151":1,"152":1,"216":1}}],["frosty704",{"2":{"127":1}}],["front",{"2":{"94":1,"135":1}}],["from",{"0":{"267":1,"268":1,"275":1,"276":1,"302":1},"1":{"268":1,"269":1,"270":1,"271":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"303":1,"304":1,"305":1,"306":1,"307":1},"2":{"4":1,"37":1,"38":1,"42":1,"44":1,"58":2,"62":2,"66":1,"76":1,"78":4,"83":1,"90":2,"93":1,"94":1,"97":2,"98":1,"100":1,"108":2,"134":1,"136":1,"168":2,"170":1,"172":1,"175":1,"184":1,"188":1,"196":1,"199":1,"218":1,"221":4,"228":1,"230":3,"239":1,"247":1,"253":1,"266":2,"268":1,"269":1,"276":1,"285":1,"300":1,"302":2}}],["framerates",{"2":{"208":1}}],["framerate",{"2":{"202":1}}],["frame",{"2":{"71":1}}],["framesize",{"2":{"71":1}}],["frames",{"2":{"71":2}}],["framework",{"2":{"24":1}}],["float",{"2":{"255":1}}],["flat",{"2":{"230":1,"236":1}}],["flawless",{"2":{"122":1}}],["flashing",{"0":{"40":1,"42":1,"43":1},"1":{"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1},"2":{"39":2,"41":1,"42":2,"241":1,"247":1,"248":1}}],["flash",{"0":{"45":1,"172":1,"173":1,"174":1},"2":{"37":2,"39":1,"66":5,"76":1,"95":1,"172":1,"174":1,"204":1,"212":1,"243":1}}],["flashed",{"2":{"36":1,"44":1,"93":1,"174":1}}],["flavour",{"2":{"16":1}}],["flipping",{"2":{"240":1}}],["flip",{"2":{"2":1,"71":2,"129":1,"171":1,"182":1,"183":1}}],["figure",{"2":{"299":1}}],["field",{"2":{"297":1,"299":1,"304":1}}],["fields",{"0":{"274":1},"2":{"305":1}}],["filters",{"2":{"215":1,"242":1}}],["filter",{"0":{"225":1,"226":1,"227":1},"1":{"226":1,"227":1},"2":{"214":4,"215":1,"225":2}}],["files",{"0":{"252":1,"259":1},"1":{"260":1,"261":1},"2":{"16":1,"25":2,"78":1,"94":2,"97":1,"221":1,"222":1,"306":2}}],["file",{"0":{"28":1,"273":1,"274":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"15":1,"17":3,"18":1,"19":3,"20":1,"21":1,"56":2,"69":1,"94":1,"95":2,"141":2,"265":2,"271":1,"273":2,"283":1,"289":1,"304":2,"305":1}}],["fitting",{"2":{"138":1}}],["fit",{"2":{"131":1,"185":2,"197":1,"224":1}}],["finger",{"2":{"240":1,"297":1}}],["fingernails",{"2":{"171":1}}],["fine",{"2":{"171":1,"271":1}}],["final",{"0":{"121":1},"2":{"134":1,"165":1,"170":1}}],["finally",{"2":{"88":1}}],["finnish",{"2":{"82":1}}],["finished",{"2":{"133":1}}],["finish",{"2":{"81":1,"94":1}}],["finding",{"0":{"96":1}}],["find",{"0":{"157":1,"158":1},"2":{"20":2,"52":1,"94":1,"98":1,"103":1,"134":1,"157":1,"176":1,"185":1,"188":1,"221":1,"247":1,"261":1,"263":1,"266":1,"273":1,"285":1,"297":1,"299":1,"304":2}}],["fi",{"2":{"28":1,"50":2,"94":2,"97":1}}],["firmly",{"2":{"90":1,"236":1}}],["firmware",{"0":{"26":1,"34":1,"40":1,"42":1,"43":1,"45":1,"78":1,"85":1,"89":1,"90":1,"94":1,"95":1,"97":1,"103":1,"122":1,"173":1,"174":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"35":1,"36":1,"37":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"98":1},"2":{"28":1,"31":6,"32":1,"33":2,"35":4,"36":1,"38":1,"39":2,"42":2,"44":1,"56":2,"69":1,"72":1,"76":1,"77":1,"78":2,"79":1,"85":2,"89":1,"90":5,"92":1,"93":3,"94":1,"95":1,"97":2,"100":1,"101":1,"103":1,"122":1,"174":1,"212":1,"241":1,"243":1,"246":1,"247":1,"248":1}}],["firstly",{"2":{"305":1}}],["first",{"2":{"4":1,"36":1,"37":1,"85":1,"87":1,"93":1,"99":1,"147":1,"152":1,"161":1,"170":1,"197":1,"230":2,"238":1,"239":1,"263":1,"266":1,"268":1,"274":4,"279":1}}],["fixes",{"2":{"25":1}}],["fix",{"2":{"25":2,"306":1}}],["focus",{"2":{"228":1}}],["focused",{"2":{"101":2,"221":1}}],["fov",{"0":{"215":1},"2":{"215":1,"234":1,"239":1}}],["four",{"2":{"217":1}}],["fourm",{"2":{"154":1}}],["found",{"2":{"39":1,"95":1,"131":1,"146":1,"151":1,"230":1}}],["footprint",{"2":{"221":1}}],["footer",{"2":{"25":1}}],["foow17",{"2":{"127":2}}],["font",{"2":{"20":2}}],["fold",{"2":{"230":1,"231":1}}],["folding",{"2":{"230":1}}],["folder",{"2":{"12":1,"15":2,"17":1,"18":4,"19":1,"21":1,"78":1,"280":1,"281":1}}],["follows",{"2":{"25":2,"47":1,"65":1}}],["followed",{"2":{"24":1,"57":1}}],["following",{"0":{"252":1,"255":1},"2":{"19":1,"20":1,"25":2,"30":2,"65":1,"66":1,"67":2,"68":2,"70":2,"90":1,"97":1,"98":1,"100":1,"169":1,"184":2,"194":1,"229":1,"234":1,"242":3,"279":1}}],["follow",{"2":{"15":1,"25":1,"39":1,"42":1,"68":1,"70":1,"84":1,"90":1,"93":1,"97":1,"101":1,"126":1,"243":1,"283":1}}],["force",{"2":{"171":2,"274":1}}],["form",{"2":{"156":1,"223":1,"305":1}}],["formula",{"0":{"117":1}}],["format",{"2":{"30":1,"67":1,"68":1,"70":1}}],["formatting",{"2":{"25":1,"141":1}}],["formatted",{"2":{"16":1}}],["forward",{"2":{"78":1,"216":1,"301":1}}],["for",{"0":{"9":1,"94":1,"95":1,"156":1,"165":1,"168":1,"176":1,"217":1,"221":1,"253":1,"254":1,"266":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"255":1,"267":1,"268":1,"269":1,"270":1,"271":1},"2":{"9":1,"15":1,"16":2,"17":1,"18":2,"19":1,"20":1,"22":1,"24":2,"25":2,"28":4,"31":1,"32":2,"33":2,"35":2,"36":4,"37":14,"38":2,"39":2,"41":1,"44":2,"56":1,"57":1,"58":2,"62":1,"64":1,"65":1,"66":1,"67":1,"68":3,"69":6,"70":1,"72":1,"77":1,"78":1,"81":1,"82":1,"84":1,"87":1,"90":1,"92":1,"94":5,"95":2,"96":3,"97":1,"99":2,"100":1,"104":1,"105":1,"106":1,"107":3,"108":1,"118":1,"123":1,"126":1,"127":1,"129":5,"130":1,"131":2,"134":1,"140":2,"141":1,"146":1,"151":1,"153":3,"154":1,"156":1,"157":4,"159":1,"160":2,"168":1,"175":2,"176":5,"182":1,"185":1,"188":2,"192":3,"196":1,"202":1,"204":1,"207":1,"208":1,"209":1,"212":5,"215":1,"216":2,"217":4,"221":3,"222":4,"223":3,"224":2,"241":1,"242":1,"243":1,"252":1,"253":1,"257":3,"261":1,"263":1,"264":1,"265":1,"266":2,"269":1,"270":1,"273":1,"274":8,"289":1,"293":1,"294":1,"297":1,"300":1,"301":3,"302":1,"304":1,"305":2}}],["fox",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["evt",{"2":{"266":1}}],["everyone",{"2":{"118":1}}],["every",{"2":{"104":1}}],["everything",{"0":{"161":1},"2":{"36":3,"44":1,"46":1,"97":1,"100":1,"168":1,"270":1,"271":1,"300":1}}],["event",{"2":{"221":1,"253":1}}],["evenly",{"2":{"134":1}}],["even",{"2":{"54":1,"67":1,"79":1,"196":1,"221":1}}],["electrical",{"2":{"229":1,"230":2}}],["elements",{"2":{"20":1}}],["ethernet",{"2":{"263":1}}],["etvrmoduleconfig",{"2":{"273":1}}],["etvr",{"0":{"256":2,"261":1,"262":1,"268":1},"1":{"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2},"2":{"126":1,"129":1,"140":1,"141":1,"228":1,"248":1,"257":3,"258":1,"261":1,"262":2,"263":2,"264":3,"266":2,"269":2,"302":1,"304":2,"307":2}}],["etc",{"2":{"25":1,"106":1,"300":1,"301":1}}],["equally",{"2":{"134":1}}],["equal",{"2":{"116":2}}],["equation",{"2":{"38":1}}],["equivalent",{"2":{"107":1}}],["empty",{"2":{"305":1}}],["emulation",{"2":{"274":7}}],["emulating",{"2":{"274":3}}],["email",{"2":{"253":1}}],["emission",{"2":{"108":1,"110":1,"117":1}}],["emitter",{"0":{"106":1},"1":{"107":1,"108":1},"2":{"221":2,"242":1}}],["emitters",{"0":{"123":1,"219":1},"1":{"220":1,"221":1},"2":{"101":1,"106":3,"107":1,"116":1,"123":1,"218":1,"221":4,"222":1,"224":1}}],["embedded",{"2":{"84":1}}],["error",{"2":{"79":1}}],["effects",{"2":{"106":1,"118":1}}],["effect",{"2":{"71":1,"101":1,"257":1}}],["e",{"2":{"35":2,"108":1,"111":2,"112":2,"114":2,"115":2,"117":3,"192":3,"194":1,"202":1,"208":1,"299":1}}],["espcam32",{"2":{"212":1}}],["especially",{"2":{"99":1,"101":1}}],["espressif",{"2":{"84":1}}],["espaithinker",{"2":{"35":1}}],["esp32wrover",{"2":{"37":2}}],["esp32m5stack",{"2":{"37":2}}],["esp32aithinker",{"2":{"37":3,"95":2}}],["esp32cams",{"2":{"37":1}}],["esp32cam",{"2":{"35":1,"37":3}}],["esp32",{"0":{"87":1,"88":1,"233":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"31":2,"37":8,"38":1,"41":1,"56":1,"57":2,"65":2,"87":2,"88":1,"103":1,"202":2,"204":3,"207":1,"211":1,"212":1,"215":1,"217":2,"223":1,"234":1,"241":1,"242":1}}],["esp",{"0":{"170":1,"172":1,"174":1,"178":1,"179":1,"180":1,"200":1,"206":1},"1":{"207":1,"208":1},"2":{"28":7,"31":4,"33":2,"37":3,"62":1,"64":1,"66":1,"68":1,"69":1,"78":1,"89":1,"90":1,"94":1,"96":2,"170":3,"171":1,"172":2,"174":1,"180":1,"207":1,"211":1,"212":1,"223":1,"245":1,"247":2}}],["esps",{"0":{"171":1,"202":1,"204":1},"2":{"4":1,"28":2,"30":3,"31":1,"32":2,"33":1,"66":1,"93":3,"95":2,"205":1,"212":1,"217":2,"218":2,"243":2,"244":1,"245":1,"297":1,"299":1}}],["either",{"2":{"28":1,"79":1,"134":1,"160":1,"170":1,"181":1,"228":1,"268":1,"305":1}}],["easier",{"2":{"177":1,"192":1,"204":1,"207":1,"269":1,"270":1}}],["easiest",{"2":{"157":1}}],["easily",{"2":{"35":1,"62":1,"81":1,"188":1,"228":1,"238":1}}],["easy",{"2":{"22":1,"24":5,"25":3,"87":1,"144":1,"149":1,"170":1,"273":1}}],["each",{"0":{"111":1,"112":1},"2":{"3":1,"28":1,"33":1,"35":1,"56":1,"185":2,"216":1,"230":1,"240":1,"263":1,"301":1}}],["enough",{"0":{"108":1},"2":{"182":1,"265":1,"306":1}}],["encountered",{"2":{"98":1}}],["enum",{"2":{"68":2,"70":2}}],["env",{"2":{"94":1,"95":1}}],["envs",{"2":{"37":1}}],["enviroment",{"2":{"37":1}}],["enviroments",{"2":{"33":1}}],["environnement",{"2":{"36":1}}],["environment",{"0":{"72":1},"1":{"73":1,"74":1,"75":1,"76":1,"77":1,"78":1},"2":{"33":2,"35":1,"36":5,"37":10,"44":1,"93":1,"94":4,"95":3}}],["environments",{"0":{"33":1,"34":1},"1":{"35":1,"36":1,"37":1},"2":{"28":1,"33":1,"35":2,"95":1}}],["enter",{"2":{"81":1,"97":1,"247":1,"248":1,"289":1,"297":1,"299":1}}],["entering",{"2":{"78":1}}],["entered",{"2":{"28":1,"52":1}}],["entirely",{"2":{"129":1}}],["entire",{"2":{"20":1,"230":1}}],["enableota",{"2":{"31":1,"95":1}}],["enabled",{"2":{"30":1,"32":1,"56":1}}],["enable",{"0":{"56":1},"2":{"30":2,"31":1,"68":1}}],["enableadhoc",{"2":{"28":2}}],["enabling",{"2":{"28":1}}],["english",{"2":{"24":2}}],["ensures",{"2":{"221":1}}],["ensure",{"2":{"22":1,"24":2,"25":2,"41":2,"47":1,"49":1,"101":1,"106":1,"116":1,"135":1,"185":1,"196":2,"217":3}}],["ends",{"2":{"217":1}}],["endpoints",{"0":{"66":1},"2":{"66":3}}],["endpoint",{"2":{"65":2,"66":3,"67":1}}],["end",{"2":{"2":1,"182":1,"183":2,"192":2,"217":1,"240":1,"266":1}}],["e67e22",{"2":{"20":2}}],["exe",{"2":{"283":1}}],["executed",{"2":{"271":1}}],["exercise",{"2":{"106":1}}],["extremely",{"2":{"196":1}}],["extremes",{"2":{"159":1,"294":1,"301":1}}],["extracting",{"2":{"268":1}}],["extra",{"0":{"130":1,"145":1,"150":1}}],["external",{"0":{"170":1},"2":{"25":1,"170":2,"204":1,"207":1,"212":1,"234":1}}],["extensive",{"2":{"44":1}}],["extensions",{"0":{"216":1},"2":{"127":1,"145":1,"150":1,"216":2}}],["extension",{"2":{"19":1,"64":1,"77":1,"145":1,"150":1,"215":1,"216":1,"257":1}}],["extend",{"2":{"24":2,"25":1}}],["excellent",{"2":{"129":1}}],["excessive",{"2":{"106":1}}],["excited",{"2":{"105":1}}],["exactly",{"2":{"106":2,"123":1,"221":1}}],["example",{"2":{"17":1,"18":1,"19":1,"20":1,"25":3,"31":1,"57":1,"65":1,"94":1,"95":1,"97":1,"131":2,"157":1,"170":1,"179":1,"182":1,"194":1,"217":1,"252":1,"300":4}}],["examples",{"2":{"16":1,"36":1}}],["expand",{"2":{"304":1,"305":1}}],["expressive",{"2":{"274":1}}],["expressions",{"2":{"274":2,"304":1,"305":1}}],["expression",{"2":{"257":1}}],["expensive",{"2":{"217":1}}],["experimental",{"0":{"298":1},"1":{"299":1},"2":{"215":1}}],["experiment",{"2":{"160":1}}],["experience",{"2":{"106":1,"121":1}}],["experiences",{"2":{"99":1}}],["expected",{"2":{"257":1}}],["expect",{"2":{"121":1,"166":1}}],["expose",{"2":{"231":1}}],["exposed",{"2":{"106":1,"175":1,"176":1}}],["exposures",{"2":{"107":1,"118":1}}],["exposure",{"0":{"109":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"115":1},"2":{"106":1,"107":1,"108":1,"118":1}}],["explains",{"2":{"302":1}}],["explain",{"2":{"274":1}}],["explanation",{"2":{"274":1}}],["explore",{"2":{"99":1}}],["explicitly",{"2":{"44":1}}],["exist",{"2":{"266":1}}],["exists",{"2":{"87":1}}],["existing",{"0":{"156":1},"2":{"25":1,"66":1,"99":1,"239":1,"266":1}}],["ex",{"2":{"78":1,"141":1,"216":1}}],["editing",{"0":{"21":1}}],["edit",{"2":{"16":1,"21":2,"165":1,"185":1}}],["eyebrowthresholdlowering",{"2":{"274":1}}],["eyebrowthresholdrising",{"2":{"274":1}}],["eyebrow",{"2":{"274":3}}],["eyetrackapp",{"2":{"280":1,"281":3}}],["eyetrack",{"2":{"131":1}}],["eyetrackvr",{"0":{"5":1,"9":1,"99":1,"282":1,"283":2,"284":1},"1":{"6":1,"7":1,"8":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"9":1,"12":2,"17":1,"18":1,"22":1,"69":1,"78":2,"90":1,"99":1,"101":1,"103":1,"104":1,"106":1,"107":1,"138":1,"140":1,"278":1,"279":1}}],["eyesy",{"2":{"255":1}}],["eyes",{"0":{"288":1,"301":1},"2":{"101":1,"106":3,"123":1,"274":1,"288":1,"301":2,"305":1}}],["eye",{"0":{"101":1,"106":1,"254":1,"286":1,"287":1,"295":1},"1":{"107":1,"108":1,"255":1},"2":{"2":1,"37":2,"99":2,"101":2,"106":1,"107":1,"108":1,"116":1,"118":1,"159":1,"165":1,"176":2,"182":1,"192":1,"194":1,"196":1,"197":4,"214":1,"215":1,"247":1,"248":1,"274":5,"286":1,"287":1,"291":1,"293":1,"294":1,"295":1,"297":2,"300":2,"301":7}}],["1x",{"2":{"130":4,"131":6,"217":1,"218":3,"221":1,"223":2}}],["16",{"0":{"181":1}}],["160",{"2":{"127":1,"146":1,"151":1,"215":1,"242":1}}],["160°",{"0":{"215":1,"227":1},"2":{"127":3,"225":1}}],["168",{"2":{"52":2}}],["123building",{"2":{"269":1}}],["1234",{"2":{"111":1,"112":1,"114":1,"115":1}}],["12345678",{"2":{"95":1}}],["1234567891011121314",{"2":{"68":1,"70":1}}],["123456789note",{"2":{"19":1}}],["12345",{"2":{"25":1,"95":1,"117":1}}],["12345the",{"2":{"25":1}}],["127",{"2":{"263":1}}],["1206",{"2":{"221":1}}],["120°",{"2":{"108":1,"110":1,"127":1}}],["12",{"0":{"177":1},"2":{"108":1,"179":1,"180":1}}],["1−cosθ",{"2":{"108":1,"117":1}}],["13",{"0":{"178":1}}],["130°",{"0":{"226":1},"2":{"215":1}}],["130ohm",{"2":{"197":1}}],["130",{"2":{"127":2,"146":1,"151":1,"215":1,"242":1,"244":1}}],["13×",{"2":{"107":1}}],["13dbm",{"2":{"68":2,"70":2}}],["110mm",{"2":{"127":1}}],["11",{"0":{"176":1},"2":{"107":1,"278":1}}],["11dbm",{"2":{"68":2,"70":2}}],["1dbm",{"2":{"68":2,"70":2}}],["18",{"0":{"182":1},"2":{"68":2,"70":2}}],["19dbm",{"2":{"68":2,"70":2}}],["19",{"0":{"185":1},"1":{"186":1,"187":1},"2":{"68":2,"70":2,"112":2}}],["192",{"2":{"52":2}}],["14mm",{"2":{"223":1}}],["1400",{"2":{"107":1}}],["14",{"0":{"179":1},"2":{"68":1,"180":1}}],["1by",{"2":{"56":1}}],["1this",{"2":{"20":1}}],["10mm",{"2":{"130":1}}],["100",{"2":{"107":1,"118":1,"121":1}}],["1000",{"2":{"107":1,"118":1}}],["10",{"0":{"175":1},"2":{"11":1,"107":1,"118":1}}],["17dbm",{"2":{"68":2,"70":2}}],["17",{"0":{"2":1}}],["1",{"0":{"42":1,"49":1,"73":1,"86":1,"87":1,"94":2,"95":1,"133":1,"157":1,"166":1,"186":1,"201":1,"207":1,"283":1},"1":{"74":1,"75":1,"87":1,"88":1,"202":1},"2":{"1":1,"2":1,"11":1,"12":4,"20":1,"28":2,"31":1,"65":1,"68":1,"71":3,"94":2,"95":2,"97":1,"107":2,"108":2,"110":1,"114":3,"115":1,"130":1,"157":1,"181":1,"182":1,"242":3,"263":1,"274":11,"279":1}}],["1st",{"2":{"1":1,"181":1}}],["15dbm",{"2":{"68":2,"70":2}}],["15",{"0":{"1":1,"180":1},"2":{"11":1,"140":1}}],["n",{"2":{"168":1,"192":2,"194":3}}],["nm",{"2":{"107":2,"118":1}}],["nummbers",{"2":{"106":1}}],["numbers",{"2":{"299":1}}],["number",{"2":{"68":1,"70":1,"71":3,"289":1,"299":1}}],["night",{"0":{"215":1},"2":{"225":1}}],["nir",{"2":{"101":1}}],["nicely",{"2":{"228":1}}],["nice",{"2":{"20":1}}],["npm",{"2":{"25":1}}],["navigating",{"2":{"78":1}}],["navigate",{"2":{"12":1,"94":1,"266":2}}],["namely",{"2":{"205":1,"269":1}}],["named",{"2":{"94":1,"304":1}}],["name",{"0":{"142":1},"1":{"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1},"2":{"17":1,"28":2,"30":1,"31":1,"50":1,"54":3,"56":5,"57":2,"60":2,"65":2,"67":1,"68":1,"69":2,"94":3,"95":2,"141":2,"266":1,"305":2}}],["names",{"2":{"15":1}}],["naming",{"2":{"15":1}}],["nonfunctioning",{"2":{"196":1}}],["none",{"2":{"156":1,"185":1,"305":1}}],["non",{"2":{"101":2,"196":1}}],["now",{"2":{"36":1,"44":1,"90":1,"96":1,"134":1,"135":1,"136":1,"147":2,"152":2,"158":1,"171":1,"182":1,"197":2,"230":1,"239":1,"240":1,"241":1,"244":3,"245":2,"261":1,"271":1,"281":1,"300":4,"301":1,"304":1,"305":3}}],["no",{"2":{"25":1,"129":1,"131":2,"146":1,"151":1,"186":1,"188":1,"196":1,"202":1,"204":1,"205":1,"208":1,"220":1,"224":1,"262":1,"265":1,"273":1}}],["normal",{"2":{"192":1}}],["nor",{"2":{"25":1,"304":1}}],["node",{"2":{"11":1}}],["notoriously",{"2":{"229":1}}],["noting",{"2":{"165":1,"215":1,"217":1}}],["notice",{"0":{"101":1},"2":{"263":1}}],["nothing",{"2":{"31":1}}],["noted",{"2":{"170":1}}],["notes",{"2":{"110":1}}],["note",{"0":{"299":1},"2":{"28":1,"37":1,"39":1,"41":1,"48":2,"66":3,"68":2,"70":1,"78":1,"96":1,"127":1,"146":1,"151":1,"167":1,"171":2,"172":1,"182":1,"205":1,"215":1,"252":1,"271":1,"302":1,"307":1}}],["not",{"0":{"60":1,"121":1,"156":1,"165":1},"2":{"1":2,"3":1,"4":1,"15":2,"19":2,"25":2,"28":5,"30":1,"31":2,"32":3,"36":2,"37":3,"39":1,"44":1,"48":1,"54":3,"56":4,"60":2,"66":1,"67":3,"68":1,"78":2,"89":1,"90":1,"95":1,"101":1,"104":2,"106":6,"108":1,"116":3,"121":2,"122":1,"123":1,"133":1,"134":1,"136":1,"145":1,"147":1,"150":1,"152":1,"154":1,"156":1,"170":5,"171":1,"175":1,"181":2,"196":1,"211":3,"214":1,"215":1,"216":1,"217":2,"221":5,"224":2,"230":2,"231":4,"235":1,"237":1,"240":1,"244":1,"252":1,"276":2,"304":1,"307":1}}],["nearly",{"2":{"159":1}}],["near",{"0":{"106":1},"1":{"107":1,"108":1},"2":{"176":1,"188":1,"216":1}}],["nevertheless",{"2":{"165":1}}],["never",{"2":{"101":1}}],["next",{"2":{"44":1,"45":1,"84":1,"94":1,"95":1,"133":1,"153":1,"173":1,"174":1,"182":1,"222":1,"237":1,"263":1,"266":1,"269":2,"301":1}}],["necessary",{"2":{"41":1}}],["networkname",{"2":{"68":1}}],["networks",{"2":{"48":1,"68":1}}],["network",{"0":{"50":1},"2":{"28":1,"30":1,"31":1,"39":1,"48":1,"50":2,"60":2,"66":4,"68":6,"69":1,"95":1,"263":2}}],["neither",{"2":{"25":1}}],["newest",{"0":{"97":1},"1":{"98":1},"2":{"97":1}}],["new",{"2":{"17":1,"25":4,"32":1,"39":1,"56":1,"62":1,"66":3,"78":1,"88":1,"93":1,"100":1,"266":1}}],["needs",{"2":{"204":1,"207":1,"217":1,"307":1}}],["need",{"0":{"258":1},"1":{"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1},"2":{"2":1,"17":1,"19":3,"21":1,"28":6,"31":5,"33":1,"36":1,"37":1,"39":1,"44":1,"48":1,"50":2,"56":2,"57":1,"76":1,"83":1,"93":1,"95":1,"97":1,"129":1,"131":1,"133":1,"146":1,"151":1,"153":1,"158":1,"170":2,"176":1,"182":1,"193":1,"194":1,"211":1,"212":1,"216":1,"217":1,"222":1,"228":1,"230":1,"236":1,"237":1,"239":1,"244":1,"247":1,"252":1,"258":1,"262":1,"263":1,"271":1,"273":2,"276":1,"301":1,"302":1,"304":3,"305":1,"307":1}}],["needed",{"0":{"130":1,"145":1,"150":1},"2":{"1":1,"25":1,"78":1,"145":1,"150":1,"181":1,"186":1,"205":1}}],["negative",{"0":{"179":1},"2":{"1":2,"175":1,"179":1,"181":2}}],["blurry",{"0":{"228":1},"2":{"228":2}}],["black",{"2":{"171":2,"197":3,"240":1}}],["blender",{"2":{"153":1,"252":1}}],["blocking",{"2":{"134":1}}],["bit",{"2":{"187":1,"193":1,"204":1,"207":1,"263":1,"273":1,"274":1}}],["bigscreen",{"2":{"141":1,"215":1}}],["bigger",{"2":{"133":1}}],["bin",{"0":{"113":1,"114":1,"115":1},"1":{"114":1,"115":1},"2":{"113":1}}],["binary",{"2":{"69":1}}],["bizarre",{"2":{"79":1}}],["b",{"0":{"118":1},"2":{"45":1,"147":1,"152":1}}],["bare",{"2":{"218":1}}],["bard",{"2":{"84":1}}],["bag",{"0":{"170":1},"2":{"170":2}}],["balty",{"2":{"165":1}}],["backing",{"2":{"300":1}}],["back",{"2":{"136":1,"171":1,"230":1,"244":1,"262":1,"264":1,"300":1,"305":1}}],["background",{"2":{"100":1}}],["babble",{"2":{"129":1,"134":2}}],["bandwidth",{"2":{"202":1}}],["band",{"2":{"28":3}}],["based",{"2":{"153":1,"158":1,"222":1}}],["bashfeat",{"2":{"25":1}}],["bash",{"2":{"25":1,"78":1}}],["basic",{"0":{"156":1},"2":{"4":1,"32":1,"64":1,"158":1,"166":1,"224":2,"285":1}}],["bounces",{"2":{"305":1}}],["bool",{"2":{"304":3,"307":1}}],["boot",{"2":{"88":3}}],["box",{"0":{"234":1}}],["bom",{"0":{"139":1}}],["bodily",{"2":{"106":1}}],["body",{"2":{"25":1,"212":1}}],["bottom",{"2":{"89":1,"133":1,"136":1,"176":1,"187":1,"216":1,"230":1}}],["both",{"0":{"288":1},"2":{"28":2,"56":1,"107":1,"129":1,"170":1,"217":1,"218":1,"222":2,"252":1,"263":1,"264":1,"270":2,"288":1,"297":1,"301":1,"304":2}}],["bonjour",{"0":{"58":1},"2":{"58":4}}],["board",{"0":{"37":1,"44":1,"49":1,"175":1},"2":{"35":1,"37":3,"44":3,"45":2,"47":1,"49":1,"51":1,"52":1,"87":1,"88":1,"90":1,"95":1,"105":1,"170":1,"175":1,"194":1,"196":3,"197":1,"202":1,"204":1,"212":4,"234":1,"236":1,"238":1,"245":1}}],["boards",{"0":{"210":1},"1":{"211":1,"212":1},"2":{"1":1,"37":5,"39":1,"160":1,"170":1,"181":1,"192":1,"202":1,"204":1,"207":1,"214":1,"215":1,"216":1,"217":2,"220":2,"222":1,"242":1}}],["breakable",{"2":{"228":1}}],["breakout",{"2":{"217":1,"218":1}}],["break",{"2":{"186":1,"214":1,"238":1}}],["breaking",{"0":{"265":1},"2":{"25":7,"186":1,"228":1,"265":1}}],["bridging",{"2":{"170":1}}],["bridge",{"2":{"131":2,"133":1,"134":2,"170":3}}],["bring",{"2":{"124":1}}],["bright",{"2":{"71":1,"196":2}}],["brightness",{"2":{"71":1,"101":1,"106":1,"116":2}}],["branch",{"2":{"78":1}}],["brows",{"2":{"274":1}}],["browser",{"2":{"12":1,"32":1,"52":1,"64":1,"94":1,"96":1,"174":1,"297":2,"304":1}}],["broadcast",{"2":{"68":1}}],["broken",{"2":{"35":1}}],["broccoli",{"2":{"25":1}}],["bypass",{"2":{"101":1,"106":1}}],["by",{"0":{"164":1,"251":1},"1":{"252":1,"253":1},"2":{"24":1,"30":1,"32":4,"37":1,"39":1,"48":1,"56":1,"57":1,"68":1,"69":1,"78":2,"81":1,"88":1,"90":1,"94":1,"95":1,"96":1,"99":1,"100":1,"103":1,"141":1,"158":1,"182":1,"194":1,"199":1,"225":1,"228":1,"229":1,"230":1,"239":1,"240":2,"244":1,"254":1,"257":1,"263":1,"264":1,"268":1,"274":12,"297":1,"300":1,"301":1,"305":1}}],["bunch",{"2":{"305":1}}],["burn",{"2":{"221":1}}],["bump",{"2":{"135":1}}],["buying",{"2":{"215":1,"221":1}}],["buy",{"2":{"123":1,"205":1,"221":2}}],["bugs",{"2":{"121":1,"122":1}}],["bug",{"2":{"25":2,"67":1}}],["buttons",{"0":{"305":1},"2":{"51":1,"52":1,"95":1,"305":2}}],["button",{"2":{"45":2,"84":1,"87":3,"88":3,"89":1,"90":1,"94":2,"95":2,"96":1,"297":1,"299":1,"300":1,"301":3,"304":1,"305":2}}],["but",{"2":{"20":1,"28":1,"37":1,"45":1,"54":1,"89":1,"93":1,"94":1,"100":1,"101":3,"104":1,"124":1,"126":1,"134":1,"171":1,"179":2,"193":1,"214":1,"215":1,"228":1,"230":1,"274":1,"304":1}}],["builds",{"2":{"89":1}}],["building",{"0":{"85":1,"217":1,"267":1,"271":1},"1":{"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"268":1,"269":1,"270":1,"271":1},"2":{"79":1,"93":1,"174":1,"229":2}}],["build",{"0":{"36":1,"89":1,"163":1,"242":1,"275":1,"276":1,"281":1},"1":{"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1},"2":{"25":2,"35":1,"36":1,"44":1,"77":1,"79":1,"89":1,"94":3,"99":1,"100":1,"126":1,"212":1,"242":1,"266":1,"271":3,"276":1,"279":1,"281":2,"305":1}}],["builtin",{"2":{"65":2,"67":1}}],["built",{"2":{"9":1,"20":1,"90":1,"101":1}}],["buil",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["because",{"2":{"300":1}}],["behave",{"2":{"273":1}}],["bend",{"2":{"231":1}}],["beyond",{"2":{"141":1,"215":1}}],["beer",{"2":{"133":1,"134":3}}],["been",{"2":{"90":1,"154":1,"171":1,"205":1,"230":1,"300":1}}],["believe",{"2":{"118":1}}],["below",{"2":{"14":1,"49":1,"90":1,"101":2,"106":1,"107":3,"136":1,"170":2,"171":1,"179":1,"184":2,"185":1,"191":1,"238":1,"240":1}}],["begin",{"2":{"88":1,"230":3,"239":1,"274":4}}],["being",{"2":{"66":1,"106":1,"129":1,"221":1,"300":2,"304":1}}],["better",{"2":{"185":1,"202":1,"208":1,"231":1,"274":1}}],["beta",{"0":{"208":1,"299":2},"2":{"39":1,"202":1}}],["between",{"2":{"35":1,"71":1,"196":1,"221":1,"235":1}}],["best",{"0":{"231":1},"2":{"28":1,"153":1,"160":1,"170":2,"188":1,"222":1,"229":1,"232":1,"293":1,"301":1}}],["before",{"0":{"41":1,"119":1,"120":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"120":1,"121":2,"122":2,"123":2,"124":2,"125":2},"2":{"19":1,"78":1,"100":1,"116":1,"136":1,"141":1,"172":2,"196":1,"200":1,"206":1,"229":1,"278":1}}],["be",{"0":{"123":1,"124":1,"165":1},"2":{"1":1,"3":1,"15":1,"17":2,"18":1,"20":1,"24":5,"31":1,"32":4,"33":1,"36":4,"43":1,"44":3,"45":1,"52":1,"54":1,"56":3,"64":1,"66":1,"67":1,"68":1,"69":2,"78":3,"82":1,"85":1,"88":1,"90":2,"93":1,"95":3,"98":1,"106":2,"118":1,"123":2,"124":1,"133":1,"134":3,"136":1,"140":1,"154":1,"162":1,"170":3,"171":3,"179":1,"181":1,"182":1,"185":1,"186":1,"192":1,"196":1,"202":3,"204":1,"207":1,"208":2,"211":1,"214":1,"217":1,"221":2,"224":2,"225":2,"230":3,"232":1,"236":1,"238":1,"240":1,"247":2,"257":1,"261":1,"266":1,"269":1,"271":1,"274":6,"281":2,"283":1,"284":1,"289":1,"293":1,"297":1,"302":1,"304":3,"305":1,"307":2}}],["ov2640",{"0":{"215":1},"2":{"215":1,"242":1}}],["overhangs",{"2":{"135":1}}],["overview",{"0":{"102":1,"120":1},"1":{"121":1,"122":1,"123":1,"124":1,"125":1},"2":{"166":1}}],["overwritten",{"2":{"68":1}}],["over",{"0":{"201":1,"203":1,"207":1,"208":1},"1":{"202":1,"204":1},"2":{"38":1,"39":1,"66":1,"85":1,"90":1,"92":1,"93":1,"99":1,"107":1,"135":3,"230":1,"260":1,"263":1,"264":1,"285":1,"297":1,"300":1}}],["ohm",{"2":{"170":1,"221":2}}],["od",{"2":{"130":1}}],["occur",{"2":{"121":1}}],["octal",{"2":{"37":2}}],["osc",{"0":{"306":1},"2":{"99":1,"262":1,"274":1,"302":2,"306":1,"307":1}}],["oldest",{"2":{"68":1}}],["otaserverport",{"2":{"95":1}}],["otaserverip",{"2":{"31":2,"95":1}}],["otapassword",{"2":{"31":2,"95":1}}],["ota",{"0":{"31":1,"91":1},"1":{"92":1,"93":1,"94":1,"95":1},"2":{"31":2,"39":1,"66":1,"69":6,"85":1,"90":2,"92":1,"93":3,"94":3,"95":5}}],["others",{"2":{"188":1}}],["other",{"0":{"224":1,"307":1},"2":{"2":1,"16":1,"25":1,"28":2,"90":2,"126":1,"147":1,"152":1,"153":1,"159":1,"176":1,"182":2,"183":1,"196":2,"202":1,"204":1,"207":1,"230":1,"244":1,"263":3,"301":1,"305":1}}],["opposite",{"2":{"134":2,"274":1}}],["optimal",{"2":{"176":1,"188":2,"204":1,"207":1}}],["optical",{"2":{"118":1}}],["option",{"0":{"87":1,"88":1,"201":1,"203":1,"207":1,"208":1,"253":1},"1":{"202":1,"204":1},"2":{"47":1,"170":2,"215":1,"284":1}}],["options",{"0":{"200":1,"206":1},"1":{"207":1,"208":1},"2":{"36":1,"44":1,"200":1,"206":1}}],["optionaland",{"2":{"25":1}}],["optional",{"0":{"216":1},"2":{"25":3,"223":1,"257":1}}],["opt",{"2":{"85":1}}],["operate",{"2":{"107":1}}],["operation",{"2":{"32":1,"44":1,"197":1}}],["openness",{"2":{"274":2}}],["openiristrackerl",{"2":{"95":1}}],["openiristracker",{"2":{"56":2,"69":1,"94":2}}],["openiris",{"2":{"39":2,"45":1,"78":3,"97":2,"103":1,"243":1}}],["opening",{"2":{"39":1,"78":1,"297":1}}],["opened",{"0":{"27":1},"2":{"305":1}}],["open",{"0":{"28":1,"270":1,"299":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"12":1,"43":1,"66":1,"77":1,"78":6,"81":1,"82":3,"84":3,"94":3,"95":1,"96":1,"97":1,"118":1,"129":1,"171":1,"247":1,"262":1,"270":1,"274":2,"279":1,"280":1,"281":1,"297":1}}],["own",{"0":{"155":1,"156":1,"251":1},"1":{"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"252":1,"253":1},"2":{"25":1,"39":1,"99":1,"104":1,"123":1,"133":1,"158":1,"205":1,"220":1,"224":2,"269":1}}],["objects",{"2":{"171":1,"231":1}}],["object",{"2":{"19":2,"66":1}}],["our",{"0":{"167":1},"2":{"14":1,"20":1,"24":1,"25":7,"32":1,"39":2,"62":1,"101":1,"102":1,"104":1,"105":1,"106":1,"107":1,"122":1,"123":1,"124":1,"140":1,"173":1,"174":1,"179":1,"202":1,"208":1,"224":1,"242":1,"293":1,"300":2}}],["outline",{"2":{"197":2,"230":1}}],["outlined",{"2":{"193":1}}],["outside",{"2":{"178":1}}],["outputs",{"2":{"290":1}}],["outputmultiplier",{"2":{"274":1}}],["output",{"2":{"90":1,"95":1,"96":1,"101":1,"107":1,"113":1,"271":1,"274":1}}],["out",{"2":{"1":3,"66":1,"101":1,"116":1,"140":1,"154":1,"171":1,"173":1,"181":3,"221":2,"224":1,"230":1,"239":1,"244":1,"257":1,"263":1,"291":1,"292":1,"299":1}}],["often",{"2":{"66":1}}],["offers",{"2":{"204":1,"207":1}}],["official",{"2":{"106":1,"123":1,"220":1}}],["off",{"2":{"32":1,"140":2,"230":3,"231":1,"300":1,"305":1}}],["of",{"0":{"95":1,"96":1,"120":1,"169":1,"266":1},"1":{"121":1,"122":1,"123":1,"124":1,"125":1,"267":1,"268":1,"269":1,"270":1,"271":1},"2":{"1":2,"2":1,"3":3,"4":3,"5":1,"15":1,"16":1,"17":1,"20":4,"25":4,"28":4,"30":1,"31":3,"33":1,"36":2,"38":1,"39":1,"42":1,"44":1,"54":8,"56":5,"57":2,"60":2,"64":1,"65":1,"66":4,"68":4,"69":1,"70":1,"71":1,"78":1,"82":2,"84":1,"87":2,"88":1,"89":1,"90":1,"94":2,"95":4,"96":2,"97":1,"101":2,"106":1,"107":2,"108":2,"111":1,"112":1,"114":1,"115":1,"116":2,"117":2,"118":3,"131":1,"133":5,"134":3,"135":3,"136":1,"143":1,"147":2,"148":1,"152":2,"156":1,"159":2,"165":4,"166":1,"167":1,"170":3,"171":4,"175":2,"176":3,"178":1,"179":1,"181":2,"182":1,"184":1,"185":4,"186":3,"187":2,"190":1,"192":4,"194":2,"196":1,"200":1,"204":1,"205":2,"206":1,"207":1,"214":1,"215":2,"216":1,"217":3,"221":1,"223":1,"224":1,"225":1,"228":1,"229":2,"230":4,"239":2,"240":1,"242":1,"244":3,"246":1,"247":2,"261":1,"263":2,"264":1,"265":1,"266":3,"269":1,"274":3,"280":1,"289":1,"300":6,"302":3,"304":3,"305":4,"306":1,"307":1}}],["ontop",{"2":{"135":1}}],["onto",{"2":{"131":1,"134":2,"243":1}}],["once",{"0":{"27":1,"125":1},"2":{"36":1,"44":1,"45":1,"51":1,"77":1,"84":1,"85":1,"87":1,"88":1,"90":1,"93":2,"94":1,"106":1,"136":1,"171":1,"173":1,"176":1,"177":1,"236":1,"238":1,"261":1,"270":1,"281":1,"301":2,"305":2}}],["only",{"0":{"212":1,"299":1},"2":{"1":1,"2":1,"24":2,"25":2,"28":2,"30":1,"32":1,"36":1,"37":1,"44":1,"58":2,"68":1,"78":1,"93":1,"96":1,"101":1,"123":1,"153":1,"171":1,"181":1,"182":2,"193":1,"204":1,"212":2,"217":1,"235":1,"240":1,"255":1,"271":1,"286":1,"287":1,"300":1,"307":1}}],["ones",{"2":{"90":1,"123":1,"176":3,"215":1,"221":3,"257":1}}],["one",{"2":{"1":1,"2":1,"4":2,"28":1,"33":1,"66":1,"81":1,"82":1,"90":1,"94":2,"95":1,"96":1,"130":1,"134":1,"140":1,"146":1,"151":1,"181":1,"182":1,"183":1,"185":1,"192":1,"196":1,"212":1,"217":3,"218":1,"230":1,"236":1,"238":1,"247":1,"263":1,"266":1,"301":1,"305":2}}],["on",{"0":{"2":1,"3":1,"27":1,"125":1,"139":1,"156":1,"167":1,"182":1,"183":1,"263":1},"2":{"1":4,"3":1,"4":1,"14":1,"16":1,"20":1,"30":2,"31":1,"36":1,"37":1,"38":2,"39":3,"42":1,"43":1,"44":2,"45":1,"56":1,"68":1,"69":1,"82":4,"84":5,"87":1,"88":1,"93":2,"94":3,"95":1,"96":1,"101":1,"103":1,"105":1,"106":1,"116":1,"118":3,"126":1,"129":1,"133":2,"135":2,"136":1,"140":2,"141":1,"145":1,"147":2,"150":1,"152":2,"153":2,"158":2,"160":1,"161":1,"165":1,"170":2,"173":2,"174":1,"178":1,"179":1,"181":4,"182":2,"184":1,"186":1,"187":1,"193":1,"196":2,"197":2,"199":1,"202":2,"205":1,"208":2,"212":1,"215":1,"217":1,"218":2,"222":2,"224":1,"225":1,"230":2,"231":2,"236":2,"238":4,"240":2,"244":1,"247":1,"261":1,"263":1,"266":1,"271":1,"273":1,"274":4,"284":1,"300":2,"304":5,"305":3,"307":1}}],["org",{"2":{"279":1}}],["organizing",{"2":{"18":1}}],["orientate",{"2":{"183":1}}],["orientation",{"2":{"3":1,"170":1,"193":1,"194":1,"197":2}}],["original",{"2":{"129":1,"136":1}}],["orders",{"2":{"192":1}}],["order",{"0":{"167":1,"251":1},"1":{"252":1,"253":1},"2":{"69":1,"76":1,"212":1}}],["orange",{"2":{"20":1}}],["or",{"0":{"170":1,"256":1,"270":1},"1":{"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1},"2":{"1":1,"11":4,"15":1,"16":1,"25":4,"28":1,"32":1,"37":1,"45":1,"52":1,"54":1,"62":1,"66":1,"68":1,"71":2,"78":1,"79":1,"84":1,"90":1,"94":2,"95":4,"99":2,"101":3,"104":1,"106":4,"116":1,"118":1,"121":1,"123":2,"124":1,"129":2,"131":2,"134":3,"141":1,"153":2,"156":1,"157":1,"159":1,"160":1,"162":2,"165":1,"170":1,"171":1,"176":2,"181":1,"185":2,"196":5,"197":1,"202":4,"204":1,"207":1,"208":2,"211":1,"212":2,"217":1,"218":3,"221":3,"223":1,"224":1,"228":3,"231":4,"235":1,"238":1,"242":1,"244":2,"247":1,"252":1,"253":1,"257":3,"262":2,"263":1,"266":2,"268":1,"269":1,"271":1,"274":5,"289":1,"305":2}}],["5cm",{"2":{"217":1}}],["5mm",{"2":{"216":1}}],["50",{"2":{"140":1,"150":1}}],["50pcs",{"2":{"130":1}}],["51",{"2":{"111":1,"274":1}}],["5×",{"2":{"107":1}}],["52",{"2":{"68":1,"70":1}}],["5dbm",{"2":{"68":8,"70":8}}],["5ghz",{"2":{"28":1,"48":1}}],["56mm",{"2":{"175":1}}],["56",{"2":{"11":1}}],["5",{"0":{"46":1,"161":1,"170":1,"301":1},"2":{"1":1,"101":1,"110":1,"111":1,"112":1,"181":1}}],["5v",{"2":{"1":2,"4":1,"175":1,"178":1,"181":2,"196":1}}],["d",{"2":{"268":1}}],["dms",{"2":{"140":1}}],["dual",{"2":{"196":1,"197":2}}],["due",{"2":{"127":1,"129":1,"204":1,"207":1}}],["dude",{"0":{"137":1},"1":{"138":1,"139":1},"2":{"127":1,"138":1}}],["during",{"2":{"95":1}}],["draw",{"2":{"300":1}}],["drastically",{"2":{"265":1}}],["drive",{"2":{"110":1,"273":1}}],["drivers",{"0":{"76":1},"2":{"76":3,"90":1}}],["dry",{"2":{"106":1}}],["dropdown",{"2":{"44":1}}],["dbm",{"2":{"68":1}}],["dashes",{"2":{"193":1}}],["dashboard",{"2":{"84":1}}],["dab",{"2":{"186":1}}],["darker",{"2":{"196":1}}],["dark",{"2":{"106":1,"225":1,"292":1}}],["damaged",{"2":{"116":1,"196":1}}],["damage",{"2":{"101":1,"106":1,"123":2,"229":1,"240":1}}],["dangerously",{"2":{"196":1}}],["dangerous",{"0":{"123":1},"2":{"106":1}}],["danger",{"2":{"101":1,"106":1,"200":1,"206":1,"214":1,"221":1}}],["date",{"2":{"90":1}}],["data",{"0":{"263":1},"2":{"38":1,"41":1,"90":1,"99":1,"257":1,"261":1,"262":1}}],["datasheet",{"2":{"1":1,"108":2,"110":1,"181":1}}],["daily",{"2":{"36":1}}],["dns",{"2":{"31":1}}],["defines",{"2":{"274":7}}],["default",{"0":{"264":1},"2":{"36":1,"37":4,"44":1,"56":2,"67":1,"94":2,"97":1,"101":1,"215":1,"263":1,"264":2,"274":11}}],["defaults",{"2":{"28":1}}],["defauly",{"2":{"32":1}}],["dead",{"2":{"205":1,"215":1}}],["decision",{"2":{"200":1,"206":1}}],["decide",{"2":{"36":1,"44":1,"197":1,"214":1}}],["degrees",{"2":{"231":1}}],["degree",{"2":{"146":1,"151":1,"215":1,"242":1,"244":1}}],["deleting",{"2":{"265":2,"306":1}}],["deletes",{"2":{"66":1}}],["delete",{"2":{"66":3,"306":1}}],["delay",{"2":{"205":1}}],["delayed",{"2":{"118":1}}],["delivers",{"2":{"175":1}}],["determines",{"2":{"108":1}}],["details",{"0":{"129":1,"132":1,"138":1,"144":1,"147":1,"149":1,"152":1},"1":{"133":1,"134":1,"135":1,"136":1,"138":1}}],["detail",{"2":{"25":1}}],["denotes",{"2":{"97":1,"175":1}}],["demonstration",{"2":{"96":1}}],["depending",{"2":{"170":1,"186":1,"217":1,"244":1,"274":1,"305":1}}],["dependencies",{"2":{"25":1,"279":2}}],["depricated",{"2":{"69":1}}],["debugging",{"2":{"36":1,"44":1}}],["debug",{"2":{"35":1,"36":7,"44":3,"266":1}}],["desired",{"2":{"44":1,"262":1}}],["designated",{"2":{"133":1,"188":1}}],["designed",{"2":{"99":1,"106":1,"123":2,"224":1}}],["design",{"2":{"24":1,"104":1,"106":1,"107":1,"129":2,"158":1,"224":1}}],["descriptor",{"2":{"304":1}}],["description",{"2":{"25":1,"66":1,"68":1,"69":1,"70":1,"71":1}}],["described",{"2":{"39":1}}],["desktop",{"2":{"38":1,"43":1,"284":2,"300":3}}],["devices",{"2":{"35":1,"56":2,"62":2,"64":1,"66":1,"69":2,"90":1,"202":1,"204":1,"207":1,"247":2}}],["device",{"0":{"57":1,"60":1},"2":{"35":2,"54":9,"56":5,"57":4,"60":7,"62":2,"65":3,"66":2,"67":1,"88":1,"92":1,"95":1,"101":1,"247":1,"299":1}}],["developed",{"2":{"32":1,"62":1,"103":1,"121":1}}],["developments",{"2":{"167":1}}],["development",{"0":{"5":1,"9":1},"1":{"6":1,"7":1,"8":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"32":1,"39":1,"99":1,"100":1,"266":2}}],["dev",{"0":{"128":1,"266":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"267":1,"268":1,"269":1,"270":1,"271":1},"2":{"12":2,"17":1,"18":1,"129":1,"131":2,"136":3}}],["dollar",{"0":{"251":1},"1":{"252":1,"253":1}}],["doa",{"2":{"205":1,"215":1}}],["doubt",{"2":{"106":1}}],["double",{"2":{"28":1,"43":1,"284":1}}],["doing",{"2":{"101":1,"106":1,"196":1,"214":2,"221":1}}],["dot",{"2":{"94":1,"184":2}}],["downward",{"2":{"240":1}}],["down",{"2":{"45":1,"52":1,"88":2,"133":1,"135":2,"171":2,"174":1,"185":1,"230":1,"238":1,"240":1,"244":1}}],["downloading",{"2":{"268":1}}],["downloaded",{"2":{"78":1}}],["download",{"0":{"39":1,"42":1,"74":1,"268":1,"283":1},"2":{"39":2,"42":1,"58":1,"73":1,"78":1,"97":1,"261":1,"266":2,"268":1,"269":1,"283":1}}],["donwload",{"0":{"269":1}}],["dont",{"0":{"154":1}}],["dongle",{"0":{"137":1},"1":{"138":1,"139":1},"2":{"138":1}}],["done",{"2":{"81":1,"82":1,"84":1,"85":1,"94":2,"106":1,"134":1,"230":1,"281":1,"297":1,"301":1,"302":1,"305":1}}],["don",{"0":{"251":1,"306":1},"1":{"252":1,"253":1},"2":{"25":1,"47":1,"94":1,"97":1,"98":1,"106":2,"126":2,"204":1,"222":1,"300":1,"304":1}}],["do",{"0":{"93":1,"258":2,"265":2,"274":1},"1":{"94":1,"95":1,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2},"2":{"15":2,"19":2,"25":1,"28":1,"30":1,"31":1,"39":2,"54":2,"56":3,"67":1,"78":2,"83":1,"95":2,"106":7,"116":1,"121":1,"126":1,"133":2,"136":1,"147":1,"152":1,"157":1,"159":1,"170":1,"171":1,"174":1,"182":1,"214":1,"215":1,"216":1,"221":2,"228":1,"229":1,"231":4,"237":1,"240":1,"252":2,"268":1,"276":1,"302":1,"304":2}}],["documented",{"2":{"32":1,"185":1}}],["documentation",{"0":{"9":1,"124":1,"165":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"9":1,"14":2,"15":1,"20":1,"24":4,"25":1,"78":1,"100":1,"124":1,"141":1,"147":1,"152":1,"263":1,"279":1}}],["docs",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"9":1,"12":1,"15":1,"16":1,"17":2,"18":2,"19":1,"21":1,"25":1,"98":1,"162":1,"165":1,"199":1,"242":1,"243":1,"260":1}}],["doesnt",{"2":{"134":1}}],["doesn",{"2":{"50":1,"133":1,"266":1}}],["does",{"0":{"265":1},"2":{"4":1,"19":1,"36":1,"37":1,"44":1,"54":1,"89":1,"90":1,"97":1,"156":1,"170":2,"211":3,"230":1,"263":1,"271":1}}],["dial",{"2":{"228":1}}],["diagram",{"2":{"4":2,"184":2}}],["digikey",{"2":{"221":3}}],["dim",{"2":{"175":1,"196":1}}],["difference",{"2":{"221":1,"235":1}}],["differently",{"2":{"273":1}}],["different",{"2":{"1":1,"28":2,"33":2,"35":1,"37":1,"56":1,"106":3,"140":1,"175":1,"176":1,"181":1,"185":1,"192":1}}],["differs",{"2":{"188":1}}],["difficulties",{"0":{"122":1}}],["diving",{"2":{"100":1}}],["direction",{"2":{"134":1,"184":1,"216":1,"228":1,"274":1}}],["direct",{"0":{"253":1},"2":{"108":1}}],["directly",{"0":{"88":1},"2":{"88":1,"145":1,"150":1,"302":1,"305":2}}],["directory",{"2":{"78":2,"94":1,"97":1,"269":4,"271":1,"306":1}}],["directories",{"0":{"18":1},"2":{"18":1,"94":1}}],["discussion",{"2":{"118":1}}],["discount",{"2":{"221":1}}],["discomfort",{"2":{"101":1}}],["discord",{"0":{"299":1},"2":{"98":1,"105":1,"124":1,"141":1,"154":1,"162":1,"165":1,"179":1,"224":2,"254":1,"266":1}}],["disconnects",{"2":{"247":1}}],["disconnect",{"2":{"52":1}}],["dist",{"2":{"281":1}}],["distribute",{"2":{"134":1}}],["distance",{"2":{"108":1}}],["distances",{"2":{"101":1}}],["distinction",{"2":{"192":1,"193":1}}],["distinct",{"2":{"35":1}}],["disabled",{"2":{"56":1}}],["dinstructions",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["hybrid",{"2":{"263":1}}],["hmds",{"2":{"215":1}}],["hmd",{"2":{"153":1,"222":1}}],["hubs",{"0":{"217":1},"2":{"204":1}}],["hub",{"0":{"137":1},"1":{"138":1,"139":1},"2":{"131":2,"136":3,"202":2,"208":1,"217":4,"242":1,"245":1}}],["h3",{"2":{"130":1}}],["hit",{"2":{"264":1,"266":1,"271":2,"301":1}}],["his",{"2":{"158":1}}],["hinge",{"2":{"133":1,"134":3}}],["hinder",{"2":{"121":1}}],["hidden",{"2":{"94":1}}],["highlight",{"2":{"304":1}}],["highlighted",{"2":{"96":1,"304":1}}],["highly",{"2":{"175":1,"221":1,"223":1}}],["higher",{"2":{"11":4,"71":2,"113":1,"202":1,"208":1,"211":1,"218":1,"239":1}}],["high",{"0":{"113":1,"251":1},"1":{"114":1,"115":1,"252":1,"253":1},"2":{"3":1,"101":1,"204":1,"265":1,"300":1}}],["hflip",{"2":{"71":1}}],["hence",{"2":{"221":1}}],["heavily",{"2":{"242":1}}],["head",{"2":{"185":1,"260":1,"263":1,"264":1,"300":1}}],["headsets",{"0":{"224":1},"2":{"140":1,"202":1,"208":1,"216":1}}],["headset",{"0":{"104":1,"140":1,"142":1,"154":1,"156":1,"157":1},"1":{"141":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1},"2":{"100":1,"104":2,"141":1,"156":1,"157":2,"159":2,"185":1,"202":1,"204":1,"207":1,"208":1,"216":1,"224":3,"231":1,"244":4,"245":2,"300":2}}],["heatsinks",{"2":{"223":1}}],["heats",{"2":{"204":1,"207":1}}],["heating",{"2":{"133":1}}],["heat",{"0":{"133":1},"2":{"130":2,"133":5,"134":4}}],["helps",{"2":{"100":1,"118":1,"230":1,"274":1}}],["help",{"2":{"66":1,"98":1,"170":3,"266":1}}],["here",{"0":{"165":1},"2":{"1":1,"20":1,"22":1,"32":1,"39":2,"58":2,"76":1,"78":2,"94":1,"95":1,"98":1,"99":1,"103":1,"154":2,"156":1,"157":2,"158":1,"162":1,"175":1,"181":1,"185":1,"194":1,"209":1,"214":1,"217":1,"221":5,"224":3,"230":1,"254":1,"273":1,"274":1,"283":1,"302":1,"305":1}}],["hat",{"0":{"238":1},"2":{"234":1,"238":1}}],["happens",{"2":{"186":1,"265":1}}],["happy",{"2":{"98":1}}],["handling",{"0":{"231":1},"2":{"231":1,"232":1}}],["handled",{"2":{"123":1}}],["handy",{"2":{"79":1,"179":1}}],["half",{"2":{"108":1,"110":1,"240":1}}],["hazard",{"2":{"107":2}}],["harm",{"2":{"106":2}}],["harmless",{"2":{"101":1}}],["hardest",{"2":{"134":1}}],["hard",{"2":{"97":1}}],["hardware",{"0":{"102":1,"109":1,"169":1,"189":1,"190":1,"243":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"190":1,"191":2,"192":2,"193":2,"194":1},"2":{"48":1,"102":1,"116":1,"129":1,"144":1,"149":1,"158":1,"167":2,"196":3,"205":2,"235":1,"246":1}}],["had",{"2":{"97":1}}],["having",{"2":{"31":1,"92":1,"94":1,"182":1,"185":1,"212":1}}],["haven",{"2":{"135":1}}],["have",{"0":{"27":1,"122":1,"125":1,"156":1,"166":1},"2":{"1":1,"2":1,"4":1,"24":1,"25":1,"28":3,"30":1,"33":1,"35":1,"36":1,"37":1,"39":1,"41":1,"44":1,"54":1,"56":1,"78":2,"85":1,"88":1,"90":2,"93":2,"94":2,"95":1,"96":1,"97":1,"105":1,"106":2,"116":1,"118":1,"126":1,"131":1,"134":2,"135":1,"136":2,"147":1,"152":1,"153":1,"154":1,"156":2,"158":2,"161":1,"169":1,"170":5,"172":1,"181":1,"182":1,"185":2,"188":1,"192":1,"193":1,"197":1,"214":1,"215":1,"224":2,"230":1,"232":1,"240":1,"241":1,"242":2,"246":1,"247":1,"248":1,"257":1,"266":1,"301":1,"304":1,"305":2}}],["hasn",{"2":{"300":1}}],["has",{"2":{"28":2,"36":2,"44":1,"49":1,"66":1,"67":1,"90":1,"95":1,"101":1,"104":1,"129":1,"131":1,"171":1,"174":2,"179":1,"205":1,"217":3,"230":2,"253":1,"263":1,"302":1}}],["h1",{"2":{"20":2}}],["htc",{"2":{"141":1,"217":1}}],["http",{"2":{"30":1,"31":2,"52":1,"57":1,"62":1,"65":1,"67":1,"94":3}}],["https",{"2":{"12":1,"17":1,"18":1,"76":1,"78":2,"157":1,"214":1,"251":1,"279":1}}],["html",{"2":{"20":2}}],["housing",{"2":{"244":1}}],["hole",{"2":{"133":2,"134":1,"135":1,"147":1,"152":1,"220":1,"221":1}}],["holes",{"2":{"131":1,"133":1,"134":2,"135":1,"136":1}}],["holding",{"2":{"88":2,"160":1,"182":1,"228":1,"297":1}}],["hold",{"2":{"2":1,"45":1,"87":1,"106":1,"136":1,"182":1,"183":1}}],["hotglue",{"2":{"244":1}}],["hot",{"2":{"129":1,"186":1,"188":2,"223":1,"244":1}}],["hogging",{"2":{"90":1}}],["home",{"2":{"84":1}}],["horizontally",{"2":{"71":1}}],["hostname",{"2":{"69":2,"95":1}}],["however",{"2":{"28":1,"31":1,"32":1,"56":1,"170":1,"204":1,"207":1}}],["how",{"0":{"48":1,"55":1,"63":1,"93":1,"156":1,"189":1,"195":1,"233":1,"254":1,"258":1,"276":1,"282":1},"1":{"49":1,"50":1,"51":1,"52":1,"56":1,"57":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"94":1,"95":1,"190":1,"191":1,"192":1,"193":1,"194":1,"196":1,"197":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"255":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"16":3,"36":1,"39":1,"41":1,"44":1,"72":1,"76":1,"87":1,"99":1,"174":1,"185":1,"212":1,"214":1,"263":1,"266":1,"273":1,"274":7,"302":2}}],["lcsc",{"2":{"221":4}}],["luck",{"2":{"161":1}}],["ldlrui",{"2":{"131":1}}],["ll",{"2":{"50":2,"76":1,"83":1,"94":1,"97":1,"212":1,"222":1,"258":1,"263":1,"266":1,"273":1,"304":1,"305":1}}],["launch",{"2":{"266":1}}],["labled",{"2":{"191":1}}],["labeled",{"2":{"52":1,"87":1}}],["labels",{"2":{"1":2,"181":2}}],["lay",{"2":{"178":1,"230":1}}],["last",{"2":{"134":2,"271":1}}],["lastly",{"2":{"133":1}}],["large",{"2":{"124":1,"212":1}}],["larger",{"2":{"71":2,"211":1}}],["later",{"2":{"78":1}}],["latency",{"2":{"71":1,"202":1,"208":1}}],["latest",{"0":{"269":1,"299":1},"2":{"42":1,"73":1,"78":1,"202":1,"208":1,"266":2,"283":1}}],["lt",{"2":{"20":2,"25":2,"30":1,"65":1,"67":6,"84":1,"94":1,"118":2,"266":1,"306":2}}],["lifting",{"2":{"239":1}}],["lite",{"0":{"195":1,"196":1,"197":1},"1":{"196":1,"197":1},"2":{"196":1,"220":1}}],["little",{"2":{"82":1,"134":1,"185":1,"274":1}}],["limited",{"2":{"118":1,"307":1}}],["limit",{"2":{"107":4,"111":1,"112":1,"114":1,"115":1,"143":1,"148":1}}],["limits",{"0":{"107":1},"2":{"118":1,"123":1}}],["library",{"2":{"101":1}}],["lighting",{"2":{"225":1}}],["lightweight",{"2":{"217":1}}],["lightly",{"2":{"182":1}}],["light",{"2":{"101":2,"106":1}}],["lives",{"2":{"38":1}}],["likely",{"2":{"175":1,"186":1,"228":1,"229":1,"253":1}}],["like",{"0":{"27":1},"2":{"20":2,"32":1,"37":1,"43":1,"52":1,"66":1,"84":1,"90":1,"94":2,"95":1,"96":1,"99":1,"130":1,"133":1,"134":1,"157":1,"167":1,"170":1,"182":1,"184":2,"194":1,"197":1,"215":1,"216":2,"221":1,"228":1,"236":1,"240":2,"247":1,"248":1,"268":1,"269":1,"284":1,"292":1,"300":1,"305":2,"307":1}}],["linearly",{"2":{"110":1}}],["line",{"0":{"253":1},"2":{"19":1,"25":1,"134":1,"136":1,"236":1,"240":1}}],["linked",{"2":{"90":1,"123":1}}],["link",{"2":{"19":4,"145":2,"150":2,"221":1}}],["listens",{"2":{"302":1,"307":1}}],["listening",{"2":{"263":1,"274":1,"306":1}}],["listen",{"2":{"261":1}}],["listed",{"0":{"162":1,"167":1},"2":{"22":1,"95":1,"224":2}}],["listing",{"2":{"215":1}}],["list",{"0":{"205":1},"1":{"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1},"2":{"5":1,"25":2,"44":1,"95":1,"102":1,"104":1,"185":2,"242":1,"247":1}}],["loaded",{"2":{"264":1}}],["load",{"2":{"261":1,"265":1,"266":1,"270":1}}],["low",{"2":{"202":1,"207":1,"221":1,"234":1,"300":1}}],["lower",{"2":{"159":1,"175":1,"202":1,"208":1,"218":1,"221":1}}],["lowercase",{"2":{"15":1}}],["long",{"2":{"168":1,"194":1,"217":1}}],["longer",{"2":{"134":1,"176":2,"239":1,"265":1}}],["locks",{"2":{"135":1}}],["locating",{"2":{"265":1}}],["location",{"2":{"159":1}}],["locate",{"2":{"84":1,"94":1,"95":1,"171":1,"238":1}}],["located",{"2":{"56":1,"221":1}}],["locallow",{"2":{"306":1}}],["local",{"2":{"30":1,"31":2,"56":1,"57":2,"65":2,"67":1,"94":2,"95":1,"248":1}}],["loses",{"2":{"134":1}}],["lorow",{"2":{"103":1}}],["logo",{"2":{"131":2}}],["logs",{"0":{"47":1},"2":{"46":1,"47":2,"52":1}}],["logging",{"2":{"36":1,"44":1,"266":1}}],["lot",{"2":{"36":2,"44":1,"266":1}}],["looking",{"2":{"159":2,"295":1}}],["looks",{"2":{"43":1,"90":1,"225":1,"228":1,"284":1}}],["look",{"2":{"16":1,"47":1,"69":2,"133":1,"134":1,"141":1,"171":1,"200":1,"206":1,"221":1,"230":2,"269":2,"294":1,"301":4}}],["legacy",{"2":{"257":1,"274":2}}],["length",{"2":{"130":3,"175":1,"176":1}}],["lengthy",{"2":{"118":1}}],["lenses",{"2":{"215":1}}],["lens",{"0":{"127":1,"157":1},"1":{"129":1,"130":1,"131":1},"2":{"101":1,"107":1,"118":1,"144":1,"146":1,"149":1,"151":1,"157":3,"159":1,"228":2,"244":2,"252":1}}],["leaving",{"2":{"230":1}}],["leave",{"2":{"28":2,"305":1}}],["lead",{"2":{"116":1}}],["least",{"2":{"93":1,"169":1}}],["learned",{"2":{"179":1,"232":1}}],["learn",{"2":{"76":1}}],["level",{"2":{"70":1,"71":1,"106":1,"133":1,"293":1}}],["let",{"2":{"39":1,"133":1,"145":1,"150":1,"224":2,"285":1,"305":1,"306":1}}],["letting",{"2":{"36":1,"44":1}}],["letters",{"2":{"15":1,"131":2}}],["less",{"2":{"36":1,"44":1,"71":1,"101":1,"202":1,"204":1,"207":2,"208":1,"220":1,"228":1,"229":1,"231":1,"269":1,"274":1,"305":1}}],["lefteyelidexpandedsqueeze",{"2":{"255":1}}],["lefteyex",{"2":{"255":1}}],["left",{"0":{"27":1,"287":1},"2":{"44":1,"127":1,"153":1,"247":1,"248":1,"252":1,"287":1,"300":1,"301":1}}],["leds",{"0":{"3":1,"111":1,"112":1,"114":1,"115":1,"160":1,"176":1,"183":1,"192":1},"2":{"1":2,"101":2,"113":1,"116":1,"117":1,"175":1,"181":2,"184":1,"188":2,"190":1,"192":4,"194":1,"196":6,"197":1,"218":1,"243":1,"244":1}}],["led",{"0":{"1":1,"110":1,"177":1,"181":1,"188":1,"189":1,"195":1},"1":{"190":1,"191":1,"192":1,"193":1,"194":1,"196":1,"197":1},"2":{"1":3,"101":2,"108":3,"117":1,"127":2,"135":3,"160":1,"165":1,"176":1,"181":3,"183":2,"190":1,"192":2,"194":5,"217":1,"220":2,"225":1,"228":1,"244":1,"245":1}}],["auto",{"2":{"306":1}}],["automatically",{"2":{"25":1,"262":2}}],["awg",{"2":{"218":3,"221":1}}],["away",{"2":{"172":1,"184":1,"266":1}}],["agree",{"2":{"253":1}}],["again",{"2":{"188":1,"271":1}}],["agc",{"2":{"71":1}}],["avis",{"2":{"274":1}}],["avatrs",{"2":{"257":1}}],["avatars",{"2":{"257":1,"306":2}}],["avatar",{"0":{"254":1},"1":{"255":1},"2":{"254":1,"302":1,"304":2,"305":1,"307":2}}],["available",{"0":{"139":1},"2":{"36":1,"44":1,"95":1,"104":1,"153":1,"221":1,"266":1}}],["avoid",{"2":{"118":1,"238":1}}],["averaged",{"2":{"107":1}}],["ammount",{"2":{"171":1}}],["amount",{"2":{"134":1,"171":1}}],["amoistman",{"2":{"133":2}}],["amp",{"0":{"105":1},"2":{"65":1,"67":1}}],["amazon",{"2":{"37":1,"211":1,"212":2,"215":1,"217":2,"218":3,"223":3}}],["aid",{"2":{"170":1}}],["air",{"2":{"39":1,"92":1,"182":1}}],["ai",{"2":{"37":1}}],["adoption",{"2":{"207":1}}],["adjust",{"0":{"282":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"88":1,"161":1,"255":1,"263":1,"293":1,"300":2}}],["adapter",{"2":{"217":2}}],["adapters",{"0":{"218":1},"2":{"217":2}}],["adapted",{"2":{"78":1,"98":1}}],["adaptation",{"2":{"78":1}}],["adhoc",{"2":{"68":1}}],["advanced",{"2":{"32":1,"202":1,"208":1}}],["address",{"0":{"96":1,"289":1},"2":{"31":2,"54":6,"96":1,"248":1,"263":1,"289":1,"297":4,"299":1}}],["addresses",{"2":{"30":1,"307":2}}],["additionally",{"2":{"90":1}}],["additional",{"0":{"29":1,"199":1},"1":{"30":1,"31":1,"32":1,"33":1,"200":1,"201":1,"202":1,"203":1,"204":1},"2":{"145":1,"150":1,"154":1,"211":1,"266":1}}],["adding",{"0":{"17":1,"19":1,"296":1,"304":1,"305":1},"1":{"18":1,"19":1,"20":1,"297":1,"298":1,"299":1,"300":1},"2":{"25":1,"37":1,"38":1,"39":1}}],["added",{"2":{"25":1,"154":1,"162":1,"224":2}}],["adds",{"2":{"25":1,"66":1}}],["add",{"2":{"16":1,"17":1,"19":7,"20":1,"25":1,"56":1,"66":1,"68":1,"160":1,"177":1,"182":1,"185":1,"304":3,"305":5}}],["abc",{"0":{"148":1},"1":{"149":1,"150":1,"151":1,"152":1},"2":{"151":1}}],["ability",{"2":{"138":1}}],["above",{"0":{"125":1},"2":{"84":1,"90":1,"221":1,"224":2,"304":1,"305":1}}],["about",{"2":{"25":1,"28":1,"50":1,"78":1,"175":1,"240":1}}],["able",{"2":{"31":1,"56":1,"93":1,"136":1,"186":1,"225":1,"305":1}}],["apart",{"2":{"238":1}}],["api",{"0":{"32":1,"61":1,"64":1},"1":{"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1},"2":{"32":6,"62":2,"64":2,"65":1,"66":1,"67":1}}],["ap",{"2":{"28":17,"68":1}}],["apps",{"2":{"268":1,"273":1}}],["appdata",{"2":{"266":1,"306":1}}],["appropriate",{"2":{"217":1}}],["appropiate",{"2":{"197":1}}],["approach",{"2":{"94":1,"196":1}}],["appreciation",{"2":{"140":1}}],["appendix",{"0":{"117":1,"118":1}}],["appear",{"2":{"47":1}}],["appears",{"2":{"20":1}}],["apply",{"2":{"97":2,"178":1,"182":1,"186":1,"187":1,"262":1}}],["applications",{"2":{"95":1,"99":1}}],["application",{"2":{"43":1,"196":1,"300":1}}],["applicable",{"2":{"28":1,"165":1}}],["app",{"0":{"43":1,"275":1,"276":1,"281":1,"282":1,"283":1,"284":1,"299":1},"1":{"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"32":1,"38":1,"42":1,"52":1,"62":1,"93":2,"96":1,"202":2,"228":1,"246":1,"247":1,"248":1,"262":1,"264":1,"266":1,"273":1,"276":1,"279":2,"281":3,"283":1,"285":1,"297":1,"299":1,"302":2,"307":2}}],["accordingly",{"2":{"255":1}}],["acceptable",{"2":{"221":1}}],["accessibility",{"2":{"140":1}}],["access",{"2":{"28":1,"39":1,"82":2,"84":1,"204":1,"207":1,"273":1}}],["accent",{"2":{"20":2}}],["acquire",{"2":{"217":1}}],["acknowledged",{"0":{"125":1}}],["acto",{"2":{"230":1}}],["actually",{"2":{"172":1}}],["actual",{"2":{"108":1,"305":1}}],["action",{"2":{"305":2}}],["actions",{"2":{"25":2}}],["activate",{"2":{"274":1}}],["actively",{"2":{"106":1}}],["active",{"2":{"100":1,"170":1}}],["affordable",{"2":{"99":1}}],["affect",{"2":{"25":2}}],["after",{"2":{"1":1,"4":1,"43":1,"52":1,"66":1,"85":1,"106":1,"136":1,"174":1,"181":1,"242":1,"280":1}}],["antistatic",{"0":{"170":1},"2":{"170":2}}],["antenna",{"0":{"170":1},"2":{"170":5,"211":1,"212":1,"234":1,"235":1,"236":2,"237":1}}],["antennas",{"0":{"170":1},"2":{"170":1,"204":1,"207":1,"211":1,"212":2,"245":1}}],["anterior",{"2":{"107":1}}],["angle",{"0":{"159":1},"2":{"108":3,"110":2,"117":1}}],["answer",{"2":{"98":1}}],["another",{"2":{"37":1,"133":1,"176":1,"223":1,"224":1,"254":1}}],["an",{"0":{"120":1,"170":1},"1":{"121":1,"122":1,"123":1,"124":1,"125":1},"2":{"25":1,"37":1,"39":1,"43":1,"54":1,"66":1,"77":1,"78":1,"87":1,"90":1,"94":1,"98":2,"101":1,"106":1,"116":1,"134":2,"140":2,"147":1,"152":1,"170":6,"185":1,"190":1,"194":1,"211":1,"214":1,"215":1,"247":1,"253":1,"254":1,"257":1,"273":1,"284":1,"300":3,"305":1}}],["anywhere",{"2":{"168":1}}],["anything",{"2":{"97":1}}],["anyone",{"2":{"31":1,"306":1}}],["any",{"0":{"156":1},"2":{"20":1,"32":1,"39":1,"50":1,"51":1,"52":1,"64":1,"66":3,"78":1,"94":1,"104":1,"106":2,"140":1,"156":1,"196":1,"197":1,"224":1,"245":1,"252":1,"266":1}}],["and",{"0":{"39":1,"42":1,"85":1,"94":1,"95":1,"120":1,"139":1,"165":1,"173":1,"174":1,"177":2,"218":1,"244":1,"258":1,"270":1,"282":1,"283":1,"285":1,"296":1,"302":1},"1":{"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"121":1,"122":1,"123":1,"124":1,"125":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"283":1,"284":1,"285":1,"286":2,"287":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":1,"297":2,"298":2,"299":2,"300":2,"301":1,"303":1,"304":1,"305":1,"306":1,"307":1},"2":{"1":1,"2":1,"4":1,"5":1,"15":1,"16":1,"20":1,"22":1,"24":1,"25":3,"28":10,"30":2,"32":2,"36":3,"37":3,"38":2,"39":1,"42":1,"44":2,"45":2,"46":1,"51":1,"52":1,"56":1,"58":1,"64":1,"66":5,"69":2,"71":1,"73":1,"77":2,"78":2,"79":4,"81":1,"82":2,"84":3,"87":1,"88":2,"90":2,"92":1,"94":6,"95":2,"96":2,"97":2,"100":2,"101":3,"102":2,"105":1,"106":2,"107":3,"116":4,"118":1,"121":2,"123":1,"124":1,"129":1,"131":1,"133":1,"134":2,"135":2,"136":3,"138":1,"140":2,"141":2,"144":3,"146":1,"147":2,"149":3,"151":1,"152":2,"157":1,"160":1,"161":1,"166":1,"170":5,"171":1,"172":1,"174":2,"175":4,"176":4,"178":1,"181":1,"182":4,"183":2,"185":1,"190":1,"196":1,"197":5,"200":2,"202":2,"204":3,"205":1,"206":2,"207":4,"208":2,"211":2,"212":2,"215":2,"216":1,"217":4,"218":1,"220":1,"221":3,"222":1,"223":1,"224":2,"228":2,"229":1,"230":4,"231":1,"232":1,"235":1,"237":1,"238":1,"239":2,"243":1,"244":5,"245":2,"246":1,"247":2,"252":2,"254":1,"257":2,"258":1,"261":1,"263":3,"264":3,"265":1,"266":2,"268":1,"270":1,"271":3,"273":2,"274":6,"279":1,"280":1,"283":2,"286":1,"287":1,"288":1,"297":4,"299":2,"300":1,"301":3,"302":2,"304":2,"305":5,"306":1,"307":2}}],["alert",{"2":{"253":1}}],["along",{"2":{"230":1}}],["alcohol",{"2":{"188":1}}],["alter",{"2":{"221":1}}],["alternative",{"0":{"212":1},"2":{"215":1,"221":1}}],["alternatively",{"0":{"221":1},"2":{"131":2,"136":1,"158":1,"211":1,"289":1}}],["alternatives",{"2":{"129":1}}],["although",{"2":{"167":1}}],["already",{"2":{"58":1,"100":1,"135":1}}],["alibaba",{"2":{"37":1}}],["aliexpress",{"2":{"37":2,"130":3,"211":1,"212":4,"215":2,"216":2,"217":2,"218":4,"221":1,"223":3}}],["always",{"2":{"28":1,"54":1,"101":1,"196":1}}],["also",{"2":{"18":1,"20":1,"24":1,"25":1,"31":1,"32":1,"36":1,"44":1,"54":1,"58":1,"66":1,"82":1,"83":1,"101":1,"129":1,"145":1,"150":1,"165":1,"212":1,"217":1,"221":1,"264":1,"305":1}}],["alligns",{"2":{"135":1}}],["allowed",{"2":{"68":1}}],["allows",{"2":{"54":1,"215":1,"257":1,"302":1}}],["allow",{"2":{"28":1,"30":1,"31":1,"68":1,"77":1,"168":1,"171":1}}],["all",{"0":{"167":1,"169":1},"2":{"15":2,"20":1,"24":4,"56":1,"66":1,"67":1,"76":1,"88":1,"95":1,"106":1,"116":2,"121":1,"138":1,"159":1,"170":2,"185":1,"186":1,"200":1,"205":1,"206":1,"246":1,"257":1,"263":1,"280":1,"294":1,"300":1,"301":2,"302":1}}],["atleast",{"2":{"228":1}}],["attention",{"2":{"184":1,"194":1}}],["attempt",{"2":{"88":1}}],["attaching",{"2":{"170":1,"212":1}}],["attached",{"2":{"170":1,"193":1}}],["attach",{"0":{"171":1},"2":{"147":1,"152":1,"158":1,"237":1,"244":4,"245":1}}],["attribute",{"2":{"20":1}}],["at",{"2":{"3":1,"16":1,"20":1,"56":1,"89":1,"93":1,"101":1,"106":1,"107":2,"108":1,"121":1,"123":1,"131":2,"141":1,"146":1,"151":1,"159":2,"169":1,"170":1,"171":1,"176":2,"192":1,"200":1,"205":1,"206":1,"216":1,"221":2,"246":1,"274":5,"295":1,"301":1}}],["a",{"0":{"17":1,"19":1,"21":1,"117":1,"156":2,"157":1,"158":1,"159":1,"164":1,"175":2,"189":1,"212":1,"229":1,"233":1,"251":1,"253":1,"263":1,"265":1,"299":1},"1":{"18":1,"19":1,"20":1,"190":1,"191":1,"192":1,"193":1,"194":1,"230":1,"231":1,"232":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"252":1,"253":1},"2":{"2":1,"3":2,"4":1,"5":1,"17":3,"18":2,"19":3,"20":2,"21":1,"24":5,"25":14,"28":4,"31":2,"32":3,"33":2,"35":3,"36":5,"37":1,"41":2,"43":1,"44":2,"48":1,"49":1,"52":1,"54":5,"62":5,"64":1,"66":7,"67":4,"71":1,"78":2,"81":1,"82":2,"84":4,"87":2,"88":2,"90":1,"92":1,"93":1,"94":4,"95":6,"96":1,"97":2,"99":1,"101":1,"104":2,"106":1,"107":2,"108":4,"113":1,"117":2,"118":1,"124":1,"126":3,"129":4,"130":1,"133":2,"134":1,"136":7,"138":1,"140":2,"141":2,"147":3,"152":3,"153":2,"156":2,"157":4,"158":2,"159":3,"161":2,"165":2,"166":1,"170":2,"171":2,"174":1,"175":1,"176":2,"179":2,"182":2,"185":3,"186":3,"187":1,"193":3,"194":1,"196":3,"200":1,"202":2,"204":3,"205":2,"206":1,"207":3,"211":2,"212":2,"215":2,"216":5,"217":9,"218":2,"221":3,"222":3,"224":5,"225":1,"228":1,"229":3,"230":2,"231":1,"236":1,"237":1,"239":1,"240":1,"242":2,"244":1,"247":1,"248":1,"252":3,"254":1,"263":2,"265":3,"266":3,"268":1,"273":1,"274":3,"276":1,"280":1,"281":1,"284":1,"289":1,"294":1,"297":1,"300":6,"302":1,"305":4,"307":1}}],["assign",{"2":{"305":1}}],["assigned",{"2":{"304":1}}],["asset",{"2":{"304":2}}],["assembling",{"2":{"193":1,"196":1}}],["assemble",{"0":{"189":1,"195":1,"244":1},"1":{"190":1,"191":1,"192":1,"193":1,"194":1,"196":1,"197":1}}],["assembled",{"2":{"172":1,"194":1}}],["assemblly",{"2":{"165":1}}],["assembly",{"0":{"132":1,"147":1,"152":1,"164":1},"1":{"133":1,"134":1,"135":1,"136":1,"138":1},"2":{"100":2,"127":1,"165":2,"193":1,"218":1}}],["associated",{"2":{"304":1}}],["aside",{"2":{"237":1}}],["asking",{"2":{"253":1}}],["asked",{"0":{"249":1}}],["ask",{"2":{"98":1,"124":1}}],["as",{"2":{"1":3,"25":3,"28":2,"30":1,"31":1,"39":2,"41":1,"44":1,"47":1,"64":1,"67":1,"78":1,"87":3,"94":1,"95":2,"106":4,"122":1,"123":1,"126":1,"129":2,"136":1,"141":2,"159":2,"171":1,"179":1,"181":3,"186":1,"192":1,"193":2,"202":2,"204":1,"207":1,"208":2,"211":1,"217":4,"221":2,"229":1,"253":1,"305":3}}],["arrival",{"2":{"205":1,"215":1}}],["arrive",{"0":{"168":1},"2":{"168":1}}],["artifacts",{"2":{"175":1}}],["around",{"2":{"95":1,"106":1,"176":1,"183":1,"186":1,"188":1,"230":2,"274":1,"301":1}}],["arduinosdk",{"2":{"79":1}}],["argument",{"2":{"37":1}}],["ar",{"2":{"1":1,"4":1,"181":1}}],["area",{"2":{"108":2,"117":1,"230":1}}],["aren",{"2":{"87":1,"221":1,"292":1}}],["are",{"0":{"140":1,"217":1},"1":{"141":1},"2":{"1":4,"5":1,"15":1,"16":1,"20":1,"22":3,"25":3,"28":5,"30":2,"31":2,"33":1,"35":1,"37":1,"38":1,"39":1,"48":1,"54":1,"58":2,"66":1,"67":3,"68":1,"80":1,"90":2,"93":1,"106":4,"116":1,"118":1,"121":1,"123":2,"124":2,"126":1,"131":1,"133":1,"135":1,"136":1,"140":1,"145":1,"146":1,"150":1,"151":1,"153":1,"165":3,"167":1,"168":1,"170":1,"171":2,"175":1,"181":4,"185":3,"188":2,"190":1,"192":3,"193":2,"196":3,"200":1,"204":2,"205":1,"206":1,"207":2,"209":1,"212":1,"215":1,"216":1,"218":1,"221":5,"222":1,"224":2,"225":1,"228":1,"229":2,"230":2,"236":1,"237":1,"244":1,"252":1,"257":1,"263":1,"295":1,"302":1,"306":1}}],["24p",{"2":{"216":2}}],["245c",{"2":{"3":1,"221":1}}],["2x",{"0":{"215":1},"2":{"145":2,"146":2,"150":2,"151":2,"211":2,"212":2,"217":1,"223":1}}],["25",{"2":{"111":2}}],["2π",{"2":{"108":1,"117":1}}],["2dbm",{"2":{"68":2,"70":2}}],["200mm",{"2":{"216":1}}],["20pcs",{"2":{"130":2}}],["20ₘₐ",{"2":{"110":2,"117":1}}],["2013",{"0":{"118":1},"2":{"107":1,"118":1}}],["20",{"2":{"68":1,"70":1,"110":2,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["28",{"2":{"68":1,"70":1,"114":2,"218":2}}],["22",{"2":{"11":1,"115":1}}],["230c",{"2":{"3":1}}],["2nd",{"0":{"180":1},"2":{"1":2,"4":1,"180":1,"181":2}}],["2",{"0":{"43":1,"50":1,"76":1,"88":1,"89":1,"111":2,"112":1,"114":2,"115":1,"134":1,"158":1,"167":1,"187":1,"203":2,"207":1,"208":1,"284":1},"1":{"204":2},"2":{"1":1,"11":1,"28":3,"38":1,"48":1,"111":2,"112":1,"114":2,"115":2,"141":1,"157":1,"168":2,"170":2,"176":4,"185":1,"192":1,"193":1,"204":2,"207":2,"215":1,"216":1,"220":1,"242":2,"274":5}}],["4x",{"2":{"221":3,"223":1}}],["4mm",{"2":{"176":1}}],["41",{"2":{"114":2}}],["400",{"2":{"107":1}}],["44",{"2":{"68":1,"70":1}}],["4ghz",{"2":{"28":2,"38":1,"48":1}}],["4",{"0":{"45":1,"52":1,"78":1,"112":2,"115":2,"136":1,"160":1,"169":1,"203":1,"207":1,"296":1},"1":{"204":1,"297":1,"298":1,"299":1,"300":1},"2":{"1":2,"11":1,"28":1,"68":1,"70":1,"97":1,"101":1,"107":1,"112":2,"115":2,"181":3,"204":2,"207":2,"215":1}}],["v=qyh",{"2":{"214":1}}],["vs",{"0":{"235":1},"2":{"173":2}}],["vsc",{"0":{"84":1},"2":{"82":1,"96":1}}],["vscode",{"2":{"11":1,"39":1,"64":1,"77":1,"78":1,"90":1}}],["voids",{"2":{"116":1}}],["voltages",{"2":{"196":1}}],["voltage",{"2":{"175":1,"197":1,"223":1}}],["volt",{"2":{"1":1,"181":1}}],["v4",{"0":{"112":1,"115":1,"165":1,"189":1,"194":1,"195":1,"196":1,"197":1,"242":1},"1":{"190":1,"191":1,"192":1,"193":1,"194":1,"196":1,"197":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1},"2":{"127":2,"135":2,"165":5,"191":1,"196":1,"218":1,"220":3,"242":2}}],["vrcfacetracking",{"2":{"266":1}}],["vrcft",{"0":{"256":1,"260":1,"263":1,"269":1},"1":{"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1},"2":{"257":5,"258":2,"260":1,"261":2,"263":5,"264":3,"266":2,"269":3,"271":3}}],["vrc",{"2":{"254":1,"302":1,"305":1,"306":1,"307":1}}],["vrchat",{"0":{"302":1},"1":{"303":1,"304":1,"305":1,"306":1,"307":1},"2":{"99":1,"302":1,"306":3}}],["vroptician",{"2":{"127":1}}],["vr",{"2":{"99":2,"104":1,"131":1}}],["vversion",{"2":{"94":1}}],["vflip",{"2":{"71":1}}],["ventilation",{"2":{"129":1,"144":1,"149":1}}],["ve",{"2":{"44":1,"94":2,"97":1,"261":1,"269":1}}],["vers",{"0":{"215":1}}],["versions",{"0":{"94":1,"95":1},"2":{"202":1}}],["version",{"0":{"97":1,"217":1,"266":1},"1":{"98":1,"267":1,"268":1,"269":1,"270":1,"271":1},"2":{"78":1,"84":1,"94":1,"104":1,"131":1,"153":1,"261":1,"266":4,"279":1,"305":1}}],["versioning",{"2":{"25":1}}],["verify",{"2":{"101":1,"116":1,"271":1}}],["vertically",{"2":{"71":1}}],["very",{"2":{"1":1,"144":1,"149":1,"181":1,"194":1,"196":1,"211":1,"265":1}}],["vive",{"2":{"129":1,"134":1,"141":1,"170":2,"202":2,"208":1,"212":1,"217":1}}],["virtual",{"2":{"99":1,"300":1}}],["via",{"0":{"81":1,"82":1,"84":1,"87":1,"88":1,"91":1},"1":{"92":1,"93":1,"94":1,"95":1},"2":{"94":1,"162":1,"165":1,"263":1,"268":1,"274":1}}],["visualized",{"2":{"300":1}}],["visually",{"2":{"106":1}}],["visual",{"0":{"73":1,"82":1,"173":1,"270":1},"1":{"74":1,"75":1},"2":{"73":1,"77":1,"82":1,"89":1,"95":1}}],["vision",{"2":{"225":1}}],["visibility",{"2":{"44":1}}],["visit",{"2":{"39":1,"157":1}}],["viewer",{"2":{"300":1}}],["viewing",{"2":{"95":1}}],["view",{"2":{"46":1,"116":1,"159":2,"215":1,"302":1}}],["video",{"2":{"38":1,"174":1,"175":1,"254":1,"289":1}}],["vitepress",{"2":{"9":1,"12":2,"14":1,"15":2,"17":1,"18":1,"19":1,"21":1}}],["valveindexdevfrunk1",{"2":{"131":1}}],["valve",{"0":{"126":1,"127":1},"1":{"127":1,"128":1,"129":2,"130":2,"131":2,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1},"2":{"126":1,"141":1,"202":2,"208":2,"217":1}}],["value",{"2":{"65":2,"67":3,"71":2,"110":2,"307":1}}],["values",{"2":{"28":1,"264":1,"274":1,"290":1}}],["variants",{"2":{"146":1,"151":1}}],["variant",{"2":{"37":1}}],["variables",{"2":{"20":1}}],["var",{"2":{"20":2}}],["vue3",{"2":{"15":1}}],["vue",{"2":{"15":2}}],["v18",{"2":{"127":1}}],["v1",{"2":{"11":2,"257":1,"262":1,"274":2}}],["v14",{"2":{"11":1}}],["v3",{"0":{"111":1,"114":1,"163":1,"182":1,"183":1,"184":1,"221":1},"1":{"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1},"2":{"1":1,"165":1,"181":1,"218":1}}],["v2s",{"0":{"1":1}}],["v2",{"0":{"0":1,"2":1,"3":1,"4":1},"1":{"1":1,"2":1,"3":1,"4":1},"2":{"4":1,"11":1,"202":1,"257":1,"262":1,"274":2}}],["tv",{"2":{"221":1}}],["twisting",{"2":{"238":1}}],["twisted",{"2":{"177":1}}],["twist",{"0":{"177":1},"2":{"175":1}}],["two",{"2":{"35":1,"56":1,"80":1,"126":1,"134":1,"175":4,"200":1,"204":1,"206":1,"207":1,"217":1,"258":1,"302":1,"304":1,"307":1}}],["t5",{"2":{"130":1,"136":1}}],["typical",{"2":{"110":1}}],["typing",{"2":{"81":1}}],["types",{"0":{"36":1,"37":1},"2":{"25":1,"33":1,"140":1,"185":1,"192":1}}],["type",{"0":{"175":1,"186":1,"187":1},"2":{"25":1,"35":2,"81":1,"185":1,"192":1,"218":1,"304":1,"305":2}}],["tape",{"2":{"229":2,"230":10}}],["table",{"2":{"199":2}}],["tabs",{"2":{"84":1}}],["tab",{"2":{"82":2,"96":1,"262":2,"263":1,"264":1,"297":1}}],["taken",{"2":{"264":1}}],["takes",{"2":{"124":1}}],["take",{"2":{"78":1,"96":1,"133":2,"141":1,"167":1,"176":1}}],["tailwindcss",{"2":{"20":2}}],["tundra",{"2":{"170":1,"202":1,"208":1,"212":1}}],["turning",{"2":{"228":1}}],["turn",{"2":{"94":1}}],["turned",{"2":{"32":1}}],["tutorials",{"2":{"76":1}}],["txpower",{"2":{"70":2}}],["txthttp",{"2":{"65":1}}],["treat",{"2":{"126":1}}],["treats",{"2":{"94":1}}],["trouble",{"2":{"90":1,"134":1,"185":1}}],["troubleshooting",{"0":{"59":1,"98":1},"1":{"60":1},"2":{"44":1}}],["training",{"2":{"101":1}}],["transmittion",{"2":{"68":1}}],["transmission",{"2":{"66":1,"68":1}}],["transfer",{"2":{"41":1}}],["trackable",{"2":{"301":1}}],["tracking",{"0":{"254":1,"256":2,"263":1,"290":1},"1":{"255":1,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2},"2":{"99":2,"165":1,"175":1,"212":1,"246":1,"254":1,"257":2,"258":1,"262":1,"263":1,"274":1,"290":1,"297":1,"299":1,"300":1,"301":1,"302":1,"305":2}}],["tracker",{"0":{"86":1,"96":1,"210":1},"1":{"87":1,"88":1,"211":1,"212":1},"2":{"38":1,"72":1,"77":1,"85":1,"90":2,"95":2,"96":1,"99":1,"129":2,"133":1,"134":3,"202":1,"217":3}}],["trackers",{"2":{"38":1,"94":2,"95":1,"165":1,"170":3,"200":1,"202":1,"204":1,"206":1,"207":1,"208":1}}],["track",{"2":{"30":1,"54":1}}],["try",{"2":{"37":1,"60":2,"68":1,"90":2,"134":1,"161":1,"185":2,"224":1,"274":1}}],["trigger",{"2":{"25":1,"302":1,"307":1}}],["true",{"2":{"19":1,"307":1}}],["t",{"0":{"108":1,"251":1,"306":1},"1":{"252":1,"253":1},"2":{"25":1,"47":1,"50":1,"68":1,"70":1,"87":1,"94":1,"97":1,"98":1,"106":2,"126":2,"133":1,"135":1,"136":1,"204":1,"221":1,"222":1,"266":2,"292":1,"300":2,"304":2,"306":1}}],["tension",{"2":{"134":1}}],["term",{"2":{"106":1}}],["terminal",{"2":{"81":2,"97":1}}],["terminology",{"0":{"285":1},"1":{"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"1":1,"181":1,"285":1}}],["testing",{"0":{"266":1},"1":{"267":1,"268":1,"269":1,"270":1,"271":1},"2":{"96":1,"106":1}}],["tested",{"2":{"58":1,"96":1,"126":1}}],["tests",{"2":{"25":1}}],["test",{"0":{"161":1},"2":{"25":2,"37":1,"64":1,"161":1,"185":1,"266":1}}],["text",{"2":{"19":4,"20":4,"25":1,"28":1,"52":1,"96":1,"184":2}}],["team",{"2":{"15":1,"78":1,"98":1}}],["temps",{"2":{"221":1}}],["temperamental",{"2":{"204":1,"207":1}}],["template",{"2":{"141":1}}],["temp",{"2":{"3":2,"221":1}}],["tightly",{"2":{"231":1}}],["tighten",{"2":{"147":1,"152":1}}],["tip",{"2":{"20":1,"36":1,"188":1}}],["title",{"0":{"20":1},"2":{"20":3,"25":1}}],["tinkering",{"2":{"138":1}}],["tin",{"0":{"177":1},"2":{"2":1,"3":1,"182":1,"183":1}}],["times",{"2":{"121":1,"168":1,"225":1,"228":1,"238":1}}],["timem",{"2":{"83":1}}],["time",{"2":{"1":1,"36":1,"56":1,"99":1,"124":1,"133":1,"170":1,"172":1,"181":1,"246":1,"266":2,"271":1,"281":1}}],["threshold",{"0":{"292":1},"2":{"300":5}}],["thresholds",{"2":{"101":1,"107":1,"274":1}}],["through",{"2":{"95":1,"131":1,"135":1,"136":1,"220":1,"221":1,"244":1}}],["those",{"2":{"94":1,"165":1,"273":1,"304":1}}],["though",{"2":{"28":1,"32":1,"79":1,"215":1}}],["thanks",{"2":{"257":1}}],["thank",{"2":{"140":1}}],["than",{"2":{"68":1,"170":1,"204":1,"205":1,"207":1,"211":1,"231":1,"273":1}}],["that",{"0":{"46":1,"156":1,"265":1},"2":{"4":1,"5":1,"20":1,"22":2,"24":6,"25":10,"28":2,"31":1,"32":1,"33":1,"35":1,"37":2,"41":1,"43":1,"47":1,"48":1,"49":1,"54":3,"56":1,"60":2,"62":1,"66":1,"67":2,"68":4,"77":1,"78":1,"79":2,"82":1,"84":1,"87":1,"90":3,"94":2,"95":2,"97":2,"106":3,"122":1,"123":1,"154":1,"156":2,"159":1,"165":1,"167":1,"170":2,"171":1,"179":1,"182":1,"186":1,"194":1,"200":1,"205":1,"206":1,"209":1,"214":1,"215":4,"216":1,"217":5,"224":3,"229":1,"230":4,"238":1,"252":1,"257":2,"261":1,"263":4,"264":1,"265":3,"269":1,"271":2,"273":1,"284":1,"292":1,"293":1,"297":2,"299":1,"300":2,"301":1,"302":1,"304":2,"305":2,"306":2}}],["thunder",{"2":{"32":1,"64":1}}],["thick",{"2":{"133":1}}],["thin",{"2":{"253":1}}],["think",{"2":{"221":1,"224":1,"274":2}}],["thinker",{"2":{"37":1}}],["thingiverse",{"2":{"157":2,"162":1}}],["thing",{"2":{"25":2,"157":1,"265":1}}],["things",{"0":{"119":1,"120":1,"168":1},"1":{"120":1,"121":2,"122":2,"123":2,"124":2,"125":2},"2":{"1":1,"19":2,"36":1,"44":1,"84":1,"100":1,"124":1,"134":1,"170":1,"181":1,"215":1,"258":1,"263":1,"292":1}}],["this",{"0":{"27":1,"38":1,"120":2,"156":1,"164":1,"253":1,"257":1,"258":1,"274":1,"276":1,"299":1},"1":{"39":1,"121":2,"122":2,"123":2,"124":2,"125":2,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1},"2":{"1":4,"5":1,"9":1,"16":1,"18":1,"19":2,"20":3,"24":2,"25":6,"28":2,"30":3,"31":5,"32":3,"33":1,"35":1,"36":3,"37":7,"39":3,"43":1,"44":2,"52":1,"54":3,"56":1,"62":2,"66":1,"69":1,"72":1,"78":4,"79":1,"83":1,"84":1,"87":1,"88":1,"89":1,"90":4,"94":3,"95":1,"96":2,"97":1,"100":2,"106":2,"126":1,"130":1,"131":2,"133":1,"134":1,"140":1,"144":1,"149":1,"153":1,"165":1,"166":1,"170":4,"174":1,"175":1,"177":1,"181":4,"182":2,"186":3,"187":1,"188":3,"193":1,"196":1,"202":1,"204":1,"205":1,"207":1,"208":1,"212":1,"215":1,"217":1,"221":1,"222":1,"225":1,"228":1,"229":1,"230":1,"236":1,"240":1,"242":1,"246":1,"247":2,"248":1,"257":1,"264":2,"265":1,"266":1,"269":1,"271":1,"274":4,"276":1,"280":1,"284":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"297":1,"300":4,"302":2,"304":1,"305":1,"306":1,"307":1}}],["thermal",{"2":{"118":1}}],["there",{"0":{"265":1},"2":{"45":1,"80":1,"82":1,"84":2,"87":1,"94":2,"98":1,"146":1,"151":1,"154":1,"159":2,"170":1,"171":1,"185":2,"186":1,"188":2,"190":1,"192":1,"196":2,"200":1,"206":1,"215":1,"224":1,"247":1,"265":2,"266":1,"273":1,"305":1}}],["these",{"2":{"20":1,"22":1,"28":1,"66":1,"78":1,"94":1,"98":1,"107":1,"118":1,"126":1,"127":1,"165":1,"175":1,"192":2,"229":1,"238":1}}],["then",{"2":{"14":1,"19":1,"28":2,"31":1,"36":1,"43":1,"44":1,"51":1,"52":2,"66":1,"78":1,"82":1,"87":1,"88":1,"94":1,"96":1,"97":1,"135":1,"147":1,"152":1,"174":1,"175":1,"176":1,"182":1,"194":1,"197":1,"221":1,"224":1,"236":1,"264":1,"280":1,"284":1,"297":2}}],["they",{"2":{"1":1,"16":1,"95":1,"133":2,"135":2,"172":1,"181":1,"193":1,"204":2,"207":2,"212":1,"214":1,"215":1,"221":5,"228":1,"244":1,"263":2,"265":1,"274":1,"304":2,"306":1}}],["theme",{"2":{"19":1,"20":1}}],["them",{"0":{"177":1,"296":1},"1":{"297":1,"298":1,"299":1,"300":1},"2":{"1":1,"35":1,"76":1,"82":1,"94":1,"95":1,"134":2,"135":1,"145":1,"150":1,"153":1,"160":1,"170":1,"172":1,"175":1,"176":1,"177":1,"181":1,"185":4,"221":4,"222":1,"224":1,"228":2,"229":2,"238":2,"244":1,"252":2,"270":1,"304":2,"305":3,"306":1}}],["their",{"2":{"1":1,"94":2,"133":1,"181":1,"254":1,"260":1,"269":1,"299":1}}],["the",{"0":{"4":1,"9":1,"19":1,"26":1,"27":2,"28":1,"42":1,"43":1,"57":1,"60":1,"72":1,"76":1,"78":1,"83":1,"84":1,"85":1,"87":1,"96":1,"97":2,"125":2,"159":1,"166":1,"167":1,"172":1,"173":1,"174":1,"177":1,"178":1,"179":1,"180":1,"184":1,"217":1,"221":1,"230":1,"234":1,"238":1,"239":1,"240":1,"244":1,"251":1,"252":1,"255":1,"256":1,"262":1,"263":1,"264":1,"266":1,"268":1,"269":1,"270":1,"271":1,"273":1,"274":1,"275":1,"276":1,"280":1,"281":1,"282":1,"283":2,"284":1,"296":1,"299":2,"305":1,"306":2},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"27":1,"28":1,"29":2,"30":2,"31":2,"32":2,"33":2,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"84":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"98":2,"252":1,"253":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":2,"268":2,"269":2,"270":2,"271":2,"272":1,"273":1,"274":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":2,"298":2,"299":2,"300":2,"301":1},"2":{"1":9,"2":4,"3":5,"4":13,"9":2,"12":4,"14":1,"15":3,"16":2,"17":5,"18":2,"19":9,"20":16,"21":2,"22":3,"24":4,"25":15,"28":19,"30":6,"31":21,"32":5,"33":4,"35":4,"36":6,"37":14,"38":5,"39":8,"41":1,"42":6,"43":3,"44":6,"45":4,"46":1,"47":4,"48":1,"49":1,"50":4,"51":2,"52":3,"54":15,"56":15,"57":6,"58":2,"60":12,"62":3,"64":2,"65":5,"66":24,"67":4,"68":17,"69":10,"70":7,"71":6,"72":1,"73":1,"76":2,"77":2,"78":13,"79":3,"82":4,"83":1,"84":5,"85":2,"87":10,"88":6,"89":4,"90":18,"92":1,"93":5,"94":12,"95":9,"96":12,"97":10,"98":4,"99":1,"100":2,"101":4,"103":1,"106":5,"107":6,"116":2,"118":3,"121":1,"122":1,"126":1,"127":4,"129":6,"131":6,"133":16,"134":23,"135":16,"136":9,"138":1,"140":2,"141":3,"145":2,"147":2,"150":2,"152":2,"153":5,"154":2,"157":2,"158":3,"159":7,"160":1,"161":1,"162":3,"165":1,"166":1,"167":1,"169":1,"170":19,"171":10,"172":3,"173":1,"174":1,"175":3,"176":8,"177":1,"178":3,"179":6,"180":1,"181":9,"182":9,"183":3,"184":11,"185":6,"186":10,"187":5,"188":3,"190":1,"191":1,"192":8,"193":5,"194":10,"196":5,"197":10,"199":1,"202":3,"204":1,"205":1,"207":1,"208":1,"209":2,"211":1,"212":4,"214":6,"215":10,"216":5,"217":9,"220":3,"221":7,"222":4,"223":1,"224":5,"225":6,"228":8,"229":4,"230":23,"231":5,"232":1,"234":1,"235":2,"236":4,"237":2,"238":4,"239":6,"240":12,"242":2,"243":4,"244":17,"245":1,"246":1,"247":6,"248":2,"253":3,"254":1,"258":1,"261":4,"262":6,"263":12,"264":3,"265":4,"266":13,"268":1,"269":6,"270":2,"271":6,"273":2,"274":8,"276":1,"279":3,"280":4,"281":5,"283":4,"284":1,"285":2,"286":1,"287":1,"289":2,"290":2,"293":1,"297":4,"299":2,"300":6,"301":8,"302":4,"304":13,"305":16,"306":6,"307":6}}],["togggle",{"2":{"274":1}}],["toggle",{"2":{"274":2}}],["together",{"0":{"177":1},"2":{"175":1,"176":1,"177":2}}],["toward",{"2":{"184":1}}],["torx",{"2":{"130":1,"136":1,"147":1,"152":1}}],["total",{"2":{"101":2,"111":1,"112":1,"114":1,"115":1,"117":1,"304":1}}],["touch",{"2":{"95":1}}],["top",{"2":{"20":1,"101":1,"131":1,"179":1,"244":2,"285":1}}],["tools",{"0":{"223":1},"1":{"224":1},"2":{"32":1}}],["tool",{"0":{"40":1,"42":1,"43":1},"1":{"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1},"2":{"25":1,"39":4,"42":2}}],["too",{"2":{"3":1,"66":1,"182":1,"196":1,"228":1,"230":1,"238":1,"300":2,"302":1}}],["to",{"0":{"1":1,"19":1,"48":1,"55":1,"57":1,"60":1,"63":1,"86":1,"97":1,"119":1,"120":1,"125":1,"156":1,"157":2,"168":1,"171":1,"172":2,"173":1,"175":1,"178":1,"179":1,"181":1,"189":1,"190":1,"195":1,"196":1,"233":1,"254":1,"262":1,"263":1,"264":1,"276":1,"282":1,"296":1,"305":1},"1":{"49":1,"50":1,"51":1,"52":1,"56":1,"57":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"87":1,"88":1,"98":1,"120":1,"121":2,"122":2,"123":2,"124":2,"125":2,"190":1,"191":2,"192":2,"193":2,"194":1,"196":1,"197":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"255":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":2,"298":2,"299":2,"300":2,"301":1},"2":{"1":3,"2":2,"3":1,"4":1,"12":1,"14":1,"15":2,"16":3,"17":2,"19":13,"20":3,"21":2,"22":2,"24":8,"25":10,"28":20,"30":3,"31":23,"32":2,"33":3,"35":3,"36":4,"37":3,"38":2,"39":3,"41":1,"42":1,"43":1,"44":4,"45":3,"46":2,"47":1,"48":1,"50":6,"51":1,"52":2,"54":4,"56":6,"57":4,"58":1,"60":5,"62":2,"64":2,"65":1,"66":14,"67":1,"68":9,"69":3,"70":2,"71":2,"72":2,"76":3,"77":2,"78":7,"79":1,"80":1,"81":1,"82":1,"83":2,"84":2,"85":2,"87":4,"88":4,"89":1,"90":5,"92":3,"93":5,"94":13,"95":6,"96":2,"97":5,"98":3,"99":2,"100":3,"101":2,"102":1,"104":2,"105":1,"106":7,"107":1,"108":1,"113":1,"116":3,"118":4,"123":3,"124":3,"126":2,"127":2,"129":2,"131":1,"133":3,"134":2,"135":3,"136":4,"138":2,"140":6,"141":1,"144":1,"145":1,"146":1,"147":2,"149":1,"150":1,"151":1,"152":2,"153":3,"156":1,"157":2,"158":1,"159":4,"160":2,"162":3,"165":1,"166":1,"167":1,"168":2,"170":7,"171":3,"172":2,"173":1,"174":1,"175":3,"176":2,"177":1,"181":3,"182":5,"184":1,"185":8,"186":1,"187":1,"188":5,"193":1,"194":4,"196":3,"202":2,"204":2,"205":1,"207":3,"208":1,"212":2,"214":2,"215":2,"216":1,"217":7,"218":3,"220":4,"221":2,"222":1,"224":3,"225":1,"228":2,"229":3,"230":8,"231":1,"232":1,"236":2,"237":2,"238":1,"239":1,"244":5,"245":2,"246":1,"247":1,"252":2,"253":2,"257":4,"258":1,"260":2,"261":1,"262":2,"263":8,"264":3,"265":1,"266":5,"269":6,"270":2,"271":2,"273":4,"274":1,"276":1,"279":4,"281":2,"283":1,"284":1,"289":1,"290":1,"292":1,"293":4,"294":1,"295":1,"300":3,"301":5,"302":6,"304":10,"305":6,"306":4,"307":5}}],["image",{"2":{"143":1,"147":4,"148":1,"152":4,"170":1,"188":1,"194":1,"240":1}}],["improvements",{"2":{"118":1}}],["improve",{"2":{"100":1,"140":1}}],["improves",{"2":{"25":1}}],["implement",{"2":{"66":1}}],["implemented",{"2":{"66":2,"274":1}}],["important",{"2":{"25":1,"37":1,"100":1,"106":1,"124":1,"200":1,"206":1,"269":1,"301":1}}],["ignored",{"2":{"123":1}}],["illuminated",{"2":{"108":1,"117":1}}],["ie",{"2":{"108":2,"110":3,"111":1,"112":1,"114":1,"115":1,"117":3}}],["iec",{"2":{"107":2}}],["icnirp",{"0":{"118":1},"2":{"101":2,"107":1,"111":1,"112":1,"114":1,"115":1,"118":1}}],["icon",{"2":{"43":2,"82":1,"96":1,"284":1,"305":1}}],["io12",{"2":{"179":1}}],["ioo",{"2":{"87":1}}],["io0",{"2":{"45":1}}],["ide",{"0":{"77":1},"2":{"77":1,"270":1}}],["ideal",{"2":{"44":1,"159":1}}],["i",{"0":{"39":1,"93":1,"258":2,"265":1},"1":{"94":1,"95":1,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2},"2":{"39":2,"110":1,"117":1,"130":1,"134":1,"136":1,"156":1,"159":1,"175":1,"179":1,"182":2,"185":1,"202":1,"208":1,"215":1,"217":1,"230":2}}],["ip",{"0":{"96":1},"2":{"30":1,"31":2,"52":2,"54":6,"94":1,"95":3,"263":3,"289":1,"297":3}}],["ish",{"2":{"179":1}}],["isn",{"0":{"108":1}}],["issue",{"2":{"39":1,"98":1,"170":1,"306":1}}],["issues",{"2":{"39":1,"170":2,"179":1,"204":1,"212":1}}],["is",{"0":{"35":1,"38":1,"54":1,"62":1,"92":1,"120":1,"121":1,"165":1,"253":1,"257":1,"299":1},"1":{"39":1,"121":1,"122":1,"123":1,"124":1,"125":1},"2":{"1":1,"3":1,"4":3,"9":2,"18":1,"20":2,"22":1,"24":9,"25":10,"28":4,"31":2,"32":4,"33":1,"35":2,"36":7,"37":10,"38":2,"39":1,"41":2,"43":1,"44":2,"46":1,"47":1,"50":1,"51":1,"52":1,"54":3,"56":4,"57":1,"58":2,"60":5,"62":2,"64":1,"65":1,"66":2,"77":1,"78":2,"79":1,"84":1,"87":1,"90":4,"92":1,"94":1,"96":1,"99":1,"100":1,"101":3,"103":1,"104":1,"106":3,"107":3,"108":1,"116":1,"124":1,"129":1,"134":2,"136":2,"140":1,"144":1,"149":1,"153":1,"157":2,"159":2,"161":1,"170":7,"173":1,"181":1,"184":2,"185":1,"186":4,"188":1,"191":1,"192":1,"193":1,"194":2,"196":1,"202":3,"205":1,"208":1,"215":2,"217":3,"221":3,"222":1,"224":2,"229":1,"230":1,"235":2,"238":1,"242":1,"246":1,"254":2,"257":2,"264":2,"265":2,"271":2,"273":1,"274":4,"276":1,"278":1,"289":1,"291":1,"292":1,"293":1,"297":1,"300":1,"301":4,"305":1,"307":1}}],["invoke",{"2":{"279":1}}],["involves",{"2":{"187":1}}],["invisible",{"2":{"101":1}}],["inwards",{"2":{"184":1,"186":1}}],["inbetween",{"2":{"134":1}}],["inaccurate",{"2":{"118":1}}],["increase",{"2":{"304":1}}],["including",{"2":{"230":1}}],["include",{"0":{"156":1},"2":{"147":1,"152":1,"222":1}}],["included",{"2":{"127":2,"140":1,"193":1,"215":1}}],["includes",{"2":{"44":1,"106":1}}],["incentive",{"2":{"140":1}}],["incomplete",{"0":{"124":1}}],["incoherent",{"2":{"118":1}}],["injury",{"2":{"118":1}}],["infront",{"2":{"136":1}}],["infrared",{"0":{"106":1},"1":{"107":1,"108":1},"2":{"101":2,"118":1}}],["information",{"2":{"33":1,"50":1,"140":1}}],["info",{"2":{"28":2,"78":1,"179":1}}],["initiative",{"2":{"140":1}}],["initially",{"2":{"85":1}}],["initial",{"2":{"44":1,"88":1}}],["inimdnsname",{"2":{"56":1}}],["ini",{"0":{"28":2},"1":{"29":2,"30":2,"31":2,"32":2,"33":2},"2":{"37":1,"56":2,"95":3}}],["indicating",{"2":{"71":1,"88":1}}],["indicate",{"2":{"25":2}}],["index",{"0":{"126":1,"127":1},"1":{"127":1,"128":1,"129":2,"130":2,"131":2,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1},"2":{"19":1,"126":1,"129":2,"136":2,"141":1,"202":2,"208":2,"217":1}}],["inspector",{"2":{"304":3,"305":1}}],["inspections",{"2":{"116":1}}],["inspiration",{"2":{"141":1,"159":1}}],["inserted",{"2":{"134":1}}],["insert",{"2":{"133":2,"134":3,"146":1,"151":1}}],["inserting",{"2":{"133":1}}],["inserts",{"0":{"133":1},"2":{"130":2,"133":4,"134":1,"144":1,"149":1}}],["instead",{"2":{"54":1,"79":1,"84":1,"215":1,"273":1}}],["instructions",{"0":{"139":1},"2":{"42":1,"100":1,"165":1}}],["installing",{"0":{"279":1},"2":{"266":1,"280":1}}],["installed",{"2":{"58":1,"77":1,"78":1,"84":1,"261":1,"270":1,"283":1}}],["installer",{"0":{"283":1},"2":{"42":2}}],["install",{"0":{"42":1,"73":1,"75":1,"76":1,"77":1,"170":1,"270":1,"278":1,"280":1,"282":1,"283":1},"1":{"74":1,"75":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"12":1,"45":1,"73":1,"76":1,"77":1,"78":1,"138":1,"261":1,"266":2,"278":1,"279":3,"280":2}}],["installation",{"0":{"12":1,"139":1},"2":{"42":1,"43":1,"45":1,"46":1,"51":1,"80":1,"266":1}}],["inside",{"2":{"20":1,"214":1,"305":1}}],["integrity",{"2":{"170":1}}],["intensity",{"2":{"101":1,"108":2,"110":2}}],["intensities",{"2":{"101":1}}],["interact",{"2":{"302":1}}],["interference",{"2":{"170":1,"204":1,"207":1}}],["interface",{"2":{"93":1,"216":1}}],["internally",{"2":{"131":1}}],["international",{"2":{"101":1,"107":1}}],["interested",{"2":{"131":1}}],["intro",{"2":{"19":1}}],["introduction",{"2":{"19":1}}],["into",{"2":{"18":1,"35":1,"44":1,"52":1,"79":1,"81":1,"87":2,"90":1,"95":1,"96":1,"97":1,"113":1,"133":2,"134":3,"135":2,"138":1,"147":1,"152":1,"171":1,"172":1,"186":2,"244":1,"247":1,"248":1,"262":1,"297":1,"299":1,"305":1}}],["input",{"2":{"4":1,"96":1}}],["in",{"0":{"7":1,"82":1,"165":1,"174":1,"208":1,"234":1,"264":1,"274":1,"299":1,"306":1},"2":{"1":4,"2":1,"3":1,"4":1,"5":1,"12":1,"15":1,"17":1,"18":2,"20":2,"21":1,"24":5,"28":8,"32":1,"33":1,"36":1,"37":1,"39":1,"44":1,"54":1,"56":1,"66":2,"67":1,"68":3,"69":1,"76":1,"78":3,"79":1,"81":1,"82":2,"84":1,"85":1,"87":6,"94":4,"95":3,"96":5,"97":1,"98":2,"99":1,"100":1,"101":3,"106":4,"107":1,"108":2,"124":1,"127":1,"131":1,"133":1,"134":4,"135":3,"136":5,"140":1,"141":1,"147":1,"152":1,"153":1,"154":1,"165":1,"170":3,"171":2,"174":1,"175":2,"179":3,"181":4,"182":2,"183":1,"184":1,"186":2,"187":1,"188":2,"192":1,"193":3,"194":2,"196":3,"197":1,"202":1,"204":1,"205":3,"207":1,"209":1,"212":1,"215":2,"217":1,"221":3,"224":3,"228":4,"229":3,"230":2,"235":1,"240":3,"252":1,"253":1,"257":1,"261":1,"264":2,"265":1,"266":1,"270":1,"273":1,"274":5,"280":1,"281":1,"285":1,"289":1,"297":1,"299":1,"300":2,"302":1,"304":6,"305":4,"307":2}}],["ifixit",{"2":{"136":1}}],["if",{"0":{"217":1,"251":1},"1":{"252":1,"253":1},"2":{"1":2,"17":1,"18":1,"19":1,"25":1,"28":5,"30":2,"31":3,"33":1,"35":1,"37":2,"39":1,"47":2,"54":4,"56":1,"57":1,"58":2,"60":4,"62":1,"65":1,"66":1,"67":2,"68":1,"78":1,"87":1,"90":4,"94":1,"95":1,"97":3,"98":2,"100":1,"101":1,"104":2,"106":1,"118":1,"123":2,"124":1,"126":1,"131":2,"134":2,"135":1,"136":1,"145":1,"150":1,"158":1,"170":2,"181":2,"184":2,"185":4,"186":1,"196":1,"197":1,"204":1,"207":1,"212":1,"214":1,"215":1,"216":1,"217":1,"218":1,"221":5,"224":4,"225":1,"228":2,"231":1,"235":1,"236":1,"237":1,"244":1,"252":1,"263":2,"266":1,"271":1,"284":1,"307":1}}],["items",{"0":{"125":1},"2":{"19":1}}],["itself",{"0":{"80":1},"1":{"81":1,"82":1},"2":{"66":2,"96":1,"258":1,"302":1,"305":1,"307":1}}],["its",{"2":{"4":2,"230":1,"248":1,"269":1,"304":1}}],["it",{"0":{"35":1,"46":1,"54":1,"55":1,"62":1,"63":1,"92":1,"93":1,"159":1,"245":1},"1":{"56":1,"57":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"94":1,"95":1},"2":{"1":1,"2":1,"4":2,"9":1,"19":1,"20":1,"24":1,"25":1,"28":4,"32":1,"36":2,"37":3,"38":1,"39":1,"41":1,"44":3,"45":2,"49":1,"50":1,"51":1,"52":1,"56":2,"64":1,"73":1,"77":1,"78":3,"79":1,"81":2,"82":3,"84":2,"87":6,"88":1,"89":1,"90":1,"92":1,"94":2,"95":2,"96":1,"97":1,"99":3,"100":1,"101":1,"103":1,"106":3,"124":1,"129":3,"133":1,"134":1,"135":5,"136":3,"138":1,"141":1,"144":1,"149":1,"159":1,"160":1,"161":1,"162":1,"165":1,"167":1,"170":5,"171":2,"172":2,"174":2,"176":1,"179":2,"181":1,"182":4,"183":1,"185":1,"186":1,"197":1,"200":1,"205":1,"206":1,"214":2,"215":2,"217":2,"224":3,"228":1,"229":1,"230":4,"236":2,"237":1,"238":2,"239":3,"240":1,"244":1,"246":1,"252":1,"257":3,"261":1,"263":2,"265":1,"266":4,"268":1,"269":4,"270":1,"271":2,"273":2,"274":6,"278":1,"281":1,"284":1,"289":1,"290":1,"293":1,"297":1,"300":1,"301":1,"302":2,"304":4,"305":6,"306":2,"307":1}}],["iron",{"2":{"130":1,"133":2,"182":2,"223":1}}],["irradiance",{"2":{"107":2,"108":2}}],["irreversible",{"2":{"106":1}}],["ir",{"0":{"0":1,"1":1,"106":1,"123":1,"176":1,"177":1,"181":1,"188":1,"215":1,"219":1,"225":1,"226":1,"227":1},"1":{"1":1,"2":1,"3":1,"4":1,"107":1,"108":1,"220":1,"221":1,"226":1,"227":1},"2":{"1":1,"4":1,"101":3,"106":4,"116":2,"181":1,"190":1,"214":1,"215":2,"218":1,"221":5,"222":1,"225":3,"242":2}}],["global",{"0":{"253":1}}],["gluing",{"2":{"187":1,"244":1}}],["glued",{"2":{"228":1}}],["glue",{"2":{"129":1,"160":1,"179":1,"186":2,"187":1,"188":2,"223":2,"244":1}}],["glass",{"2":{"1":1,"181":1}}],["game",{"2":{"257":1}}],["gasket",{"2":{"244":2}}],["gauge",{"2":{"218":3}}],["gain",{"2":{"71":1}}],["gather",{"0":{"169":1},"2":{"1":1,"181":1}}],["grey",{"2":{"239":1,"240":1}}],["greater",{"2":{"207":1}}],["greatly",{"2":{"199":1}}],["green",{"2":{"96":1,"184":2}}],["greeted",{"2":{"43":1,"284":1}}],["graph",{"2":{"274":1}}],["gray",{"2":{"171":2}}],["grab",{"2":{"87":1,"182":1,"239":1}}],["ground",{"2":{"1":1,"4":4,"175":1,"176":2,"179":1,"181":1}}],["gold",{"2":{"197":2}}],["good",{"0":{"159":1},"2":{"144":1,"149":1,"159":2,"161":1,"185":1,"186":1,"204":1,"205":1,"207":1,"217":1,"230":3,"254":1,"300":2}}],["got",{"2":{"79":1,"264":1}}],["go",{"2":{"46":1,"78":1,"123":1,"126":1,"188":1,"193":1,"240":1,"262":1,"283":1,"285":1}}],["going",{"2":{"36":1,"38":1,"78":1,"167":1}}],["goes",{"2":{"4":1,"78":1,"98":1,"172":1}}],["g",{"2":{"35":2,"299":1}}],["ghz",{"0":{"203":1,"207":1},"1":{"204":1},"2":{"28":1,"204":2,"207":2}}],["gh",{"2":{"25":1}}],["gumstick",{"0":{"137":1},"1":{"138":1,"139":1},"2":{"138":1}}],["guarantees",{"2":{"116":1}}],["gui",{"2":{"43":1,"284":1,"290":1}}],["guides",{"0":{"140":1},"1":{"141":1}}],["guideline",{"0":{"118":1}}],["guidelines",{"0":{"141":1},"2":{"101":2,"118":1}}],["guide",{"0":{"22":1,"163":1,"164":1,"242":1,"276":1},"1":{"23":1,"24":1,"25":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1},"2":{"30":1,"79":1,"84":1,"87":1,"90":1,"93":1,"100":1,"141":1,"165":1,"173":1,"174":1,"212":1,"224":1,"229":1}}],["gulp",{"2":{"25":1}}],["gesture",{"2":{"305":1}}],["gerber",{"2":{"221":1}}],["gently",{"2":{"230":1,"239":2}}],["gentle",{"2":{"171":1,"240":1}}],["generic",{"2":{"37":1,"223":2}}],["generated",{"2":{"306":1}}],["generate",{"2":{"25":1}}],["generally",{"2":{"186":2}}],["general",{"0":{"24":1}}],["getting",{"0":{"10":1,"190":1,"196":1,"285":1},"1":{"11":1,"12":1,"191":1,"192":1,"193":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"19":3,"36":1,"96":1,"159":1,"185":1,"220":1}}],["getstoredconfig",{"2":{"66":1}}],["gets",{"2":{"4":1,"228":1}}],["get",{"0":{"52":1,"100":1,"162":1},"2":{"1":1,"38":1,"58":1,"64":1,"66":6,"76":1,"90":1,"156":1,"157":1,"161":1,"174":1,"175":1,"181":1,"221":1,"230":2,"252":1,"253":1,"260":1,"265":1,"271":1,"304":1}}],["gt",{"2":{"20":2,"25":2,"30":1,"65":1,"67":6,"84":1,"94":1,"107":1,"118":1,"194":4,"266":1,"306":2}}],["gives",{"2":{"159":1}}],["given",{"2":{"67":1,"68":1}}],["give",{"0":{"159":1},"2":{"20":1,"166":1,"224":1,"281":1,"305":1}}],["github",{"0":{"268":1},"2":{"12":1,"16":1,"42":1,"78":2,"103":1,"118":1,"131":1,"141":1,"146":1,"151":1,"158":1,"268":1,"269":1,"283":1}}],["git",{"0":{"25":1},"2":{"11":1,"12":1,"24":1,"25":6,"78":4,"97":4,"268":1}}],["gnd",{"2":{"1":1,"179":1,"181":1}}],["pyinstaller",{"2":{"281":1}}],["py",{"2":{"279":1}}],["python",{"0":{"278":1,"280":1},"2":{"278":1,"279":1}}],["peel",{"2":{"230":1}}],["peeled",{"2":{"230":1}}],["people",{"2":{"153":1,"222":1}}],["periodic",{"2":{"116":1}}],["permanent",{"2":{"101":1}}],["permanently",{"2":{"36":1}}],["perfect",{"2":{"121":1,"133":1,"161":1}}],["performs",{"2":{"170":1}}],["perform",{"2":{"116":1}}],["performance",{"2":{"25":1,"202":1,"208":1}}],["perf",{"2":{"25":1}}],["per",{"2":{"2":1,"108":1,"117":1,"176":1,"182":1,"192":1}}],["physics",{"0":{"137":1},"1":{"138":1,"139":1},"2":{"127":1,"138":1}}],["photobiological",{"2":{"101":1}}],["pdf",{"2":{"118":1}}],["purchase",{"2":{"215":1}}],["purchases",{"2":{"205":1}}],["purple",{"2":{"192":1}}],["purposes",{"2":{"36":1,"44":1}}],["pushing",{"2":{"240":1}}],["push",{"2":{"133":1,"135":2,"240":1}}],["pupil",{"2":{"107":1,"159":1,"292":1,"300":1}}],["pull",{"2":{"97":1,"230":1,"231":1}}],["putting",{"2":{"135":1,"186":1,"231":1}}],["put",{"2":{"95":1,"106":2,"179":1,"182":1,"192":1,"221":1,"269":1,"289":1,"300":1}}],["piece",{"2":{"176":1,"182":1}}],["pick",{"2":{"146":1,"151":1,"197":1,"225":1}}],["picture",{"2":{"133":2,"136":1,"184":2,"193":1}}],["pio",{"2":{"81":1,"84":1,"94":1}}],["pinecil",{"2":{"223":1}}],["pine64",{"2":{"223":1}}],["pins",{"2":{"171":1,"193":2,"196":1,"240":2}}],["pinging",{"2":{"141":1}}],["ping",{"2":{"66":1,"185":1}}],["pin",{"2":{"1":1,"4":5,"178":1,"179":3,"181":1,"197":1}}],["pc",{"0":{"86":1,"263":1},"1":{"87":1,"88":1},"2":{"45":1,"51":1,"52":1,"87":2,"88":1,"90":1,"94":1,"96":1,"263":1,"266":1}}],["pcbs",{"0":{"4":1,"181":1,"184":1},"2":{"1":1,"4":2,"176":1,"181":1,"184":1,"221":2}}],["pcb",{"0":{"1":1,"2":1,"3":1,"182":1,"183":1},"2":{"1":3,"2":1,"4":1,"135":4,"181":3,"182":2}}],["pay",{"2":{"184":1,"194":1}}],["pad",{"2":{"182":1}}],["pads",{"2":{"2":1,"3":2,"170":2,"182":2,"183":1}}],["pairs",{"2":{"175":1}}],["patreon",{"2":{"221":1}}],["patient",{"0":{"165":1}}],["path",{"2":{"78":2}}],["past",{"2":{"94":1}}],["passthrough",{"2":{"136":1}}],["pass",{"2":{"68":1,"70":1,"289":1}}],["passed",{"2":{"67":1}}],["password",{"2":{"28":7,"31":4,"50":2,"68":2,"69":2}}],["panel",{"2":{"82":1,"304":1}}],["parent",{"2":{"269":1}}],["parameter",{"2":{"305":2}}],["parameters",{"0":{"303":1,"304":1,"306":1},"1":{"304":1,"305":1},"2":{"255":1,"257":3,"262":1,"274":4,"304":6,"305":1,"307":2}}],["paramaters",{"0":{"255":1}}],["params",{"0":{"67":1,"71":1},"1":{"68":1,"69":1,"70":1},"2":{"67":4}}],["param",{"2":{"65":2,"67":4,"68":2,"69":1,"70":2,"71":1}}],["partial",{"2":{"140":1}}],["part",{"2":{"38":1,"134":1,"147":3,"152":3,"171":3,"230":2,"239":1,"240":1,"242":1,"301":1}}],["parts",{"0":{"130":1,"145":1,"150":1,"167":1,"198":1,"199":1,"205":1,"209":1,"221":1,"223":1},"1":{"200":1,"201":1,"202":1,"203":1,"204":1,"206":1,"207":1,"208":1,"209":1,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":1,"223":1,"224":2},"2":{"35":1,"102":1,"106":1,"145":3,"147":1,"150":3,"152":1,"160":1,"185":3,"209":1,"221":1,"242":1}}],["package",{"2":{"58":1,"87":1}}],["packages",{"2":{"12":1}}],["page",{"0":{"17":1,"19":1,"21":1,"120":1,"156":1,"164":1},"1":{"18":1,"19":1,"20":1,"121":1,"122":1,"123":1,"124":1,"125":1},"2":{"17":4,"18":2,"19":7,"20":3,"21":1,"33":1,"94":1,"140":1,"141":1,"145":1,"150":1,"242":1,"260":1,"302":1}}],["pages",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1},"2":{"16":2,"17":1,"18":2,"21":1,"100":1,"243":1}}],["practices",{"0":{"231":1},"2":{"229":1,"232":1}}],["practice",{"2":{"205":1}}],["pr",{"2":{"141":1}}],["pricing",{"2":{"221":1}}],["price",{"2":{"211":1}}],["primary",{"2":{"200":1,"206":1}}],["prior",{"2":{"135":1,"228":1}}],["priority",{"2":{"101":1}}],["prints",{"0":{"251":1},"1":{"252":1,"253":1}}],["printer",{"0":{"251":1},"1":{"252":1,"253":1}}],["printed",{"0":{"131":1,"146":1,"151":1,"153":1,"222":1,"244":1},"1":{"154":1},"2":{"104":1,"140":1,"157":1,"185":1,"242":1,"244":1}}],["printing",{"0":{"250":1},"1":{"251":1,"252":1,"253":1},"2":{"251":1,"252":1}}],["print",{"0":{"185":1,"252":1},"1":{"186":1,"187":1},"2":{"102":1,"131":1,"133":1,"146":1,"151":1,"161":1,"185":2,"253":2}}],["prone",{"2":{"229":1}}],["proximity",{"2":{"204":1,"207":1}}],["pros",{"2":{"202":1,"204":1,"207":1,"208":1}}],["problems",{"2":{"170":1}}],["protected",{"2":{"232":1}}],["protecting",{"0":{"229":1},"1":{"230":1,"231":1,"232":1}}],["protection",{"2":{"214":1}}],["protector",{"2":{"157":3}}],["prototype",{"2":{"131":1}}],["protocol",{"2":{"54":2,"58":1}}],["pro",{"2":{"141":1}}],["prohurtz",{"2":{"140":1,"141":1,"162":1,"185":1,"212":1}}],["proven",{"2":{"126":1}}],["provided",{"2":{"93":1,"225":1}}],["provide",{"2":{"50":2,"140":2}}],["provides",{"2":{"44":1,"129":1,"138":1,"144":1,"149":1,"165":1}}],["produce",{"2":{"88":1}}],["programs",{"0":{"259":1},"1":{"260":1,"261":1}}],["program",{"2":{"257":1}}],["programmers",{"2":{"205":1,"212":2}}],["programmer",{"0":{"87":1,"172":1},"2":{"87":4,"90":1,"172":1,"175":1,"211":2,"212":2}}],["progress",{"0":{"7":1,"165":1},"2":{"5":1,"165":1}}],["prompts",{"2":{"283":1}}],["prompt",{"2":{"81":1,"280":1,"281":1}}],["proper",{"2":{"101":1,"212":1}}],["properly",{"2":{"47":1,"78":1,"217":1}}],["property",{"2":{"19":1}}],["procedure",{"2":{"72":1}}],["process",{"2":{"41":1,"122":1,"229":1,"230":1}}],["proceed",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1},"2":{"88":1}}],["proir",{"2":{"15":1}}],["projected",{"2":{"107":1}}],["projects",{"2":{"78":1,"105":1}}],["project",{"0":{"14":1,"27":1,"78":1,"120":1,"270":1},"1":{"15":1,"121":1,"122":1,"123":1,"124":1,"125":1},"2":{"14":1,"22":2,"25":1,"39":1,"62":1,"78":1,"94":1,"100":2,"129":1,"166":1,"269":1,"270":1,"280":1}}],["present",{"2":{"269":1}}],["pressure",{"2":{"134":1,"186":1}}],["pressing",{"2":{"51":1,"52":1,"88":2,"96":1}}],["press",{"2":{"44":1,"51":1,"81":1,"89":1,"90":1,"94":2,"95":1,"96":1,"171":1,"236":1,"238":1,"297":1,"299":1,"300":1,"301":2}}],["pre",{"2":{"266":2}}],["preparing",{"2":{"243":1}}],["prepare",{"0":{"1":1,"173":1,"181":1,"233":1,"243":1,"244":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"41":1,"72":1,"102":1}}],["prefer",{"2":{"270":1}}],["preferably",{"2":{"175":1}}],["prefaced",{"2":{"20":1}}],["precautions",{"2":{"101":1,"123":1}}],["prevent",{"2":{"66":1,"228":1}}],["previous",{"2":{"25":1,"305":1}}],["prerequisites",{"0":{"11":1,"58":1}}],["pliers",{"2":{"228":2}}],["pluggin",{"2":{"194":1}}],["plugging",{"2":{"136":1}}],["plugged",{"2":{"87":1,"90":1}}],["plug",{"0":{"174":1},"2":{"87":1,"96":1,"274":1}}],["play",{"2":{"274":1}}],["plastic",{"2":{"244":1}}],["plans",{"2":{"126":1}}],["planning",{"2":{"50":1}}],["planned",{"0":{"8":1},"2":{"5":1}}],["platform",{"2":{"84":1,"99":1}}],["platforms",{"0":{"307":1},"2":{"84":1}}],["platformio",{"0":{"77":1,"79":1,"80":1,"82":1},"1":{"80":1,"81":2,"82":2,"83":1,"84":1},"2":{"37":1,"77":1,"78":2,"79":2,"80":1,"82":2,"84":1,"94":1}}],["placed",{"2":{"134":1}}],["placeholder",{"2":{"28":1}}],["place",{"0":{"159":1},"2":{"2":1,"3":1,"99":1,"106":2,"133":3,"134":1,"135":3,"136":1,"159":2,"183":1,"186":2,"187":2,"228":1,"230":1,"266":1}}],["please",{"0":{"165":1,"299":1},"2":{"1":1,"16":2,"19":1,"20":2,"33":1,"39":2,"48":1,"66":1,"78":3,"106":1,"118":1,"123":1,"127":1,"136":1,"141":1,"167":1,"168":1,"171":1,"181":1,"196":1,"205":1,"221":1,"224":2,"255":1,"278":1}}],["poetry",{"0":{"279":1},"2":{"279":5,"280":2,"281":1}}],["popular",{"2":{"129":1}}],["potentially",{"2":{"224":1}}],["potential",{"2":{"106":1}}],["portnumber",{"2":{"274":1}}],["port",{"2":{"45":1,"69":2,"136":1,"172":1,"202":1,"208":1,"217":2,"218":1,"247":2,"262":1,"274":1,"299":2,"307":2}}],["ports",{"2":{"30":1,"90":2,"217":1}}],["position",{"2":{"188":1}}],["positioning",{"2":{"127":1}}],["positive",{"0":{"177":2,"178":1},"2":{"1":2,"175":1,"181":2}}],["possible",{"2":{"106":1,"118":1,"141":1,"159":1,"217":1,"231":1}}],["postman",{"2":{"32":1}}],["post",{"2":{"32":1,"66":5}}],["points",{"2":{"129":1}}],["point",{"2":{"28":1,"204":2,"207":2,"228":1,"246":1,"295":1,"302":1}}],["powershell",{"2":{"279":1}}],["powering",{"2":{"103":1,"175":1}}],["powered",{"2":{"94":1}}],["power",{"0":{"175":1},"2":{"1":3,"4":3,"66":1,"68":18,"70":14,"95":1,"106":2,"108":1,"123":1,"131":1,"136":1,"174":1,"176":2,"181":3,"204":3,"207":2,"218":3,"221":2,"297":1}}],["squeezethresholdv2",{"2":{"274":1}}],["squeezethresholdv1",{"2":{"274":1}}],["squeeze",{"2":{"274":3}}],["squinting",{"2":{"274":1}}],["slot",{"2":{"305":1}}],["slowly",{"2":{"186":1,"240":1,"300":1}}],["slightly",{"2":{"176":1,"202":1,"230":2}}],["slicer",{"2":{"153":1,"252":1}}],["slid",{"2":{"171":1}}],["slider",{"2":{"293":1,"300":2}}],["slide",{"2":{"135":2,"171":1,"172":1}}],["sliding",{"2":{"131":1,"186":1}}],["slimevr",{"2":{"78":2,"98":2,"199":1}}],["sketch",{"2":{"165":2}}],["skirt",{"2":{"230":1}}],["skills",{"2":{"158":1,"185":1,"224":1}}],["skip",{"2":{"28":1,"90":1,"97":1}}],["synced",{"2":{"304":2}}],["symbol",{"2":{"110":1}}],["symptoms",{"2":{"106":1}}],["system",{"2":{"4":1,"25":1,"44":1,"72":1}}],["sr",{"2":{"101":2,"108":2,"110":2,"111":1,"112":1,"113":1,"114":1,"115":1}}],["src",{"2":{"17":1,"18":1,"19":1,"20":1,"21":1,"25":1}}],["swap",{"2":{"101":1,"215":1}}],["switched",{"2":{"94":2}}],["switching",{"2":{"36":1}}],["switch",{"2":{"35":1,"37":1}}],["sdk",{"0":{"83":1,"84":1},"1":{"84":1},"2":{"83":1}}],["smoothstep",{"2":{"274":2}}],["smol",{"2":{"1":1,"181":1}}],["smd",{"2":{"221":2}}],["smaller",{"2":{"71":1,"133":1,"134":1,"215":1,"221":2}}],["small",{"2":{"45":1,"135":1,"171":1,"186":1,"196":1,"211":1,"212":1,"305":1}}],["s3",{"0":{"88":1},"2":{"37":7,"88":1,"202":1,"204":1,"211":2,"217":2,"234":1}}],["say",{"2":{"265":1,"301":1}}],["satisfactory",{"2":{"161":1}}],["safer",{"2":{"221":1}}],["safe",{"2":{"106":3,"118":1}}],["safety",{"0":{"101":1,"106":1,"107":1},"1":{"107":1,"108":1},"2":{"100":1,"101":6,"106":3,"107":1,"108":1,"116":1,"123":1}}],["saved",{"2":{"97":1,"304":1}}],["save",{"2":{"66":3,"97":1,"186":1,"297":1,"299":1}}],["same",{"2":{"30":1,"54":1,"56":1,"134":3,"136":2,"170":1,"176":1,"263":3}}],["said",{"2":{"28":1}}],["ssids",{"2":{"28":1}}],["ssid",{"2":{"28":6,"50":2,"68":2}}],["scene",{"2":{"304":1}}],["schematics",{"2":{"221":1}}],["scales",{"2":{"110":1}}],["scanning",{"2":{"69":1}}],["screwed",{"2":{"136":1}}],["screwing",{"2":{"134":5}}],["screws",{"0":{"134":1},"2":{"130":2,"136":2,"150":1}}],["screwdriver",{"2":{"130":2,"136":1,"147":1,"152":1}}],["screw",{"2":{"130":1,"134":6,"136":3,"147":4,"152":4}}],["screen",{"2":{"42":1}}],["scroll",{"2":{"52":1}}],["scripts",{"2":{"25":1}}],["scopes",{"2":{"25":2}}],["scope",{"2":{"25":1}}],["spot",{"2":{"301":1}}],["spots",{"2":{"106":1,"188":2}}],["speaker",{"2":{"175":1}}],["spend",{"2":{"172":1}}],["spell",{"2":{"141":1}}],["spec",{"2":{"281":1}}],["specs",{"2":{"123":1}}],["specified",{"2":{"36":1,"188":1}}],["specifically",{"2":{"99":1}}],["specific",{"0":{"140":1},"1":{"141":1},"2":{"14":1,"35":1,"140":3,"165":1,"193":1,"196":1}}],["special",{"2":{"28":2,"37":1,"50":1,"193":1,"212":1,"266":1}}],["sparkfun",{"2":{"76":1}}],["spaces",{"2":{"28":1}}],["space",{"2":{"25":1,"28":1}}],["surprised",{"2":{"274":1}}],["sure",{"0":{"166":1},"2":{"28":1,"50":1,"56":1,"60":2,"78":1,"87":1,"90":3,"96":1,"123":1,"135":1,"147":1,"152":1,"169":1,"172":1,"174":1,"185":1,"221":1,"263":1,"264":1}}],["super",{"2":{"170":1,"200":1,"206":1}}],["supplied",{"2":{"196":1}}],["supply",{"2":{"67":1}}],["support",{"0":{"105":1},"2":{"33":1,"37":1,"38":2,"39":1,"93":1,"136":1,"144":1,"146":1,"149":1,"151":1,"207":1,"211":2,"217":1,"255":1}}],["supported",{"2":{"28":2,"37":2,"48":1,"104":1,"200":1,"206":1,"242":1}}],["supports",{"2":{"20":1,"28":1,"31":1,"32":1,"33":1,"144":1,"149":1,"211":1,"212":1,"217":1,"257":1}}],["summary",{"0":{"117":1}}],["suffix",{"2":{"94":1,"95":1}}],["suggest",{"2":{"217":1}}],["suggested",{"2":{"90":1}}],["suggestions",{"2":{"66":1,"118":1}}],["successfully",{"2":{"90":1,"232":1}}],["successful",{"2":{"90":1}}],["such",{"2":{"25":1,"28":1,"106":1,"202":2,"208":2,"217":1,"229":1,"265":1}}],["submenu",{"2":{"305":1}}],["submit",{"2":{"141":1}}],["submitting",{"2":{"141":1}}],["submissions",{"2":{"140":1}}],["subdir",{"2":{"19":1}}],["sub",{"0":{"18":1},"2":{"18":1}}],["snug",{"2":{"135":1}}],["snaps",{"2":{"135":1,"186":1,"236":1,"238":1}}],["snap",{"2":{"131":1,"135":1}}],["snake",{"2":{"15":1}}],["sng",{"2":{"1":1,"181":1}}],["shutting",{"2":{"274":1}}],["sharp",{"2":{"231":1}}],["sharper",{"2":{"231":1}}],["shatter",{"2":{"214":1}}],["shape",{"2":{"197":1}}],["shield",{"0":{"170":1}}],["shipping",{"0":{"253":1},"2":{"168":1}}],["shot",{"2":{"224":1}}],["shove",{"2":{"171":1}}],["shortcut",{"2":{"284":1}}],["shorter",{"2":{"230":1}}],["shorts",{"2":{"196":2}}],["short",{"2":{"106":1,"176":1,"179":1,"217":2,"221":1}}],["shows",{"2":{"170":1,"188":1,"193":1,"194":1,"286":1,"287":1,"288":1}}],["showing",{"2":{"147":1,"152":1}}],["show",{"0":{"276":1},"2":{"46":1,"52":1,"72":1,"140":1,"156":1,"273":1,"304":1}}],["shown",{"2":{"37":1,"194":1,"197":1}}],["shouldemulateeyebrows",{"2":{"274":1}}],["shouldemulateeyesquint",{"2":{"274":1}}],["shouldemulateeyewiden",{"2":{"274":1}}],["should",{"0":{"27":1,"39":1},"2":{"15":1,"24":4,"36":2,"43":2,"44":1,"47":1,"69":1,"84":1,"88":1,"90":1,"94":1,"118":1,"133":1,"134":3,"170":1,"171":1,"182":1,"192":1,"221":1,"228":1,"234":1,"236":1,"240":3,"241":1,"242":2,"246":1,"263":1,"269":1,"271":2,"273":1,"274":11,"280":1,"281":2,"283":1,"284":2,"300":2,"305":1}}],["shyarn",{"2":{"12":1}}],["sh",{"2":{"12":1}}],["shcd",{"2":{"12":1}}],["shgit",{"2":{"12":1}}],["stuff",{"2":{"266":1,"269":1}}],["studio",{"0":{"73":1,"82":1,"173":1,"233":1,"270":1},"1":{"74":1,"75":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"41":1,"73":1,"77":1,"82":1,"89":1,"95":1,"202":1,"204":1}}],["stls",{"2":{"162":1}}],["stl",{"0":{"252":1},"2":{"127":1,"131":4,"153":1,"252":1,"253":1}}],["steamvr",{"2":{"300":1}}],["steradians",{"2":{"108":1}}],["steps",{"2":{"39":1,"78":1,"87":1,"94":2,"97":2,"98":1,"124":1,"134":1,"156":1,"174":1,"180":1,"305":1}}],["step",{"0":{"1":1,"2":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"49":1,"50":1,"51":1,"52":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"164":2,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"185":1,"283":1,"284":1,"285":1,"296":1,"301":1},"1":{"186":1,"187":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"297":1,"298":1,"299":1,"300":1},"2":{"44":1,"97":1,"100":2,"170":1,"173":1,"179":1,"237":1,"247":1,"271":2,"276":1,"300":1,"301":1}}],["stock",{"2":{"215":1}}],["stone",{"2":{"205":1}}],["stops",{"2":{"240":1}}],["stop",{"2":{"101":1}}],["stored",{"2":{"306":1}}],["store",{"2":{"35":2,"68":1,"140":1}}],["stick",{"2":{"167":1,"182":1}}],["sticking",{"2":{"87":1}}],["still",{"0":{"165":1},"2":{"32":1,"60":1,"88":1,"167":1,"171":1,"225":1}}],["stray",{"2":{"196":1}}],["strands",{"2":{"196":1}}],["strand",{"2":{"192":1,"194":1}}],["strain",{"2":{"106":1}}],["straight",{"2":{"93":1,"240":1,"301":1}}],["strictly",{"2":{"230":1}}],["strip",{"2":{"175":1,"176":1}}],["string",{"2":{"67":1}}],["stream",{"0":{"52":1},"2":{"96":1,"170":1,"174":1}}],["streaming",{"2":{"38":3,"204":1,"207":1,"212":2}}],["structure",{"0":{"14":1},"1":{"15":1},"2":{"15":1}}],["styles",{"2":{"20":1}}],["style",{"0":{"20":1,"25":1},"2":{"20":3,"24":1,"25":4}}],["stays",{"2":{"101":1}}],["stash",{"2":{"97":2}}],["stands",{"2":{"92":1,"192":2}}],["standard",{"0":{"65":1,"253":1},"2":{"25":3,"65":1}}],["standards",{"0":{"15":1,"22":1,"23":1},"1":{"23":1,"24":2,"25":2},"2":{"22":2,"101":1,"107":1}}],["state",{"2":{"97":1,"305":1}}],["status",{"2":{"39":1,"66":1,"166":1}}],["static",{"2":{"24":1,"54":1}}],["sta",{"2":{"28":2}}],["starting",{"2":{"36":1,"100":1,"204":1,"207":1,"279":1,"285":1}}],["start",{"0":{"119":1,"120":1},"1":{"120":1,"121":2,"122":2,"123":2,"124":2,"125":2},"2":{"12":1,"19":1,"133":2,"194":1,"207":1,"262":1,"294":1,"300":1}}],["started",{"0":{"10":1,"100":1},"1":{"11":1,"12":1},"2":{"19":3,"157":1}}],["separate",{"0":{"263":1},"2":{"211":3,"212":2,"252":1}}],["separately",{"2":{"39":1}}],["sequence",{"2":{"194":1}}],["search",{"2":{"157":1,"273":1}}],["selects",{"2":{"300":1}}],["selecting",{"2":{"78":1}}],["selected",{"2":{"44":1,"49":1,"50":1}}],["select",{"0":{"44":1,"49":1},"2":{"44":1,"45":1,"84":1,"94":3,"95":1,"215":1,"216":2,"217":1,"262":2,"263":1,"304":1,"305":1}}],["sent",{"2":{"307":1}}],["sensor",{"2":{"230":2}}],["sensors",{"2":{"225":1}}],["sensitive",{"2":{"116":1,"202":1}}],["sense",{"0":{"233":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"37":2,"41":1,"202":1,"204":2,"207":1,"211":1,"241":1}}],["sends",{"2":{"90":1}}],["sending",{"0":{"263":1},"2":{"52":1,"99":1,"141":1,"262":1}}],["send",{"0":{"51":1},"2":{"32":1,"51":1,"89":1,"162":2,"257":1}}],["several",{"2":{"37":1}}],["setcamera",{"2":{"66":1}}],["setdevice",{"0":{"69":1},"2":{"66":1}}],["sets",{"2":{"66":3}}],["settxpower",{"0":{"70":1},"2":{"66":1}}],["setting",{"0":{"72":1,"262":1,"300":1,"302":1,"303":1},"1":{"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"303":1,"304":2,"305":2,"306":1,"307":1},"2":{"28":1,"56":1,"173":1}}],["settings",{"0":{"252":1,"264":1,"285":1},"1":{"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"28":1,"39":1,"66":2,"67":1,"101":1,"262":2,"263":2,"264":3,"265":2,"286":1,"287":1,"288":1,"307":1}}],["setups",{"2":{"202":1,"208":1}}],["setup",{"0":{"200":1,"206":1},"1":{"207":1,"208":1},"2":{"36":1,"44":1,"100":1,"102":1,"126":1,"129":1,"140":1,"147":1,"152":1,"196":1,"202":1,"208":1,"209":1,"229":2,"236":1,"237":1,"242":1,"254":1,"255":1,"257":2,"261":1,"263":1,"271":1,"283":1}}],["set",{"0":{"254":1,"258":1},"1":{"255":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1},"2":{"28":5,"31":6,"41":1,"46":1,"56":1,"67":1,"69":1,"70":1,"87":1,"88":1,"96":1,"147":1,"152":1,"173":1,"205":1,"237":1,"242":1,"246":1,"248":1,"263":1,"269":1,"300":1,"302":1}}],["semi",{"2":{"25":1,"238":1}}],["semantic",{"2":{"25":1}}],["seems",{"2":{"167":1}}],["seeed",{"0":{"233":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"41":1,"202":1,"204":1}}],["seedstudio",{"2":{"37":2,"211":1}}],["see",{"0":{"27":1,"154":1},"2":{"16":1,"36":1,"43":1,"84":1,"94":1,"101":1,"102":1,"104":1,"171":1,"212":1,"240":1,"247":1,"263":1,"284":1,"300":4,"305":1}}],["secure",{"2":{"185":1}}],["sections",{"2":{"82":1}}],["section",{"2":{"16":1,"56":1,"82":1,"84":1,"90":1,"97":1,"185":1,"262":1,"263":1,"265":1,"304":1,"305":3}}],["seconds",{"2":{"107":1,"133":1}}],["second",{"2":{"4":1,"38":1,"170":1,"192":1,"274":4}}],["serial",{"0":{"201":1,"208":1},"1":{"202":1},"2":{"95":1,"96":1,"247":1}}],["series",{"2":{"1":1,"181":1}}],["services",{"2":{"162":1}}],["service",{"0":{"250":1},"1":{"251":1,"252":1,"253":1},"2":{"69":4}}],["server",{"2":{"12":1,"105":1}}],["silver",{"2":{"175":1}}],["sits",{"2":{"133":1}}],["site",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"9":1,"12":1,"20":2,"24":3}}],["size",{"2":{"130":3,"176":1,"211":1,"217":1}}],["similar",{"2":{"94":1,"162":1}}],["similarly",{"2":{"28":1,"266":1}}],["simple",{"2":{"87":1,"156":1,"172":1,"274":1}}],["simply",{"0":{"256":1},"1":{"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1},"2":{"81":1,"129":1,"170":1,"264":1,"274":1,"305":1,"306":1}}],["signal",{"2":{"170":1}}],["significantly",{"2":{"138":1,"229":1}}],["sign",{"2":{"68":1,"70":1}}],["sidebar",{"0":{"19":1},"2":{"19":4,"82":1,"84":1}}],["side",{"0":{"27":1},"2":{"1":2,"2":1,"3":1,"82":1,"84":1,"133":2,"134":1,"153":1,"181":2,"197":1,"230":4,"240":1}}],["single",{"2":{"1":1,"111":2,"112":2,"114":2,"115":2,"181":1,"196":1,"197":2}}],["since",{"2":{"1":1,"56":1,"94":1,"181":1,"273":1}}],["social",{"2":{"99":1}}],["socket",{"2":{"87":1}}],["sourced",{"2":{"104":1}}],["sources",{"2":{"101":1,"107":1}}],["source",{"0":{"221":1,"267":1,"268":1,"269":1,"275":1,"276":1},"1":{"268":1,"269":1,"270":1,"271":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1},"2":{"99":1,"102":1,"268":1,"269":1,"270":1,"276":1}}],["sound",{"2":{"88":1}}],["soon",{"2":{"93":1}}],["software",{"0":{"121":1,"246":1,"296":1},"1":{"247":1,"248":1,"297":1,"298":1,"299":1,"300":1},"2":{"90":1,"96":1,"263":1,"301":1}}],["solve",{"2":{"170":3}}],["solid",{"2":{"108":1,"117":1}}],["solution",{"2":{"39":1,"170":1,"224":1}}],["soldered",{"2":{"221":1}}],["solderless",{"2":{"165":2}}],["soldering",{"2":{"3":1,"130":1,"133":1,"172":1,"182":1,"196":1,"202":1,"208":1,"212":1,"218":1,"220":1,"223":1}}],["solder",{"0":{"1":1,"2":1,"3":1,"178":1,"179":1,"181":1,"182":1,"183":1},"2":{"1":1,"2":2,"3":2,"138":1,"165":1,"170":1,"177":1,"178":1,"181":1,"182":4,"183":2,"196":2,"197":2,"220":5,"221":1,"223":2}}],["so",{"2":{"20":1,"32":1,"35":1,"36":1,"48":1,"62":1,"87":1,"94":1,"95":1,"97":2,"101":1,"133":2,"134":1,"147":1,"152":1,"156":1,"185":1,"194":1,"196":1,"214":2,"215":1,"217":1,"224":2,"225":1,"229":1,"230":2,"238":1,"240":1,"246":1,"257":1,"265":2,"266":1,"269":1,"301":1}}],["sometimes",{"2":{"79":1,"134":1,"266":1,"306":1}}],["something",{"0":{"27":1,"264":1},"2":{"106":1,"221":1,"265":1,"300":1}}],["some",{"2":{"1":1,"25":1,"30":1,"32":1,"36":1,"37":1,"44":1,"76":1,"78":1,"79":1,"87":1,"90":1,"98":1,"113":1,"153":1,"156":2,"170":2,"181":1,"185":1,"188":1,"205":1,"212":1,"217":1,"218":1,"222":2,"225":1,"266":1,"269":1,"285":1}}],["s",{"0":{"46":1,"128":1,"137":1,"143":1,"148":1,"157":1,"234":1,"265":1,"273":2},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"144":1,"145":1,"146":1,"147":1,"149":1,"150":1,"151":1,"152":1},"2":{"1":1,"25":2,"37":2,"44":1,"45":1,"64":1,"76":1,"79":1,"84":1,"87":1,"100":1,"101":1,"103":1,"107":1,"118":1,"127":4,"129":1,"131":1,"134":1,"135":1,"138":1,"140":1,"143":1,"146":1,"148":1,"151":1,"157":1,"159":1,"160":1,"165":1,"166":1,"170":1,"172":2,"179":1,"181":1,"194":1,"197":1,"199":1,"200":1,"206":1,"214":1,"215":1,"216":2,"217":1,"225":1,"228":1,"242":1,"261":1,"263":3,"264":1,"265":5,"266":1,"269":1,"271":1,"273":2,"285":1,"297":1,"299":1,"300":1,"302":1,"304":2,"305":3,"306":2}}]],"serializationVersion":2}`;export{e as default}; diff --git a/assets/chunks/@localSearchIndexroot.42785e48.js b/assets/chunks/@localSearchIndexroot.42785e48.js deleted file mode 100644 index 91127e3..0000000 --- a/assets/chunks/@localSearchIndexroot.42785e48.js +++ /dev/null @@ -1 +0,0 @@ -const e=`{"documentCount":308,"nextId":308,"documentIds":{"0":"/archive/fox_ir_v2_build_instructions#fox-ir-v2-buil-dinstructions","1":"/archive/fox_ir_v2_build_instructions#step-15-prepare-to-solder-ir-led-pcb-v2s","2":"/archive/fox_ir_v2_build_instructions#step-17-solder-resistors-on-pcb-v2","3":"/archive/fox_ir_v2_build_instructions#solder-leds-on-pcb-v2","4":"/archive/fox_ir_v2_build_instructions#wire-up-the-pcbs-v2","5":"/dev_roadmap#eyetrackvr-development-roadmap","6":"/dev_roadmap#completed","7":"/dev_roadmap#in-progress","8":"/dev_roadmap#planned","9":"/development/docs/dev_docs#development-documentation-for-the-eyetrackvr-docs-site","10":"/development/docs/dev_docs#getting-started","11":"/development/docs/dev_docs#prerequisites","12":"/development/docs/dev_docs#installation","13":"/development/docs/dev_docs#contributing","14":"/development/docs/dev_docs#project-structure","15":"/development/docs/dev_docs#standards","16":"/development/docs/pages#pages","17":"/development/docs/pages#adding-a-page","18":"/development/docs/pages#sub-directories","19":"/development/docs/pages#adding-a-page-to-the-sidebar","20":"/development/docs/pages#title-style","21":"/development/docs/pages#editing-a-page","22":"/development/docs/standards#standards-guide","23":"/development/docs/standards#code-standards","24":"/development/docs/standards#general","25":"/development/docs/standards#git-commit-style","26":"/firmware_guide/configure_firmware#configuring-the-firmware","27":"/firmware_guide/configure_firmware#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","28":"/firmware_guide/configure_firmware#open-the-ini-user-config-ini-file","29":"/firmware_guide/configure_firmware#additional-configuration","30":"/firmware_guide/configure_firmware#mdns","31":"/firmware_guide/configure_firmware#ota","32":"/firmware_guide/configure_firmware#rest-api","33":"/firmware_guide/configure_firmware#environments","34":"/firmware_guide/environments#firmware-environments","35":"/firmware_guide/environments#what-is-it","36":"/firmware_guide/environments#build-types","37":"/firmware_guide/environments#board-types","38":"/firmware_guide/firmware#what-is-this","39":"/firmware_guide/firmware#what-should-i-download-and-where","40":"/firmware_guide/flashing_tool#firmware-flashing-tool","41":"/firmware_guide/flashing_tool#before-we-proceed","42":"/firmware_guide/flashing_tool#step-1-download-and-install-the-firmware-flashing-tool","43":"/firmware_guide/flashing_tool#step-2-run-the-firmware-flashing-tool-app","44":"/firmware_guide/flashing_tool#step-3-select-board","45":"/firmware_guide/flashing_tool#step-4-flash-firmware","46":"/firmware_guide/flashing_tool#step-5-that-s-it","47":"/firmware_guide/flashing_tool#step-6-logs","48":"/firmware_guide/flashing_tool#how-to-configure-wifi","49":"/firmware_guide/flashing_tool#step-1-select-board","50":"/firmware_guide/flashing_tool#step-2-configure-wifi-network","51":"/firmware_guide/flashing_tool#step-3-send-wifi-credentials","52":"/firmware_guide/flashing_tool#step-4-get-working-stream","53":"/firmware_guide/mdns#mdns","54":"/firmware_guide/mdns#what-is-it","55":"/firmware_guide/mdns#how-to-use-it","56":"/firmware_guide/mdns#enable-mdns","57":"/firmware_guide/mdns#connect-to-the-device","58":"/firmware_guide/mdns#prerequisites-bonjour","59":"/firmware_guide/mdns#troubleshooting","60":"/firmware_guide/mdns#can-not-connect-to-the-device","61":"/firmware_guide/rest_api#rest-api","62":"/firmware_guide/rest_api#what-is-it","63":"/firmware_guide/rest_api#how-to-use-it","64":"/firmware_guide/rest_api#rest-api-client","65":"/firmware_guide/rest_api#standard","66":"/firmware_guide/rest_api#endpoints","67":"/firmware_guide/rest_api#params","68":"/firmware_guide/rest_api#wifi","69":"/firmware_guide/rest_api#setdevice","70":"/firmware_guide/rest_api#settxpower","71":"/firmware_guide/rest_api#camera-params","72":"/firmware_guide/setup_vscode#setting-up-the-environment","73":"/firmware_guide/setup_vscode#_1-install-visual-studio-code","74":"/firmware_guide/setup_vscode#download","75":"/firmware_guide/setup_vscode#install","76":"/firmware_guide/setup_vscode#_2-install-the-drivers","77":"/firmware_guide/setup_vscode#_3-install-platformio-ide","78":"/firmware_guide/setup_vscode#_4-clone-the-firmware-project","79":"/firmware_guide/update_platformio#updating-platformio","80":"/firmware_guide/update_platformio#updating-platformio-itself","81":"/firmware_guide/update_platformio#via-cli","82":"/firmware_guide/update_platformio#via-platformio-in-visual-studio-code","83":"/firmware_guide/update_platformio#upgrading-the-sdk","84":"/firmware_guide/update_platformio#upgrading-the-sdk-via-vsc","85":"/firmware_guide/upload_and_update_firmware#building-and-uploading-the-firmware-manually","86":"/firmware_guide/upload_and_update_firmware#_1-connect-your-tracker-to-your-pc","87":"/firmware_guide/upload_and_update_firmware#option-1-connect-esp32-cam-via-the-programmer","88":"/firmware_guide/upload_and_update_firmware#option-2-connect-esp32-s3-via-usb-c-directly","89":"/firmware_guide/upload_and_update_firmware#_2-build-your-firmware","90":"/firmware_guide/upload_and_update_firmware#_3-upload-your-firmware","91":"/firmware_guide/upload_and_update_firmware#uploading-via-ota","92":"/firmware_guide/upload_and_update_firmware#what-is-it","93":"/firmware_guide/upload_and_update_firmware#how-do-i-use-it","94":"/firmware_guide/upload_and_update_firmware#for-firmware-versions-1-1-0-and-up","95":"/firmware_guide/upload_and_update_firmware#for-firmware-versions-of-1-0-0-and-under","96":"/firmware_guide/upload_and_update_firmware#finding-the-ip-address-of-your-tracker","97":"/firmware_guide/upload_and_update_firmware#updating-the-firmware-to-the-newest-version","98":"/firmware_guide/upload_and_update_firmware#troubleshooting","99":"/getting_started/intro#eyetrackvr","100":"/getting_started/intro#get-started","101":"/getting_started/intro#eye-safety-notice","102":"/getting_started/intro#hardware-overview","103":"/getting_started/intro#firmware","104":"/getting_started/intro#headset-compatibility","105":"/getting_started/intro#community-support","106":"/getting_started/led_safety#near‐eye-infrared-ir-emitter-safety","107":"/getting_started/led_safety#relevant-safety-limits","108":"/getting_started/led_safety#why-current-ma-isn-t-enough","109":"/getting_started/led_safety#hardware-exposure-calculations","110":"/getting_started/led_safety#led-xl‐3216hirc‐850","111":"/getting_started/led_safety#v3-module-2-leds-3-2-ma-each","112":"/getting_started/led_safety#v4-module-4-leds-2-4-ma-each","113":"/getting_started/led_safety#worst-case-high-bin-calculations","114":"/getting_started/led_safety#v3-max-bin-2-leds-3-2-ma","115":"/getting_started/led_safety#v4-max-bin-4-leds-2-4-ma","116":"/getting_started/led_safety#your-responsibilities","117":"/getting_started/led_safety#appendix-a-–-formula-summary","118":"/getting_started/led_safety#appendix-b-–-quoted-guideline-icnirp-2013","119":"/getting_started/things_to_know#things-to-know-before-you-start","120":"/getting_started/things_to_know#this-page-is-an-overview-of-things-to-know-and-understand-before-you-start-this-project","121":"/getting_started/things_to_know#software-is-not-final","122":"/getting_started/things_to_know#firmware-may-have-user-difficulties","123":"/getting_started/things_to_know#ir-emitters-can-be-dangerous","124":"/getting_started/things_to_know#documentation-may-be-incomplete","125":"/getting_started/things_to_know#once-you-have-acknowledged-the-items-above-move-on-to-the-full-build-guide","126":"/headset_guides/valve_index#valve-index","127":"/headset_guides/valve_index#recommended-valve-index-lens-mounts","128":"/headset_guides/valve_index#mutethecyberwolf-s-dev-frunk-mod","129":"/headset_guides/valve_index#mod-details","130":"/headset_guides/valve_index#extra-parts-needed","131":"/headset_guides/valve_index#_3d-printed-mounts","132":"/headset_guides/valve_index#assembly-details","133":"/headset_guides/valve_index#_1-heat-inserts","134":"/headset_guides/valve_index#_2-screws","135":"/headset_guides/valve_index#_3-mounting-components","136":"/headset_guides/valve_index#_4-replacing-frunk","137":"/headset_guides/valve_index#physics-dude-s-gumstick-usb-hub-dongle","138":"/headset_guides/valve_index#mod-details-1","139":"/headset_guides/valve_index#installation-instructions-and-bom-available-on-physics-dude-s-repo","140":"/headset_guides/what_is_this#what-are-headset-specific-guides","141":"/headset_guides/what_is_this#guidelines","142":"/headset_guides/what_is_this#headset-name","143":"/headset_guides/what_is_this#xyz-s-mod","144":"/headset_guides/what_is_this#mod-details","145":"/headset_guides/what_is_this#extra-parts-needed","146":"/headset_guides/what_is_this#_3d-printed-mounts","147":"/headset_guides/what_is_this#assembly-details","148":"/headset_guides/what_is_this#abc-s-mod","149":"/headset_guides/what_is_this#mod-details-1","150":"/headset_guides/what_is_this#extra-parts-needed-1","151":"/headset_guides/what_is_this#_3d-printed-mounts-1","152":"/headset_guides/what_is_this#assembly-details-1","153":"/how_to_build/3d_printed_mounts#_3d-printed-mounts","154":"/how_to_build/3d_printed_mounts#dont-see-your-headset","155":"/how_to_build/creating_your_own_mount#creating-your-own-mount","156":"/how_to_build/creating_your_own_mount#this-page-will-include-a-basic-rundown-on-how-to-create-your-own-camera-mount-for-a-headset-that-may-not-have-any-existing-community-mounts","157":"/how_to_build/creating_your_own_mount#step-1-find-a-way-to-mount-to-your-headset-s-lens","158":"/how_to_build/creating_your_own_mount#step-2-find-a-camera-mount","159":"/how_to_build/creating_your_own_mount#step-3-place-the-camera-mount-where-it-will-give-a-good-camera-angle","160":"/how_to_build/creating_your_own_mount#step-4-mount-your-leds","161":"/how_to_build/creating_your_own_mount#step-5-test-everything","162":"/how_to_build/creating_your_own_mount#step-6-get-your-mounts-listed","163":"/how_to_build/full_build#v3-build-guide","164":"/how_to_build/full_build#this-page-will-contain-a-step-by-step-assembly-guide","165":"/how_to_build/full_build#updated-documentation-for-v4-is-still-in-progress-and-not-updated-here-please-be-patient","166":"/how_to_build/full_build#step-1-make-sure-your-have-read-the-things-to-know-before-you-start-guide","167":"/how_to_build/full_build#step-2-order-all-the-parts-listed-on-our-parts-list","168":"/how_to_build/full_build#step-3-wait-for-things-to-arrive","169":"/how_to_build/full_build#step-4-gather-up-all-of-your-hardware","170":"/how_to_build/full_build#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","171":"/how_to_build/full_build#step-6-attach-cameras-to-esps","172":"/how_to_build/full_build#step-7-connect-esp-to-the-programmer-to-flash","173":"/how_to_build/full_build#step-8-configure-visual-studio-code-and-prepare-to-flash-the-firmware","174":"/how_to_build/full_build#step-9-plug-in-your-esp-and-flash-the-firmware","175":"/how_to_build/full_build#step-10-connect-your-power-wires-to-a-usb-type-a-board","176":"/how_to_build/full_build#step-11-cut-wires-for-ir-leds","177":"/how_to_build/full_build#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","178":"/how_to_build/full_build#step-13-solder-the-positive-wire-to-esp","179":"/how_to_build/full_build#step-14-solder-the-negative-wire-to-esp","180":"/how_to_build/full_build#step-15-wire-up-the-2nd-esp","181":"/how_to_build/full_build#step-16-prepare-to-solder-ir-led-pcbs","182":"/how_to_build/full_build#step-18-solder-resistors-on-pcb-v3","183":"/how_to_build/full_build#solder-leds-on-pcb-v3","184":"/how_to_build/full_build#wire-up-the-pcbs-v3","185":"/how_to_build/full_build#step-19-3d-print-mounts","186":"/how_to_build/full_build#type-1","187":"/how_to_build/full_build#type-2","188":"/how_to_build/full_build#ir-led-mounting","189":"/how_to_build/led_setup#how-to-assemble-a-v4-mini-led-hardware-kit","190":"/how_to_build/led_setup#getting-to-know-your-hardware","191":"/how_to_build/led_setup#mainboard","192":"/how_to_build/led_setup#leds","193":"/how_to_build/led_setup#wires","194":"/how_to_build/led_setup#wiring-up-v4-mini","195":"/how_to_build/led_setup#how-to-assemble-v4-lite-led-kit","196":"/how_to_build/led_setup#getting-to-know-v4-lite","197":"/how_to_build/led_setup#wiring-up-v4-lite","198":"/how_to_build/part_list#required-parts","199":"/how_to_build/part_list#additional-parts","200":"/how_to_build/part_list#esp-setup-options","201":"/how_to_build/part_list#option-1-wired-over-usb-serial","202":"/how_to_build/part_list#wired-capable-esps","203":"/how_to_build/part_list#option-2-wireless-over-wifi-2-4-ghz","204":"/how_to_build/part_list#wireless-capable-esps","205":"/how_to_build/parts_list#parts-list","206":"/how_to_build/parts_list#esp-setup-options","207":"/how_to_build/parts_list#option-1-wireless-over-wifi-2-4-ghz","208":"/how_to_build/parts_list#option-2-wired-over-usb-serial-in-beta","209":"/how_to_build/parts_list#required-parts","210":"/how_to_build/parts_list#tracker-boards","211":"/how_to_build/parts_list#recommended","212":"/how_to_build/parts_list#a-cheaper-wireless-only-alternative","213":"/how_to_build/parts_list#cameras","214":"/how_to_build/parts_list#camera-modules","215":"/how_to_build/parts_list#_2x-ov2640-160°-fov-ir-night-vers-75mm-850nm","216":"/how_to_build/parts_list#optional-ribbon-extensions","217":"/how_to_build/parts_list#usb-hubs-for-if-you-are-building-the-wired-version","218":"/how_to_build/parts_list#wires-and-adapters","219":"/how_to_build/parts_list#ir-emitters","220":"/how_to_build/parts_list#recommended-1","221":"/how_to_build/parts_list#alternatively-you-can-source-the-parts-for-v3-yourself","222":"/how_to_build/parts_list#_3d-printed-mounts","223":"/how_to_build/parts_list#misc-parts-tools","224":"/how_to_build/parts_list#other-headsets","225":"/how_to_build/preparing_cameras#ir-filter-removal","226":"/how_to_build/preparing_cameras#_130°-ir-filter-removal","227":"/how_to_build/preparing_cameras#_160°-ir-filter-removal","228":"/how_to_build/preparing_cameras#blurry-camera","229":"/how_to_build/preparing_cameras#protecting-a-camera-ribbon-cable","230":"/how_to_build/preparing_cameras#wrapping-the-camera-ribbon","231":"/how_to_build/preparing_cameras#best-practices-when-handling-cameras","232":"/how_to_build/preparing_cameras#conclusion","233":"/how_to_build/preparing_xiao#how-to-prepare-a-seeed-studio-xiao-sense-esp32","234":"/how_to_build/preparing_xiao#what-s-in-the-box","235":"/how_to_build/preparing_xiao#wired-vs-wireless","236":"/how_to_build/preparing_xiao#wireless-configuration","237":"/how_to_build/preparing_xiao#wired-configuration","238":"/how_to_build/preparing_xiao#connecting-the-camera-hat","239":"/how_to_build/preparing_xiao#removing-the-camera","240":"/how_to_build/preparing_xiao#connecting-the-camera","241":"/how_to_build/preparing_xiao#conclusion","242":"/how_to_build/v4_full_build#v4-build-guide-wip","243":"/how_to_build/v4_full_build#prepare-you-hardware","244":"/how_to_build/v4_full_build#prepare-and-assemble-the-3d-printed-mounts","245":"/how_to_build/v4_full_build#wiring-it-up","246":"/how_to_build/v4_full_build#software","247":"/how_to_build/v4_full_build#wired","248":"/how_to_build/v4_full_build#wireless","249":"/misc/faq#frequently-asked-questions","250":"/misc/jlc3dp#_3d-printing-service-jlc3dp","251":"/misc/jlc3dp#if-you-don-t-own-a-3d-printer-you-can-order-high-quality-prints-by-the-dollar-using-jlc3dp","252":"/misc/jlc3dp#upload-your-stl-files-with-the-following-print-settings","253":"/misc/jlc3dp#choose-a-cheaper-shipping-option-for-me-this-is-global-standard-direct-line","254":"/misc/vrc_avatar_setup#how-to-set-up-your-avatar-for-eye-tracking","255":"/misc/vrc_avatar_setup#we-currently-use-the-following-paramaters","256":"/software_guide/VRCFT_tracking_module#vrcft-etvr-tracking-module-or-simply-the-etvr-tracking-module","257":"/software_guide/VRCFT_tracking_module#what-is-this","258":"/software_guide/VRCFT_tracking_module#what-do-i-need-and-how-do-i-set-this-up","259":"/software_guide/VRCFT_tracking_module#required-programs-files","260":"/software_guide/VRCFT_tracking_module#vrcft","261":"/software_guide/VRCFT_tracking_module#etvr-module","262":"/software_guide/VRCFT_tracking_module#setting-up-etvr-to-use-the-module","263":"/software_guide/VRCFT_tracking_module#sending-the-tracking-data-to-vrcft-running-on-a-separate-pc","264":"/software_guide/VRCFT_tracking_module#reseting-the-module-to-default-settings-in-case-something-went-wrong","265":"/software_guide/VRCFT_tracking_module#there-s-a-breaking-change-reported-what-does-that-mean-what-do-i-do","266":"/software_guide/VRCFT_tracking_module#dev-version-of-the-module-for-testing","267":"/software_guide/VRCFT_tracking_module#building-from-source","268":"/software_guide/VRCFT_tracking_module#download-the-etvr-module-source-from-github","269":"/software_guide/VRCFT_tracking_module#donwload-the-latest-vrcft-source","270":"/software_guide/VRCFT_tracking_module#install-visual-studio-or-jetbrains-rider-and-open-the-project","271":"/software_guide/VRCFT_tracking_module#building-the-module","272":"/software_guide/VRCFT_tracking_module#faq","273":"/software_guide/VRCFT_tracking_module#where-s-the-module-s-configuration-file","274":"/software_guide/VRCFT_tracking_module#what-do-the-fields-in-this-file-mean","275":"/software_guide/build_software#build-the-app-from-source","276":"/software_guide/build_software#this-guide-will-show-how-to-build-the-app-from-source","277":"/software_guide/build_software#requirements","278":"/software_guide/build_software#install-python","279":"/software_guide/build_software#installing-poetry","280":"/software_guide/build_software#install-the-required-python-modules","281":"/software_guide/build_software#build-the-app","282":"/software_guide/eyetrackvr_app_guide#how-to-install-run-and-adjust-the-eyetrackvr-app","283":"/software_guide/eyetrackvr_app_guide#step-1-download-the-eyetrackvr-installer-and-install-the-eyetrackvr-app","284":"/software_guide/eyetrackvr_app_guide#step-2-run-the-eyetrackvr-app","285":"/software_guide/eyetrackvr_app_guide#step-3-getting-familiar-with-settings-and-terminology","286":"/software_guide/eyetrackvr_app_guide#right-eye","287":"/software_guide/eyetrackvr_app_guide#left-eye","288":"/software_guide/eyetrackvr_app_guide#both-eyes","289":"/software_guide/eyetrackvr_app_guide#camera-address","290":"/software_guide/eyetrackvr_app_guide#tracking-mode","291":"/software_guide/eyetrackvr_app_guide#cropping-mode","292":"/software_guide/eyetrackvr_app_guide#threshold","293":"/software_guide/eyetrackvr_app_guide#rotation","294":"/software_guide/eyetrackvr_app_guide#restart-calibration","295":"/software_guide/eyetrackvr_app_guide#recenter-eye","296":"/software_guide/eyetrackvr_app_guide#step-4-adding-your-cameras-to-the-software-and-configuring-them","297":"/software_guide/eyetrackvr_app_guide#wireless-configuration","298":"/software_guide/eyetrackvr_app_guide#wired-configuration-experimental","299":"/software_guide/eyetrackvr_app_guide#note-this-is-a-beta-app-feature-only-please-use-the-latest-open-beta-in-the-discord","300":"/software_guide/eyetrackvr_app_guide#setting-up-roi","301":"/software_guide/eyetrackvr_app_guide#step-5-calibrating-your-eyes","302":"/software_guide/osc_setup#setting-up-recalibration-and-recentering-from-vrchat","303":"/software_guide/osc_setup#setting-up-your-parameters","304":"/software_guide/osc_setup#adding-parameters","305":"/software_guide/osc_setup#adding-buttons-to-the-menu","306":"/software_guide/osc_setup#resetting-the-osc-config-in-case-the-parameters-don-t-work","307":"/software_guide/osc_setup#other-platforms"},"fieldIds":{"title":0,"titles":1,"text":2},"fieldLength":{"0":[5,1,1],"1":[9,5,86],"2":[7,5,28],"3":[5,5,31],"4":[5,5,45],"5":[3,1,15],"6":[1,3,1],"7":[2,3,1],"8":[1,3,1],"9":[7,1,13],"10":[2,7,1],"11":[1,9,19],"12":[1,9,32],"13":[1,7,1],"14":[2,8,15],"15":[1,10,41],"16":[1,1,33],"17":[3,1,34],"18":[2,4,37],"19":[6,4,63],"20":[2,4,96],"21":[3,1,18],"22":[2,1,19],"23":[2,2,1],"24":[1,3,43],"25":[3,3,160],"26":[3,1,1],"27":[14,3,1],"28":[6,3,126],"29":[2,8,1],"30":[1,10,50],"31":[1,10,67],"32":[2,10,68],"33":[1,10,44],"34":[2,1,1],"35":[4,2,55],"36":[2,2,81],"37":[2,2,113],"38":[4,1,41],"39":[7,4,89],"40":[3,1,1],"41":[3,3,32],"42":[9,6,23],"43":[8,6,30],"44":[5,6,92],"45":[5,6,36],"46":[6,6,17],"47":[4,6,26],"48":[5,3,23],"49":[4,8,13],"50":[5,8,34],"51":[6,8,22],"52":[6,8,43],"53":[1,1,1],"54":[4,1,45],"55":[4,1,1],"56":[2,5,70],"57":[4,5,22],"58":[2,1,33],"59":[1,1,1],"60":[6,2,22],"61":[2,1,1],"62":[4,2,41],"63":[4,2,1],"64":[3,6,39],"65":[1,6,36],"66":[1,6,118],"67":[1,6,54],"68":[2,7,106],"69":[2,7,40],"70":[2,7,57],"71":[2,6,46],"72":[4,1,15],"73":[5,4,10],"74":[1,9,1],"75":[1,9,1],"76":[4,4,29],"77":[4,4,28],"78":[5,4,110],"79":[2,1,46],"80":[3,2,10],"81":[2,4,29],"82":[6,4,53],"83":[3,2,13],"84":[5,5,65],"85":[6,1,27],"86":[6,6,1],"87":[8,12,69],"88":[9,12,52],"89":[4,6,22],"90":[4,6,105],"91":[3,6,1],"92":[4,9,21],"93":[6,9,52],"94":[8,15,134],"95":[9,15,125],"96":[7,6,69],"97":[6,1,83],"98":[1,6,40],"99":[1,1,56],"100":[2,1,58],"101":[3,1,124],"102":[2,1,16],"103":[1,1,21],"104":[2,1,40],"105":[3,1,18],"106":[6,1,146],"107":[3,7,84],"108":[6,7,65],"109":[3,1,1],"110":[4,4,38],"111":[8,4,26],"112":[8,4,26],"113":[5,4,21],"114":[8,8,27],"115":[8,8,27],"116":[2,1,51],"117":[4,1,25],"118":[7,1,74],"119":[6,1,1],"120":[16,6,1],"121":[4,22,29],"122":[5,22,15],"123":[5,22,54],"124":[4,22,33],"125":[10,22,1],"126":[2,1,34],"127":[5,3,37],"128":[6,2,1],"129":[2,10,68],"130":[4,10,43],"131":[3,10,66],"132":[3,8,1],"133":[3,10,82],"134":[2,10,111],"135":[3,10,67],"136":[3,10,90],"137":[7,2,1],"138":[2,12,27],"139":[6,9,1],"140":[7,1,62],"141":[1,7,53],"142":[2,1,1],"143":[4,2,7],"144":[2,6,21],"145":[4,6,28],"146":[3,6,38],"147":[3,6,46],"148":[4,2,7],"149":[2,6,21],"150":[4,6,31],"151":[3,6,38],"152":[3,6,46],"153":[3,1,47],"154":[5,3,20],"155":[4,1,1],"156":[25,4,29],"157":[11,4,43],"158":[6,4,31],"159":[13,4,46],"160":[5,4,28],"161":[4,4,24],"162":[6,4,25],"163":[3,1,1],"164":[10,3,1],"165":[16,3,53],"166":[8,3,18],"167":[9,3,25],"168":[7,3,20],"169":[8,3,9],"170":[13,3,123],"171":[6,3,69],"172":[8,3,35],"173":[12,3,18],"174":[10,3,35],"175":[12,3,67],"176":[7,3,59],"177":[14,3,15],"178":[8,3,12],"179":[8,3,48],"180":[7,3,9],"181":[8,3,87],"182":[7,3,65],"183":[5,3,18],"184":[5,3,28],"185":[5,3,84],"186":[2,8,59],"187":[2,8,19],"188":[3,3,49],"189":[10,1,1],"190":[5,10,16],"191":[1,12,11],"192":[1,12,47],"193":[1,12,39],"194":[4,10,53],"195":[8,1,1],"196":[5,8,88],"197":[4,8,57],"198":[3,1,1],"199":[3,1,16],"200":[4,3,32],"201":[6,3,1],"202":[4,8,93],"203":[7,3,1],"204":[4,9,88],"205":[2,1,48],"206":[4,2,32],"207":[8,6,81],"208":[9,6,58],"209":[2,2,12],"210":[3,4,1],"211":[1,7,46],"212":[6,7,77],"213":[1,4,1],"214":[3,5,51],"215":[10,5,97],"216":[4,5,56],"217":[10,4,120],"218":[3,4,46],"219":[2,4,1],"220":[2,6,28],"221":[10,6,136],"222":[3,2,41],"223":[3,2,34],"224":[2,5,69],"225":[3,1,40],"226":[4,4,1],"227":[4,4,1],"228":[3,1,71],"229":[5,1,53],"230":[4,5,104],"231":[5,5,39],"232":[1,5,18],"233":[9,1,1],"234":[5,9,20],"235":[3,9,19],"236":[2,9,33],"237":[2,9,22],"238":[4,9,48],"239":[3,9,35],"240":[3,9,56],"241":[1,9,13],"242":[5,1,49],"243":[3,5,16],"244":[7,5,63],"245":[3,5,23],"246":[1,5,24],"247":[1,5,52],"248":[1,5,24],"249":[3,1,1],"250":[4,1,1],"251":[18,4,7],"252":[9,20,34],"253":[13,20,27],"254":[10,1,22],"255":[6,10,17],"256":[8,1,1],"257":[4,8,54],"258":[10,8,17],"259":[3,18,1],"260":[1,20,10],"261":[2,20,34],"262":[7,18,38],"263":[12,18,83],"264":[12,18,40],"265":[14,18,55],"266":[7,8,100],"267":[3,13,1],"268":[7,16,27],"269":[5,16,53],"270":[10,16,27],"271":[3,16,53],"272":[1,8,1],"273":[7,9,52],"274":[9,9,137],"275":[5,1,1],"276":[11,5,17],"277":[1,5,1],"278":[2,5,15],"279":[2,5,42],"280":[5,5,25],"281":[3,5,30],"282":[10,1,1],"283":[9,10,19],"284":[6,10,33],"285":[8,10,17],"286":[2,16,9],"287":[2,16,9],"288":[2,16,7],"289":[2,16,30],"290":[2,16,12],"291":[2,16,10],"292":[1,16,15],"293":[1,16,23],"294":[2,16,16],"295":[2,16,13],"296":[11,10,1],"297":[2,17,49],"298":[4,17,1],"299":[16,21,32],"300":[3,17,96],"301":[5,10,66],"302":[8,1,59],"303":[4,8,1],"304":[2,9,85],"305":[5,9,116],"306":[10,8,54],"307":[2,8,48]},"averageFieldLength":[4.759740259740255,6.288961038961039,37.620129870129865],"storedFields":{"0":{"title":"Fox IR V2 Buil dInstructions","titles":[]},"1":{"title":"Step 15: Prepare to solder IR LED PCB V2s","titles":["Fox IR V2 Buil dInstructions"]},"2":{"title":"Step 17: Solder resistors on PCB V2","titles":["Fox IR V2 Buil dInstructions"]},"3":{"title":"Solder LEDs on PCB V2","titles":["Fox IR V2 Buil dInstructions"]},"4":{"title":"Wire up the PCBs V2","titles":["Fox IR V2 Buil dInstructions"]},"5":{"title":"EyeTrackVR Development Roadmap","titles":[]},"6":{"title":"Completed","titles":["EyeTrackVR Development Roadmap"]},"7":{"title":"In Progress","titles":["EyeTrackVR Development Roadmap"]},"8":{"title":"Planned","titles":["EyeTrackVR Development Roadmap"]},"9":{"title":"Development Documentation for the EyeTrackVR Docs Site","titles":[]},"10":{"title":"Getting Started","titles":["Development Documentation for the EyeTrackVR Docs Site"]},"11":{"title":"Prerequisites","titles":["Development Documentation for the EyeTrackVR Docs Site","Getting Started"]},"12":{"title":"Installation","titles":["Development Documentation for the EyeTrackVR Docs Site","Getting Started"]},"13":{"title":"Contributing","titles":["Development Documentation for the EyeTrackVR Docs Site"]},"14":{"title":"Project Structure","titles":["Development Documentation for the EyeTrackVR Docs Site","Contributing"]},"15":{"title":"Standards","titles":["Development Documentation for the EyeTrackVR Docs Site","Contributing","Project Structure"]},"16":{"title":"Pages","titles":[]},"17":{"title":"Adding a Page","titles":["Pages"]},"18":{"title":"Sub-directories","titles":["Pages","Adding a Page"]},"19":{"title":"Adding a Page to the Sidebar","titles":["Pages","Adding a Page"]},"20":{"title":"Title Style","titles":["Pages","Adding a Page"]},"21":{"title":"Editing a Page","titles":["Pages"]},"22":{"title":"Standards Guide","titles":[]},"23":{"title":"Code Standards","titles":["Standards Guide"]},"24":{"title":"General","titles":["Standards Guide","Code Standards"]},"25":{"title":"Git Commit Style","titles":["Standards Guide","Code Standards"]},"26":{"title":"Configuring the firmware","titles":[]},"27":{"title":"Once you have opened the project, you should see something on the left side like this","titles":["Configuring the firmware"]},"28":{"title":"Open the ini/user_config.ini file","titles":["Configuring the firmware"]},"29":{"title":"Additional configuration","titles":["Configuring the firmware","Open the ini/user_config.ini file"]},"30":{"title":"mDNS","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additional configuration"]},"31":{"title":"OTA","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additional configuration"]},"32":{"title":"REST API","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additional configuration"]},"33":{"title":"Environments","titles":["Configuring the firmware","Open the ini/user_config.ini file","Additional configuration"]},"34":{"title":"Firmware Environments","titles":[]},"35":{"title":"What is it?","titles":["Firmware Environments"]},"36":{"title":"Build Types","titles":["Firmware Environments"]},"37":{"title":"Board Types","titles":["Firmware Environments"]},"38":{"title":"What is this?","titles":[]},"39":{"title":"What should I download and where?","titles":["What is this?"]},"40":{"title":"Firmware Flashing Tool","titles":[]},"41":{"title":"Before we proceed","titles":["Firmware Flashing Tool"]},"42":{"title":"Step 1: Download and Install the Firmware Flashing Tool","titles":["Firmware Flashing Tool","Before we proceed"]},"43":{"title":"Step 2: Run the Firmware Flashing Tool app","titles":["Firmware Flashing Tool","Before we proceed"]},"44":{"title":"Step 3: Select board.","titles":["Firmware Flashing Tool","Before we proceed"]},"45":{"title":"Step 4: Flash firmware.","titles":["Firmware Flashing Tool","Before we proceed"]},"46":{"title":"Step 5: That's it!.","titles":["Firmware Flashing Tool","Before we proceed"]},"47":{"title":"Step 6: Logs.","titles":["Firmware Flashing Tool","Before we proceed"]},"48":{"title":"How to configure wifi.","titles":["Firmware Flashing Tool"]},"49":{"title":"Step 1: Select board","titles":["Firmware Flashing Tool","How to configure wifi."]},"50":{"title":"Step 2: Configure wifi network","titles":["Firmware Flashing Tool","How to configure wifi."]},"51":{"title":"Step 3: Send wifi credentials.","titles":["Firmware Flashing Tool","How to configure wifi."]},"52":{"title":"Step 4: Get working stream.","titles":["Firmware Flashing Tool","How to configure wifi."]},"53":{"title":"MDNS","titles":[]},"54":{"title":"What is it?","titles":["MDNS"]},"55":{"title":"How to use it","titles":["MDNS"]},"56":{"title":"Enable mDNS","titles":["MDNS","How to use it"]},"57":{"title":"Connect to the device","titles":["MDNS","How to use it"]},"58":{"title":"Prerequisites Bonjour","titles":["MDNS"]},"59":{"title":"Troubleshooting","titles":["MDNS"]},"60":{"title":"Can not connect to the device","titles":["MDNS","Troubleshooting"]},"61":{"title":"REST API","titles":[]},"62":{"title":"What is it?","titles":["REST API"]},"63":{"title":"How to use it","titles":["REST API"]},"64":{"title":"REST API Client","titles":["REST API","How to use it"]},"65":{"title":"Standard","titles":["REST API","How to use it"]},"66":{"title":"Endpoints","titles":["REST API","How to use it"]},"67":{"title":"Params","titles":["REST API","How to use it"]},"68":{"title":"/wifi","titles":["REST API","How to use it","Params"]},"69":{"title":"/setDevice","titles":["REST API","How to use it","Params"]},"70":{"title":"/setTxPower","titles":["REST API","How to use it","Params"]},"71":{"title":"Camera Params","titles":["REST API","How to use it"]},"72":{"title":"Setting up the environment","titles":[]},"73":{"title":"1. Install Visual Studio Code","titles":["Setting up the environment"]},"74":{"title":"Download","titles":["Setting up the environment","1. Install Visual Studio Code"]},"75":{"title":"Install","titles":["Setting up the environment","1. Install Visual Studio Code"]},"76":{"title":"2. Install the drivers","titles":["Setting up the environment"]},"77":{"title":"3. Install PlatformIO IDE","titles":["Setting up the environment"]},"78":{"title":"4. Clone the firmware project","titles":["Setting up the environment"]},"79":{"title":"Updating Platformio","titles":[]},"80":{"title":"Updating PlatformIO itself","titles":["Updating Platformio"]},"81":{"title":"Via CLI","titles":["Updating Platformio","Updating PlatformIO itself"]},"82":{"title":"Via PlatformIO in Visual Studio Code","titles":["Updating Platformio","Updating PlatformIO itself"]},"83":{"title":"Upgrading the SDK","titles":["Updating Platformio"]},"84":{"title":"Upgrading the SDK via VSC","titles":["Updating Platformio","Upgrading the SDK"]},"85":{"title":"Building and uploading the firmware manually","titles":[]},"86":{"title":"1. Connect your tracker to your PC","titles":["Building and uploading the firmware manually"]},"87":{"title":"Option 1: Connect ESP32-CAM via the programmer","titles":["Building and uploading the firmware manually","1. Connect your tracker to your PC"]},"88":{"title":"Option 2: Connect ESP32-S3 via USB-C directly","titles":["Building and uploading the firmware manually","1. Connect your tracker to your PC"]},"89":{"title":"2. Build your firmware","titles":["Building and uploading the firmware manually"]},"90":{"title":"3. Upload your firmware","titles":["Building and uploading the firmware manually"]},"91":{"title":"Uploading via OTA","titles":["Building and uploading the firmware manually"]},"92":{"title":"What is it?","titles":["Building and uploading the firmware manually","Uploading via OTA"]},"93":{"title":"How do I use it?","titles":["Building and uploading the firmware manually","Uploading via OTA"]},"94":{"title":"For firmware versions 1.1.0 and up:","titles":["Building and uploading the firmware manually","Uploading via OTA","How do I use it?"]},"95":{"title":"For firmware versions of 1.0.0 and under:","titles":["Building and uploading the firmware manually","Uploading via OTA","How do I use it?"]},"96":{"title":"Finding the IP address of your tracker","titles":["Building and uploading the firmware manually"]},"97":{"title":"Updating the firmware to the newest version","titles":[]},"98":{"title":"Troubleshooting","titles":["Updating the firmware to the newest version"]},"99":{"title":"EyeTrackVR","titles":[]},"100":{"title":"Get Started","titles":["EyeTrackVR"]},"101":{"title":"Eye Safety Notice","titles":["EyeTrackVR"]},"102":{"title":"Hardware Overview","titles":["EyeTrackVR"]},"103":{"title":"Firmware","titles":["EyeTrackVR"]},"104":{"title":"Headset Compatibility","titles":["EyeTrackVR"]},"105":{"title":"Community & Support","titles":["EyeTrackVR"]},"106":{"title":"Near‑Eye Infrared (IR) Emitter Safety","titles":[null]},"107":{"title":"Relevant Safety Limits","titles":[null,"Near‑Eye Infrared (IR) Emitter Safety"]},"108":{"title":"Why Current (mA) Isn’t Enough","titles":[null,"Near‑Eye Infrared (IR) Emitter Safety"]},"109":{"title":"Hardware Exposure Calculations","titles":[null]},"110":{"title":"LED: XL‑3216HIRC‑850","titles":[null,"Hardware Exposure Calculations"]},"111":{"title":"V3 Module (2 LEDs @ 3.2 mA each)","titles":[null,"Hardware Exposure Calculations"]},"112":{"title":"V4 Module (4 LEDs @ 2.4 mA each)","titles":[null,"Hardware Exposure Calculations"]},"113":{"title":"Worst-Case (High Bin) Calculations","titles":[null,"Hardware Exposure Calculations"]},"114":{"title":"V3 Max Bin (2 LEDs @ 3.2 mA):","titles":[null,"Hardware Exposure Calculations","Worst-Case (High Bin) Calculations"]},"115":{"title":"V4 Max Bin (4 LEDs @ 2.4 mA):","titles":[null,"Hardware Exposure Calculations","Worst-Case (High Bin) Calculations"]},"116":{"title":"Your Responsibilities","titles":[null]},"117":{"title":"Appendix A – Formula Summary","titles":[null]},"118":{"title":"Appendix B – Quoted Guideline (ICNIRP 2013)","titles":[null]},"119":{"title":"Things To Know Before You Start","titles":[]},"120":{"title":"This page is an overview of things to know and understand before you start this project","titles":["Things To Know Before You Start"]},"121":{"title":"Software is not final","titles":["Things To Know Before You Start","This page is an overview of things to know and understand before you start this project"]},"122":{"title":"Firmware may have user difficulties","titles":["Things To Know Before You Start","This page is an overview of things to know and understand before you start this project"]},"123":{"title":"IR emitters can be dangerous","titles":["Things To Know Before You Start","This page is an overview of things to know and understand before you start this project"]},"124":{"title":"Documentation may be incomplete","titles":["Things To Know Before You Start","This page is an overview of things to know and understand before you start this project"]},"125":{"title":"Once you have acknowledged the items above, move on to the","titles":["Things To Know Before You Start","This page is an overview of things to know and understand before you start this project"]},"126":{"title":"Valve Index","titles":[]},"127":{"title":"Recommended Valve Index lens mounts","titles":["Valve Index",null]},"128":{"title":"MUTEtheCyberwolf's DEV Frunk Mod:","titles":["Valve Index"]},"129":{"title":"Mod Details","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Recommended Valve Index lens mounts"]},"130":{"title":"Extra Parts Needed:","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Recommended Valve Index lens mounts"]},"131":{"title":"3D Printed Mounts","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Recommended Valve Index lens mounts"]},"132":{"title":"Assembly Details:","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:"]},"133":{"title":"1. Heat Inserts","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Assembly Details:"]},"134":{"title":"2. Screws","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Assembly Details:"]},"135":{"title":"3. Mounting components","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Assembly Details:"]},"136":{"title":"4. Replacing frunk","titles":["Valve Index","MUTEtheCyberwolf's DEV Frunk Mod:","Assembly Details:"]},"137":{"title":"Physics-Dude's Gumstick USB Hub Dongle","titles":["Valve Index"]},"138":{"title":"Mod Details","titles":["Valve Index","Physics-Dude's Gumstick USB Hub Dongle","Assembly Details:"]},"139":{"title":"Installation instructions and BOM available on","titles":["Valve Index","Physics-Dude's Gumstick USB Hub Dongle"]},"140":{"title":"What are "Headset Specific Guides"?","titles":[]},"141":{"title":"Guidelines","titles":["What are "Headset Specific Guides"?",null]},"142":{"title":"Headset Name","titles":[]},"143":{"title":"Xyz's mod:","titles":["Headset Name"]},"144":{"title":"Mod Details","titles":["Headset Name","Xyz's mod:",null]},"145":{"title":"Extra Parts Needed:","titles":["Headset Name","Xyz's mod:",null]},"146":{"title":"3D Printed Mounts","titles":["Headset Name","Xyz's mod:",null]},"147":{"title":"Assembly Details:","titles":["Headset Name","Xyz's mod:",null]},"148":{"title":"Abc's mod:","titles":["Headset Name"]},"149":{"title":"Mod Details","titles":["Headset Name","Abc's mod:",null]},"150":{"title":"Extra Parts Needed:","titles":["Headset Name","Abc's mod:",null]},"151":{"title":"3D Printed Mounts","titles":["Headset Name","Abc's mod:",null]},"152":{"title":"Assembly Details:","titles":["Headset Name","Abc's mod:",null]},"153":{"title":"3D Printed Mounts","titles":[]},"154":{"title":"Dont see your headset?","titles":["3D Printed Mounts"]},"155":{"title":"Creating Your Own Mount","titles":[]},"156":{"title":"This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts","titles":["Creating Your Own Mount"]},"157":{"title":"Step 1: Find a way to mount to your headset's lens","titles":["Creating Your Own Mount"]},"158":{"title":"Step 2: Find a camera mount","titles":["Creating Your Own Mount"]},"159":{"title":"Step 3: Place the camera mount where it will give a good camera angle","titles":["Creating Your Own Mount"]},"160":{"title":"Step 4: Mount your LEDs","titles":["Creating Your Own Mount"]},"161":{"title":"Step 5: Test everything","titles":["Creating Your Own Mount"]},"162":{"title":"Step 6: Get your mounts listed","titles":["Creating Your Own Mount"]},"163":{"title":"V3 Build Guide","titles":[]},"164":{"title":"This page will contain a step-by-step assembly guide.","titles":["V3 Build Guide"]},"165":{"title":"Updated documentation for V4 is still in progress and not updated here, please be patient.","titles":["V3 Build Guide"]},"166":{"title":"Step 1: Make sure your have read the","titles":["V3 Build Guide"]},"167":{"title":"Step 2: Order all the parts listed on our","titles":["V3 Build Guide"]},"168":{"title":"Step 3: Wait for things to arrive","titles":["V3 Build Guide"]},"169":{"title":"Step 4: Gather up all of your hardware","titles":["V3 Build Guide"]},"170":{"title":"Step 5: Install external antennas or shield ESP antenna with an antistatic bag","titles":["V3 Build Guide"]},"171":{"title":"Step 6: Attach cameras to ESPs","titles":["V3 Build Guide"]},"172":{"title":"Step 7: Connect ESP to the programmer to flash","titles":["V3 Build Guide"]},"173":{"title":"Step 8: Configure Visual Studio Code and prepare to flash the firmware","titles":["V3 Build Guide"]},"174":{"title":"Step 9: Plug in your ESP and flash the firmware","titles":["V3 Build Guide"]},"175":{"title":"Step 10: Connect your power wires to a USB Type-A board","titles":["V3 Build Guide"]},"176":{"title":"Step 11: Cut wires for IR LEDs","titles":["V3 Build Guide"]},"177":{"title":"Step 12: Twist the positive USB wire and positive IR LED wires together and tin them","titles":["V3 Build Guide"]},"178":{"title":"Step 13: Solder the positive wire to ESP","titles":["V3 Build Guide"]},"179":{"title":"Step 14: Solder the negative wire to ESP","titles":["V3 Build Guide"]},"180":{"title":"Step 15: Wire up the 2nd ESP","titles":["V3 Build Guide"]},"181":{"title":"Step 16: Prepare to solder IR LED PCBs","titles":["V3 Build Guide"]},"182":{"title":"Step 18: Solder resistors on PCB V3","titles":["V3 Build Guide"]},"183":{"title":"Solder LEDs on PCB V3","titles":["V3 Build Guide"]},"184":{"title":"Wire up the PCBs V3","titles":["V3 Build Guide"]},"185":{"title":"Step 19: 3D print mounts","titles":["V3 Build Guide"]},"186":{"title":"Type 1","titles":["V3 Build Guide","Step 19: 3D print mounts"]},"187":{"title":"Type 2","titles":["V3 Build Guide","Step 19: 3D print mounts"]},"188":{"title":"IR LED mounting","titles":["V3 Build Guide"]},"189":{"title":"How to assemble a V4 mini LED hardware kit:","titles":[]},"190":{"title":"Getting to know your hardware","titles":["How to assemble a V4 mini LED hardware kit:"]},"191":{"title":"Mainboard","titles":["How to assemble a V4 mini LED hardware kit:","Getting to know your hardware"]},"192":{"title":"LEDs","titles":["How to assemble a V4 mini LED hardware kit:","Getting to know your hardware"]},"193":{"title":"Wires","titles":["How to assemble a V4 mini LED hardware kit:","Getting to know your hardware"]},"194":{"title":"Wiring up V4 mini","titles":["How to assemble a V4 mini LED hardware kit:"]},"195":{"title":"How to assemble V4 Lite LED kit:","titles":[]},"196":{"title":"Getting to know V4 lite","titles":["How to assemble V4 Lite LED kit:"]},"197":{"title":"Wiring up V4 Lite","titles":["How to assemble V4 Lite LED kit:"]},"198":{"title":"Required Parts:","titles":[]},"199":{"title":"Additional Parts:","titles":[]},"200":{"title":"ESP setup options:","titles":["Additional Parts:"]},"201":{"title":"Option 1: Wired over USB Serial","titles":["Additional Parts:"]},"202":{"title":"Wired Capable ESPs:","titles":["Additional Parts:","Option 1: Wired over USB Serial"]},"203":{"title":"Option 2: Wireless over WiFi 2.4 GHz","titles":["Additional Parts:"]},"204":{"title":"Wireless Capable ESPs:","titles":["Additional Parts:","Option 2: Wireless over WiFi 2.4 GHz"]},"205":{"title":"Parts List","titles":[]},"206":{"title":"ESP setup options:","titles":["Parts List"]},"207":{"title":"Option 1: Wireless over WiFi 2.4 GHz","titles":["Parts List","ESP setup options:"]},"208":{"title":"Option 2: Wired over USB Serial (in beta)","titles":["Parts List","ESP setup options:"]},"209":{"title":"Required parts","titles":["Parts List"]},"210":{"title":"Tracker boards:","titles":["Parts List","Required parts"]},"211":{"title":"Recommended","titles":["Parts List","Required parts","Tracker boards:"]},"212":{"title":"A cheaper, wireless only alternative:","titles":["Parts List","Required parts","Tracker boards:"]},"213":{"title":"Cameras","titles":["Parts List","Required parts"]},"214":{"title":"Camera modules:","titles":["Parts List","Required parts","Cameras"]},"215":{"title":"2x OV2640 160° FOV IR / Night vers 75mm (850nm)","titles":["Parts List","Required parts","Cameras"]},"216":{"title":"Optional Ribbon extensions:","titles":["Parts List","Required parts","Cameras"]},"217":{"title":"USB Hubs - for if you are building the wired version","titles":["Parts List","Required parts"]},"218":{"title":"Wires and adapters","titles":["Parts List","Required parts"]},"219":{"title":"IR emitters","titles":["Parts List","Required parts"]},"220":{"title":"Recommended:","titles":["Parts List","Required parts","IR emitters"]},"221":{"title":"Alternatively you can source the parts for V3 yourself:","titles":["Parts List","Required parts","IR emitters"]},"222":{"title":"3D Printed Mounts","titles":["Parts List"]},"223":{"title":"Misc parts/tools","titles":["Parts List"]},"224":{"title":"Other Headsets","titles":["Parts List","Misc parts/tools"]},"225":{"title":"IR Filter Removal","titles":[]},"226":{"title":"130° IR Filter removal","titles":["IR Filter Removal",null]},"227":{"title":"160° IR Filter removal","titles":["IR Filter Removal",null]},"228":{"title":"Blurry Camera?","titles":[]},"229":{"title":"Protecting a Camera Ribbon Cable","titles":[]},"230":{"title":"Wrapping the Camera Ribbon","titles":["Protecting a Camera Ribbon Cable"]},"231":{"title":"Best Practices When Handling Cameras","titles":["Protecting a Camera Ribbon Cable"]},"232":{"title":"Conclusion","titles":["Protecting a Camera Ribbon Cable"]},"233":{"title":"How to prepare a Seeed Studio XIAO Sense ESP32","titles":[]},"234":{"title":"What's in the box","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"235":{"title":"Wired vs Wireless","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"236":{"title":"Wireless Configuration","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"237":{"title":"Wired Configuration","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"238":{"title":"Connecting the Camera Hat","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"239":{"title":"Removing the Camera","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"240":{"title":"Connecting the camera","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"241":{"title":"Conclusion","titles":["How to prepare a Seeed Studio XIAO Sense ESP32"]},"242":{"title":"V4 Build Guide (WIP)","titles":[]},"243":{"title":"Prepare you hardware","titles":["V4 Build Guide (WIP)"]},"244":{"title":"Prepare and assemble the 3d printed mounts","titles":["V4 Build Guide (WIP)"]},"245":{"title":"Wiring it up","titles":["V4 Build Guide (WIP)"]},"246":{"title":"Software","titles":["V4 Build Guide (WIP)"]},"247":{"title":"Wired","titles":["V4 Build Guide (WIP)","Software"]},"248":{"title":"Wireless","titles":["V4 Build Guide (WIP)","Software"]},"249":{"title":"Frequently Asked Questions","titles":[]},"250":{"title":"3D Printing Service JLC3DP","titles":[]},"251":{"title":"If you don't own a 3D Printer, you can order high quality prints by the dollar using JLC3DP","titles":["3D Printing Service JLC3DP"]},"252":{"title":"Upload your STL files with the following print settings","titles":["3D Printing Service JLC3DP","If you don't own a 3D Printer, you can order high quality prints by the dollar using JLC3DP"]},"253":{"title":"Choose a cheaper shipping option, for me this is global standard direct line","titles":["3D Printing Service JLC3DP","If you don't own a 3D Printer, you can order high quality prints by the dollar using JLC3DP"]},"254":{"title":"How to set up your avatar for eye tracking:","titles":[]},"255":{"title":"We currently use the following paramaters","titles":["How to set up your avatar for eye tracking:",null]},"256":{"title":"VRCFT ETVR Tracking module, or simply the ETVR tracking module","titles":[]},"257":{"title":"What is this?","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module"]},"258":{"title":"What do I need and how do I set this up?","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module"]},"259":{"title":"Required programs / Files","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?"]},"260":{"title":"VRCFT","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?","Required programs / Files"]},"261":{"title":"ETVR Module","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?","Required programs / Files"]},"262":{"title":"Setting up ETVR to use the module","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?"]},"263":{"title":"Sending the tracking data to VRCFT running on a separate PC.","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?"]},"264":{"title":"Reseting the module to default settings in case something went wrong.","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?"]},"265":{"title":"There's a breaking change reported, what does that mean? What do I do?","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","What do I need and how do I set this up?"]},"266":{"title":"Dev version of the module for testing","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module"]},"267":{"title":"Building from source","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","Dev version of the module for testing"]},"268":{"title":"Download the ETVR Module source from github","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","Dev version of the module for testing","Building from source"]},"269":{"title":"Donwload the latest VRCFT Source","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","Dev version of the module for testing","Building from source"]},"270":{"title":"Install Visual Studio or Jetbrains Rider, and open the project","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","Dev version of the module for testing","Building from source"]},"271":{"title":"Building the module","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","Dev version of the module for testing","Building from source"]},"272":{"title":"FAQ","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module"]},"273":{"title":"Where's the module's configuration file?","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","FAQ"]},"274":{"title":"WHat do the fields in this file mean?","titles":["VRCFT ETVR Tracking module, or simply the ETVR tracking module","FAQ"]},"275":{"title":"Build the app from source","titles":[]},"276":{"title":"This guide will show how to build the app from source","titles":["Build the app from source"]},"277":{"title":"Requirements","titles":["Build the app from source"]},"278":{"title":"Install Python","titles":["Build the app from source"]},"279":{"title":"Installing Poetry","titles":["Build the app from source"]},"280":{"title":"Install the required Python modules","titles":["Build the app from source"]},"281":{"title":"Build the app","titles":["Build the app from source"]},"282":{"title":"How to install, run and adjust the EyeTrackVR app.","titles":[]},"283":{"title":"Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app","titles":["How to install, run and adjust the EyeTrackVR app.",null]},"284":{"title":"Step 2: Run the EyeTrackVR app","titles":["How to install, run and adjust the EyeTrackVR app."]},"285":{"title":"Step 3: Getting familiar with settings and terminology","titles":["How to install, run and adjust the EyeTrackVR app."]},"286":{"title":"Right eye","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"287":{"title":"Left eye","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"288":{"title":"Both eyes","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"289":{"title":"Camera Address","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"290":{"title":"Tracking Mode","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"291":{"title":"Cropping Mode","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"292":{"title":"Threshold","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"293":{"title":"Rotation","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"294":{"title":"Restart Calibration","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"295":{"title":"Recenter Eye","titles":["How to install, run and adjust the EyeTrackVR app.","Step 3: Getting familiar with settings and terminology"]},"296":{"title":"Step 4: Adding your cameras to the software and configuring them","titles":["How to install, run and adjust the EyeTrackVR app."]},"297":{"title":"Wireless configuration","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them"]},"298":{"title":"Wired configuration (experimental)","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them"]},"299":{"title":"Note this is a Beta app feature only. Please use the latest Open Beta in the Discord.","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them","Wired configuration (experimental)"]},"300":{"title":"Setting up ROI","titles":["How to install, run and adjust the EyeTrackVR app.","Step 4: Adding your cameras to the software and configuring them"]},"301":{"title":"Step 5: Calibrating your eyes","titles":["How to install, run and adjust the EyeTrackVR app."]},"302":{"title":"Setting up recalibration and recentering from VRChat.","titles":[]},"303":{"title":"Setting up your parameters","titles":["Setting up recalibration and recentering from VRChat."]},"304":{"title":"Adding parameters","titles":["Setting up recalibration and recentering from VRChat.","Setting up your parameters"]},"305":{"title":"Adding buttons to the menu","titles":["Setting up recalibration and recentering from VRChat.","Setting up your parameters"]},"306":{"title":"Resetting the OSC config in case the parameters don't work","titles":["Setting up recalibration and recentering from VRChat."]},"307":{"title":"Other platforms","titles":["Setting up recalibration and recentering from VRChat."]}},"dirtCount":0,"index":[["+",{"2":{"223":1}}],["9001",{"2":{"307":1}}],["93",{"2":{"274":1}}],["99",{"2":{"274":1}}],["97",{"2":{"274":1}}],["9",{"0":{"174":1}}],["96",{"2":{"115":2,"274":1}}],["qdot",{"2":{"158":1}}],["quite",{"2":{"273":1}}],["quirks",{"2":{"140":1,"147":1,"152":1}}],["quick",{"2":{"82":2,"84":1}}],["quest",{"2":{"157":1,"216":1}}],["questions",{"0":{"249":1},"2":{"98":1,"124":1}}],["question",{"2":{"98":1}}],["query",{"2":{"67":1}}],["quality",{"0":{"251":1},"1":{"252":1,"253":1},"2":{"71":3,"204":1,"207":1,"217":1}}],["quote",{"2":{"251":1}}],["quoted",{"0":{"118":1}}],["quot",{"0":{"140":2},"1":{"141":2},"2":{"19":14,"20":2,"56":2,"95":4,"147":2,"152":2,"157":2,"159":2,"192":6,"215":2,"217":2,"230":2,"274":8,"304":4,"305":6}}],["★",{"2":{"153":1,"222":1}}],["|",{"2":{"130":3,"279":1}}],["λ",{"2":{"118":1}}],["~45",{"2":{"231":1}}],["~350ohm",{"2":{"181":1}}],["~2",{"2":{"143":1,"148":1}}],["~12",{"2":{"115":1}}],["~8",{"2":{"112":1,"114":1}}],["~5",{"2":{"111":1}}],["~700ohm",{"2":{"1":2,"181":1}}],["×",{"2":{"110":1,"111":2,"112":2,"114":2,"115":2,"117":3,"242":6}}],["⇒",{"2":{"110":1}}],["π",{"2":{"108":2,"110":1,"111":1,"112":1,"114":1,"115":1}}],["≈",{"2":{"108":1,"110":1}}],["→",{"2":{"108":2,"111":1,"112":1,"114":1,"115":1}}],["θ",{"2":{"108":2,"110":1}}],["ω",{"2":{"108":4,"110":1,"117":2}}],["≤",{"2":{"107":1}}],["≥10",{"2":{"107":1}}],["µm",{"2":{"101":1,"118":1}}],["zip",{"2":{"78":1,"268":1}}],["jetbrains",{"0":{"270":1}}],["jerk",{"2":{"231":1}}],["jlc",{"2":{"253":1}}],["jlc3dp",{"0":{"250":1,"251":1},"1":{"251":1,"252":2,"253":2},"2":{"251":1}}],["job",{"2":{"159":1}}],["joints",{"2":{"196":1}}],["joint",{"2":{"179":1}}],["join",{"2":{"105":1}}],["just",{"2":{"94":1,"106":1,"134":1,"145":1,"150":1,"160":1,"162":1,"212":1,"215":3,"263":1,"268":1,"270":1,"271":2}}],["jpeg",{"2":{"71":1}}],["json",{"2":{"66":1,"273":1}}],["js",{"2":{"11":1,"19":2}}],["04",{"2":{"274":1}}],["01",{"2":{"274":1}}],["06",{"2":{"274":3}}],["05",{"2":{"274":1}}],["05m",{"2":{"217":1}}],["0+",{"2":{"217":1}}],["0001",{"2":{"162":1,"185":1}}],["0",{"0":{"94":1,"95":2},"2":{"71":3,"94":1,"101":1,"107":1,"111":5,"112":5,"114":3,"115":4,"130":1,"170":1,"202":1,"216":1,"217":1,"263":2,"274":24,"278":1,"279":1}}],["89",{"2":{"274":2}}],["8889",{"2":{"274":1}}],["8mm",{"2":{"130":1,"223":1}}],["8x",{"2":{"130":1}}],["80",{"2":{"111":2}}],["850nm",{"0":{"215":1},"2":{"215":1}}],["850",{"0":{"110":1},"2":{"107":1}}],["8",{"0":{"173":1},"2":{"68":3,"70":3,"107":1,"113":1,"114":1,"115":1}}],["81",{"2":{"65":2,"67":1,"94":1,"114":1}}],["75mm",{"0":{"215":1},"2":{"215":2}}],["70",{"2":{"202":1,"208":1}}],["7",{"0":{"172":1},"2":{"71":1,"107":1,"279":1}}],["7dbm",{"2":{"68":2,"70":2}}],["74",{"2":{"68":1,"70":1}}],["76",{"2":{"68":1,"70":1,"112":1}}],["780",{"2":{"118":1}}],["78",{"2":{"68":1,"70":1}}],["=",{"2":{"56":1,"65":2,"67":2,"68":13,"70":13,"71":2,"95":4,"108":9,"110":3,"111":6,"112":6,"114":6,"115":6,"117":5}}],["65ohm",{"2":{"197":1}}],["6x",{"2":{"130":1}}],["6mm",{"2":{"130":1}}],["62471",{"2":{"107":1}}],["63",{"2":{"71":1}}],["60°",{"2":{"108":2,"110":2}}],["60825",{"2":{"107":1}}],["60",{"2":{"68":1,"70":1,"112":2}}],["68",{"2":{"68":1,"70":1}}],["6",{"0":{"47":1,"162":1,"171":1}}],["357",{"2":{"221":1}}],["350ohm",{"2":{"221":1}}],["3mm",{"2":{"175":1}}],["3653631",{"2":{"157":1}}],["31",{"2":{"115":2}}],["3d",{"0":{"131":1,"146":1,"151":1,"153":1,"185":1,"222":1,"244":1,"250":1,"251":1},"1":{"154":1,"186":1,"187":1,"251":1,"252":2,"253":2},"2":{"104":1,"140":1,"157":1,"185":1,"242":1,"244":1,"251":1}}],["38",{"2":{"101":1}}],["3216hirc",{"0":{"110":1}}],["3232",{"2":{"95":1}}],["32",{"2":{"84":1,"211":1}}],["348",{"2":{"221":1}}],["34",{"2":{"68":1,"70":1,"218":1,"221":1}}],["3",{"0":{"44":1,"51":1,"77":1,"90":1,"111":1,"114":1,"135":1,"159":1,"168":1,"285":1},"1":{"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"68":2,"101":1,"111":1,"114":1,"118":1,"176":1,"190":1,"192":1,"193":1,"197":1,"212":1,"215":1,"217":1,"242":1,"278":1}}],["30mm",{"2":{"130":1}}],["30x30x7mm",{"2":{"129":1}}],["30",{"2":{"11":1}}],["x",{"2":{"230":1}}],["xyz",{"0":{"143":1},"1":{"144":1,"145":1,"146":1,"147":1},"2":{"146":1}}],["xl",{"0":{"110":1}}],["xxx",{"2":{"52":4}}],["xiaos",{"2":{"211":1,"235":1}}],["xiaosenses3",{"2":{"36":2,"37":2}}],["xiao",{"0":{"233":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"41":1,"129":1,"131":3,"134":2,"135":3,"202":1,"204":1,"211":1,"234":1,"238":1,"239":1,"241":1,"243":1}}],["xaio",{"2":{"37":2}}],["knife",{"2":{"230":1}}],["known",{"2":{"106":1,"238":1}}],["know",{"0":{"119":1,"120":1,"190":1,"196":1},"1":{"120":1,"121":2,"122":2,"123":2,"124":2,"125":2,"191":1,"192":1,"193":1},"2":{"19":2,"39":1,"54":1,"100":1,"106":1,"145":1,"150":1,"196":1,"224":2}}],["kick",{"2":{"274":2}}],["kill",{"2":{"229":1}}],["killing",{"2":{"229":1}}],["kind",{"2":{"185":1}}],["kit",{"0":{"189":1,"195":1},"1":{"190":1,"191":1,"192":1,"193":1,"194":1,"196":1,"197":1},"2":{"127":2,"130":1,"135":1,"190":1,"193":1,"194":1,"217":1,"220":3,"242":1}}],["kits",{"2":{"106":1,"123":1,"220":1}}],["key",{"2":{"107":1}}],["keep",{"2":{"20":2,"30":1,"54":1,"96":1,"101":1,"118":1,"135":1,"141":1,"153":1,"177":1,"215":1}}],["mtt",{"2":{"202":1,"217":2}}],["m3",{"2":{"150":1}}],["m2",{"2":{"147":1,"152":1}}],["m4x30",{"2":{"130":1,"134":2}}],["m4x10",{"2":{"130":1,"134":2}}],["m4x8",{"2":{"130":1}}],["m4",{"2":{"130":3}}],["m⁻²",{"2":{"118":1}}],["mrad",{"2":{"107":1}}],["mm",{"2":{"107":1}}],["m²",{"2":{"107":1}}],["mw",{"2":{"101":2,"107":3,"108":1,"110":1,"111":3,"112":3,"113":1,"114":3,"115":3,"118":1}}],["mb",{"2":{"87":1,"90":1}}],["middle",{"2":{"135":1,"136":1,"197":2}}],["mirror",{"2":{"127":1,"153":1,"252":1}}],["minimum",{"2":{"217":1}}],["mini",{"0":{"189":1,"194":1},"1":{"190":1,"191":1,"192":1,"193":1,"194":1},"2":{"191":1,"217":1}}],["mind",{"2":{"96":1,"153":1,"209":1,"215":1}}],["minute",{"2":{"95":1}}],["minus",{"2":{"68":1,"70":1}}],["might",{"2":{"90":1,"244":1}}],["microsoft",{"2":{"263":1}}],["micro",{"2":{"87":1}}],["misc",{"0":{"223":1},"1":{"224":1}}],["miscelleneous",{"2":{"82":1}}],["mishap",{"2":{"221":1}}],["missing",{"2":{"25":2,"36":1,"44":1,"124":1,"194":1}}],["multiplied",{"2":{"274":1}}],["multiple",{"2":{"33":2,"35":1,"129":1,"185":1}}],["mute",{"2":{"216":2}}],["mutethecyberwolf",{"0":{"128":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1},"2":{"131":1}}],["much",{"2":{"129":1,"177":1,"182":1,"202":1,"208":1,"211":1,"265":1,"274":1}}],["must",{"2":{"20":1,"68":1,"70":1,"85":1,"95":1,"101":1,"126":1,"136":1,"147":1,"152":1,"196":2,"279":1}}],["mock",{"2":{"176":1}}],["months",{"2":{"168":1}}],["monitor",{"2":{"95":1,"96":2}}],["monitoring",{"2":{"95":1}}],["mounted",{"2":{"202":1,"208":1,"216":1}}],["mount",{"0":{"155":1,"156":1,"157":1,"158":1,"159":1,"160":1},"1":{"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1},"2":{"104":2,"127":1,"129":2,"131":1,"134":2,"135":2,"140":1,"146":3,"151":3,"156":1,"158":2,"160":1,"161":2,"162":1,"185":1,"186":3,"187":2,"188":2,"216":1,"222":2,"224":5,"231":1,"244":4,"252":1}}],["mounts",{"0":{"127":1,"131":1,"146":1,"151":1,"153":1,"156":1,"162":1,"185":1,"222":1,"244":1},"1":{"129":1,"130":1,"131":1,"154":1,"186":1,"187":1},"2":{"102":1,"140":1,"146":1,"151":1,"153":3,"154":3,"156":1,"159":1,"185":2,"216":1,"222":2,"224":1,"242":1,"244":2}}],["mounting",{"0":{"135":1,"188":1},"2":{"100":1,"129":1,"136":1,"186":1,"228":2}}],["moment",{"2":{"79":1}}],["moving",{"2":{"78":1,"133":1,"300":1,"301":1}}],["movement",{"2":{"274":1}}],["move",{"0":{"125":1},"2":{"14":1,"44":1,"95":1,"134":1,"170":1,"173":1,"274":1,"300":1}}],["mobile",{"2":{"62":1}}],["more",{"2":{"32":1,"33":1,"37":1,"62":1,"68":1,"71":2,"78":1,"94":1,"129":1,"134":1,"138":1,"167":1,"192":1,"202":1,"204":2,"205":1,"207":2,"208":1,"215":1,"228":1,"230":1,"269":1,"274":1,"305":1}}],["mostly",{"2":{"165":1}}],["most",{"2":{"28":1,"37":1,"153":1,"222":1,"261":1}}],["modified",{"2":{"131":2,"199":1,"265":1}}],["modify",{"2":{"25":1,"116":1,"273":1}}],["mod",{"0":{"128":1,"129":1,"138":1,"143":1,"144":1,"148":1,"149":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"144":1,"145":1,"146":1,"147":1,"149":1,"150":1,"151":1,"152":1},"2":{"143":1,"144":1,"148":1,"149":1,"216":1}}],["modules",{"0":{"214":1,"280":1},"2":{"211":1,"212":1,"266":1,"280":1}}],["module",{"0":{"111":1,"112":1,"256":2,"261":1,"262":1,"264":1,"266":1,"268":1,"271":1,"273":1},"1":{"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":3,"268":3,"269":3,"270":3,"271":3,"272":2,"273":2,"274":2},"2":{"207":1,"257":2,"258":1,"261":2,"262":2,"263":2,"264":3,"265":3,"266":6,"269":3,"274":2}}],["modeling",{"2":{"224":1}}],["model",{"2":{"104":1,"225":1}}],["mode",{"0":{"290":1,"291":1},"2":{"28":9,"37":6,"49":1,"68":1,"88":1,"170":1,"290":1,"294":1,"300":2,"301":1}}],["menu",{"0":{"305":1},"2":{"305":3}}],["mentioned",{"2":{"304":1,"305":1,"307":1}}],["mechanism",{"2":{"302":1}}],["melt",{"2":{"244":1}}],["me",{"0":{"253":1},"2":{"140":1,"145":1,"150":1,"162":2,"185":1}}],["mess",{"2":{"175":1,"188":1}}],["messing",{"2":{"106":1}}],["messages",{"2":{"274":1,"302":1,"307":1}}],["message",{"2":{"97":1}}],["measure",{"2":{"108":1}}],["measures",{"2":{"101":1,"106":1}}],["mean",{"0":{"265":1,"274":1},"2":{"265":1}}],["means",{"2":{"31":1,"32":1,"33":1,"54":1,"79":1,"106":1,"221":1,"224":1}}],["meaning",{"2":{"25":1,"304":1}}],["memory",{"2":{"66":1,"68":2,"304":1}}],["members",{"2":{"15":1}}],["method",{"2":{"66":3,"90":1,"186":2,"187":1,"293":1}}],["mdns",{"0":{"30":1,"53":1,"56":1},"1":{"54":1,"55":1,"56":1,"57":1,"58":1,"59":1,"60":1},"2":{"30":3,"31":2,"54":2,"56":1,"58":1,"66":1,"69":2,"94":3,"95":2,"248":1}}],["md",{"2":{"17":1,"18":1,"19":1,"20":1,"141":4}}],["my",{"2":{"17":2,"18":4,"19":4,"20":2,"175":1,"182":2}}],["male",{"2":{"136":1,"218":1}}],["matters",{"2":{"197":1}}],["match",{"2":{"123":1}}],["matches",{"2":{"95":1}}],["matures",{"2":{"122":1}}],["ma",{"0":{"108":1,"111":1,"112":1,"114":1,"115":1},"2":{"108":1,"110":2,"113":1,"117":1}}],["manager",{"2":{"247":1,"299":1}}],["manage",{"2":{"207":1,"245":1,"279":1}}],["many",{"2":{"95":1,"99":1,"100":1,"225":1,"228":1,"238":1}}],["manual",{"2":{"93":1}}],["manually",{"0":{"85":1},"1":{"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1},"2":{"30":1,"93":1,"174":1,"215":2}}],["machines",{"2":{"263":1}}],["machine",{"2":{"263":2}}],["macos",{"2":{"58":1}}],["mac",{"2":{"58":1}}],["making",{"2":{"44":1,"99":1,"135":1,"141":1,"185":1,"200":1,"206":1,"224":1,"236":1,"237":1,"274":1}}],["makes",{"2":{"66":1,"177":1}}],["make",{"0":{"166":1},"2":{"15":2,"28":1,"50":1,"56":1,"60":2,"78":1,"87":1,"90":3,"96":1,"122":1,"123":1,"133":1,"147":1,"152":1,"169":1,"170":1,"172":1,"174":1,"176":1,"185":1,"192":1,"204":1,"207":1,"217":1,"224":1,"230":1,"258":1,"263":1,"264":1,"269":1,"270":1,"302":1,"305":1}}],["map",{"2":{"39":1}}],["mainboard",{"0":{"191":1},"2":{"190":1,"191":1,"194":1}}],["mainly",{"2":{"76":1,"300":1}}],["main",{"2":{"38":1,"78":1,"190":1,"194":1,"196":2,"234":1,"238":1}}],["maintain",{"2":{"24":2,"25":1}}],["may",{"0":{"122":1,"124":1,"156":1},"2":{"36":1,"37":1,"44":1,"45":1,"79":2,"88":1,"113":1,"116":1,"121":1,"122":1,"124":1,"153":1,"154":1,"167":1,"185":1,"186":1,"196":1,"211":1,"212":1,"214":1,"216":1,"217":4,"225":1,"247":1,"252":1}}],["made",{"2":{"25":1,"106":1,"185":1}}],["major",{"2":{"15":1,"191":1}}],["mark",{"2":{"176":1}}],["marker",{"2":{"176":1}}],["marked",{"2":{"66":1,"197":2}}],["markdown",{"2":{"15":1,"16":3,"17":1,"21":1}}],["marks",{"2":{"1":2,"181":2}}],["maximize",{"2":{"159":1}}],["max",{"0":{"114":1,"115":1},"2":{"3":1,"110":1}}],["magnifying",{"2":{"1":1,"181":1}}],["yellow",{"2":{"197":1}}],["yes",{"2":{"146":2,"151":2}}],["yet",{"2":{"89":1,"104":1,"121":1,"215":1,"224":1,"266":1,"300":1}}],["yaml",{"2":{"25":1}}],["yarn",{"2":{"11":1,"12":2,"25":1}}],["yml",{"2":{"25":1}}],["youtube",{"2":{"214":1}}],["you",{"0":{"27":2,"119":1,"120":1,"125":1,"217":1,"221":1,"243":1,"251":2},"1":{"120":1,"121":2,"122":2,"123":2,"124":2,"125":2,"252":2,"253":2},"2":{"1":2,"2":1,"17":2,"18":2,"19":5,"20":7,"21":1,"28":15,"30":6,"31":16,"32":2,"33":2,"35":2,"37":3,"39":4,"41":1,"43":2,"44":1,"45":1,"47":1,"48":1,"50":3,"54":5,"56":7,"57":2,"58":4,"60":1,"62":1,"64":1,"65":1,"66":1,"67":2,"68":6,"70":2,"76":1,"77":1,"78":5,"79":1,"81":1,"82":1,"83":1,"84":1,"85":2,"87":2,"88":2,"90":7,"93":4,"94":4,"95":4,"96":2,"97":4,"98":2,"99":2,"100":1,"101":1,"103":1,"104":1,"105":1,"106":5,"118":1,"123":2,"126":1,"127":1,"131":3,"134":4,"135":4,"136":5,"140":1,"141":1,"145":1,"146":1,"147":1,"150":1,"151":1,"152":1,"153":1,"156":2,"157":1,"158":3,"160":3,"161":2,"162":1,"166":1,"169":1,"170":6,"171":1,"172":2,"174":1,"176":1,"179":1,"181":2,"182":1,"185":2,"186":1,"188":1,"192":1,"194":1,"196":3,"197":1,"200":1,"204":1,"206":1,"207":1,"212":2,"214":1,"215":2,"216":1,"217":5,"218":1,"220":2,"221":10,"222":1,"224":4,"228":4,"229":2,"230":1,"232":1,"236":2,"237":2,"240":2,"241":1,"242":2,"244":2,"246":1,"247":3,"248":1,"252":2,"253":2,"258":1,"261":2,"263":2,"266":2,"268":1,"270":1,"273":2,"274":1,"276":1,"278":1,"279":1,"281":1,"284":2,"285":1,"289":1,"291":1,"293":1,"294":1,"295":1,"300":2,"301":2,"302":1,"304":1,"305":7}}],["yourself",{"0":{"221":1},"2":{"14":1,"106":1,"185":1}}],["your",{"0":{"86":2,"89":1,"90":1,"96":1,"116":1,"154":1,"155":1,"156":1,"157":1,"160":1,"162":1,"166":1,"169":1,"174":1,"175":1,"190":1,"252":1,"254":1,"296":1,"301":1,"303":1},"1":{"87":2,"88":2,"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"191":1,"192":1,"193":1,"255":1,"297":1,"298":1,"299":1,"300":1,"304":1,"305":1},"2":{"1":1,"12":1,"16":1,"28":8,"30":1,"31":1,"37":1,"38":1,"39":1,"41":1,"43":1,"44":2,"45":3,"47":1,"50":1,"51":1,"52":1,"64":1,"72":2,"80":1,"81":1,"82":1,"85":3,"87":4,"88":2,"90":6,"92":3,"93":4,"94":7,"95":3,"96":2,"97":6,"98":1,"99":1,"100":1,"101":2,"102":1,"104":2,"106":2,"116":1,"118":1,"123":2,"129":1,"133":3,"134":2,"135":3,"136":2,"146":1,"151":1,"157":2,"158":1,"160":1,"170":1,"171":1,"172":1,"174":2,"176":1,"181":1,"182":1,"185":1,"188":1,"196":1,"200":2,"202":1,"205":1,"206":2,"208":1,"214":1,"217":2,"220":1,"224":1,"225":1,"228":1,"229":1,"232":1,"234":1,"241":1,"244":3,"245":3,"246":1,"255":1,"266":3,"269":1,"273":1,"274":2,"284":1,"289":1,"291":1,"292":1,"293":1,"294":1,"295":1,"297":4,"299":1,"300":8,"301":5,"302":2,"304":4,"305":3,"306":1}}],["r",{"2":{"108":1}}],["r²",{"2":{"108":1,"117":1}}],["rider",{"0":{"270":1}}],["ripping",{"2":{"238":1}}],["rings",{"2":{"197":2}}],["rift",{"2":{"157":1}}],["ribbon",{"0":{"216":1,"229":1,"230":1},"1":{"230":1,"231":1,"232":1},"2":{"131":2,"171":1,"229":1,"230":3,"231":2,"239":1,"240":1}}],["risk",{"2":{"106":1,"204":1,"205":2,"207":1,"221":1,"228":1,"229":1}}],["risks",{"2":{"101":1}}],["righteyelidexpandedsqueeze",{"2":{"255":1}}],["righteyex",{"2":{"255":1}}],["right",{"0":{"286":1},"2":{"47":1,"68":1,"70":1,"99":1,"153":1,"194":1,"247":1,"252":1,"266":1,"286":1,"297":2}}],["range",{"2":{"274":9}}],["randomnerdtutorials",{"2":{"90":1}}],["rare",{"2":{"265":1,"273":1}}],["raises",{"2":{"239":1}}],["rated",{"2":{"221":1}}],["radio",{"2":{"204":2,"207":2}}],["radius",{"2":{"133":1}}],["radiation",{"2":{"101":1,"118":2}}],["radiant",{"2":{"101":1,"108":2,"110":2}}],["ram",{"2":{"66":1}}],["rubbing",{"2":{"188":1}}],["runs",{"2":{"263":1}}],["running",{"0":{"263":1},"2":{"212":1,"263":3,"264":1,"271":1}}],["rundown",{"0":{"156":1}}],["run",{"0":{"43":1,"282":1,"284":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"42":1,"78":1,"79":1,"279":1,"280":1,"281":2,"284":1}}],["rule",{"2":{"25":1}}],["rules",{"2":{"24":1}}],["roi",{"0":{"300":1},"2":{"300":2}}],["rotation",{"0":{"293":1},"2":{"300":2}}],["rotate",{"2":{"228":1}}],["roaming",{"2":{"266":1}}],["road",{"2":{"39":1}}],["roadmap",{"0":{"5":1},"1":{"6":1,"7":1,"8":1}}],["roll",{"2":{"230":3}}],["rough",{"2":{"165":1}}],["roughly",{"2":{"110":1}}],["routing",{"2":{"131":1,"244":1}}],["route",{"2":{"123":1,"135":1,"176":1,"244":1}}],["router",{"2":{"28":1,"60":1,"204":1,"207":1,"263":1}}],["rendering",{"2":{"229":1}}],["regenerate",{"2":{"306":1}}],["registry",{"2":{"261":1,"266":2}}],["region",{"2":{"107":2}}],["regular",{"2":{"221":1,"273":1}}],["regulator",{"2":{"197":1,"223":1}}],["remake",{"2":{"306":1}}],["remain",{"2":{"116":1}}],["remember",{"2":{"238":1}}],["remote",{"2":{"221":1}}],["removal",{"0":{"225":1,"226":1,"227":1},"1":{"226":1,"227":1},"2":{"214":1,"225":1}}],["removing",{"0":{"239":1},"2":{"170":1}}],["remove",{"2":{"133":1,"136":1,"147":1,"152":1,"170":1,"188":1,"214":1,"215":2,"230":1,"239":1}}],["removed",{"2":{"69":1,"136":1,"214":1}}],["reduces",{"2":{"205":1}}],["reduce",{"2":{"106":1,"229":1}}],["reacts",{"2":{"274":1}}],["reach",{"2":{"140":1}}],["reasonable",{"2":{"204":1,"207":1}}],["really",{"2":{"200":1,"204":1,"206":1}}],["real",{"2":{"99":1}}],["reality",{"2":{"99":1}}],["read",{"0":{"166":1}}],["ready",{"2":{"41":1,"45":1,"46":1,"241":1,"246":1,"266":1,"281":1}}],["reading",{"2":{"28":1}}],["retention",{"2":{"131":2,"135":4}}],["retinal",{"2":{"107":3}}],["retyping",{"2":{"97":1}}],["retype",{"2":{"97":2}}],["retrieve",{"2":{"95":1}}],["returns",{"2":{"66":2}}],["re",{"2":{"45":1,"50":1,"90":1,"99":2,"100":1,"104":1,"105":1,"134":1,"212":1,"263":2,"265":1,"274":1}}],["refuse",{"2":{"79":1}}],["refer",{"2":{"68":1,"78":1,"263":1}}],["references",{"2":{"101":1}}],["reference",{"2":{"33":1,"228":1}}],["refactor",{"2":{"25":1}}],["requests",{"2":{"32":1,"62":1,"64":1}}],["requirements",{"0":{"277":1}}],["requirement",{"2":{"217":1}}],["requires",{"2":{"186":1,"202":2,"204":2,"207":2,"208":1,"212":2,"217":1,"220":3,"269":1}}],["required",{"0":{"198":1,"209":1,"259":1,"280":1},"1":{"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"260":1,"261":1},"2":{"20":1,"28":1,"32":1,"58":1,"67":1,"170":1,"196":1,"202":2,"208":1,"209":1,"212":1,"217":1,"218":1,"257":1,"276":1,"279":1,"280":1}}],["require",{"2":{"19":1,"37":1,"66":1,"127":1,"138":1,"211":1,"212":1,"215":1,"216":2,"217":1,"225":1}}],["repetitively",{"2":{"231":1}}],["repeat",{"2":{"94":1,"95":1,"134":2,"161":1,"179":1,"180":1,"182":1,"228":1,"300":1,"301":1,"305":1}}],["replacing",{"0":{"136":1},"2":{"129":1}}],["replace",{"2":{"28":1,"239":1}}],["reported",{"0":{"265":1}}],["repository",{"2":{"39":1,"78":1,"102":1}}],["repo",{"2":{"12":1,"97":1,"131":1,"266":1,"269":1}}],["reverts",{"2":{"25":1}}],["revert",{"2":{"25":1}}],["relevant",{"0":{"107":1}}],["releasing",{"2":{"88":1}}],["released",{"2":{"202":1}}],["release",{"2":{"25":3,"35":1,"36":4,"42":1,"44":1,"87":1,"266":2,"283":1}}],["reliable",{"2":{"121":1}}],["reliably",{"2":{"100":1}}],["relies",{"2":{"39":1}}],["related",{"2":{"1":1,"181":1}}],["resolve",{"2":{"306":1}}],["resolution",{"2":{"71":2}}],["resonite",{"2":{"302":1}}],["resource",{"2":{"254":1}}],["resizing",{"2":{"185":1}}],["resistor",{"2":{"1":3,"2":4,"3":2,"4":3,"170":2,"181":3,"182":4,"197":4}}],["resistors",{"0":{"2":1,"182":1},"2":{"1":2,"116":1,"181":1,"182":1,"196":1,"221":2}}],["resulting",{"2":{"271":1}}],["result",{"2":{"101":1,"106":2,"134":1,"170":1,"196":3,"215":1}}],["results",{"2":{"46":1,"175":1}}],["reseting",{"0":{"264":1}}],["resetting",{"0":{"306":1},"2":{"90":1}}],["reset",{"2":{"88":1,"97":2,"264":2}}],["resetconfig",{"2":{"66":1}}],["respected",{"2":{"153":1,"222":1}}],["respectively",{"2":{"28":1}}],["responsibilities",{"0":{"116":1},"2":{"106":1}}],["responsibility",{"2":{"101":1,"106":1}}],["responsible",{"2":{"38":1,"123":1}}],["restartcamera",{"2":{"66":1}}],["restarts",{"2":{"66":2}}],["restartdevice",{"2":{"66":1}}],["restart",{"0":{"294":1},"2":{"60":2,"66":1,"95":1,"96":1,"262":1,"297":1,"299":1,"301":1}}],["rest",{"0":{"32":1,"61":1,"64":1},"1":{"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1},"2":{"20":1,"32":6,"62":2,"64":2,"65":1,"66":1,"67":1,"224":1}}],["recalibrate",{"2":{"302":1,"304":1,"305":2,"307":1}}],["recalibration",{"0":{"302":1},"1":{"303":1,"304":1,"305":1,"306":1,"307":1}}],["recalculate",{"2":{"113":1}}],["rectangle",{"2":{"300":1}}],["recentering",{"0":{"302":1},"1":{"303":1,"304":1,"305":1,"306":1,"307":1}}],["recenter",{"0":{"295":1},"2":{"295":1,"301":2,"302":1,"304":1,"305":2,"307":2}}],["recent",{"2":{"261":1}}],["receive",{"2":{"140":3,"307":1}}],["receives",{"2":{"4":1}}],["reconnect",{"2":{"51":1,"52":1}}],["recommendation",{"2":{"215":1}}],["recommend",{"2":{"36":1,"64":1,"100":1,"130":1,"136":1,"159":1,"215":1,"220":1}}],["recommended",{"0":{"127":1,"211":1,"220":1},"1":{"129":1,"130":1,"131":1},"2":{"1":1,"3":1,"28":2,"31":1,"101":1,"106":1,"140":1,"153":1,"159":1,"181":1,"185":1,"186":1,"202":1,"208":1,"221":4,"222":1,"223":1,"229":1}}],["www",{"2":{"157":1,"214":1}}],["w",{"2":{"107":1,"118":1}}],["won",{"2":{"136":1,"266":1,"304":1,"306":1}}],["worry",{"2":{"253":1}}],["worse",{"2":{"170":1,"185":1}}],["worst",{"0":{"113":1},"1":{"114":1,"115":1},"2":{"107":1,"108":1}}],["worth",{"2":{"165":1,"215":1,"217":1}}],["work",{"0":{"306":1},"2":{"37":2,"90":1,"104":1,"133":1,"156":1,"165":1,"172":1,"175":1,"185":2,"214":1,"217":1,"221":1,"230":1,"258":1,"263":1,"270":2,"274":1,"293":1}}],["working",{"0":{"52":1},"2":{"36":2,"37":2,"38":1,"39":1,"44":1,"93":2,"95":1,"100":1,"124":1,"140":1,"156":1}}],["works",{"2":{"30":1,"99":2,"153":1,"160":1,"188":1,"222":1}}],["would",{"2":{"39":1,"66":1,"95":1,"221":1}}],["wrapped",{"2":{"232":1}}],["wrapping",{"0":{"230":1},"2":{"229":1}}],["wrap",{"2":{"230":2}}],["wroom",{"2":{"202":1,"204":1,"211":1}}],["wrooms3usb",{"2":{"37":1}}],["wrooms3qiousb",{"2":{"37":1}}],["wrooms3qio",{"2":{"37":1}}],["wrooms3",{"2":{"37":1}}],["wrong",{"0":{"264":1},"2":{"97":1,"123":1}}],["writes",{"2":{"66":2}}],["write",{"2":{"66":2}}],["written",{"2":{"15":1,"24":4,"66":1}}],["walls",{"2":{"253":1}}],["walkthrough",{"2":{"165":1}}],["wary",{"2":{"217":1}}],["warm",{"2":{"106":1}}],["warmth",{"2":{"101":1,"106":1}}],["warning",{"2":{"37":1,"175":1,"184":1}}],["watch",{"2":{"96":1,"214":1,"228":1,"271":1,"274":1}}],["wait",{"0":{"168":1},"2":{"81":1,"82":1,"84":1,"94":2,"95":1,"104":1,"270":1,"301":1}}],["washed",{"2":{"116":1}}],["was",{"2":{"32":1,"186":1,"199":1,"284":1}}],["ways",{"2":{"80":1,"126":1}}],["way",{"0":{"157":1},"2":{"24":3,"35":1,"62":1,"87":1,"92":1,"136":2,"138":1,"157":1,"158":1,"182":1,"194":1,"240":1,"273":1,"300":1,"301":1}}],["want",{"2":{"19":1,"35":1,"36":1,"39":1,"44":1,"54":1,"56":1,"62":1,"78":1,"197":1,"293":1,"305":1}}],["who",{"2":{"165":1}}],["why",{"0":{"108":1},"2":{"172":1,"221":1,"225":1}}],["whether",{"2":{"68":1,"71":2,"99":1}}],["wherever",{"2":{"217":1}}],["where",{"0":{"39":1,"159":1,"273":1},"2":{"76":1,"78":1,"93":1,"94":1,"108":1,"134":1,"175":1,"179":1,"186":1,"263":1,"265":1,"273":1,"289":1,"290":1,"291":1,"293":1,"294":1}}],["when",{"0":{"231":1},"2":{"20":2,"28":1,"30":1,"36":1,"44":1,"69":1,"78":1,"79":2,"106":1,"123":1,"133":2,"159":1,"170":1,"186":1,"202":1,"230":1,"248":1,"265":2,"271":1,"274":6}}],["whatever",{"2":{"56":1,"244":1,"295":1}}],["what",{"0":{"35":1,"38":1,"39":1,"54":1,"62":1,"92":1,"140":1,"234":1,"257":1,"258":1,"265":2,"274":1},"1":{"39":1,"141":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1},"2":{"36":1,"106":2,"153":1,"160":1,"166":1,"188":1,"212":1,"221":1,"222":1,"230":1,"297":1}}],["while",{"2":{"28":1,"87":1,"88":1,"96":1,"98":1,"106":2,"134":1,"182":1,"214":1,"228":1,"231":1,"302":1}}],["white",{"2":{"25":1,"197":2}}],["whichever",{"2":{"257":1,"270":1}}],["which",{"2":{"4":1,"66":1,"121":1,"146":1,"151":1,"175":1,"185":1,"193":1,"199":1,"221":1,"247":2,"274":1}}],["weak",{"2":{"179":1}}],["wear",{"2":{"66":1,"214":1,"231":1}}],["weeks",{"2":{"168":1}}],["weight",{"2":{"133":1,"207":1}}],["weirdly",{"2":{"238":1}}],["weird",{"2":{"79":1,"140":1}}],["were",{"2":{"106":1,"215":1}}],["welcome",{"2":{"104":1}}],["well",{"2":{"39":1,"101":1,"107":1,"123":1,"129":1,"156":1,"211":1,"217":1,"221":1}}],["went",{"0":{"264":1},"2":{"97":1}}],["webrequest",{"2":{"279":1}}],["web",{"2":{"52":1,"93":1}}],["website",{"2":{"16":1,"157":1}}],["we",{"0":{"41":1,"255":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1},"2":{"20":1,"24":2,"25":5,"33":1,"35":1,"36":3,"37":2,"38":1,"39":1,"44":2,"62":2,"64":1,"66":1,"68":1,"78":1,"93":2,"94":1,"95":1,"98":1,"100":1,"105":1,"106":3,"107":1,"113":1,"123":1,"124":1,"134":2,"136":1,"158":1,"167":1,"220":1,"239":1,"255":1,"265":2,"266":1,"269":1,"271":1,"300":2,"301":1,"305":1}}],["wiki",{"2":{"254":1}}],["wip",{"0":{"242":1},"1":{"243":1,"244":1,"245":1,"246":1,"247":1,"248":1}}],["wiggle",{"2":{"239":1}}],["widenthresholdv2",{"2":{"274":1}}],["widenthresholdv1",{"2":{"274":1}}],["widen",{"2":{"274":4}}],["wider",{"2":{"207":1}}],["wide",{"2":{"144":1,"149":1}}],["widmovr",{"2":{"127":1}}],["window",{"2":{"78":1,"84":1}}],["windows",{"2":{"30":1,"58":3,"94":1,"247":1,"279":1}}],["wifi",{"0":{"48":1,"50":1,"51":1,"68":1,"203":1,"207":1},"1":{"49":1,"50":1,"51":1,"52":1,"204":1},"2":{"28":4,"56":1,"66":7,"68":15,"70":13,"85":1,"93":1,"204":2,"207":2,"263":1}}],["wi",{"2":{"28":1,"50":2,"94":2,"97":1}}],["wish",{"2":{"20":1,"28":1,"30":1,"31":5,"68":1,"95":1,"118":1,"217":1}}],["willing",{"2":{"224":1}}],["will",{"0":{"156":1,"159":1,"164":1,"276":1},"2":{"5":1,"16":1,"17":3,"18":1,"19":3,"20":2,"21":1,"25":1,"28":7,"30":1,"31":7,"33":1,"37":2,"39":1,"48":1,"54":1,"56":1,"66":3,"67":1,"68":1,"69":1,"72":1,"77":1,"78":2,"79":2,"82":2,"84":1,"88":1,"93":1,"95":2,"98":1,"121":1,"123":2,"127":1,"131":1,"134":1,"135":1,"136":1,"138":1,"140":2,"146":1,"151":1,"156":1,"161":1,"166":1,"170":2,"171":1,"175":1,"176":1,"179":1,"185":1,"188":1,"192":1,"196":1,"202":1,"214":2,"215":1,"216":1,"221":2,"225":1,"236":1,"244":1,"247":3,"248":1,"257":1,"261":2,"262":2,"264":1,"266":1,"269":1,"271":2,"274":4,"285":1,"291":1,"294":1,"295":1,"300":2,"304":1,"305":3,"306":1}}],["wiring",{"0":{"194":1,"197":1,"245":1},"2":{"4":1,"101":1,"165":1}}],["wires",{"0":{"175":1,"176":1,"177":1,"193":1,"218":1},"2":{"175":1,"179":1,"190":1,"193":4,"194":3,"220":3,"244":2}}],["wired",{"0":{"201":1,"202":1,"208":1,"217":1,"235":1,"237":1,"247":1,"298":1},"1":{"202":1,"299":1},"2":{"37":3,"38":1,"47":1,"165":1,"200":1,"202":2,"204":2,"206":1,"207":2,"208":2,"211":2,"235":1,"237":1,"289":1}}],["wireless",{"0":{"203":1,"204":1,"207":1,"212":1,"235":1,"236":1,"248":1,"297":1},"1":{"204":1},"2":{"37":3,"38":1,"49":1,"165":1,"200":1,"202":1,"206":1,"208":1,"211":2,"212":1,"235":1,"236":1}}],["wire",{"0":{"4":1,"177":1,"178":1,"179":1,"180":1,"184":1},"2":{"175":3,"176":5,"178":1,"194":1,"197":1,"217":1,"218":3,"221":1}}],["within",{"2":{"107":1,"123":1,"302":1}}],["without",{"2":{"15":1,"31":2,"51":1,"52":1,"92":1,"94":2,"101":1,"136":1,"179":1,"193":1,"212":1,"242":1,"253":1,"301":1,"302":1}}],["with",{"0":{"170":1,"252":1,"285":1},"1":{"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"3":1,"4":1,"14":1,"20":2,"25":2,"28":2,"31":1,"35":1,"36":1,"37":3,"43":1,"62":1,"64":1,"66":1,"68":1,"78":1,"79":1,"87":1,"90":2,"94":1,"99":1,"100":1,"101":1,"104":1,"106":3,"107":1,"110":1,"113":1,"123":1,"129":1,"133":3,"134":1,"135":1,"136":1,"146":1,"151":1,"153":1,"167":2,"170":2,"179":2,"180":1,"188":1,"191":1,"196":1,"197":3,"202":4,"204":2,"207":1,"208":3,"209":1,"212":1,"214":1,"215":3,"217":2,"218":1,"222":1,"228":2,"230":1,"232":1,"234":2,"239":1,"240":1,"245":1,"257":3,"258":1,"263":1,"266":1,"268":1,"270":1,"274":7,"279":1,"281":1,"284":1,"297":1,"300":1,"302":1}}],["uuid",{"2":{"306":1}}],["uri",{"2":{"279":1}}],["url",{"2":{"17":2,"18":1,"67":3}}],["uwp",{"2":{"273":1}}],["ue",{"2":{"257":1,"262":1}}],["u",{"2":{"168":1}}],["udp",{"2":{"99":1}}],["unfinished",{"2":{"242":1}}],["unfocused",{"2":{"221":1}}],["unfortunately",{"2":{"170":1}}],["unmount",{"2":{"231":1}}],["unmounting",{"2":{"228":1}}],["unusable",{"2":{"170":1,"202":1}}],["unclear",{"2":{"124":2}}],["unsafe",{"2":{"116":1}}],["uninstall",{"2":{"266":3}}],["unified",{"2":{"257":1,"274":2}}],["unity",{"2":{"304":1}}],["unit",{"2":{"108":1,"221":1}}],["unique",{"2":{"68":1}}],["unless",{"2":{"106":1}}],["unlikely",{"2":{"37":1,"161":1}}],["until",{"2":{"84":2,"135":2,"161":1,"186":1,"202":1,"228":1,"236":1,"238":1,"239":1,"240":1,"300":1}}],["undertaking",{"2":{"124":1}}],["undergo",{"2":{"106":1}}],["under",{"0":{"95":1},"2":{"56":1,"100":1,"135":1,"247":2,"248":1,"262":1,"274":1,"281":1,"306":1}}],["understanding",{"2":{"101":1}}],["understand",{"0":{"120":1},"1":{"121":1,"122":1,"123":1,"124":1,"125":1},"2":{"22":1,"24":2,"25":1,"106":1}}],["unplug",{"2":{"51":1,"136":1,"247":1}}],["uplaod",{"2":{"95":1}}],["uploaded",{"2":{"90":1}}],["upload",{"0":{"90":1,"252":1},"2":{"77":1,"90":3,"93":1,"94":1,"95":3,"97":1,"162":1,"252":2,"305":1}}],["uploading",{"0":{"85":1,"91":1},"1":{"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":2,"93":2,"94":2,"95":2,"96":1},"2":{"72":1,"79":1,"85":1,"90":1,"94":1,"97":1,"174":1}}],["upate",{"2":{"93":1}}],["upgrading",{"0":{"83":1,"84":1},"1":{"84":1}}],["upgrade",{"2":{"81":1,"82":1,"83":1}}],["updating",{"0":{"79":1,"80":1,"97":1},"1":{"80":1,"81":2,"82":2,"83":1,"84":1,"98":1},"2":{"31":1}}],["updated",{"0":{"165":2},"2":{"97":1,"305":1}}],["update",{"2":{"31":8,"79":1,"80":1,"81":1,"82":1,"84":1,"85":1,"92":1,"94":1,"97":2}}],["updates",{"2":{"31":2,"84":1,"105":1}}],["up",{"0":{"4":1,"72":1,"94":1,"169":1,"180":1,"184":1,"194":1,"197":1,"245":1,"254":1,"258":1,"262":1,"300":1,"302":1,"303":1},"1":{"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"255":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"303":1,"304":2,"305":2,"306":1,"307":1},"2":{"35":1,"41":1,"46":1,"68":1,"84":1,"87":1,"90":1,"94":1,"96":1,"113":1,"122":1,"129":1,"133":1,"134":1,"136":1,"160":1,"171":1,"173":2,"175":1,"176":1,"182":1,"185":1,"192":1,"197":1,"202":1,"204":1,"207":1,"208":1,"224":1,"225":1,"236":1,"239":2,"240":1,"244":2,"246":1,"269":1,"273":1,"300":1,"301":1,"302":1}}],["usability",{"2":{"121":1}}],["usually",{"2":{"79":1,"265":1}}],["us",{"2":{"36":1,"39":1,"44":1,"58":1,"66":2,"100":1,"118":1,"224":2,"266":1}}],["usb",{"0":{"88":1,"137":1,"175":1,"177":1,"201":1,"208":1,"217":1},"1":{"138":1,"139":1,"202":1},"2":{"28":1,"37":1,"87":1,"88":1,"90":2,"131":1,"136":5,"172":1,"202":3,"204":1,"208":2,"217":13,"218":1,"242":2,"245":2}}],["using",{"0":{"251":1},"1":{"252":1,"253":1},"2":{"1":1,"9":1,"20":2,"28":2,"30":2,"31":1,"32":2,"33":1,"39":1,"54":3,"57":1,"58":2,"62":1,"64":1,"65":1,"67":1,"68":1,"70":1,"82":1,"90":2,"93":1,"94":2,"97":4,"101":1,"106":1,"165":1,"181":1,"196":2,"204":1,"207":1,"217":1,"218":1,"221":1,"240":1,"244":1,"268":1,"278":1}}],["usebasicparsing",{"2":{"279":1}}],["useless",{"2":{"229":1}}],["uses",{"2":{"66":1,"186":1,"204":1,"207":1,"212":1,"279":1,"306":1}}],["users",{"2":{"32":1,"100":1,"101":1,"202":1,"208":1,"266":1,"306":1}}],["user",{"0":{"28":1,"122":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"56":1,"94":1,"95":1,"106":1,"153":1,"179":1,"207":1,"222":1,"306":2}}],["useful",{"2":{"18":1,"35":1,"36":1,"54":2,"62":1}}],["use",{"0":{"55":1,"63":1,"93":1,"255":1,"262":1,"299":1},"1":{"56":1,"57":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"94":1,"95":1},"2":{"1":1,"16":2,"20":3,"24":1,"25":3,"28":1,"31":4,"35":1,"36":1,"37":1,"39":1,"48":1,"56":1,"57":1,"58":1,"64":1,"68":1,"85":1,"93":2,"95":1,"96":1,"101":3,"106":3,"116":2,"127":1,"134":1,"136":2,"144":1,"149":1,"153":1,"170":1,"181":1,"182":1,"184":2,"188":1,"197":2,"200":1,"202":1,"206":1,"212":1,"216":1,"217":1,"221":1,"228":1,"229":1,"244":1,"257":1,"262":1,"266":1,"293":1,"300":1,"302":1,"305":1}}],["used",{"2":{"1":1,"22":2,"25":2,"32":4,"36":1,"50":1,"64":1,"69":1,"123":1,"175":1,"181":1,"230":1,"274":4,"289":1,"292":1}}],["cvr",{"2":{"302":1}}],["center",{"2":{"301":2}}],["certain",{"2":{"106":1,"170":1,"216":1}}],["ctrl+b",{"2":{"271":1}}],["crop",{"2":{"291":1}}],["cropping",{"0":{"291":1},"2":{"300":1}}],["crvft",{"2":{"273":1}}],["crutial",{"2":{"193":1}}],["crevices",{"2":{"231":1}}],["creating",{"0":{"155":1},"1":{"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1}}],["created",{"2":{"158":1,"199":1,"254":1,"305":1}}],["creates",{"2":{"129":1}}],["create",{"0":{"156":1},"2":{"17":2,"18":2,"158":1,"266":1,"284":1,"305":1}}],["creep",{"2":{"122":1}}],["credit",{"2":{"78":1,"98":1,"165":1}}],["credentials",{"0":{"51":1},"2":{"28":1,"51":1,"97":3}}],["cm⁻²",{"2":{"118":1}}],["cm",{"2":{"107":1,"108":2}}],["cm²",{"2":{"107":3,"108":1,"111":2,"112":2,"114":2,"115":2}}],["cycled",{"2":{"95":1}}],["c",{"0":{"88":1},"2":{"78":1,"97":1,"136":2,"217":6,"242":1,"245":1,"266":1,"273":1,"306":1}}],["cd",{"2":{"78":1,"97":1}}],["cpptypedef",{"2":{"68":1,"70":1}}],["cutters",{"2":{"230":1}}],["cuts",{"2":{"176":1}}],["cut",{"0":{"176":1},"2":{"175":1,"176":2,"230":6,"292":1}}],["cutouts",{"2":{"129":1}}],["cura",{"2":{"90":1}}],["current",{"0":{"108":1},"2":{"66":2,"78":1,"94":1,"95":1,"97":1,"108":1,"110":1,"167":1,"266":1}}],["currently",{"0":{"255":1},"2":{"37":2,"38":1,"39":1,"66":1,"93":1,"166":1,"255":1,"278":1}}],["custommodules\`",{"2":{"271":1}}],["customlibs",{"2":{"266":2}}],["customizations",{"2":{"25":2}}],["custom",{"2":{"19":1,"35":1,"95":1,"217":1,"218":1}}],["cheaper",{"0":{"212":1,"253":1},"2":{"204":1,"207":1,"212":1}}],["checked",{"2":{"284":1}}],["checkout",{"2":{"215":1}}],["checking",{"2":{"106":1}}],["checkmark",{"2":{"49":1,"94":1}}],["check",{"2":{"28":1,"39":1,"90":1,"98":1,"104":1,"141":1,"154":1,"173":1,"221":2,"224":1,"265":1}}],["china",{"2":{"168":1}}],["chip",{"2":{"38":1}}],["ch340",{"2":{"76":2}}],["choice",{"2":{"64":1,"129":1,"217":1}}],["chosen",{"2":{"44":1}}],["choose",{"0":{"253":1},"2":{"28":1,"44":1,"47":1,"130":3}}],["chore",{"2":{"25":1}}],["charging",{"2":{"90":1}}],["character",{"2":{"28":1}}],["characters",{"2":{"28":1,"50":1}}],["chance",{"2":{"186":1,"265":1}}],["channel",{"2":{"68":2,"98":1}}],["changing",{"2":{"37":1,"67":1,"116":1}}],["changed",{"2":{"97":1,"265":1,"307":1}}],["changelog",{"2":{"25":1}}],["change",{"0":{"265":1},"2":{"20":1,"25":8,"28":2,"33":1,"37":1,"54":1,"56":3,"78":1,"94":1,"95":2,"167":1,"196":2,"262":1,"263":1,"265":1}}],["changes",{"2":{"15":2,"25":5,"54":1,"66":4,"97":3,"205":1,"290":1,"306":1}}],["circled",{"2":{"171":1,"238":1}}],["ci",{"2":{"25":2}}],["css",{"2":{"20":2}}],["cluttered",{"2":{"305":1}}],["clearer",{"2":{"215":1}}],["clears",{"2":{"66":1}}],["cleanly",{"2":{"138":1}}],["clean",{"2":{"126":1,"129":1}}],["cloning",{"2":{"78":1,"280":1}}],["cloned",{"2":{"78":1,"94":1,"97":1}}],["clone",{"0":{"78":1},"2":{"12":2,"78":5,"268":1}}],["closed",{"2":{"274":1}}],["close",{"2":{"78":1,"96":1,"101":1,"159":1,"194":1,"240":1,"271":1,"297":1}}],["clip",{"2":{"131":2,"135":4,"147":1,"152":1,"244":1}}],["cli",{"0":{"81":1}}],["clicking",{"2":{"84":1,"261":1,"304":1}}],["click",{"2":{"43":1,"44":2,"45":1,"46":1,"52":1,"82":3,"84":3,"94":1,"95":1,"271":1,"284":1,"304":3,"305":2}}],["client",{"0":{"64":1},"2":{"32":2,"64":2,"96":1}}],["class=",{"2":{"20":1}}],["class",{"2":{"20":1}}],["classes",{"2":{"20":4}}],["capable",{"0":{"202":1,"204":1},"2":{"204":1,"207":1}}],["care",{"2":{"264":1}}],["carefully",{"2":{"230":1,"238":1,"244":3}}],["careful",{"2":{"3":1,"230":1,"238":1}}],["carl",{"2":{"199":1}}],["caveats",{"2":{"196":1}}],["cataractogenesis",{"2":{"118":1}}],["categories",{"2":{"18":1,"200":1,"206":1}}],["calibrated",{"2":{"301":1}}],["calibrate",{"2":{"301":1}}],["calibrating",{"0":{"301":1}}],["calibration",{"0":{"294":1},"2":{"294":1,"301":1,"307":1}}],["calculations",{"0":{"109":1,"113":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":2,"115":2},"2":{"118":1}}],["calculated",{"2":{"106":1,"107":1,"123":1}}],["call",{"2":{"66":2}}],["called",{"2":{"17":1,"18":2,"19":1,"39":1,"82":1,"84":1,"103":1,"257":1}}],["causing",{"2":{"205":1}}],["caused",{"2":{"90":1,"123":1}}],["cause",{"2":{"66":1,"90":1,"123":1}}],["caution",{"2":{"39":1,"106":1}}],["cables",{"2":{"90":1,"131":3,"204":1,"207":1,"215":1,"217":3,"218":1,"229":1,"242":1,"244":1,"245":1}}],["cable",{"0":{"229":1},"1":{"230":1,"231":1,"232":1},"2":{"41":1,"85":1,"87":1,"90":5,"136":1,"171":1,"216":2,"230":1,"231":1,"240":2,"245":1}}],["cams",{"2":{"212":1,"224":1}}],["came",{"2":{"87":1}}],["cameras",{"0":{"171":1,"213":1,"231":1,"296":1},"1":{"214":1,"215":1,"216":1,"297":1,"298":1,"299":1,"300":1},"2":{"103":1,"146":1,"151":1,"171":1,"205":1,"212":1,"214":2,"215":3,"225":1,"228":2,"229":1,"231":1,"232":1,"242":1,"243":1,"244":2,"289":1,"297":1}}],["camera",{"0":{"71":1,"156":1,"158":1,"159":2,"214":1,"228":1,"229":1,"230":1,"238":1,"239":1,"240":1,"289":1},"1":{"230":1,"231":1,"232":1},"2":{"41":1,"47":1,"66":2,"71":1,"96":2,"101":1,"106":1,"116":1,"145":2,"146":2,"150":2,"151":2,"158":1,"159":1,"171":3,"172":1,"176":1,"185":1,"186":5,"187":3,"216":2,"222":1,"224":1,"228":1,"229":2,"230":7,"232":1,"234":2,"238":1,"239":4,"240":4,"242":1,"244":2,"289":1,"297":2,"299":1,"300":2}}],["cam",{"0":{"87":1},"2":{"37":2,"87":2,"170":1,"202":2,"204":3,"207":1,"223":1,"289":1}}],["can",{"0":{"60":1,"123":1,"221":1,"251":1},"1":{"252":1,"253":1},"2":{"18":1,"20":4,"28":2,"30":2,"31":3,"32":5,"35":1,"37":1,"39":1,"52":1,"54":2,"56":3,"57":1,"58":2,"60":1,"62":1,"64":2,"65":1,"66":1,"81":1,"82":1,"85":1,"87":1,"90":2,"93":1,"95":1,"96":1,"97":1,"103":1,"104":1,"106":2,"121":1,"123":1,"131":1,"134":1,"135":2,"136":2,"141":1,"145":1,"150":1,"157":1,"158":1,"160":1,"162":1,"170":5,"179":1,"185":1,"196":1,"202":2,"204":1,"207":1,"208":2,"214":1,"215":2,"221":2,"224":3,"229":1,"230":1,"238":1,"247":1,"253":1,"261":1,"263":1,"274":1,"289":1,"297":1,"302":1,"305":1,"307":1}}],["cases",{"2":{"87":1,"170":2,"188":1,"205":1,"265":1,"273":1}}],["case",{"0":{"113":1,"264":1,"306":1},"1":{"114":1,"115":1},"2":{"15":1,"28":1,"87":2,"107":1,"108":1,"134":2,"170":1,"175":1,"200":1,"205":1,"206":1,"293":1}}],["copy",{"2":{"271":1,"297":1}}],["copying",{"2":{"271":1}}],["copied",{"2":{"271":1}}],["copper",{"2":{"175":1}}],["cooresponding",{"2":{"247":1}}],["costly",{"2":{"202":1,"208":1}}],["count",{"2":{"304":1}}],["coupons",{"2":{"140":1}}],["coupon",{"2":{"140":1}}],["couple",{"2":{"36":1,"44":1,"82":1,"84":1,"94":1,"95":1,"97":1}}],["courtesy",{"2":{"133":2,"136":1}}],["could",{"2":{"101":1,"106":1}}],["corners",{"2":{"159":1}}],["corneal",{"2":{"107":1,"111":1,"112":1,"114":1,"115":1}}],["cornea",{"2":{"107":1,"108":1,"118":1}}],["core",{"2":{"82":1,"269":1}}],["corresponds",{"2":{"68":1,"146":1,"151":1}}],["corresponding",{"2":{"45":1,"238":1,"248":1}}],["correctly",{"2":{"28":1,"41":1,"175":1,"271":1}}],["correcting",{"2":{"25":1}}],["correct",{"2":{"3":1,"28":1,"33":1,"47":1,"60":2,"79":1,"106":1,"194":1,"196":1,"221":1}}],["codes",{"2":{"221":1}}],["code",{"0":{"23":1,"73":1,"82":1,"173":1},"1":{"24":1,"25":1,"74":1,"75":1},"2":{"24":4,"25":3,"73":1,"77":1,"79":1,"82":1,"89":1,"95":1,"140":1,"173":2,"270":1}}],["colors",{"2":{"175":1}}],["color",{"2":{"130":1}}],["colons",{"2":{"25":1}}],["colour",{"2":{"20":3}}],["collapsible",{"2":{"19":1}}],["cohesive",{"2":{"20":1}}],["covered",{"2":{"147":1,"152":1,"229":1,"230":2}}],["coverplate",{"2":{"131":1,"135":2}}],["covers",{"2":{"100":1}}],["cover",{"2":{"16":1,"170":1,"182":1,"218":1}}],["com4",{"2":{"247":1,"299":1}}],["combined",{"2":{"129":1,"252":1}}],["coming",{"2":{"93":1,"171":1}}],["comes",{"2":{"170":1,"179":1}}],["come",{"2":{"79":1,"214":1,"215":1,"234":1}}],["community",{"0":{"105":1,"156":1},"2":{"104":1,"105":1,"154":1,"224":1}}],["communicate",{"2":{"62":1,"64":1,"306":1}}],["communication",{"2":{"28":1}}],["command",{"2":{"65":2,"67":1,"78":2,"81":2,"279":1,"280":2,"281":2}}],["commits",{"2":{"25":6}}],["commit",{"0":{"25":1},"2":{"24":1,"25":6}}],["compile",{"2":{"269":1}}],["compared",{"2":{"202":1}}],["compatable",{"2":{"146":1,"151":1}}],["compatibility",{"0":{"104":1}}],["compatible",{"2":{"99":1,"224":1,"257":2,"265":1}}],["compact",{"2":{"144":1,"149":1,"217":1}}],["completions",{"2":{"140":1}}],["completeness",{"2":{"124":1}}],["completely",{"2":{"116":1,"170":2}}],["complete",{"2":{"42":1,"43":1,"45":1,"46":1,"51":1,"52":1,"140":1}}],["completed",{"0":{"6":1},"2":{"5":1,"88":1}}],["compliance",{"2":{"107":1}}],["complain",{"2":{"79":1}}],["comprehensive",{"2":{"44":1}}],["computer",{"2":{"28":2,"30":1,"62":1,"92":1}}],["componentes",{"2":{"15":1}}],["components",{"0":{"135":1},"2":{"15":1,"101":1,"102":1,"116":1,"190":1,"202":1,"220":1,"234":1,"242":1}}],["com",{"2":{"12":1,"76":1,"78":2,"90":1,"157":1,"214":1,"247":2,"251":1,"299":2}}],["convenient",{"2":{"305":1}}],["conventional",{"2":{"25":3}}],["converted",{"2":{"257":1}}],["conclusion",{"0":{"232":1,"241":1}}],["concise",{"2":{"141":1}}],["conflicts",{"2":{"202":1,"208":1}}],["confirm",{"2":{"44":1,"116":1}}],["configs",{"2":{"35":1}}],["config",{"0":{"28":1,"306":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"35":2,"56":2,"66":3,"68":1,"95":2,"97":2,"235":1,"304":2,"306":1}}],["configure",{"0":{"48":1,"50":1,"173":1},"1":{"49":1,"50":1,"51":1,"52":1},"2":{"212":1}}],["configured",{"2":{"33":1}}],["configuring",{"0":{"26":1,"296":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"297":1,"298":1,"299":1,"300":1},"2":{"39":1}}],["configuration",{"0":{"29":1,"236":1,"237":1,"273":1,"297":1,"298":1},"1":{"30":1,"31":1,"32":1,"33":1,"299":1},"2":{"25":1,"101":1,"265":1,"273":1,"306":1}}],["conditions",{"2":{"116":1}}],["cone",{"2":{"107":1,"108":1}}],["congratulations",{"2":{"90":1}}],["connector",{"2":{"171":3,"216":1,"230":2,"236":1,"238":1,"239":2,"240":3}}],["connectors",{"2":{"135":1,"145":1,"150":1,"193":1,"216":1,"217":1,"238":1}}],["connections",{"2":{"170":3,"230":1}}],["connection",{"2":{"88":1,"177":1}}],["connecting",{"0":{"238":1,"240":1},"2":{"87":1,"176":1}}],["connected",{"2":{"47":1,"60":3,"85":1,"94":2,"170":1,"171":1,"235":1,"236":1,"238":1,"263":1}}],["connect",{"0":{"57":1,"60":1,"86":1,"87":1,"88":1,"172":1,"175":1},"1":{"87":1,"88":1},"2":{"28":3,"30":1,"31":1,"45":1,"50":2,"54":2,"56":1,"57":2,"60":1,"65":1,"77":1,"87":1,"88":1,"92":1,"94":1,"96":1,"194":1,"217":1,"236":1,"245":2}}],["consent",{"2":{"253":1}}],["conservatively",{"2":{"113":1}}],["cons",{"2":{"202":1,"204":1,"207":1,"208":1}}],["consider",{"2":{"200":1,"206":1,"217":1}}],["consistent",{"2":{"20":1,"22":1}}],["consultation",{"2":{"15":1}}],["consult",{"2":{"1":1,"181":1}}],["contents",{"2":{"306":1}}],["content",{"2":{"279":1,"304":1}}],["continue",{"2":{"237":1,"278":1}}],["continuing",{"2":{"136":1,"300":1}}],["contact",{"2":{"66":1}}],["contains",{"2":{"305":1}}],["contain",{"0":{"164":1},"2":{"5":1,"50":1}}],["contributor",{"2":{"254":1}}],["contribute",{"2":{"99":1,"118":1}}],["contributing",{"0":{"13":1},"1":{"14":1,"15":1}}],["control",{"2":{"32":1,"62":2,"65":2,"67":1,"305":1}}],["fwvdbdc",{"2":{"214":1}}],["fbt",{"2":{"202":1,"204":1,"207":1,"208":1}}],["f",{"2":{"168":1}}],["familiar",{"0":{"285":1},"1":{"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1}}],["familiarize",{"2":{"14":1}}],["fast",{"2":{"274":4}}],["fail",{"2":{"271":1}}],["failing",{"2":{"265":1}}],["failures",{"2":{"106":1}}],["failure",{"2":{"106":1}}],["fan",{"2":{"134":1,"136":1}}],["fans",{"2":{"129":1,"136":1}}],["facing",{"2":{"171":1,"184":2,"194":1,"240":1}}],["facialtrackerbridgevidevfrunk1",{"2":{"131":1}}],["facialtrackerbeerhingevidevfrunk1",{"2":{"131":1}}],["facial",{"2":{"129":1,"133":1,"134":2,"202":1,"216":1}}],["factory",{"2":{"228":1}}],["fact",{"2":{"167":1}}],["face",{"2":{"129":1,"134":1,"217":3,"254":1,"274":1}}],["falling",{"2":{"136":1}}],["fall",{"2":{"113":1}}],["faq",{"0":{"272":1},"1":{"273":1,"274":1},"2":{"98":1,"265":1}}],["ftdi",{"2":{"87":1,"90":1}}],["fps",{"2":{"71":1,"202":2,"208":1}}],["functioning",{"2":{"196":1}}],["function",{"2":{"121":1}}],["functionality",{"2":{"32":1,"116":1,"307":1}}],["further",{"2":{"106":1}}],["future",{"2":{"66":1,"85":1,"192":1}}],["fully",{"2":{"32":1,"38":1,"58":1,"121":1,"194":1,"205":1,"274":3,"301":1}}],["full",{"2":{"4":1,"32":1,"33":1,"100":1,"108":1,"110":1,"212":2}}],["fetch",{"2":{"279":1}}],["female",{"2":{"136":1}}],["feed",{"2":{"225":1,"228":2,"286":1,"287":1,"288":1,"300":2}}],["feedback",{"2":{"100":1,"118":1,"153":1,"222":1}}],["feeling",{"2":{"106":1}}],["feel",{"2":{"101":1,"106":1,"124":1}}],["featured",{"2":{"32":1}}],["feature",{"0":{"299":1},"2":{"25":3,"30":2,"32":2,"67":1,"94":1}}],["features",{"2":{"5":1,"101":1,"106":1,"121":1,"191":1}}],["feat",{"2":{"25":1}}],["few",{"2":{"24":1,"133":1,"196":1}}],["frequently",{"0":{"249":1}}],["free",{"2":{"64":1,"124":1,"170":1}}],["freenove",{"2":{"37":4,"202":1,"204":1,"211":1}}],["friend",{"2":{"188":1}}],["friendly",{"2":{"94":1,"305":1}}],["frunk",{"0":{"128":1,"136":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1},"2":{"129":2,"131":2,"133":1,"134":1,"136":5,"138":1,"144":1,"146":1,"147":1,"149":1,"151":1,"152":1,"216":1}}],["frosty704",{"2":{"127":1}}],["front",{"2":{"94":1,"135":1}}],["from",{"0":{"267":1,"268":1,"275":1,"276":1,"302":1},"1":{"268":1,"269":1,"270":1,"271":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"303":1,"304":1,"305":1,"306":1,"307":1},"2":{"4":1,"37":1,"38":1,"42":1,"44":1,"58":2,"62":2,"66":1,"76":1,"78":4,"83":1,"90":2,"93":1,"94":1,"97":2,"98":1,"100":1,"108":2,"134":1,"136":1,"168":2,"170":1,"172":1,"175":1,"184":1,"188":1,"196":1,"199":1,"218":1,"221":4,"228":1,"230":3,"239":1,"247":1,"253":1,"266":2,"268":1,"269":1,"276":1,"285":1,"300":1,"302":2}}],["framerates",{"2":{"208":1}}],["framerate",{"2":{"202":1}}],["frame",{"2":{"71":1}}],["framesize",{"2":{"71":1}}],["frames",{"2":{"71":2}}],["framework",{"2":{"24":1}}],["float",{"2":{"255":1}}],["flat",{"2":{"230":1,"236":1}}],["flawless",{"2":{"122":1}}],["flashing",{"0":{"40":1,"42":1,"43":1},"1":{"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1},"2":{"39":2,"41":1,"42":2,"241":1,"247":1,"248":1}}],["flash",{"0":{"45":1,"172":1,"173":1,"174":1},"2":{"37":2,"39":1,"66":5,"76":1,"95":1,"172":1,"174":1,"204":1,"212":1,"243":1}}],["flashed",{"2":{"36":1,"44":1,"93":1,"174":1}}],["flavour",{"2":{"16":1}}],["flipping",{"2":{"240":1}}],["flip",{"2":{"2":1,"71":2,"129":1,"171":1,"182":1,"183":1}}],["figure",{"2":{"299":1}}],["field",{"2":{"297":1,"299":1,"304":1}}],["fields",{"0":{"274":1},"2":{"305":1}}],["filters",{"2":{"215":1,"242":1}}],["filter",{"0":{"225":1,"226":1,"227":1},"1":{"226":1,"227":1},"2":{"214":4,"215":1,"225":2}}],["files",{"0":{"252":1,"259":1},"1":{"260":1,"261":1},"2":{"16":1,"25":2,"78":1,"94":2,"97":1,"221":1,"222":1,"306":2}}],["file",{"0":{"28":1,"273":1,"274":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"15":1,"17":3,"18":1,"19":3,"20":1,"21":1,"56":2,"69":1,"94":1,"95":2,"141":2,"265":2,"271":1,"273":2,"283":1,"289":1,"304":2,"305":1}}],["fitting",{"2":{"138":1}}],["fit",{"2":{"131":1,"185":2,"197":1,"224":1}}],["finger",{"2":{"240":1,"297":1}}],["fingernails",{"2":{"171":1}}],["fine",{"2":{"171":1,"271":1}}],["final",{"0":{"121":1},"2":{"134":1,"165":1,"170":1}}],["finally",{"2":{"88":1}}],["finnish",{"2":{"82":1}}],["finished",{"2":{"133":1}}],["finish",{"2":{"81":1,"94":1}}],["finding",{"0":{"96":1}}],["find",{"0":{"157":1,"158":1},"2":{"20":2,"52":1,"94":1,"98":1,"103":1,"134":1,"157":1,"176":1,"185":1,"188":1,"221":1,"247":1,"261":1,"263":1,"266":1,"273":1,"285":1,"297":1,"299":1,"304":2}}],["fi",{"2":{"28":1,"50":2,"94":2,"97":1}}],["firmly",{"2":{"90":1,"236":1}}],["firmware",{"0":{"26":1,"34":1,"40":1,"42":1,"43":1,"45":1,"78":1,"85":1,"89":1,"90":1,"94":1,"95":1,"97":1,"103":1,"122":1,"173":1,"174":1},"1":{"27":1,"28":1,"29":1,"30":1,"31":1,"32":1,"33":1,"35":1,"36":1,"37":1,"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"98":1},"2":{"28":1,"31":6,"32":1,"33":2,"35":4,"36":1,"38":1,"39":2,"42":2,"44":1,"56":2,"69":1,"72":1,"76":1,"77":1,"78":2,"79":1,"85":2,"89":1,"90":5,"92":1,"93":3,"94":1,"95":1,"97":2,"100":1,"101":1,"103":1,"122":1,"174":1,"212":1,"241":1,"243":1,"246":1,"247":1,"248":1}}],["firstly",{"2":{"305":1}}],["first",{"2":{"4":1,"36":1,"37":1,"85":1,"87":1,"93":1,"99":1,"147":1,"152":1,"161":1,"170":1,"197":1,"230":2,"238":1,"239":1,"263":1,"266":1,"268":1,"274":4,"279":1}}],["fixes",{"2":{"25":1}}],["fix",{"2":{"25":2,"306":1}}],["focus",{"2":{"228":1}}],["focused",{"2":{"101":2,"221":1}}],["fov",{"0":{"215":1},"2":{"215":1,"234":1,"239":1}}],["four",{"2":{"217":1}}],["fourm",{"2":{"154":1}}],["found",{"2":{"39":1,"95":1,"131":1,"146":1,"151":1,"230":1}}],["footprint",{"2":{"221":1}}],["footer",{"2":{"25":1}}],["foow17",{"2":{"127":2}}],["font",{"2":{"20":2}}],["fold",{"2":{"230":1,"231":1}}],["folding",{"2":{"230":1}}],["folder",{"2":{"12":1,"15":2,"17":1,"18":4,"19":1,"21":1,"78":1,"280":1,"281":1}}],["follows",{"2":{"25":2,"47":1,"65":1}}],["followed",{"2":{"24":1,"57":1}}],["following",{"0":{"252":1,"255":1},"2":{"19":1,"20":1,"25":2,"30":2,"65":1,"66":1,"67":2,"68":2,"70":2,"90":1,"97":1,"98":1,"100":1,"169":1,"184":2,"194":1,"229":1,"234":1,"242":3,"279":1}}],["follow",{"2":{"15":1,"25":1,"39":1,"42":1,"68":1,"70":1,"84":1,"90":1,"93":1,"97":1,"101":1,"126":1,"243":1,"283":1}}],["force",{"2":{"171":2,"274":1}}],["form",{"2":{"156":1,"223":1,"305":1}}],["formula",{"0":{"117":1}}],["format",{"2":{"30":1,"67":1,"68":1,"70":1}}],["formatting",{"2":{"25":1,"141":1}}],["formatted",{"2":{"16":1}}],["forward",{"2":{"78":1,"216":1,"301":1}}],["for",{"0":{"9":1,"94":1,"95":1,"156":1,"165":1,"168":1,"176":1,"217":1,"221":1,"253":1,"254":1,"266":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"255":1,"267":1,"268":1,"269":1,"270":1,"271":1},"2":{"9":1,"15":1,"16":2,"17":1,"18":2,"19":1,"20":1,"22":1,"24":2,"25":2,"28":4,"31":1,"32":2,"33":2,"35":2,"36":4,"37":14,"38":2,"39":2,"41":1,"44":2,"56":1,"57":1,"58":2,"62":1,"64":1,"65":1,"66":1,"67":1,"68":3,"69":6,"70":1,"72":1,"77":1,"78":1,"81":1,"82":1,"84":1,"87":1,"90":1,"92":1,"94":5,"95":2,"96":3,"97":1,"99":2,"100":1,"104":1,"105":1,"106":1,"107":3,"108":1,"118":1,"123":1,"126":1,"127":1,"129":5,"130":1,"131":2,"134":1,"140":2,"141":1,"146":1,"151":1,"153":3,"154":1,"156":1,"157":4,"159":1,"160":2,"168":1,"175":2,"176":5,"182":1,"185":1,"188":2,"192":3,"196":1,"202":1,"204":1,"207":1,"208":1,"209":1,"212":5,"215":1,"216":2,"217":4,"221":3,"222":4,"223":3,"224":2,"241":1,"242":1,"243":1,"252":1,"253":1,"257":3,"261":1,"263":1,"264":1,"265":1,"266":2,"269":1,"270":1,"273":1,"274":8,"289":1,"293":1,"294":1,"297":1,"300":1,"301":3,"302":1,"304":1,"305":2}}],["fox",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["evt",{"2":{"266":1}}],["everyone",{"2":{"118":1}}],["every",{"2":{"104":1}}],["everything",{"0":{"161":1},"2":{"36":3,"44":1,"46":1,"97":1,"100":1,"168":1,"270":1,"271":1,"300":1}}],["event",{"2":{"221":1,"253":1}}],["evenly",{"2":{"134":1}}],["even",{"2":{"54":1,"67":1,"79":1,"196":1,"221":1}}],["electrical",{"2":{"229":1,"230":2}}],["elements",{"2":{"20":1}}],["ethernet",{"2":{"263":1}}],["etvrmoduleconfig",{"2":{"273":1}}],["etvr",{"0":{"256":2,"261":1,"262":1,"268":1},"1":{"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2},"2":{"126":1,"129":1,"140":1,"141":1,"228":1,"248":1,"257":3,"258":1,"261":1,"262":2,"263":2,"264":3,"266":2,"269":2,"302":1,"304":2,"307":2}}],["etc",{"2":{"25":1,"106":1,"300":1,"301":1}}],["equally",{"2":{"134":1}}],["equal",{"2":{"116":2}}],["equation",{"2":{"38":1}}],["equivalent",{"2":{"107":1}}],["empty",{"2":{"305":1}}],["emulation",{"2":{"274":7}}],["emulating",{"2":{"274":3}}],["email",{"2":{"253":1}}],["emission",{"2":{"108":1,"110":1,"117":1}}],["emitter",{"0":{"106":1},"1":{"107":1,"108":1},"2":{"221":2,"242":1}}],["emitters",{"0":{"123":1,"219":1},"1":{"220":1,"221":1},"2":{"101":1,"106":3,"107":1,"116":1,"123":1,"218":1,"221":4,"222":1,"224":1}}],["embedded",{"2":{"84":1}}],["error",{"2":{"79":1}}],["effects",{"2":{"106":1,"118":1}}],["effect",{"2":{"71":1,"101":1,"257":1}}],["e",{"2":{"35":2,"108":1,"111":2,"112":2,"114":2,"115":2,"117":3,"192":3,"194":1,"202":1,"208":1,"299":1}}],["espcam32",{"2":{"212":1}}],["especially",{"2":{"99":1,"101":1}}],["espressif",{"2":{"84":1}}],["espaithinker",{"2":{"35":1}}],["esp32wrover",{"2":{"37":2}}],["esp32m5stack",{"2":{"37":2}}],["esp32aithinker",{"2":{"37":3,"95":2}}],["esp32cams",{"2":{"37":1}}],["esp32cam",{"2":{"35":1,"37":3}}],["esp32",{"0":{"87":1,"88":1,"233":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"31":2,"37":8,"38":1,"41":1,"56":1,"57":2,"65":2,"87":2,"88":1,"103":1,"202":2,"204":3,"207":1,"211":1,"212":1,"215":1,"217":2,"223":1,"234":1,"241":1,"242":1}}],["esp",{"0":{"170":1,"172":1,"174":1,"178":1,"179":1,"180":1,"200":1,"206":1},"1":{"207":1,"208":1},"2":{"28":7,"31":4,"33":2,"37":3,"62":1,"64":1,"66":1,"68":1,"69":1,"78":1,"89":1,"90":1,"94":1,"96":2,"170":3,"171":1,"172":2,"174":1,"180":1,"207":1,"211":1,"212":1,"223":1,"245":1,"247":2}}],["esps",{"0":{"171":1,"202":1,"204":1},"2":{"4":1,"28":2,"30":3,"31":1,"32":2,"33":1,"66":1,"93":3,"95":2,"205":1,"212":1,"217":2,"218":2,"243":2,"244":1,"245":1,"297":1,"299":1}}],["either",{"2":{"28":1,"79":1,"134":1,"160":1,"170":1,"181":1,"228":1,"268":1,"305":1}}],["easier",{"2":{"177":1,"192":1,"204":1,"207":1,"269":1,"270":1}}],["easiest",{"2":{"157":1}}],["easily",{"2":{"35":1,"62":1,"81":1,"188":1,"228":1,"238":1}}],["easy",{"2":{"22":1,"24":5,"25":3,"87":1,"144":1,"149":1,"170":1,"273":1}}],["each",{"0":{"111":1,"112":1},"2":{"3":1,"28":1,"33":1,"35":1,"56":1,"185":2,"216":1,"230":1,"240":1,"263":1,"301":1}}],["enough",{"0":{"108":1},"2":{"182":1,"265":1,"306":1}}],["encountered",{"2":{"98":1}}],["enum",{"2":{"68":2,"70":2}}],["env",{"2":{"94":1,"95":1}}],["envs",{"2":{"37":1}}],["enviroment",{"2":{"37":1}}],["enviroments",{"2":{"33":1}}],["environnement",{"2":{"36":1}}],["environment",{"0":{"72":1},"1":{"73":1,"74":1,"75":1,"76":1,"77":1,"78":1},"2":{"33":2,"35":1,"36":5,"37":10,"44":1,"93":1,"94":4,"95":3}}],["environments",{"0":{"33":1,"34":1},"1":{"35":1,"36":1,"37":1},"2":{"28":1,"33":1,"35":2,"95":1}}],["enter",{"2":{"81":1,"97":1,"247":1,"248":1,"289":1,"297":1,"299":1}}],["entering",{"2":{"78":1}}],["entered",{"2":{"28":1,"52":1}}],["entirely",{"2":{"129":1}}],["entire",{"2":{"20":1,"230":1}}],["enableota",{"2":{"31":1,"95":1}}],["enabled",{"2":{"30":1,"32":1,"56":1}}],["enable",{"0":{"56":1},"2":{"30":2,"31":1,"68":1}}],["enableadhoc",{"2":{"28":2}}],["enabling",{"2":{"28":1}}],["english",{"2":{"24":2}}],["ensures",{"2":{"221":1}}],["ensure",{"2":{"22":1,"24":2,"25":2,"41":2,"47":1,"49":1,"101":1,"106":1,"116":1,"135":1,"185":1,"196":2,"217":3}}],["ends",{"2":{"217":1}}],["endpoints",{"0":{"66":1},"2":{"66":3}}],["endpoint",{"2":{"65":2,"66":3,"67":1}}],["end",{"2":{"2":1,"182":1,"183":2,"192":2,"217":1,"240":1,"266":1}}],["e67e22",{"2":{"20":2}}],["exe",{"2":{"283":1}}],["executed",{"2":{"271":1}}],["exercise",{"2":{"106":1}}],["extremely",{"2":{"196":1}}],["extremes",{"2":{"159":1,"294":1,"301":1}}],["extracting",{"2":{"268":1}}],["extra",{"0":{"130":1,"145":1,"150":1}}],["external",{"0":{"170":1},"2":{"25":1,"170":2,"204":1,"207":1,"212":1,"234":1}}],["extensive",{"2":{"44":1}}],["extensions",{"0":{"216":1},"2":{"127":1,"145":1,"150":1,"216":2}}],["extension",{"2":{"19":1,"64":1,"77":1,"145":1,"150":1,"215":1,"216":1,"257":1}}],["extend",{"2":{"24":2,"25":1}}],["excellent",{"2":{"129":1}}],["excessive",{"2":{"106":1}}],["excited",{"2":{"105":1}}],["exactly",{"2":{"106":2,"123":1,"221":1}}],["example",{"2":{"17":1,"18":1,"19":1,"20":1,"25":3,"31":1,"57":1,"65":1,"94":1,"95":1,"97":1,"131":2,"157":1,"170":1,"179":1,"182":1,"194":1,"217":1,"252":1,"300":4}}],["examples",{"2":{"16":1,"36":1}}],["expand",{"2":{"304":1,"305":1}}],["expressive",{"2":{"274":1}}],["expressions",{"2":{"274":2,"304":1,"305":1}}],["expression",{"2":{"257":1}}],["expensive",{"2":{"217":1}}],["experimental",{"0":{"298":1},"1":{"299":1},"2":{"215":1}}],["experiment",{"2":{"160":1}}],["experience",{"2":{"106":1,"121":1}}],["experiences",{"2":{"99":1}}],["expected",{"2":{"257":1}}],["expect",{"2":{"121":1,"166":1}}],["expose",{"2":{"231":1}}],["exposed",{"2":{"106":1,"175":1,"176":1}}],["exposures",{"2":{"107":1,"118":1}}],["exposure",{"0":{"109":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"115":1},"2":{"106":1,"107":1,"108":1,"118":1}}],["explains",{"2":{"302":1}}],["explain",{"2":{"274":1}}],["explanation",{"2":{"274":1}}],["explore",{"2":{"99":1}}],["explicitly",{"2":{"44":1}}],["exist",{"2":{"266":1}}],["exists",{"2":{"87":1}}],["existing",{"0":{"156":1},"2":{"25":1,"66":1,"99":1,"239":1,"266":1}}],["ex",{"2":{"78":1,"141":1,"216":1}}],["editing",{"0":{"21":1}}],["edit",{"2":{"16":1,"21":2,"165":1,"185":1}}],["eyebrowthresholdlowering",{"2":{"274":1}}],["eyebrowthresholdrising",{"2":{"274":1}}],["eyebrow",{"2":{"274":3}}],["eyetrackapp",{"2":{"280":1,"281":3}}],["eyetrack",{"2":{"131":1}}],["eyetrackvr",{"0":{"5":1,"9":1,"99":1,"282":1,"283":2,"284":1},"1":{"6":1,"7":1,"8":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"100":1,"101":1,"102":1,"103":1,"104":1,"105":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"9":1,"12":2,"17":1,"18":1,"22":1,"69":1,"78":2,"90":1,"99":1,"101":1,"103":1,"104":1,"106":1,"107":1,"138":1,"140":1,"278":1,"279":1}}],["eyesy",{"2":{"255":1}}],["eyes",{"0":{"288":1,"301":1},"2":{"101":1,"106":3,"123":1,"274":1,"288":1,"301":2,"305":1}}],["eye",{"0":{"101":1,"106":1,"254":1,"286":1,"287":1,"295":1},"1":{"107":1,"108":1,"255":1},"2":{"2":1,"37":2,"99":2,"101":2,"106":1,"107":1,"108":1,"116":1,"118":1,"159":1,"165":1,"176":2,"182":1,"192":1,"194":1,"196":1,"197":4,"214":1,"215":1,"247":1,"248":1,"274":5,"286":1,"287":1,"291":1,"293":1,"294":1,"295":1,"297":2,"300":2,"301":7}}],["1x",{"2":{"130":4,"131":6,"217":1,"218":3,"221":1,"223":2}}],["16",{"0":{"181":1}}],["160",{"2":{"127":1,"146":1,"151":1,"215":1}}],["160°",{"0":{"215":1,"227":1},"2":{"127":3,"225":1}}],["168",{"2":{"52":2}}],["123building",{"2":{"269":1}}],["1234",{"2":{"111":1,"112":1,"114":1,"115":1}}],["12345678",{"2":{"95":1}}],["1234567891011121314",{"2":{"68":1,"70":1}}],["123456789note",{"2":{"19":1}}],["12345",{"2":{"25":1,"95":1,"117":1}}],["12345the",{"2":{"25":1}}],["127",{"2":{"263":1}}],["1206",{"2":{"221":1}}],["120°",{"2":{"108":1,"110":1,"127":1}}],["12",{"0":{"177":1},"2":{"108":1,"179":1,"180":1}}],["1−cosθ",{"2":{"108":1,"117":1}}],["13",{"0":{"178":1}}],["130°",{"0":{"226":1},"2":{"215":1}}],["130ohm",{"2":{"197":1}}],["130",{"2":{"127":2,"146":1,"151":1,"215":1,"244":1}}],["13×",{"2":{"107":1}}],["13dbm",{"2":{"68":2,"70":2}}],["110mm",{"2":{"127":1}}],["11",{"0":{"176":1},"2":{"107":1,"278":1}}],["11dbm",{"2":{"68":2,"70":2}}],["1dbm",{"2":{"68":2,"70":2}}],["18",{"0":{"182":1},"2":{"68":2,"70":2}}],["19dbm",{"2":{"68":2,"70":2}}],["19",{"0":{"185":1},"1":{"186":1,"187":1},"2":{"68":2,"70":2,"112":2}}],["192",{"2":{"52":2}}],["14mm",{"2":{"223":1}}],["1400",{"2":{"107":1}}],["14",{"0":{"179":1},"2":{"68":1,"180":1}}],["1by",{"2":{"56":1}}],["1this",{"2":{"20":1}}],["10mm",{"2":{"130":1}}],["100",{"2":{"107":1,"118":1,"121":1}}],["1000",{"2":{"107":1,"118":1}}],["10",{"0":{"175":1},"2":{"11":1,"107":1,"118":1}}],["17dbm",{"2":{"68":2,"70":2}}],["17",{"0":{"2":1}}],["1",{"0":{"42":1,"49":1,"73":1,"86":1,"87":1,"94":2,"95":1,"133":1,"157":1,"166":1,"186":1,"201":1,"207":1,"283":1},"1":{"74":1,"75":1,"87":1,"88":1,"202":1},"2":{"1":1,"2":1,"11":1,"12":4,"20":1,"28":2,"31":1,"65":1,"68":1,"71":3,"94":2,"95":2,"97":1,"107":2,"108":2,"110":1,"114":3,"115":1,"130":1,"157":1,"181":1,"182":1,"242":2,"263":1,"274":11,"279":1}}],["1st",{"2":{"1":1,"181":1}}],["15dbm",{"2":{"68":2,"70":2}}],["15",{"0":{"1":1,"180":1},"2":{"11":1,"140":1}}],["n",{"2":{"168":1,"192":2,"194":3}}],["nm",{"2":{"107":2,"118":1}}],["nummbers",{"2":{"106":1}}],["numbers",{"2":{"299":1}}],["number",{"2":{"68":1,"70":1,"71":3,"289":1,"299":1}}],["night",{"0":{"215":1},"2":{"225":1}}],["nir",{"2":{"101":1}}],["nicely",{"2":{"228":1}}],["nice",{"2":{"20":1}}],["npm",{"2":{"25":1}}],["navigating",{"2":{"78":1}}],["navigate",{"2":{"12":1,"94":1,"266":2}}],["namely",{"2":{"205":1,"269":1}}],["named",{"2":{"94":1,"304":1}}],["name",{"0":{"142":1},"1":{"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1},"2":{"17":1,"28":2,"30":1,"31":1,"50":1,"54":3,"56":5,"57":2,"60":2,"65":2,"67":1,"68":1,"69":2,"94":3,"95":2,"141":2,"266":1,"305":2}}],["names",{"2":{"15":1}}],["naming",{"2":{"15":1}}],["nonfunctioning",{"2":{"196":1}}],["none",{"2":{"156":1,"185":1,"305":1}}],["non",{"2":{"101":2,"196":1}}],["now",{"2":{"36":1,"44":1,"90":1,"96":1,"134":1,"135":1,"136":1,"147":2,"152":2,"158":1,"171":1,"182":1,"197":2,"230":1,"239":1,"240":1,"241":1,"244":3,"245":2,"261":1,"271":1,"281":1,"300":4,"301":1,"304":1,"305":3}}],["no",{"2":{"25":1,"129":1,"131":2,"146":1,"151":1,"186":1,"188":1,"196":1,"202":1,"204":1,"205":1,"208":1,"220":1,"224":1,"262":1,"265":1,"273":1}}],["normal",{"2":{"192":1}}],["nor",{"2":{"25":1,"304":1}}],["node",{"2":{"11":1}}],["notoriously",{"2":{"229":1}}],["noting",{"2":{"165":1,"215":1,"217":1}}],["notice",{"0":{"101":1},"2":{"263":1}}],["nothing",{"2":{"31":1}}],["noted",{"2":{"170":1}}],["notes",{"2":{"110":1}}],["note",{"0":{"299":1},"2":{"28":1,"37":1,"39":1,"41":1,"48":2,"66":3,"68":2,"70":1,"78":1,"96":1,"127":1,"146":1,"151":1,"167":1,"171":2,"172":1,"182":1,"205":1,"215":1,"252":1,"271":1,"302":1,"307":1}}],["not",{"0":{"60":1,"121":1,"156":1,"165":1},"2":{"1":2,"3":1,"4":1,"15":2,"19":2,"25":2,"28":5,"30":1,"31":2,"32":3,"36":2,"37":3,"39":1,"44":1,"48":1,"54":3,"56":4,"60":2,"66":1,"67":3,"68":1,"78":2,"89":1,"90":1,"95":1,"101":1,"104":2,"106":6,"108":1,"116":3,"121":2,"122":1,"123":1,"133":1,"134":1,"136":1,"145":1,"147":1,"150":1,"152":1,"154":1,"156":1,"170":5,"171":1,"175":1,"181":2,"196":1,"211":3,"214":1,"215":1,"216":1,"217":2,"221":5,"224":2,"230":2,"231":4,"235":1,"237":1,"240":1,"244":1,"252":1,"276":2,"304":1,"307":1}}],["nearly",{"2":{"159":1}}],["near",{"0":{"106":1},"1":{"107":1,"108":1},"2":{"176":1,"188":1,"216":1}}],["nevertheless",{"2":{"165":1}}],["never",{"2":{"101":1}}],["next",{"2":{"44":1,"45":1,"84":1,"94":1,"95":1,"133":1,"153":1,"173":1,"174":1,"182":1,"222":1,"237":1,"263":1,"266":1,"269":2,"301":1}}],["necessary",{"2":{"41":1}}],["networkname",{"2":{"68":1}}],["networks",{"2":{"48":1,"68":1}}],["network",{"0":{"50":1},"2":{"28":1,"30":1,"31":1,"39":1,"48":1,"50":2,"60":2,"66":4,"68":6,"69":1,"95":1,"263":2}}],["neither",{"2":{"25":1}}],["newest",{"0":{"97":1},"1":{"98":1},"2":{"97":1}}],["new",{"2":{"17":1,"25":4,"32":1,"39":1,"56":1,"62":1,"66":3,"78":1,"88":1,"93":1,"100":1,"266":1}}],["needs",{"2":{"204":1,"207":1,"217":1,"307":1}}],["need",{"0":{"258":1},"1":{"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1},"2":{"2":1,"17":1,"19":3,"21":1,"28":6,"31":5,"33":1,"36":1,"37":1,"39":1,"44":1,"48":1,"50":2,"56":2,"57":1,"76":1,"83":1,"93":1,"95":1,"97":1,"129":1,"131":1,"133":1,"146":1,"151":1,"153":1,"158":1,"170":2,"176":1,"182":1,"193":1,"194":1,"211":1,"212":1,"216":1,"217":1,"222":1,"228":1,"230":1,"236":1,"237":1,"239":1,"244":1,"247":1,"252":1,"258":1,"262":1,"263":1,"271":1,"273":2,"276":1,"301":1,"302":1,"304":3,"305":1,"307":1}}],["needed",{"0":{"130":1,"145":1,"150":1},"2":{"1":1,"25":1,"78":1,"145":1,"150":1,"181":1,"186":1,"205":1}}],["negative",{"0":{"179":1},"2":{"1":2,"175":1,"179":1,"181":2}}],["blurry",{"0":{"228":1},"2":{"228":2}}],["black",{"2":{"171":2,"197":3,"240":1}}],["blender",{"2":{"153":1,"252":1}}],["blocking",{"2":{"134":1}}],["bit",{"2":{"187":1,"193":1,"204":1,"207":1,"263":1,"273":1,"274":1}}],["bigscreen",{"2":{"141":1,"215":1}}],["bigger",{"2":{"133":1}}],["bin",{"0":{"113":1,"114":1,"115":1},"1":{"114":1,"115":1},"2":{"113":1}}],["binary",{"2":{"69":1}}],["bizarre",{"2":{"79":1}}],["b",{"0":{"118":1},"2":{"45":1,"147":1,"152":1}}],["bare",{"2":{"218":1}}],["bard",{"2":{"84":1}}],["bag",{"0":{"170":1},"2":{"170":2}}],["balty",{"2":{"165":1}}],["backing",{"2":{"300":1}}],["back",{"2":{"136":1,"171":1,"230":1,"244":1,"262":1,"264":1,"300":1,"305":1}}],["background",{"2":{"100":1}}],["babble",{"2":{"129":1,"134":2}}],["bandwidth",{"2":{"202":1}}],["band",{"2":{"28":3}}],["based",{"2":{"153":1,"158":1,"222":1}}],["bashfeat",{"2":{"25":1}}],["bash",{"2":{"25":1,"78":1}}],["basic",{"0":{"156":1},"2":{"4":1,"32":1,"64":1,"158":1,"166":1,"224":2,"285":1}}],["bounces",{"2":{"305":1}}],["bool",{"2":{"304":3,"307":1}}],["boot",{"2":{"88":3}}],["box",{"0":{"234":1}}],["bom",{"0":{"139":1}}],["bodily",{"2":{"106":1}}],["body",{"2":{"25":1,"212":1}}],["bottom",{"2":{"89":1,"133":1,"136":1,"176":1,"187":1,"216":1,"230":1}}],["both",{"0":{"288":1},"2":{"28":2,"56":1,"107":1,"129":1,"170":1,"217":1,"218":1,"222":2,"252":1,"263":1,"264":1,"270":2,"288":1,"297":1,"301":1,"304":2}}],["bonjour",{"0":{"58":1},"2":{"58":4}}],["board",{"0":{"37":1,"44":1,"49":1,"175":1},"2":{"35":1,"37":3,"44":3,"45":2,"47":1,"49":1,"51":1,"52":1,"87":1,"88":1,"90":1,"95":1,"105":1,"170":1,"175":1,"194":1,"196":3,"197":1,"202":1,"204":1,"212":4,"234":1,"236":1,"238":1,"245":1}}],["boards",{"0":{"210":1},"1":{"211":1,"212":1},"2":{"1":1,"37":5,"39":1,"160":1,"170":1,"181":1,"192":1,"202":1,"204":1,"207":1,"214":1,"215":1,"216":1,"217":2,"220":2,"222":1,"242":1}}],["breakable",{"2":{"228":1}}],["breakout",{"2":{"217":1,"218":1}}],["break",{"2":{"186":1,"214":1,"238":1}}],["breaking",{"0":{"265":1},"2":{"25":7,"186":1,"228":1,"265":1}}],["bridging",{"2":{"170":1}}],["bridge",{"2":{"131":2,"133":1,"134":2,"170":3}}],["bring",{"2":{"124":1}}],["bright",{"2":{"71":1,"196":2}}],["brightness",{"2":{"71":1,"101":1,"106":1,"116":2}}],["branch",{"2":{"78":1}}],["brows",{"2":{"274":1}}],["browser",{"2":{"12":1,"32":1,"52":1,"64":1,"94":1,"96":1,"174":1,"297":2,"304":1}}],["broadcast",{"2":{"68":1}}],["broken",{"2":{"35":1}}],["broccoli",{"2":{"25":1}}],["bypass",{"2":{"101":1,"106":1}}],["by",{"0":{"164":1,"251":1},"1":{"252":1,"253":1},"2":{"24":1,"30":1,"32":4,"37":1,"39":1,"48":1,"56":1,"57":1,"68":1,"69":1,"78":2,"81":1,"88":1,"90":1,"94":1,"95":1,"96":1,"99":1,"100":1,"103":1,"141":1,"158":1,"182":1,"194":1,"199":1,"225":1,"228":1,"229":1,"230":1,"239":1,"240":2,"244":1,"254":1,"257":1,"263":1,"264":1,"268":1,"274":12,"297":1,"300":1,"301":1,"305":1}}],["bunch",{"2":{"305":1}}],["burn",{"2":{"221":1}}],["bump",{"2":{"135":1}}],["buying",{"2":{"215":1,"221":1}}],["buy",{"2":{"123":1,"205":1,"221":2}}],["bugs",{"2":{"121":1,"122":1}}],["bug",{"2":{"25":2,"67":1}}],["buttons",{"0":{"305":1},"2":{"51":1,"52":1,"95":1,"305":2}}],["button",{"2":{"45":2,"84":1,"87":3,"88":3,"89":1,"90":1,"94":2,"95":2,"96":1,"297":1,"299":1,"300":1,"301":3,"304":1,"305":2}}],["but",{"2":{"20":1,"28":1,"37":1,"45":1,"54":1,"89":1,"93":1,"94":1,"100":1,"101":3,"104":1,"124":1,"126":1,"134":1,"171":1,"179":2,"193":1,"214":1,"215":1,"228":1,"230":1,"274":1,"304":1}}],["builds",{"2":{"89":1}}],["building",{"0":{"85":1,"217":1,"267":1,"271":1},"1":{"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"268":1,"269":1,"270":1,"271":1},"2":{"79":1,"93":1,"174":1,"229":2}}],["build",{"0":{"36":1,"89":1,"163":1,"242":1,"275":1,"276":1,"281":1},"1":{"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1},"2":{"25":2,"35":1,"36":1,"44":1,"77":1,"79":1,"89":1,"94":3,"99":1,"100":1,"126":1,"212":1,"242":1,"266":1,"271":3,"276":1,"279":1,"281":2,"305":1}}],["builtin",{"2":{"65":2,"67":1}}],["built",{"2":{"9":1,"20":1,"90":1,"101":1}}],["buil",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["because",{"2":{"300":1}}],["behave",{"2":{"273":1}}],["bend",{"2":{"231":1}}],["beyond",{"2":{"141":1,"215":1}}],["beer",{"2":{"133":1,"134":3}}],["been",{"2":{"90":1,"154":1,"171":1,"205":1,"230":1,"300":1}}],["believe",{"2":{"118":1}}],["below",{"2":{"14":1,"49":1,"90":1,"101":2,"106":1,"107":3,"136":1,"170":2,"171":1,"179":1,"184":2,"185":1,"191":1,"238":1,"240":1}}],["begin",{"2":{"88":1,"230":3,"239":1,"274":4}}],["being",{"2":{"66":1,"106":1,"129":1,"221":1,"300":2,"304":1}}],["better",{"2":{"185":1,"202":1,"208":1,"231":1,"274":1}}],["beta",{"0":{"208":1,"299":2},"2":{"39":1,"202":1}}],["between",{"2":{"35":1,"71":1,"196":1,"221":1,"235":1}}],["best",{"0":{"231":1},"2":{"28":1,"153":1,"160":1,"170":2,"188":1,"222":1,"229":1,"232":1,"293":1,"301":1}}],["before",{"0":{"41":1,"119":1,"120":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"120":1,"121":2,"122":2,"123":2,"124":2,"125":2},"2":{"19":1,"78":1,"100":1,"116":1,"136":1,"141":1,"172":2,"196":1,"200":1,"206":1,"229":1,"278":1}}],["be",{"0":{"123":1,"124":1,"165":1},"2":{"1":1,"3":1,"15":1,"17":2,"18":1,"20":1,"24":5,"31":1,"32":4,"33":1,"36":4,"43":1,"44":3,"45":1,"52":1,"54":1,"56":3,"64":1,"66":1,"67":1,"68":1,"69":2,"78":3,"82":1,"85":1,"88":1,"90":2,"93":1,"95":3,"98":1,"106":2,"118":1,"123":2,"124":1,"133":1,"134":3,"136":1,"140":1,"154":1,"162":1,"170":3,"171":3,"179":1,"181":1,"182":1,"185":1,"186":1,"192":1,"196":1,"202":3,"204":1,"207":1,"208":2,"211":1,"214":1,"217":1,"221":2,"224":2,"225":2,"230":3,"232":1,"236":1,"238":1,"240":1,"247":2,"257":1,"261":1,"266":1,"269":1,"271":1,"274":6,"281":2,"283":1,"284":1,"289":1,"293":1,"297":1,"302":1,"304":3,"305":1,"307":2}}],["ov2640",{"0":{"215":1},"2":{"215":1,"242":1}}],["overhangs",{"2":{"135":1}}],["overview",{"0":{"102":1,"120":1},"1":{"121":1,"122":1,"123":1,"124":1,"125":1},"2":{"166":1}}],["overwritten",{"2":{"68":1}}],["over",{"0":{"201":1,"203":1,"207":1,"208":1},"1":{"202":1,"204":1},"2":{"38":1,"39":1,"66":1,"85":1,"90":1,"92":1,"93":1,"99":1,"107":1,"135":3,"230":1,"260":1,"263":1,"264":1,"285":1,"297":1,"300":1}}],["ohm",{"2":{"170":1,"221":2}}],["od",{"2":{"130":1}}],["occur",{"2":{"121":1}}],["octal",{"2":{"37":2}}],["osc",{"0":{"306":1},"2":{"99":1,"262":1,"274":1,"302":2,"306":1,"307":1}}],["oldest",{"2":{"68":1}}],["otaserverport",{"2":{"95":1}}],["otaserverip",{"2":{"31":2,"95":1}}],["otapassword",{"2":{"31":2,"95":1}}],["ota",{"0":{"31":1,"91":1},"1":{"92":1,"93":1,"94":1,"95":1},"2":{"31":2,"39":1,"66":1,"69":6,"85":1,"90":2,"92":1,"93":3,"94":3,"95":5}}],["others",{"2":{"188":1}}],["other",{"0":{"224":1,"307":1},"2":{"2":1,"16":1,"25":1,"28":2,"90":2,"126":1,"147":1,"152":1,"153":1,"159":1,"176":1,"182":2,"183":1,"196":2,"202":1,"204":1,"207":1,"230":1,"244":1,"263":3,"301":1,"305":1}}],["opposite",{"2":{"134":2,"274":1}}],["optimal",{"2":{"176":1,"188":2,"204":1,"207":1}}],["optical",{"2":{"118":1}}],["option",{"0":{"87":1,"88":1,"201":1,"203":1,"207":1,"208":1,"253":1},"1":{"202":1,"204":1},"2":{"47":1,"170":2,"215":1,"284":1}}],["options",{"0":{"200":1,"206":1},"1":{"207":1,"208":1},"2":{"36":1,"44":1,"200":1,"206":1}}],["optionaland",{"2":{"25":1}}],["optional",{"0":{"216":1},"2":{"25":3,"223":1,"257":1}}],["opt",{"2":{"85":1}}],["operate",{"2":{"107":1}}],["operation",{"2":{"32":1,"44":1,"197":1}}],["openness",{"2":{"274":2}}],["openiristrackerl",{"2":{"95":1}}],["openiristracker",{"2":{"56":2,"69":1,"94":2}}],["openiris",{"2":{"39":2,"45":1,"78":3,"97":2,"103":1,"243":1}}],["opening",{"2":{"39":1,"78":1,"297":1}}],["opened",{"0":{"27":1},"2":{"305":1}}],["open",{"0":{"28":1,"270":1,"299":1},"1":{"29":1,"30":1,"31":1,"32":1,"33":1},"2":{"12":1,"43":1,"66":1,"77":1,"78":6,"81":1,"82":3,"84":3,"94":3,"95":1,"96":1,"97":1,"118":1,"129":1,"171":1,"247":1,"262":1,"270":1,"274":2,"279":1,"280":1,"281":1,"297":1}}],["own",{"0":{"155":1,"156":1,"251":1},"1":{"156":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"252":1,"253":1},"2":{"25":1,"39":1,"99":1,"104":1,"123":1,"133":1,"158":1,"205":1,"220":1,"224":2,"269":1}}],["objects",{"2":{"171":1,"231":1}}],["object",{"2":{"19":2,"66":1}}],["our",{"0":{"167":1},"2":{"14":1,"20":1,"24":1,"25":7,"32":1,"39":2,"62":1,"101":1,"102":1,"104":1,"105":1,"106":1,"107":1,"122":1,"123":1,"124":1,"140":1,"173":1,"174":1,"179":1,"202":1,"208":1,"224":1,"242":1,"293":1,"300":2}}],["outline",{"2":{"197":2,"230":1}}],["outlined",{"2":{"193":1}}],["outside",{"2":{"178":1}}],["outputs",{"2":{"290":1}}],["outputmultiplier",{"2":{"274":1}}],["output",{"2":{"90":1,"95":1,"96":1,"101":1,"107":1,"113":1,"271":1,"274":1}}],["out",{"2":{"1":3,"66":1,"101":1,"116":1,"140":1,"154":1,"171":1,"173":1,"181":3,"221":2,"224":1,"230":1,"239":1,"244":1,"257":1,"263":1,"291":1,"292":1,"299":1}}],["often",{"2":{"66":1}}],["offers",{"2":{"204":1,"207":1}}],["official",{"2":{"106":1,"123":1,"220":1}}],["off",{"2":{"32":1,"140":2,"230":3,"231":1,"300":1,"305":1}}],["of",{"0":{"95":1,"96":1,"120":1,"169":1,"266":1},"1":{"121":1,"122":1,"123":1,"124":1,"125":1,"267":1,"268":1,"269":1,"270":1,"271":1},"2":{"1":2,"2":1,"3":3,"4":3,"5":1,"15":1,"16":1,"17":1,"20":4,"25":4,"28":4,"30":1,"31":3,"33":1,"36":2,"38":1,"39":1,"42":1,"44":1,"54":8,"56":5,"57":2,"60":2,"64":1,"65":1,"66":4,"68":4,"69":1,"70":1,"71":1,"78":1,"82":2,"84":1,"87":2,"88":1,"89":1,"90":1,"94":2,"95":4,"96":2,"97":1,"101":2,"106":1,"107":2,"108":2,"111":1,"112":1,"114":1,"115":1,"116":2,"117":2,"118":3,"131":1,"133":5,"134":3,"135":3,"136":1,"143":1,"147":2,"148":1,"152":2,"156":1,"159":2,"165":4,"166":1,"167":1,"170":3,"171":4,"175":2,"176":3,"178":1,"179":1,"181":2,"182":1,"184":1,"185":4,"186":3,"187":2,"190":1,"192":4,"194":2,"196":1,"200":1,"204":1,"205":2,"206":1,"207":1,"214":1,"215":2,"216":1,"217":3,"221":1,"223":1,"224":1,"225":1,"228":1,"229":2,"230":4,"239":2,"240":1,"242":1,"244":3,"246":1,"247":2,"261":1,"263":2,"264":1,"265":1,"266":3,"269":1,"274":3,"280":1,"289":1,"300":6,"302":3,"304":3,"305":4,"306":1,"307":1}}],["ontop",{"2":{"135":1}}],["onto",{"2":{"131":1,"134":2,"243":1}}],["once",{"0":{"27":1,"125":1},"2":{"36":1,"44":1,"45":1,"51":1,"77":1,"84":1,"85":1,"87":1,"88":1,"90":1,"93":2,"94":1,"106":1,"136":1,"171":1,"173":1,"176":1,"177":1,"236":1,"238":1,"261":1,"270":1,"281":1,"301":2,"305":2}}],["only",{"0":{"212":1,"299":1},"2":{"1":1,"2":1,"24":2,"25":2,"28":2,"30":1,"32":1,"36":1,"37":1,"44":1,"58":2,"68":1,"78":1,"93":1,"96":1,"101":1,"123":1,"153":1,"171":1,"181":1,"182":2,"193":1,"204":1,"212":2,"217":1,"235":1,"240":1,"255":1,"271":1,"286":1,"287":1,"300":1,"307":1}}],["ones",{"2":{"90":1,"123":1,"176":3,"215":1,"221":3,"257":1}}],["one",{"2":{"1":1,"2":1,"4":2,"28":1,"33":1,"66":1,"81":1,"82":1,"90":1,"94":2,"95":1,"96":1,"130":1,"134":1,"140":1,"146":1,"151":1,"181":1,"182":1,"183":1,"185":1,"192":1,"196":1,"212":1,"217":3,"218":1,"230":1,"236":1,"238":1,"247":1,"263":1,"266":1,"301":1,"305":2}}],["on",{"0":{"2":1,"3":1,"27":1,"125":1,"139":1,"156":1,"167":1,"182":1,"183":1,"263":1},"2":{"1":4,"3":1,"4":1,"14":1,"16":1,"20":1,"30":2,"31":1,"36":1,"37":1,"38":2,"39":3,"42":1,"43":1,"44":2,"45":1,"56":1,"68":1,"69":1,"82":4,"84":5,"87":1,"88":1,"93":2,"94":3,"95":1,"96":1,"101":1,"103":1,"105":1,"106":1,"116":1,"118":3,"126":1,"129":1,"133":2,"135":2,"136":1,"140":2,"141":1,"145":1,"147":2,"150":1,"152":2,"153":2,"158":2,"160":1,"161":1,"165":1,"170":2,"173":2,"174":1,"178":1,"179":1,"181":4,"182":2,"184":1,"186":1,"187":1,"193":1,"196":2,"197":2,"199":1,"202":2,"205":1,"208":2,"212":1,"215":1,"217":1,"218":2,"222":2,"224":1,"225":1,"230":2,"231":2,"236":2,"238":4,"240":2,"244":1,"247":1,"261":1,"263":1,"266":1,"271":1,"273":1,"274":4,"284":1,"300":2,"304":5,"305":3,"307":1}}],["org",{"2":{"279":1}}],["organizing",{"2":{"18":1}}],["orientate",{"2":{"183":1}}],["orientation",{"2":{"3":1,"170":1,"193":1,"194":1,"197":2}}],["original",{"2":{"129":1,"136":1}}],["orders",{"2":{"192":1}}],["order",{"0":{"167":1,"251":1},"1":{"252":1,"253":1},"2":{"69":1,"76":1,"212":1}}],["orange",{"2":{"20":1}}],["or",{"0":{"170":1,"256":1,"270":1},"1":{"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1},"2":{"1":1,"11":4,"15":1,"16":1,"25":4,"28":1,"32":1,"37":1,"45":1,"52":1,"54":1,"62":1,"66":1,"68":1,"71":2,"78":1,"79":1,"84":1,"90":1,"94":2,"95":4,"99":2,"101":3,"104":1,"106":4,"116":1,"118":1,"121":1,"123":2,"124":1,"129":2,"131":2,"134":3,"141":1,"153":2,"156":1,"157":1,"159":1,"160":1,"162":2,"165":1,"170":1,"171":1,"176":2,"181":1,"185":2,"196":5,"197":1,"202":4,"204":1,"207":1,"208":2,"211":1,"212":2,"217":1,"218":3,"221":3,"223":1,"224":1,"228":3,"231":4,"235":1,"238":1,"244":2,"247":1,"252":1,"253":1,"257":3,"262":2,"263":1,"266":2,"268":1,"269":1,"271":1,"274":5,"289":1,"305":2}}],["5cm",{"2":{"217":1}}],["5mm",{"2":{"216":1}}],["50",{"2":{"140":1,"150":1}}],["50pcs",{"2":{"130":1}}],["51",{"2":{"111":1,"274":1}}],["5×",{"2":{"107":1}}],["52",{"2":{"68":1,"70":1}}],["5dbm",{"2":{"68":8,"70":8}}],["5ghz",{"2":{"28":1,"48":1}}],["56mm",{"2":{"175":1}}],["56",{"2":{"11":1}}],["5",{"0":{"46":1,"161":1,"170":1,"301":1},"2":{"1":1,"101":1,"110":1,"111":1,"112":1,"181":1}}],["5v",{"2":{"1":2,"4":1,"175":1,"178":1,"181":2,"196":1}}],["d",{"2":{"268":1}}],["dms",{"2":{"140":1}}],["dual",{"2":{"196":1,"197":2}}],["due",{"2":{"127":1,"129":1,"204":1,"207":1}}],["dude",{"0":{"137":1},"1":{"138":1,"139":1},"2":{"127":1,"138":1}}],["during",{"2":{"95":1}}],["draw",{"2":{"300":1}}],["drastically",{"2":{"265":1}}],["drive",{"2":{"110":1,"273":1}}],["drivers",{"0":{"76":1},"2":{"76":3,"90":1}}],["dry",{"2":{"106":1}}],["dropdown",{"2":{"44":1}}],["dbm",{"2":{"68":1}}],["dashes",{"2":{"193":1}}],["dashboard",{"2":{"84":1}}],["dab",{"2":{"186":1}}],["darker",{"2":{"196":1}}],["dark",{"2":{"106":1,"225":1,"292":1}}],["damaged",{"2":{"116":1,"196":1}}],["damage",{"2":{"101":1,"106":1,"123":2,"229":1,"240":1}}],["dangerously",{"2":{"196":1}}],["dangerous",{"0":{"123":1},"2":{"106":1}}],["danger",{"2":{"101":1,"106":1,"200":1,"206":1,"214":1,"221":1}}],["date",{"2":{"90":1}}],["data",{"0":{"263":1},"2":{"38":1,"41":1,"90":1,"99":1,"257":1,"261":1,"262":1}}],["datasheet",{"2":{"1":1,"108":2,"110":1,"181":1}}],["daily",{"2":{"36":1}}],["dns",{"2":{"31":1}}],["defines",{"2":{"274":7}}],["default",{"0":{"264":1},"2":{"36":1,"37":4,"44":1,"56":2,"67":1,"94":2,"97":1,"101":1,"215":1,"263":1,"264":2,"274":11}}],["defaults",{"2":{"28":1}}],["defauly",{"2":{"32":1}}],["dead",{"2":{"205":1,"215":1}}],["decision",{"2":{"200":1,"206":1}}],["decide",{"2":{"36":1,"44":1,"197":1,"214":1}}],["degrees",{"2":{"231":1}}],["degree",{"2":{"146":1,"151":1,"215":1,"244":1}}],["deleting",{"2":{"265":2,"306":1}}],["deletes",{"2":{"66":1}}],["delete",{"2":{"66":3,"306":1}}],["delay",{"2":{"205":1}}],["delayed",{"2":{"118":1}}],["delivers",{"2":{"175":1}}],["determines",{"2":{"108":1}}],["details",{"0":{"129":1,"132":1,"138":1,"144":1,"147":1,"149":1,"152":1},"1":{"133":1,"134":1,"135":1,"136":1,"138":1}}],["detail",{"2":{"25":1}}],["denotes",{"2":{"97":1,"175":1}}],["demonstration",{"2":{"96":1}}],["depending",{"2":{"170":1,"186":1,"217":1,"244":1,"274":1,"305":1}}],["dependencies",{"2":{"25":1,"279":2}}],["depricated",{"2":{"69":1}}],["debugging",{"2":{"36":1,"44":1}}],["debug",{"2":{"35":1,"36":7,"44":3,"266":1}}],["desired",{"2":{"44":1,"262":1}}],["designated",{"2":{"133":1,"188":1}}],["designed",{"2":{"99":1,"106":1,"123":2,"224":1}}],["design",{"2":{"24":1,"104":1,"106":1,"107":1,"129":2,"158":1,"224":1}}],["descriptor",{"2":{"304":1}}],["description",{"2":{"25":1,"66":1,"68":1,"69":1,"70":1,"71":1}}],["described",{"2":{"39":1}}],["desktop",{"2":{"38":1,"43":1,"284":2,"300":3}}],["devices",{"2":{"35":1,"56":2,"62":2,"64":1,"66":1,"69":2,"90":1,"202":1,"204":1,"207":1,"247":2}}],["device",{"0":{"57":1,"60":1},"2":{"35":2,"54":9,"56":5,"57":4,"60":7,"62":2,"65":3,"66":2,"67":1,"88":1,"92":1,"95":1,"101":1,"247":1,"299":1}}],["developed",{"2":{"32":1,"62":1,"103":1,"121":1}}],["developments",{"2":{"167":1}}],["development",{"0":{"5":1,"9":1},"1":{"6":1,"7":1,"8":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"32":1,"39":1,"99":1,"100":1,"266":2}}],["dev",{"0":{"128":1,"266":1},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"267":1,"268":1,"269":1,"270":1,"271":1},"2":{"12":2,"17":1,"18":1,"129":1,"131":2,"136":3}}],["dollar",{"0":{"251":1},"1":{"252":1,"253":1}}],["doa",{"2":{"205":1,"215":1}}],["doubt",{"2":{"106":1}}],["double",{"2":{"28":1,"43":1,"284":1}}],["doing",{"2":{"101":1,"106":1,"196":1,"214":2,"221":1}}],["dot",{"2":{"94":1,"184":2}}],["downward",{"2":{"240":1}}],["down",{"2":{"45":1,"52":1,"88":2,"133":1,"135":2,"171":2,"174":1,"185":1,"230":1,"238":1,"240":1,"244":1}}],["downloading",{"2":{"268":1}}],["downloaded",{"2":{"78":1}}],["download",{"0":{"39":1,"42":1,"74":1,"268":1,"283":1},"2":{"39":2,"42":1,"58":1,"73":1,"78":1,"97":1,"261":1,"266":2,"268":1,"269":1,"283":1}}],["donwload",{"0":{"269":1}}],["dont",{"0":{"154":1}}],["dongle",{"0":{"137":1},"1":{"138":1,"139":1},"2":{"138":1}}],["done",{"2":{"81":1,"82":1,"84":1,"85":1,"94":2,"106":1,"134":1,"230":1,"281":1,"297":1,"301":1,"302":1,"305":1}}],["don",{"0":{"251":1,"306":1},"1":{"252":1,"253":1},"2":{"25":1,"47":1,"94":1,"97":1,"98":1,"106":2,"126":2,"204":1,"222":1,"300":1,"304":1}}],["do",{"0":{"93":1,"258":2,"265":2,"274":1},"1":{"94":1,"95":1,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2},"2":{"15":2,"19":2,"25":1,"28":1,"30":1,"31":1,"39":2,"54":2,"56":3,"67":1,"78":2,"83":1,"95":2,"106":7,"116":1,"121":1,"126":1,"133":2,"136":1,"147":1,"152":1,"157":1,"159":1,"170":1,"171":1,"174":1,"182":1,"214":1,"215":1,"216":1,"221":2,"228":1,"229":1,"231":4,"237":1,"240":1,"252":2,"268":1,"276":1,"302":1,"304":2}}],["documented",{"2":{"32":1,"185":1}}],["documentation",{"0":{"9":1,"124":1,"165":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"9":1,"14":2,"15":1,"20":1,"24":4,"25":1,"78":1,"100":1,"124":1,"141":1,"147":1,"152":1,"263":1,"279":1}}],["docs",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"9":1,"12":1,"15":1,"16":1,"17":2,"18":2,"19":1,"21":1,"25":1,"98":1,"162":1,"165":1,"199":1,"242":1,"243":1,"260":1}}],["doesnt",{"2":{"134":1}}],["doesn",{"2":{"50":1,"133":1,"266":1}}],["does",{"0":{"265":1},"2":{"4":1,"19":1,"36":1,"37":1,"44":1,"54":1,"89":1,"90":1,"97":1,"156":1,"170":2,"211":3,"230":1,"263":1,"271":1}}],["dial",{"2":{"228":1}}],["diagram",{"2":{"4":2,"184":2}}],["digikey",{"2":{"221":3}}],["dim",{"2":{"175":1,"196":1}}],["difference",{"2":{"221":1,"235":1}}],["differently",{"2":{"273":1}}],["different",{"2":{"1":1,"28":2,"33":2,"35":1,"37":1,"56":1,"106":3,"140":1,"175":1,"176":1,"181":1,"185":1,"192":1}}],["differs",{"2":{"188":1}}],["difficulties",{"0":{"122":1}}],["diving",{"2":{"100":1}}],["direction",{"2":{"134":1,"184":1,"216":1,"228":1,"274":1}}],["direct",{"0":{"253":1},"2":{"108":1}}],["directly",{"0":{"88":1},"2":{"88":1,"145":1,"150":1,"302":1,"305":2}}],["directory",{"2":{"78":2,"94":1,"97":1,"269":4,"271":1,"306":1}}],["directories",{"0":{"18":1},"2":{"18":1,"94":1}}],["discussion",{"2":{"118":1}}],["discount",{"2":{"221":1}}],["discomfort",{"2":{"101":1}}],["discord",{"0":{"299":1},"2":{"98":1,"105":1,"124":1,"141":1,"154":1,"162":1,"165":1,"179":1,"224":2,"254":1,"266":1}}],["disconnects",{"2":{"247":1}}],["disconnect",{"2":{"52":1}}],["dist",{"2":{"281":1}}],["distribute",{"2":{"134":1}}],["distance",{"2":{"108":1}}],["distances",{"2":{"101":1}}],["distinction",{"2":{"192":1,"193":1}}],["distinct",{"2":{"35":1}}],["disabled",{"2":{"56":1}}],["dinstructions",{"0":{"0":1},"1":{"1":1,"2":1,"3":1,"4":1}}],["hybrid",{"2":{"263":1}}],["hmds",{"2":{"215":1}}],["hmd",{"2":{"153":1,"222":1}}],["hubs",{"0":{"217":1},"2":{"204":1}}],["hub",{"0":{"137":1},"1":{"138":1,"139":1},"2":{"131":2,"136":3,"202":2,"208":1,"217":4,"242":1,"245":1}}],["h3",{"2":{"130":1}}],["hit",{"2":{"264":1,"266":1,"271":2,"301":1}}],["his",{"2":{"158":1}}],["hinge",{"2":{"133":1,"134":3}}],["hinder",{"2":{"121":1}}],["hidden",{"2":{"94":1}}],["highlight",{"2":{"304":1}}],["highlighted",{"2":{"96":1,"304":1}}],["highly",{"2":{"175":1,"221":1,"223":1}}],["higher",{"2":{"11":4,"71":2,"113":1,"202":1,"208":1,"211":1,"218":1,"239":1}}],["high",{"0":{"113":1,"251":1},"1":{"114":1,"115":1,"252":1,"253":1},"2":{"3":1,"101":1,"204":1,"265":1,"300":1}}],["hflip",{"2":{"71":1}}],["hence",{"2":{"221":1}}],["heavily",{"2":{"242":1}}],["head",{"2":{"185":1,"260":1,"263":1,"264":1,"300":1}}],["headsets",{"0":{"224":1},"2":{"140":1,"202":1,"208":1,"216":1}}],["headset",{"0":{"104":1,"140":1,"142":1,"154":1,"156":1,"157":1},"1":{"141":1,"143":1,"144":1,"145":1,"146":1,"147":1,"148":1,"149":1,"150":1,"151":1,"152":1},"2":{"100":1,"104":2,"141":1,"156":1,"157":2,"159":2,"185":1,"202":1,"204":1,"207":1,"208":1,"216":1,"224":3,"231":1,"244":4,"245":2,"300":2}}],["heatsinks",{"2":{"223":1}}],["heats",{"2":{"204":1,"207":1}}],["heating",{"2":{"133":1}}],["heat",{"0":{"133":1},"2":{"130":2,"133":5,"134":4}}],["helps",{"2":{"100":1,"118":1,"230":1,"274":1}}],["help",{"2":{"66":1,"98":1,"170":3,"266":1}}],["here",{"0":{"165":1},"2":{"1":1,"20":1,"22":1,"32":1,"39":2,"58":2,"76":1,"78":2,"94":1,"95":1,"98":1,"99":1,"103":1,"154":2,"156":1,"157":2,"158":1,"162":1,"175":1,"181":1,"185":1,"194":1,"209":1,"214":1,"217":1,"221":5,"224":3,"230":1,"254":1,"273":1,"274":1,"283":1,"302":1,"305":1}}],["hat",{"0":{"238":1},"2":{"234":1,"238":1}}],["happens",{"2":{"186":1,"265":1}}],["happy",{"2":{"98":1}}],["handling",{"0":{"231":1},"2":{"231":1,"232":1}}],["handled",{"2":{"123":1}}],["handy",{"2":{"79":1,"179":1}}],["half",{"2":{"108":1,"110":1,"240":1}}],["hazard",{"2":{"107":2}}],["harm",{"2":{"106":2}}],["harmless",{"2":{"101":1}}],["hardest",{"2":{"134":1}}],["hard",{"2":{"97":1}}],["hardware",{"0":{"102":1,"109":1,"169":1,"189":1,"190":1,"243":1},"1":{"110":1,"111":1,"112":1,"113":1,"114":1,"115":1,"190":1,"191":2,"192":2,"193":2,"194":1},"2":{"48":1,"102":1,"116":1,"129":1,"144":1,"149":1,"158":1,"167":2,"196":3,"205":2,"235":1,"246":1}}],["had",{"2":{"97":1}}],["having",{"2":{"31":1,"92":1,"94":1,"182":1,"185":1,"212":1}}],["haven",{"2":{"135":1}}],["have",{"0":{"27":1,"122":1,"125":1,"156":1,"166":1},"2":{"1":1,"2":1,"4":1,"24":1,"25":1,"28":3,"30":1,"33":1,"35":1,"36":1,"37":1,"39":1,"41":1,"44":1,"54":1,"56":1,"78":2,"85":1,"88":1,"90":2,"93":2,"94":2,"95":1,"96":1,"97":1,"105":1,"106":2,"116":1,"118":1,"126":1,"131":1,"134":2,"135":1,"136":2,"147":1,"152":1,"153":1,"154":1,"156":2,"158":2,"161":1,"169":1,"170":5,"172":1,"181":1,"182":1,"185":2,"188":1,"192":1,"193":1,"197":1,"214":1,"215":1,"224":2,"230":1,"232":1,"240":1,"241":1,"242":2,"246":1,"247":1,"248":1,"257":1,"266":1,"301":1,"304":1,"305":2}}],["hasn",{"2":{"300":1}}],["has",{"2":{"28":2,"36":2,"44":1,"49":1,"66":1,"67":1,"90":1,"95":1,"101":1,"104":1,"129":1,"131":1,"171":1,"174":2,"179":1,"205":1,"217":3,"230":2,"253":1,"263":1,"302":1}}],["h1",{"2":{"20":2}}],["htc",{"2":{"141":1,"217":1}}],["http",{"2":{"30":1,"31":2,"52":1,"57":1,"62":1,"65":1,"67":1,"94":3}}],["https",{"2":{"12":1,"17":1,"18":1,"76":1,"78":2,"157":1,"214":1,"251":1,"279":1}}],["html",{"2":{"20":2}}],["housing",{"2":{"244":1}}],["hole",{"2":{"133":2,"134":1,"135":1,"147":1,"152":1,"220":1,"221":1}}],["holes",{"2":{"131":1,"133":1,"134":2,"135":1,"136":1}}],["holding",{"2":{"88":2,"160":1,"182":1,"228":1,"297":1}}],["hold",{"2":{"2":1,"45":1,"87":1,"106":1,"136":1,"182":1,"183":1}}],["hotglue",{"2":{"244":1}}],["hot",{"2":{"129":1,"186":1,"188":2,"223":1,"244":1}}],["hogging",{"2":{"90":1}}],["home",{"2":{"84":1}}],["horizontally",{"2":{"71":1}}],["hostname",{"2":{"69":2,"95":1}}],["however",{"2":{"28":1,"31":1,"32":1,"56":1,"170":1,"204":1,"207":1}}],["how",{"0":{"48":1,"55":1,"63":1,"93":1,"156":1,"189":1,"195":1,"233":1,"254":1,"258":1,"276":1,"282":1},"1":{"49":1,"50":1,"51":1,"52":1,"56":1,"57":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"94":1,"95":1,"190":1,"191":1,"192":1,"193":1,"194":1,"196":1,"197":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"255":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"16":3,"36":1,"39":1,"41":1,"44":1,"72":1,"76":1,"87":1,"99":1,"174":1,"185":1,"212":1,"214":1,"263":1,"266":1,"273":1,"274":7,"302":2}}],["lcsc",{"2":{"221":4}}],["luck",{"2":{"161":1}}],["ldlrui",{"2":{"131":1}}],["ll",{"2":{"50":2,"76":1,"83":1,"94":1,"97":1,"212":1,"222":1,"258":1,"263":1,"266":1,"273":1,"304":1,"305":1}}],["launch",{"2":{"266":1}}],["labled",{"2":{"191":1}}],["labeled",{"2":{"52":1,"87":1}}],["labels",{"2":{"1":2,"181":2}}],["lay",{"2":{"178":1,"230":1}}],["last",{"2":{"134":2,"271":1}}],["lastly",{"2":{"133":1}}],["large",{"2":{"124":1,"212":1}}],["larger",{"2":{"71":2,"211":1}}],["later",{"2":{"78":1}}],["latency",{"2":{"71":1,"202":1,"208":1}}],["latest",{"0":{"269":1,"299":1},"2":{"42":1,"73":1,"78":1,"202":1,"208":1,"266":2,"283":1}}],["lt",{"2":{"20":2,"25":2,"30":1,"65":1,"67":6,"84":1,"94":1,"118":2,"266":1,"306":2}}],["lifting",{"2":{"239":1}}],["lite",{"0":{"195":1,"196":1,"197":1},"1":{"196":1,"197":1},"2":{"196":1,"220":1}}],["little",{"2":{"82":1,"134":1,"185":1,"274":1}}],["limited",{"2":{"118":1,"307":1}}],["limit",{"2":{"107":4,"111":1,"112":1,"114":1,"115":1,"143":1,"148":1}}],["limits",{"0":{"107":1},"2":{"118":1,"123":1}}],["library",{"2":{"101":1}}],["lighting",{"2":{"225":1}}],["lightweight",{"2":{"217":1}}],["lightly",{"2":{"182":1}}],["light",{"2":{"101":2,"106":1}}],["lives",{"2":{"38":1}}],["likely",{"2":{"175":1,"186":1,"228":1,"229":1,"253":1}}],["like",{"0":{"27":1},"2":{"20":2,"32":1,"37":1,"43":1,"52":1,"66":1,"84":1,"90":1,"94":2,"95":1,"96":1,"99":1,"130":1,"133":1,"134":1,"157":1,"167":1,"170":1,"182":1,"184":2,"194":1,"197":1,"215":1,"216":2,"221":1,"228":1,"236":1,"240":2,"247":1,"248":1,"268":1,"269":1,"284":1,"292":1,"300":1,"305":2,"307":1}}],["linearly",{"2":{"110":1}}],["line",{"0":{"253":1},"2":{"19":1,"25":1,"134":1,"136":1,"236":1,"240":1}}],["linked",{"2":{"90":1,"123":1}}],["link",{"2":{"19":4,"145":2,"150":2,"221":1}}],["listens",{"2":{"302":1,"307":1}}],["listening",{"2":{"263":1,"274":1,"306":1}}],["listen",{"2":{"261":1}}],["listed",{"0":{"162":1,"167":1},"2":{"22":1,"95":1,"224":2}}],["listing",{"2":{"215":1}}],["list",{"0":{"205":1},"1":{"206":1,"207":1,"208":1,"209":1,"210":1,"211":1,"212":1,"213":1,"214":1,"215":1,"216":1,"217":1,"218":1,"219":1,"220":1,"221":1,"222":1,"223":1,"224":1},"2":{"5":1,"25":2,"44":1,"95":1,"102":1,"104":1,"185":2,"242":1,"247":1}}],["loaded",{"2":{"264":1}}],["load",{"2":{"261":1,"265":1,"266":1,"270":1}}],["low",{"2":{"202":1,"207":1,"221":1,"234":1,"300":1}}],["lower",{"2":{"159":1,"175":1,"202":1,"208":1,"218":1,"221":1}}],["lowercase",{"2":{"15":1}}],["long",{"2":{"168":1,"194":1,"217":1}}],["longer",{"2":{"134":1,"176":2,"239":1,"265":1}}],["locks",{"2":{"135":1}}],["locating",{"2":{"265":1}}],["location",{"2":{"159":1}}],["locate",{"2":{"84":1,"94":1,"95":1,"171":1,"238":1}}],["located",{"2":{"56":1,"221":1}}],["locallow",{"2":{"306":1}}],["local",{"2":{"30":1,"31":2,"56":1,"57":2,"65":2,"67":1,"94":2,"95":1,"248":1}}],["loses",{"2":{"134":1}}],["lorow",{"2":{"103":1}}],["logo",{"2":{"131":2}}],["logs",{"0":{"47":1},"2":{"46":1,"47":2,"52":1}}],["logging",{"2":{"36":1,"44":1,"266":1}}],["lot",{"2":{"36":2,"44":1,"266":1}}],["looking",{"2":{"159":2,"295":1}}],["looks",{"2":{"43":1,"90":1,"225":1,"228":1,"284":1}}],["look",{"2":{"16":1,"47":1,"69":2,"133":1,"134":1,"141":1,"171":1,"200":1,"206":1,"221":1,"230":2,"269":2,"294":1,"301":4}}],["legacy",{"2":{"257":1,"274":2}}],["length",{"2":{"130":3,"175":1,"176":1}}],["lengthy",{"2":{"118":1}}],["lenses",{"2":{"215":1}}],["lens",{"0":{"127":1,"157":1},"1":{"129":1,"130":1,"131":1},"2":{"101":1,"107":1,"118":1,"144":1,"146":1,"149":1,"151":1,"157":3,"159":1,"228":2,"244":2,"252":1}}],["leaving",{"2":{"230":1}}],["leave",{"2":{"28":2,"305":1}}],["lead",{"2":{"116":1}}],["least",{"2":{"93":1,"169":1}}],["learned",{"2":{"179":1,"232":1}}],["learn",{"2":{"76":1}}],["level",{"2":{"70":1,"71":1,"106":1,"133":1,"293":1}}],["let",{"2":{"39":1,"133":1,"145":1,"150":1,"224":2,"285":1,"305":1,"306":1}}],["letting",{"2":{"36":1,"44":1}}],["letters",{"2":{"15":1,"131":2}}],["less",{"2":{"36":1,"44":1,"71":1,"101":1,"202":1,"204":1,"207":2,"208":1,"220":1,"228":1,"229":1,"231":1,"269":1,"274":1,"305":1}}],["lefteyelidexpandedsqueeze",{"2":{"255":1}}],["lefteyex",{"2":{"255":1}}],["left",{"0":{"27":1,"287":1},"2":{"44":1,"127":1,"153":1,"247":1,"248":1,"252":1,"287":1,"300":1,"301":1}}],["leds",{"0":{"3":1,"111":1,"112":1,"114":1,"115":1,"160":1,"176":1,"183":1,"192":1},"2":{"1":2,"101":2,"113":1,"116":1,"117":1,"175":1,"181":2,"184":1,"188":2,"190":1,"192":4,"194":1,"196":6,"197":1,"218":1,"243":1,"244":1}}],["led",{"0":{"1":1,"110":1,"177":1,"181":1,"188":1,"189":1,"195":1},"1":{"190":1,"191":1,"192":1,"193":1,"194":1,"196":1,"197":1},"2":{"1":3,"101":2,"108":3,"117":1,"127":2,"135":3,"160":1,"165":1,"176":1,"181":3,"183":2,"190":1,"192":2,"194":5,"217":1,"220":2,"225":1,"228":1,"244":1,"245":1}}],["auto",{"2":{"306":1}}],["automatically",{"2":{"25":1,"262":2}}],["awg",{"2":{"218":3,"221":1}}],["away",{"2":{"172":1,"184":1,"266":1}}],["agree",{"2":{"253":1}}],["again",{"2":{"188":1,"271":1}}],["agc",{"2":{"71":1}}],["avis",{"2":{"274":1}}],["avatrs",{"2":{"257":1}}],["avatars",{"2":{"257":1,"306":2}}],["avatar",{"0":{"254":1},"1":{"255":1},"2":{"254":1,"302":1,"304":2,"305":1,"307":2}}],["available",{"0":{"139":1},"2":{"36":1,"44":1,"95":1,"104":1,"153":1,"221":1,"266":1}}],["avoid",{"2":{"118":1,"238":1}}],["averaged",{"2":{"107":1}}],["ammount",{"2":{"171":1}}],["amount",{"2":{"134":1,"171":1}}],["amoistman",{"2":{"133":2}}],["amp",{"0":{"105":1},"2":{"65":1,"67":1}}],["amazon",{"2":{"37":1,"211":1,"212":2,"215":1,"217":2,"218":3,"223":3}}],["aid",{"2":{"170":1}}],["air",{"2":{"39":1,"92":1,"182":1}}],["ai",{"2":{"37":1}}],["adoption",{"2":{"207":1}}],["adjust",{"0":{"282":1},"1":{"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"88":1,"161":1,"255":1,"263":1,"293":1,"300":2}}],["adapter",{"2":{"217":2}}],["adapters",{"0":{"218":1},"2":{"217":2}}],["adapted",{"2":{"78":1,"98":1}}],["adaptation",{"2":{"78":1}}],["adhoc",{"2":{"68":1}}],["advanced",{"2":{"32":1,"202":1,"208":1}}],["address",{"0":{"96":1,"289":1},"2":{"31":2,"54":6,"96":1,"248":1,"263":1,"289":1,"297":4,"299":1}}],["addresses",{"2":{"30":1,"307":2}}],["additionally",{"2":{"90":1}}],["additional",{"0":{"29":1,"199":1},"1":{"30":1,"31":1,"32":1,"33":1,"200":1,"201":1,"202":1,"203":1,"204":1},"2":{"145":1,"150":1,"154":1,"211":1,"266":1}}],["adding",{"0":{"17":1,"19":1,"296":1,"304":1,"305":1},"1":{"18":1,"19":1,"20":1,"297":1,"298":1,"299":1,"300":1},"2":{"25":1,"37":1,"38":1,"39":1}}],["added",{"2":{"25":1,"154":1,"162":1,"224":2}}],["adds",{"2":{"25":1,"66":1}}],["add",{"2":{"16":1,"17":1,"19":7,"20":1,"25":1,"56":1,"66":1,"68":1,"160":1,"177":1,"182":1,"185":1,"304":3,"305":5}}],["abc",{"0":{"148":1},"1":{"149":1,"150":1,"151":1,"152":1},"2":{"151":1}}],["ability",{"2":{"138":1}}],["above",{"0":{"125":1},"2":{"84":1,"90":1,"221":1,"224":2,"304":1,"305":1}}],["about",{"2":{"25":1,"28":1,"50":1,"78":1,"175":1,"240":1}}],["able",{"2":{"31":1,"56":1,"93":1,"136":1,"186":1,"225":1,"305":1}}],["apart",{"2":{"238":1}}],["api",{"0":{"32":1,"61":1,"64":1},"1":{"62":1,"63":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1},"2":{"32":6,"62":2,"64":2,"65":1,"66":1,"67":1}}],["ap",{"2":{"28":17,"68":1}}],["apps",{"2":{"268":1,"273":1}}],["appdata",{"2":{"266":1,"306":1}}],["appropriate",{"2":{"217":1}}],["appropiate",{"2":{"197":1}}],["approach",{"2":{"94":1,"196":1}}],["appreciation",{"2":{"140":1}}],["appendix",{"0":{"117":1,"118":1}}],["appear",{"2":{"47":1}}],["appears",{"2":{"20":1}}],["apply",{"2":{"97":2,"178":1,"182":1,"186":1,"187":1,"262":1}}],["applications",{"2":{"95":1,"99":1}}],["application",{"2":{"43":1,"196":1,"300":1}}],["applicable",{"2":{"28":1,"165":1}}],["app",{"0":{"43":1,"275":1,"276":1,"281":1,"282":1,"283":1,"284":1,"299":1},"1":{"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"32":1,"38":1,"42":1,"52":1,"62":1,"93":2,"96":1,"202":2,"228":1,"246":1,"247":1,"248":1,"262":1,"264":1,"266":1,"273":1,"276":1,"279":2,"281":3,"283":1,"285":1,"297":1,"299":1,"302":2,"307":2}}],["accordingly",{"2":{"255":1}}],["acceptable",{"2":{"221":1}}],["accessibility",{"2":{"140":1}}],["access",{"2":{"28":1,"39":1,"82":2,"84":1,"204":1,"207":1,"273":1}}],["accent",{"2":{"20":2}}],["acquire",{"2":{"217":1}}],["acknowledged",{"0":{"125":1}}],["acto",{"2":{"230":1}}],["actually",{"2":{"172":1}}],["actual",{"2":{"108":1,"305":1}}],["action",{"2":{"305":2}}],["actions",{"2":{"25":2}}],["activate",{"2":{"274":1}}],["actively",{"2":{"106":1}}],["active",{"2":{"100":1,"170":1}}],["affordable",{"2":{"99":1}}],["affect",{"2":{"25":2}}],["after",{"2":{"1":1,"4":1,"43":1,"52":1,"66":1,"85":1,"106":1,"136":1,"174":1,"181":1,"242":1,"280":1}}],["antistatic",{"0":{"170":1},"2":{"170":2}}],["antenna",{"0":{"170":1},"2":{"170":5,"211":1,"212":1,"234":1,"235":1,"236":2,"237":1}}],["antennas",{"0":{"170":1},"2":{"170":1,"204":1,"207":1,"211":1,"212":2,"245":1}}],["anterior",{"2":{"107":1}}],["angle",{"0":{"159":1},"2":{"108":3,"110":2,"117":1}}],["answer",{"2":{"98":1}}],["another",{"2":{"37":1,"133":1,"176":1,"223":1,"224":1,"254":1}}],["an",{"0":{"120":1,"170":1},"1":{"121":1,"122":1,"123":1,"124":1,"125":1},"2":{"25":1,"37":1,"39":1,"43":1,"54":1,"66":1,"77":1,"78":1,"87":1,"90":1,"94":1,"98":2,"101":1,"106":1,"116":1,"134":2,"140":2,"147":1,"152":1,"170":6,"185":1,"190":1,"194":1,"211":1,"214":1,"215":1,"247":1,"253":1,"254":1,"257":1,"273":1,"284":1,"300":3,"305":1}}],["anywhere",{"2":{"168":1}}],["anything",{"2":{"97":1}}],["anyone",{"2":{"31":1,"306":1}}],["any",{"0":{"156":1},"2":{"20":1,"32":1,"39":1,"50":1,"51":1,"52":1,"64":1,"66":3,"78":1,"94":1,"104":1,"106":2,"140":1,"156":1,"196":1,"197":1,"224":1,"245":1,"252":1,"266":1}}],["and",{"0":{"39":1,"42":1,"85":1,"94":1,"95":1,"120":1,"139":1,"165":1,"173":1,"174":1,"177":2,"218":1,"244":1,"258":1,"270":1,"282":1,"283":1,"285":1,"296":1,"302":1},"1":{"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"121":1,"122":1,"123":1,"124":1,"125":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"283":1,"284":1,"285":1,"286":2,"287":2,"288":2,"289":2,"290":2,"291":2,"292":2,"293":2,"294":2,"295":2,"296":1,"297":2,"298":2,"299":2,"300":2,"301":1,"303":1,"304":1,"305":1,"306":1,"307":1},"2":{"1":1,"2":1,"4":1,"5":1,"15":1,"16":1,"20":1,"22":1,"24":1,"25":3,"28":10,"30":2,"32":2,"36":3,"37":3,"38":2,"39":1,"42":1,"44":2,"45":2,"46":1,"51":1,"52":1,"56":1,"58":1,"64":1,"66":5,"69":2,"71":1,"73":1,"77":2,"78":2,"79":4,"81":1,"82":2,"84":3,"87":1,"88":2,"90":2,"92":1,"94":6,"95":2,"96":2,"97":2,"100":2,"101":3,"102":2,"105":1,"106":2,"107":3,"116":4,"118":1,"121":2,"123":1,"124":1,"129":1,"131":1,"133":1,"134":2,"135":2,"136":3,"138":1,"140":2,"141":2,"144":3,"146":1,"147":2,"149":3,"151":1,"152":2,"157":1,"160":1,"161":1,"166":1,"170":5,"171":1,"172":1,"174":2,"175":4,"176":4,"178":1,"181":1,"182":4,"183":2,"185":1,"190":1,"196":1,"197":5,"200":2,"202":2,"204":3,"205":1,"206":2,"207":4,"208":2,"211":2,"212":2,"215":2,"216":1,"217":4,"218":1,"220":1,"221":3,"222":1,"223":1,"224":2,"228":2,"229":1,"230":4,"231":1,"232":1,"235":1,"237":1,"238":1,"239":2,"243":1,"244":5,"245":2,"246":1,"247":2,"252":2,"254":1,"257":2,"258":1,"261":1,"263":3,"264":3,"265":1,"266":2,"268":1,"270":1,"271":3,"273":2,"274":6,"279":1,"280":1,"283":2,"286":1,"287":1,"288":1,"297":4,"299":2,"300":1,"301":3,"302":2,"304":2,"305":5,"306":1,"307":2}}],["alert",{"2":{"253":1}}],["along",{"2":{"230":1}}],["alcohol",{"2":{"188":1}}],["alter",{"2":{"221":1}}],["alternative",{"0":{"212":1},"2":{"215":1,"221":1}}],["alternatively",{"0":{"221":1},"2":{"131":2,"136":1,"158":1,"211":1,"289":1}}],["alternatives",{"2":{"129":1}}],["although",{"2":{"167":1}}],["already",{"2":{"58":1,"100":1,"135":1}}],["alibaba",{"2":{"37":1}}],["aliexpress",{"2":{"37":2,"130":3,"211":1,"212":4,"215":2,"216":2,"217":2,"218":4,"221":1,"223":3}}],["always",{"2":{"28":1,"54":1,"101":1,"196":1}}],["also",{"2":{"18":1,"20":1,"24":1,"25":1,"31":1,"32":1,"36":1,"44":1,"54":1,"58":1,"66":1,"82":1,"83":1,"101":1,"129":1,"145":1,"150":1,"165":1,"212":1,"217":1,"221":1,"264":1,"305":1}}],["alligns",{"2":{"135":1}}],["allowed",{"2":{"68":1}}],["allows",{"2":{"54":1,"215":1,"257":1,"302":1}}],["allow",{"2":{"28":1,"30":1,"31":1,"68":1,"77":1,"168":1,"171":1}}],["all",{"0":{"167":1,"169":1},"2":{"15":2,"20":1,"24":4,"56":1,"66":1,"67":1,"76":1,"88":1,"95":1,"106":1,"116":2,"121":1,"138":1,"159":1,"170":2,"185":1,"186":1,"200":1,"205":1,"206":1,"246":1,"257":1,"263":1,"280":1,"294":1,"300":1,"301":2,"302":1}}],["atleast",{"2":{"228":1}}],["attention",{"2":{"184":1,"194":1}}],["attempt",{"2":{"88":1}}],["attaching",{"2":{"170":1,"212":1}}],["attached",{"2":{"170":1,"193":1}}],["attach",{"0":{"171":1},"2":{"147":1,"152":1,"158":1,"237":1,"244":4,"245":1}}],["attribute",{"2":{"20":1}}],["at",{"2":{"3":1,"16":1,"20":1,"56":1,"89":1,"93":1,"101":1,"106":1,"107":2,"108":1,"121":1,"123":1,"131":2,"141":1,"146":1,"151":1,"159":2,"169":1,"170":1,"171":1,"176":2,"192":1,"200":1,"205":1,"206":1,"216":1,"221":2,"246":1,"274":5,"295":1,"301":1}}],["a",{"0":{"17":1,"19":1,"21":1,"117":1,"156":2,"157":1,"158":1,"159":1,"164":1,"175":2,"189":1,"212":1,"229":1,"233":1,"251":1,"253":1,"263":1,"265":1,"299":1},"1":{"18":1,"19":1,"20":1,"190":1,"191":1,"192":1,"193":1,"194":1,"230":1,"231":1,"232":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"252":1,"253":1},"2":{"2":1,"3":2,"4":1,"5":1,"17":3,"18":2,"19":3,"20":2,"21":1,"24":5,"25":14,"28":4,"31":2,"32":3,"33":2,"35":3,"36":5,"37":1,"41":2,"43":1,"44":2,"48":1,"49":1,"52":1,"54":5,"62":5,"64":1,"66":7,"67":4,"71":1,"78":2,"81":1,"82":2,"84":4,"87":2,"88":2,"90":1,"92":1,"93":1,"94":4,"95":6,"96":1,"97":2,"99":1,"101":1,"104":2,"106":1,"107":2,"108":4,"113":1,"117":2,"118":1,"124":1,"126":3,"129":4,"130":1,"133":2,"134":1,"136":7,"138":1,"140":2,"141":2,"147":3,"152":3,"153":2,"156":2,"157":4,"158":2,"159":3,"161":2,"165":2,"166":1,"170":2,"171":2,"174":1,"175":1,"176":2,"179":2,"182":2,"185":3,"186":3,"187":1,"193":3,"194":1,"196":3,"200":1,"202":2,"204":3,"205":2,"206":1,"207":3,"211":2,"212":2,"215":2,"216":5,"217":9,"218":2,"221":3,"222":3,"224":5,"225":1,"228":1,"229":3,"230":2,"231":1,"236":1,"237":1,"239":1,"240":1,"242":2,"244":1,"247":1,"248":1,"252":3,"254":1,"263":2,"265":3,"266":3,"268":1,"273":1,"274":3,"276":1,"280":1,"281":1,"284":1,"289":1,"294":1,"297":1,"300":6,"302":1,"305":4,"307":1}}],["assign",{"2":{"305":1}}],["assigned",{"2":{"304":1}}],["asset",{"2":{"304":2}}],["assembling",{"2":{"193":1,"196":1}}],["assemble",{"0":{"189":1,"195":1,"244":1},"1":{"190":1,"191":1,"192":1,"193":1,"194":1,"196":1,"197":1}}],["assembled",{"2":{"172":1,"194":1}}],["assemblly",{"2":{"165":1}}],["assembly",{"0":{"132":1,"147":1,"152":1,"164":1},"1":{"133":1,"134":1,"135":1,"136":1,"138":1},"2":{"100":2,"127":1,"165":2,"193":1,"218":1}}],["associated",{"2":{"304":1}}],["aside",{"2":{"237":1}}],["asking",{"2":{"253":1}}],["asked",{"0":{"249":1}}],["ask",{"2":{"98":1,"124":1}}],["as",{"2":{"1":3,"25":3,"28":2,"30":1,"31":1,"39":2,"41":1,"44":1,"47":1,"64":1,"67":1,"78":1,"87":3,"94":1,"95":2,"106":4,"122":1,"123":1,"126":1,"129":2,"136":1,"141":2,"159":2,"171":1,"179":1,"181":3,"186":1,"192":1,"193":2,"202":2,"204":1,"207":1,"208":2,"211":1,"217":4,"221":2,"229":1,"253":1,"305":3}}],["arrival",{"2":{"205":1,"215":1}}],["arrive",{"0":{"168":1},"2":{"168":1}}],["artifacts",{"2":{"175":1}}],["around",{"2":{"95":1,"106":1,"176":1,"183":1,"186":1,"188":1,"230":2,"274":1,"301":1}}],["arduinosdk",{"2":{"79":1}}],["argument",{"2":{"37":1}}],["ar",{"2":{"1":1,"4":1,"181":1}}],["area",{"2":{"108":2,"117":1,"230":1}}],["aren",{"2":{"87":1,"221":1,"292":1}}],["are",{"0":{"140":1,"217":1},"1":{"141":1},"2":{"1":4,"5":1,"15":1,"16":1,"20":1,"22":3,"25":3,"28":5,"30":2,"31":2,"33":1,"35":1,"37":1,"38":1,"39":1,"48":1,"54":1,"58":2,"66":1,"67":3,"68":1,"80":1,"90":2,"93":1,"106":4,"116":1,"118":1,"121":1,"123":2,"124":2,"126":1,"131":1,"133":1,"135":1,"136":1,"140":1,"145":1,"146":1,"150":1,"151":1,"153":1,"165":3,"167":1,"168":1,"170":1,"171":2,"175":1,"181":4,"185":3,"188":2,"190":1,"192":3,"193":2,"196":3,"200":1,"204":2,"205":1,"206":1,"207":2,"209":1,"212":1,"215":1,"216":1,"218":1,"221":5,"222":1,"224":2,"225":1,"228":1,"229":2,"230":2,"236":1,"237":1,"244":1,"252":1,"257":1,"263":1,"295":1,"302":1,"306":1}}],["24p",{"2":{"216":2}}],["245c",{"2":{"3":1,"221":1}}],["2x",{"0":{"215":1},"2":{"145":2,"146":2,"150":2,"151":2,"211":2,"212":2,"217":1,"223":1}}],["25",{"2":{"111":2}}],["2π",{"2":{"108":1,"117":1}}],["2dbm",{"2":{"68":2,"70":2}}],["200mm",{"2":{"216":1}}],["20pcs",{"2":{"130":2}}],["20ₘₐ",{"2":{"110":2,"117":1}}],["2013",{"0":{"118":1},"2":{"107":1,"118":1}}],["20",{"2":{"68":1,"70":1,"110":2,"111":1,"112":1,"113":1,"114":1,"115":1,"117":1}}],["28",{"2":{"68":1,"70":1,"114":2,"218":2}}],["22",{"2":{"11":1,"115":1}}],["230c",{"2":{"3":1}}],["2nd",{"0":{"180":1},"2":{"1":2,"4":1,"180":1,"181":2}}],["2",{"0":{"43":1,"50":1,"76":1,"88":1,"89":1,"111":2,"112":1,"114":2,"115":1,"134":1,"158":1,"167":1,"187":1,"203":2,"207":1,"208":1,"284":1},"1":{"204":2},"2":{"1":1,"11":1,"28":3,"38":1,"48":1,"111":2,"112":1,"114":2,"115":2,"141":1,"157":1,"168":2,"170":2,"176":4,"185":1,"192":1,"193":1,"204":2,"207":2,"215":1,"216":1,"220":1,"242":3,"274":5}}],["4x",{"2":{"221":3,"223":1}}],["4mm",{"2":{"176":1}}],["41",{"2":{"114":2}}],["400",{"2":{"107":1}}],["44",{"2":{"68":1,"70":1}}],["4ghz",{"2":{"28":2,"38":1,"48":1}}],["4",{"0":{"45":1,"52":1,"78":1,"112":2,"115":2,"136":1,"160":1,"169":1,"203":1,"207":1,"296":1},"1":{"204":1,"297":1,"298":1,"299":1,"300":1},"2":{"1":2,"11":1,"28":1,"68":1,"70":1,"97":1,"101":1,"107":1,"112":2,"115":2,"181":3,"204":2,"207":2,"215":1}}],["v=qyh",{"2":{"214":1}}],["vs",{"0":{"235":1},"2":{"173":2}}],["vsc",{"0":{"84":1},"2":{"82":1,"96":1}}],["vscode",{"2":{"11":1,"39":1,"64":1,"77":1,"78":1,"90":1}}],["voids",{"2":{"116":1}}],["voltages",{"2":{"196":1}}],["voltage",{"2":{"175":1,"197":1,"223":1}}],["volt",{"2":{"1":1,"181":1}}],["v4",{"0":{"112":1,"115":1,"165":1,"189":1,"194":1,"195":1,"196":1,"197":1,"242":1},"1":{"190":1,"191":1,"192":1,"193":1,"194":1,"196":1,"197":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1},"2":{"127":2,"135":2,"165":5,"191":1,"196":1,"218":1,"220":3,"242":2}}],["vrcfacetracking",{"2":{"266":1}}],["vrcft",{"0":{"256":1,"260":1,"263":1,"269":1},"1":{"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1},"2":{"257":5,"258":2,"260":1,"261":2,"263":5,"264":3,"266":2,"269":3,"271":3}}],["vrc",{"2":{"254":1,"302":1,"305":1,"306":1,"307":1}}],["vrchat",{"0":{"302":1},"1":{"303":1,"304":1,"305":1,"306":1,"307":1},"2":{"99":1,"302":1,"306":3}}],["vroptician",{"2":{"127":1}}],["vr",{"2":{"99":2,"104":1,"131":1}}],["vversion",{"2":{"94":1}}],["vflip",{"2":{"71":1}}],["ventilation",{"2":{"129":1,"144":1,"149":1}}],["ve",{"2":{"44":1,"94":2,"97":1,"261":1,"269":1}}],["vers",{"0":{"215":1}}],["versions",{"0":{"94":1,"95":1},"2":{"202":1}}],["version",{"0":{"97":1,"217":1,"266":1},"1":{"98":1,"267":1,"268":1,"269":1,"270":1,"271":1},"2":{"78":1,"84":1,"94":1,"104":1,"131":1,"153":1,"261":1,"266":4,"279":1,"305":1}}],["versioning",{"2":{"25":1}}],["verify",{"2":{"101":1,"116":1,"271":1}}],["vertically",{"2":{"71":1}}],["very",{"2":{"1":1,"144":1,"149":1,"181":1,"194":1,"196":1,"211":1,"265":1}}],["vive",{"2":{"129":1,"134":1,"141":1,"170":2,"202":2,"208":1,"212":1,"217":1}}],["virtual",{"2":{"99":1,"300":1}}],["via",{"0":{"81":1,"82":1,"84":1,"87":1,"88":1,"91":1},"1":{"92":1,"93":1,"94":1,"95":1},"2":{"94":1,"162":1,"165":1,"263":1,"268":1,"274":1}}],["visualized",{"2":{"300":1}}],["visually",{"2":{"106":1}}],["visual",{"0":{"73":1,"82":1,"173":1,"270":1},"1":{"74":1,"75":1},"2":{"73":1,"77":1,"82":1,"89":1,"95":1}}],["vision",{"2":{"225":1}}],["visibility",{"2":{"44":1}}],["visit",{"2":{"39":1,"157":1}}],["viewer",{"2":{"300":1}}],["viewing",{"2":{"95":1}}],["view",{"2":{"46":1,"116":1,"159":2,"215":1,"302":1}}],["video",{"2":{"38":1,"174":1,"175":1,"254":1,"289":1}}],["vitepress",{"2":{"9":1,"12":2,"14":1,"15":2,"17":1,"18":1,"19":1,"21":1}}],["valveindexdevfrunk1",{"2":{"131":1}}],["valve",{"0":{"126":1,"127":1},"1":{"127":1,"128":1,"129":2,"130":2,"131":2,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1},"2":{"126":1,"141":1,"202":2,"208":2,"217":1}}],["value",{"2":{"65":2,"67":3,"71":2,"110":2,"307":1}}],["values",{"2":{"28":1,"264":1,"274":1,"290":1}}],["variants",{"2":{"146":1,"151":1}}],["variant",{"2":{"37":1}}],["variables",{"2":{"20":1}}],["var",{"2":{"20":2}}],["vue3",{"2":{"15":1}}],["vue",{"2":{"15":2}}],["v18",{"2":{"127":1}}],["v1",{"2":{"11":2,"257":1,"262":1,"274":2}}],["v14",{"2":{"11":1}}],["v3",{"0":{"111":1,"114":1,"163":1,"182":1,"183":1,"184":1,"221":1},"1":{"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1},"2":{"1":1,"165":1,"181":1,"218":1}}],["v2s",{"0":{"1":1}}],["v2",{"0":{"0":1,"2":1,"3":1,"4":1},"1":{"1":1,"2":1,"3":1,"4":1},"2":{"4":1,"11":1,"202":1,"257":1,"262":1,"274":2}}],["tv",{"2":{"221":1}}],["twisting",{"2":{"238":1}}],["twisted",{"2":{"177":1}}],["twist",{"0":{"177":1},"2":{"175":1}}],["two",{"2":{"35":1,"56":1,"80":1,"126":1,"134":1,"175":4,"200":1,"204":1,"206":1,"207":1,"217":1,"258":1,"302":1,"304":1,"307":1}}],["t5",{"2":{"130":1,"136":1}}],["typical",{"2":{"110":1}}],["typing",{"2":{"81":1}}],["types",{"0":{"36":1,"37":1},"2":{"25":1,"33":1,"140":1,"185":1,"192":1}}],["type",{"0":{"175":1,"186":1,"187":1},"2":{"25":1,"35":2,"81":1,"185":1,"192":1,"218":1,"304":1,"305":2}}],["tape",{"2":{"229":2,"230":10}}],["table",{"2":{"199":2}}],["tabs",{"2":{"84":1}}],["tab",{"2":{"82":2,"96":1,"262":2,"263":1,"264":1,"297":1}}],["taken",{"2":{"264":1}}],["takes",{"2":{"124":1}}],["take",{"2":{"78":1,"96":1,"133":2,"141":1,"167":1,"176":1}}],["tailwindcss",{"2":{"20":2}}],["tundra",{"2":{"170":1,"202":1,"208":1,"212":1}}],["turning",{"2":{"228":1}}],["turn",{"2":{"94":1}}],["turned",{"2":{"32":1}}],["tutorials",{"2":{"76":1}}],["txpower",{"2":{"70":2}}],["txthttp",{"2":{"65":1}}],["treat",{"2":{"126":1}}],["treats",{"2":{"94":1}}],["trouble",{"2":{"90":1,"134":1,"185":1}}],["troubleshooting",{"0":{"59":1,"98":1},"1":{"60":1},"2":{"44":1}}],["training",{"2":{"101":1}}],["transmittion",{"2":{"68":1}}],["transmission",{"2":{"66":1,"68":1}}],["transfer",{"2":{"41":1}}],["trackable",{"2":{"301":1}}],["tracking",{"0":{"254":1,"256":2,"263":1,"290":1},"1":{"255":1,"257":2,"258":2,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2,"266":2,"267":2,"268":2,"269":2,"270":2,"271":2,"272":2,"273":2,"274":2},"2":{"99":2,"165":1,"175":1,"212":1,"246":1,"254":1,"257":2,"258":1,"262":1,"263":1,"274":1,"290":1,"297":1,"299":1,"300":1,"301":1,"302":1,"305":2}}],["tracker",{"0":{"86":1,"96":1,"210":1},"1":{"87":1,"88":1,"211":1,"212":1},"2":{"38":1,"72":1,"77":1,"85":1,"90":2,"95":2,"96":1,"99":1,"129":2,"133":1,"134":3,"202":1,"217":3}}],["trackers",{"2":{"38":1,"94":2,"95":1,"165":1,"170":3,"200":1,"202":1,"204":1,"206":1,"207":1,"208":1}}],["track",{"2":{"30":1,"54":1}}],["try",{"2":{"37":1,"60":2,"68":1,"90":2,"134":1,"161":1,"185":2,"224":1,"274":1}}],["trigger",{"2":{"25":1,"302":1,"307":1}}],["true",{"2":{"19":1,"307":1}}],["t",{"0":{"108":1,"251":1,"306":1},"1":{"252":1,"253":1},"2":{"25":1,"47":1,"50":1,"68":1,"70":1,"87":1,"94":1,"97":1,"98":1,"106":2,"126":2,"133":1,"135":1,"136":1,"204":1,"221":1,"222":1,"266":2,"292":1,"300":2,"304":2,"306":1}}],["tension",{"2":{"134":1}}],["term",{"2":{"106":1}}],["terminal",{"2":{"81":2,"97":1}}],["terminology",{"0":{"285":1},"1":{"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"1":1,"181":1,"285":1}}],["testing",{"0":{"266":1},"1":{"267":1,"268":1,"269":1,"270":1,"271":1},"2":{"96":1,"106":1}}],["tested",{"2":{"58":1,"96":1,"126":1}}],["tests",{"2":{"25":1}}],["test",{"0":{"161":1},"2":{"25":2,"37":1,"64":1,"161":1,"185":1,"266":1}}],["text",{"2":{"19":4,"20":4,"25":1,"28":1,"52":1,"96":1,"184":2}}],["team",{"2":{"15":1,"78":1,"98":1}}],["temps",{"2":{"221":1}}],["temperamental",{"2":{"204":1,"207":1}}],["template",{"2":{"141":1}}],["temp",{"2":{"3":2,"221":1}}],["tightly",{"2":{"231":1}}],["tighten",{"2":{"147":1,"152":1}}],["tip",{"2":{"20":1,"36":1,"188":1}}],["title",{"0":{"20":1},"2":{"20":3,"25":1}}],["tinkering",{"2":{"138":1}}],["tin",{"0":{"177":1},"2":{"2":1,"3":1,"182":1,"183":1}}],["times",{"2":{"121":1,"168":1,"225":1,"228":1,"238":1}}],["timem",{"2":{"83":1}}],["time",{"2":{"1":1,"36":1,"56":1,"99":1,"124":1,"133":1,"170":1,"172":1,"181":1,"246":1,"266":2,"271":1,"281":1}}],["threshold",{"0":{"292":1},"2":{"300":5}}],["thresholds",{"2":{"101":1,"107":1,"274":1}}],["through",{"2":{"95":1,"131":1,"135":1,"136":1,"220":1,"221":1,"244":1}}],["those",{"2":{"94":1,"165":1,"273":1,"304":1}}],["though",{"2":{"28":1,"32":1,"79":1,"215":1}}],["thanks",{"2":{"257":1}}],["thank",{"2":{"140":1}}],["than",{"2":{"68":1,"170":1,"204":1,"205":1,"207":1,"211":1,"231":1,"273":1}}],["that",{"0":{"46":1,"156":1,"265":1},"2":{"4":1,"5":1,"20":1,"22":2,"24":6,"25":10,"28":2,"31":1,"32":1,"33":1,"35":1,"37":2,"41":1,"43":1,"47":1,"48":1,"49":1,"54":3,"56":1,"60":2,"62":1,"66":1,"67":2,"68":4,"77":1,"78":1,"79":2,"82":1,"84":1,"87":1,"90":3,"94":2,"95":2,"97":2,"106":3,"122":1,"123":1,"154":1,"156":2,"159":1,"165":1,"167":1,"170":2,"171":1,"179":1,"182":1,"186":1,"194":1,"200":1,"205":1,"206":1,"209":1,"214":1,"215":4,"216":1,"217":5,"224":3,"229":1,"230":4,"238":1,"252":1,"257":2,"261":1,"263":4,"264":1,"265":3,"269":1,"271":2,"273":1,"284":1,"292":1,"293":1,"297":2,"299":1,"300":2,"301":1,"302":1,"304":2,"305":2,"306":2}}],["thunder",{"2":{"32":1,"64":1}}],["thick",{"2":{"133":1}}],["thin",{"2":{"253":1}}],["think",{"2":{"221":1,"224":1,"274":2}}],["thinker",{"2":{"37":1}}],["thingiverse",{"2":{"157":2,"162":1}}],["thing",{"2":{"25":2,"157":1,"265":1}}],["things",{"0":{"119":1,"120":1,"168":1},"1":{"120":1,"121":2,"122":2,"123":2,"124":2,"125":2},"2":{"1":1,"19":2,"36":1,"44":1,"84":1,"100":1,"124":1,"134":1,"170":1,"181":1,"215":1,"258":1,"263":1,"292":1}}],["this",{"0":{"27":1,"38":1,"120":2,"156":1,"164":1,"253":1,"257":1,"258":1,"274":1,"276":1,"299":1},"1":{"39":1,"121":2,"122":2,"123":2,"124":2,"125":2,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1},"2":{"1":4,"5":1,"9":1,"16":1,"18":1,"19":2,"20":3,"24":2,"25":6,"28":2,"30":3,"31":5,"32":3,"33":1,"35":1,"36":3,"37":7,"39":3,"43":1,"44":2,"52":1,"54":3,"56":1,"62":2,"66":1,"69":1,"72":1,"78":4,"79":1,"83":1,"84":1,"87":1,"88":1,"89":1,"90":4,"94":3,"95":1,"96":2,"97":1,"100":2,"106":2,"126":1,"130":1,"131":2,"133":1,"134":1,"140":1,"144":1,"149":1,"153":1,"165":1,"166":1,"170":4,"174":1,"175":1,"177":1,"181":4,"182":2,"186":3,"187":1,"188":3,"193":1,"196":1,"202":1,"204":1,"205":1,"207":1,"208":1,"212":1,"215":1,"217":1,"221":1,"222":1,"225":1,"228":1,"229":1,"230":1,"236":1,"240":1,"242":1,"246":1,"247":2,"248":1,"257":1,"264":2,"265":1,"266":1,"269":1,"271":1,"274":4,"276":1,"280":1,"284":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"297":1,"300":4,"302":2,"304":1,"305":1,"306":1,"307":1}}],["thermal",{"2":{"118":1}}],["there",{"0":{"265":1},"2":{"45":1,"80":1,"82":1,"84":2,"87":1,"94":2,"98":1,"146":1,"151":1,"154":1,"159":2,"170":1,"171":1,"185":2,"186":1,"188":2,"190":1,"192":1,"196":2,"200":1,"206":1,"215":1,"224":1,"247":1,"265":2,"266":1,"273":1,"305":1}}],["these",{"2":{"20":1,"22":1,"28":1,"66":1,"78":1,"94":1,"98":1,"107":1,"118":1,"126":1,"127":1,"165":1,"175":1,"192":2,"229":1,"238":1}}],["then",{"2":{"14":1,"19":1,"28":2,"31":1,"36":1,"43":1,"44":1,"51":1,"52":2,"66":1,"78":1,"82":1,"87":1,"88":1,"94":1,"96":1,"97":1,"135":1,"147":1,"152":1,"174":1,"175":1,"176":1,"182":1,"194":1,"197":1,"221":1,"224":1,"236":1,"264":1,"280":1,"284":1,"297":2}}],["they",{"2":{"1":1,"16":1,"95":1,"133":2,"135":2,"172":1,"181":1,"193":1,"204":2,"207":2,"212":1,"214":1,"215":1,"221":5,"228":1,"244":1,"263":2,"265":1,"274":1,"304":2,"306":1}}],["theme",{"2":{"19":1,"20":1}}],["them",{"0":{"177":1,"296":1},"1":{"297":1,"298":1,"299":1,"300":1},"2":{"1":1,"35":1,"76":1,"82":1,"94":1,"95":1,"134":2,"135":1,"145":1,"150":1,"153":1,"160":1,"170":1,"172":1,"175":1,"176":1,"177":1,"181":1,"185":4,"221":4,"222":1,"224":1,"228":2,"229":2,"238":2,"244":1,"252":2,"270":1,"304":2,"305":3,"306":1}}],["their",{"2":{"1":1,"94":2,"133":1,"181":1,"254":1,"260":1,"269":1,"299":1}}],["the",{"0":{"4":1,"9":1,"19":1,"26":1,"27":2,"28":1,"42":1,"43":1,"57":1,"60":1,"72":1,"76":1,"78":1,"83":1,"84":1,"85":1,"87":1,"96":1,"97":2,"125":2,"159":1,"166":1,"167":1,"172":1,"173":1,"174":1,"177":1,"178":1,"179":1,"180":1,"184":1,"217":1,"221":1,"230":1,"234":1,"238":1,"239":1,"240":1,"244":1,"251":1,"252":1,"255":1,"256":1,"262":1,"263":1,"264":1,"266":1,"268":1,"269":1,"270":1,"271":1,"273":1,"274":1,"275":1,"276":1,"280":1,"281":1,"282":1,"283":2,"284":1,"296":1,"299":2,"305":1,"306":2},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"27":1,"28":1,"29":2,"30":2,"31":2,"32":2,"33":2,"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"84":1,"86":1,"87":1,"88":1,"89":1,"90":1,"91":1,"92":1,"93":1,"94":1,"95":1,"96":1,"98":2,"252":1,"253":1,"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":2,"268":2,"269":2,"270":2,"271":2,"272":1,"273":1,"274":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":2,"298":2,"299":2,"300":2,"301":1},"2":{"1":9,"2":4,"3":5,"4":13,"9":2,"12":4,"14":1,"15":3,"16":2,"17":5,"18":2,"19":9,"20":16,"21":2,"22":3,"24":4,"25":15,"28":19,"30":6,"31":21,"32":5,"33":4,"35":4,"36":6,"37":14,"38":5,"39":8,"41":1,"42":6,"43":3,"44":6,"45":4,"46":1,"47":4,"48":1,"49":1,"50":4,"51":2,"52":3,"54":15,"56":15,"57":6,"58":2,"60":12,"62":3,"64":2,"65":5,"66":24,"67":4,"68":17,"69":10,"70":7,"71":6,"72":1,"73":1,"76":2,"77":2,"78":13,"79":3,"82":4,"83":1,"84":5,"85":2,"87":10,"88":6,"89":4,"90":18,"92":1,"93":5,"94":12,"95":9,"96":12,"97":10,"98":4,"99":1,"100":2,"101":4,"103":1,"106":5,"107":6,"116":2,"118":3,"121":1,"122":1,"126":1,"127":4,"129":6,"131":6,"133":16,"134":23,"135":16,"136":9,"138":1,"140":2,"141":3,"145":2,"147":2,"150":2,"152":2,"153":5,"154":2,"157":2,"158":3,"159":7,"160":1,"161":1,"162":3,"165":1,"166":1,"167":1,"169":1,"170":19,"171":10,"172":3,"173":1,"174":1,"175":3,"176":8,"177":1,"178":3,"179":6,"180":1,"181":9,"182":9,"183":3,"184":11,"185":6,"186":10,"187":5,"188":3,"190":1,"191":1,"192":8,"193":5,"194":10,"196":5,"197":10,"199":1,"202":3,"204":1,"205":1,"207":1,"208":1,"209":2,"211":1,"212":4,"214":6,"215":10,"216":5,"217":9,"220":3,"221":7,"222":4,"223":1,"224":5,"225":6,"228":8,"229":4,"230":23,"231":5,"232":1,"234":1,"235":2,"236":4,"237":2,"238":4,"239":6,"240":12,"242":2,"243":4,"244":17,"245":1,"246":1,"247":6,"248":2,"253":3,"254":1,"258":1,"261":4,"262":6,"263":12,"264":3,"265":4,"266":13,"268":1,"269":6,"270":2,"271":6,"273":2,"274":8,"276":1,"279":3,"280":4,"281":5,"283":4,"284":1,"285":2,"286":1,"287":1,"289":2,"290":2,"293":1,"297":4,"299":2,"300":6,"301":8,"302":4,"304":13,"305":16,"306":6,"307":6}}],["togggle",{"2":{"274":1}}],["toggle",{"2":{"274":2}}],["together",{"0":{"177":1},"2":{"175":1,"176":1,"177":2}}],["toward",{"2":{"184":1}}],["torx",{"2":{"130":1,"136":1,"147":1,"152":1}}],["total",{"2":{"101":2,"111":1,"112":1,"114":1,"115":1,"117":1,"304":1}}],["touch",{"2":{"95":1}}],["top",{"2":{"20":1,"101":1,"131":1,"179":1,"244":2,"285":1}}],["tools",{"0":{"223":1},"1":{"224":1},"2":{"32":1}}],["tool",{"0":{"40":1,"42":1,"43":1},"1":{"41":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"48":1,"49":1,"50":1,"51":1,"52":1},"2":{"25":1,"39":4,"42":2}}],["too",{"2":{"3":1,"66":1,"182":1,"196":1,"228":1,"230":1,"238":1,"300":2,"302":1}}],["to",{"0":{"1":1,"19":1,"48":1,"55":1,"57":1,"60":1,"63":1,"86":1,"97":1,"119":1,"120":1,"125":1,"156":1,"157":2,"168":1,"171":1,"172":2,"173":1,"175":1,"178":1,"179":1,"181":1,"189":1,"190":1,"195":1,"196":1,"233":1,"254":1,"262":1,"263":1,"264":1,"276":1,"282":1,"296":1,"305":1},"1":{"49":1,"50":1,"51":1,"52":1,"56":1,"57":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"87":1,"88":1,"98":1,"120":1,"121":2,"122":2,"123":2,"124":2,"125":2,"190":1,"191":2,"192":2,"193":2,"194":1,"196":1,"197":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1,"255":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":2,"298":2,"299":2,"300":2,"301":1},"2":{"1":3,"2":2,"3":1,"4":1,"12":1,"14":1,"15":2,"16":3,"17":2,"19":13,"20":3,"21":2,"22":2,"24":8,"25":10,"28":20,"30":3,"31":23,"32":2,"33":3,"35":3,"36":4,"37":3,"38":2,"39":3,"41":1,"42":1,"43":1,"44":4,"45":3,"46":2,"47":1,"48":1,"50":6,"51":1,"52":2,"54":4,"56":6,"57":4,"58":1,"60":5,"62":2,"64":2,"65":1,"66":14,"67":1,"68":9,"69":3,"70":2,"71":2,"72":2,"76":3,"77":2,"78":7,"79":1,"80":1,"81":1,"82":1,"83":2,"84":2,"85":2,"87":4,"88":4,"89":1,"90":5,"92":3,"93":5,"94":13,"95":6,"96":2,"97":5,"98":3,"99":2,"100":3,"101":2,"102":1,"104":2,"105":1,"106":7,"107":1,"108":1,"113":1,"116":3,"118":4,"123":3,"124":3,"126":2,"127":2,"129":2,"131":1,"133":3,"134":2,"135":3,"136":4,"138":2,"140":6,"141":1,"144":1,"145":1,"146":1,"147":2,"149":1,"150":1,"151":1,"152":2,"153":3,"156":1,"157":2,"158":1,"159":4,"160":2,"162":3,"165":1,"166":1,"167":1,"168":2,"170":7,"171":3,"172":2,"173":1,"174":1,"175":3,"176":2,"177":1,"181":3,"182":5,"184":1,"185":8,"186":1,"187":1,"188":5,"193":1,"194":4,"196":3,"202":2,"204":2,"205":1,"207":3,"208":1,"212":2,"214":2,"215":2,"216":1,"217":7,"218":3,"220":4,"221":2,"222":1,"224":3,"225":1,"228":2,"229":3,"230":8,"231":1,"232":1,"236":2,"237":2,"238":1,"239":1,"244":5,"245":2,"246":1,"247":1,"252":2,"253":2,"257":4,"258":1,"260":2,"261":1,"262":2,"263":8,"264":3,"265":1,"266":5,"269":6,"270":2,"271":2,"273":4,"274":1,"276":1,"279":4,"281":2,"283":1,"284":1,"289":1,"290":1,"292":1,"293":4,"294":1,"295":1,"300":3,"301":5,"302":6,"304":10,"305":6,"306":4,"307":5}}],["image",{"2":{"143":1,"147":4,"148":1,"152":4,"170":1,"188":1,"194":1,"240":1}}],["improvements",{"2":{"118":1}}],["improve",{"2":{"100":1,"140":1}}],["improves",{"2":{"25":1}}],["implement",{"2":{"66":1}}],["implemented",{"2":{"66":2,"274":1}}],["important",{"2":{"25":1,"37":1,"100":1,"106":1,"124":1,"200":1,"206":1,"269":1,"301":1}}],["ignored",{"2":{"123":1}}],["illuminated",{"2":{"108":1,"117":1}}],["ie",{"2":{"108":2,"110":3,"111":1,"112":1,"114":1,"115":1,"117":3}}],["iec",{"2":{"107":2}}],["icnirp",{"0":{"118":1},"2":{"101":2,"107":1,"111":1,"112":1,"114":1,"115":1,"118":1}}],["icon",{"2":{"43":2,"82":1,"96":1,"284":1,"305":1}}],["io12",{"2":{"179":1}}],["ioo",{"2":{"87":1}}],["io0",{"2":{"45":1}}],["ide",{"0":{"77":1},"2":{"77":1,"270":1}}],["ideal",{"2":{"44":1,"159":1}}],["i",{"0":{"39":1,"93":1,"258":2,"265":1},"1":{"94":1,"95":1,"259":2,"260":2,"261":2,"262":2,"263":2,"264":2,"265":2},"2":{"39":2,"110":1,"117":1,"130":1,"134":1,"136":1,"156":1,"159":1,"175":1,"179":1,"182":2,"185":1,"202":1,"208":1,"215":1,"217":1,"230":2}}],["ip",{"0":{"96":1},"2":{"30":1,"31":2,"52":2,"54":6,"94":1,"95":3,"263":3,"289":1,"297":3}}],["ish",{"2":{"179":1}}],["isn",{"0":{"108":1}}],["issue",{"2":{"39":1,"98":1,"170":1,"306":1}}],["issues",{"2":{"39":1,"170":2,"179":1,"204":1,"212":1}}],["is",{"0":{"35":1,"38":1,"54":1,"62":1,"92":1,"120":1,"121":1,"165":1,"253":1,"257":1,"299":1},"1":{"39":1,"121":1,"122":1,"123":1,"124":1,"125":1},"2":{"1":1,"3":1,"4":3,"9":2,"18":1,"20":2,"22":1,"24":9,"25":10,"28":4,"31":2,"32":4,"33":1,"35":2,"36":7,"37":10,"38":2,"39":1,"41":2,"43":1,"44":2,"46":1,"47":1,"50":1,"51":1,"52":1,"54":3,"56":4,"57":1,"58":2,"60":5,"62":2,"64":1,"65":1,"66":2,"77":1,"78":2,"79":1,"84":1,"87":1,"90":4,"92":1,"94":1,"96":1,"99":1,"100":1,"101":3,"103":1,"104":1,"106":3,"107":3,"108":1,"116":1,"124":1,"129":1,"134":2,"136":2,"140":1,"144":1,"149":1,"153":1,"157":2,"159":2,"161":1,"170":7,"173":1,"181":1,"184":2,"185":1,"186":4,"188":1,"191":1,"192":1,"193":1,"194":2,"196":1,"202":3,"205":1,"208":1,"215":2,"217":3,"221":3,"222":1,"224":2,"229":1,"230":1,"235":2,"238":1,"242":1,"246":1,"254":2,"257":2,"264":2,"265":2,"271":2,"273":1,"274":4,"276":1,"278":1,"289":1,"291":1,"292":1,"293":1,"297":1,"300":1,"301":4,"305":1,"307":1}}],["invoke",{"2":{"279":1}}],["involves",{"2":{"187":1}}],["invisible",{"2":{"101":1}}],["inwards",{"2":{"184":1,"186":1}}],["inbetween",{"2":{"134":1}}],["inaccurate",{"2":{"118":1}}],["increase",{"2":{"304":1}}],["including",{"2":{"230":1}}],["include",{"0":{"156":1},"2":{"147":1,"152":1,"222":1}}],["included",{"2":{"127":2,"140":1,"193":1,"215":1}}],["includes",{"2":{"44":1,"106":1}}],["incentive",{"2":{"140":1}}],["incomplete",{"0":{"124":1}}],["incoherent",{"2":{"118":1}}],["injury",{"2":{"118":1}}],["infront",{"2":{"136":1}}],["infrared",{"0":{"106":1},"1":{"107":1,"108":1},"2":{"101":2,"118":1}}],["information",{"2":{"33":1,"50":1,"140":1}}],["info",{"2":{"28":2,"78":1,"179":1}}],["initiative",{"2":{"140":1}}],["initially",{"2":{"85":1}}],["initial",{"2":{"44":1,"88":1}}],["inimdnsname",{"2":{"56":1}}],["ini",{"0":{"28":2},"1":{"29":2,"30":2,"31":2,"32":2,"33":2},"2":{"37":1,"56":2,"95":3}}],["indicating",{"2":{"71":1,"88":1}}],["indicate",{"2":{"25":2}}],["index",{"0":{"126":1,"127":1},"1":{"127":1,"128":1,"129":2,"130":2,"131":2,"132":1,"133":1,"134":1,"135":1,"136":1,"137":1,"138":1,"139":1},"2":{"19":1,"126":1,"129":2,"136":2,"141":1,"202":2,"208":2,"217":1}}],["inspector",{"2":{"304":3,"305":1}}],["inspections",{"2":{"116":1}}],["inspiration",{"2":{"141":1,"159":1}}],["inserted",{"2":{"134":1}}],["insert",{"2":{"133":2,"134":3,"146":1,"151":1}}],["inserting",{"2":{"133":1}}],["inserts",{"0":{"133":1},"2":{"130":2,"133":4,"134":1,"144":1,"149":1}}],["instead",{"2":{"54":1,"79":1,"84":1,"215":1,"273":1}}],["instructions",{"0":{"139":1},"2":{"42":1,"100":1,"165":1}}],["installing",{"0":{"279":1},"2":{"266":1,"280":1}}],["installed",{"2":{"58":1,"77":1,"78":1,"84":1,"261":1,"270":1,"283":1}}],["installer",{"0":{"283":1},"2":{"42":2}}],["install",{"0":{"42":1,"73":1,"75":1,"76":1,"77":1,"170":1,"270":1,"278":1,"280":1,"282":1,"283":1},"1":{"74":1,"75":1,"283":1,"284":1,"285":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"296":1,"297":1,"298":1,"299":1,"300":1,"301":1},"2":{"12":1,"45":1,"73":1,"76":1,"77":1,"78":1,"138":1,"261":1,"266":2,"278":1,"279":3,"280":2}}],["installation",{"0":{"12":1,"139":1},"2":{"42":1,"43":1,"45":1,"46":1,"51":1,"80":1,"266":1}}],["inside",{"2":{"20":1,"214":1,"305":1}}],["integrity",{"2":{"170":1}}],["intensity",{"2":{"101":1,"108":2,"110":2}}],["intensities",{"2":{"101":1}}],["interact",{"2":{"302":1}}],["interference",{"2":{"170":1,"204":1,"207":1}}],["interface",{"2":{"93":1,"216":1}}],["internally",{"2":{"131":1}}],["international",{"2":{"101":1,"107":1}}],["interested",{"2":{"131":1}}],["intro",{"2":{"19":1}}],["introduction",{"2":{"19":1}}],["into",{"2":{"18":1,"35":1,"44":1,"52":1,"79":1,"81":1,"87":2,"90":1,"95":1,"96":1,"97":1,"113":1,"133":2,"134":3,"135":2,"138":1,"147":1,"152":1,"171":1,"172":1,"186":2,"244":1,"247":1,"248":1,"262":1,"297":1,"299":1,"305":1}}],["input",{"2":{"4":1,"96":1}}],["in",{"0":{"7":1,"82":1,"165":1,"174":1,"208":1,"234":1,"264":1,"274":1,"299":1,"306":1},"2":{"1":4,"2":1,"3":1,"4":1,"5":1,"12":1,"15":1,"17":1,"18":2,"20":2,"21":1,"24":5,"28":8,"32":1,"33":1,"36":1,"37":1,"39":1,"44":1,"54":1,"56":1,"66":2,"67":1,"68":3,"69":1,"76":1,"78":3,"79":1,"81":1,"82":2,"84":1,"85":1,"87":6,"94":4,"95":3,"96":5,"97":1,"98":2,"99":1,"100":1,"101":3,"106":4,"107":1,"108":2,"124":1,"127":1,"131":1,"133":1,"134":4,"135":3,"136":5,"140":1,"141":1,"147":1,"152":1,"153":1,"154":1,"165":1,"170":3,"171":2,"174":1,"175":2,"179":3,"181":4,"182":2,"183":1,"184":1,"186":2,"187":1,"188":2,"192":1,"193":3,"194":2,"196":3,"197":1,"202":1,"204":1,"205":3,"207":1,"209":1,"212":1,"215":2,"217":1,"221":3,"224":3,"228":4,"229":3,"230":2,"235":1,"240":3,"252":1,"253":1,"257":1,"261":1,"264":2,"265":1,"266":1,"270":1,"273":1,"274":5,"280":1,"281":1,"285":1,"289":1,"297":1,"299":1,"300":2,"302":1,"304":6,"305":4,"307":2}}],["ifixit",{"2":{"136":1}}],["if",{"0":{"217":1,"251":1},"1":{"252":1,"253":1},"2":{"1":2,"17":1,"18":1,"19":1,"25":1,"28":5,"30":2,"31":3,"33":1,"35":1,"37":2,"39":1,"47":2,"54":4,"56":1,"57":1,"58":2,"60":4,"62":1,"65":1,"66":1,"67":2,"68":1,"78":1,"87":1,"90":4,"94":1,"95":1,"97":3,"98":2,"100":1,"101":1,"104":2,"106":1,"118":1,"123":2,"124":1,"126":1,"131":2,"134":2,"135":1,"136":1,"145":1,"150":1,"158":1,"170":2,"181":2,"184":2,"185":4,"186":1,"196":1,"197":1,"204":1,"207":1,"212":1,"214":1,"215":1,"216":1,"217":1,"218":1,"221":5,"224":4,"225":1,"228":2,"231":1,"235":1,"236":1,"237":1,"244":1,"252":1,"263":2,"266":1,"271":1,"284":1,"307":1}}],["items",{"0":{"125":1},"2":{"19":1}}],["itself",{"0":{"80":1},"1":{"81":1,"82":1},"2":{"66":2,"96":1,"258":1,"302":1,"305":1,"307":1}}],["its",{"2":{"4":2,"230":1,"248":1,"269":1,"304":1}}],["it",{"0":{"35":1,"46":1,"54":1,"55":1,"62":1,"63":1,"92":1,"93":1,"159":1,"245":1},"1":{"56":1,"57":1,"64":1,"65":1,"66":1,"67":1,"68":1,"69":1,"70":1,"71":1,"94":1,"95":1},"2":{"1":1,"2":1,"4":2,"9":1,"19":1,"20":1,"24":1,"25":1,"28":4,"32":1,"36":2,"37":3,"38":1,"39":1,"41":1,"44":3,"45":2,"49":1,"50":1,"51":1,"52":1,"56":2,"64":1,"73":1,"77":1,"78":3,"79":1,"81":2,"82":3,"84":2,"87":6,"88":1,"89":1,"90":1,"92":1,"94":2,"95":2,"96":1,"97":1,"99":3,"100":1,"101":1,"103":1,"106":3,"124":1,"129":3,"133":1,"134":1,"135":5,"136":3,"138":1,"141":1,"144":1,"149":1,"159":1,"160":1,"161":1,"162":1,"165":1,"167":1,"170":5,"171":2,"172":2,"174":2,"176":1,"179":2,"181":1,"182":4,"183":1,"185":1,"186":1,"197":1,"200":1,"205":1,"206":1,"214":2,"215":2,"217":2,"224":3,"228":1,"229":1,"230":4,"236":2,"237":1,"238":2,"239":3,"240":1,"244":1,"246":1,"252":1,"257":3,"261":1,"263":2,"265":1,"266":4,"268":1,"269":4,"270":1,"271":2,"273":2,"274":6,"278":1,"281":1,"284":1,"289":1,"290":1,"293":1,"297":1,"300":1,"301":1,"302":2,"304":4,"305":6,"306":2,"307":1}}],["iron",{"2":{"130":1,"133":2,"182":2,"223":1}}],["irradiance",{"2":{"107":2,"108":2}}],["irreversible",{"2":{"106":1}}],["ir",{"0":{"0":1,"1":1,"106":1,"123":1,"176":1,"177":1,"181":1,"188":1,"215":1,"219":1,"225":1,"226":1,"227":1},"1":{"1":1,"2":1,"3":1,"4":1,"107":1,"108":1,"220":1,"221":1,"226":1,"227":1},"2":{"1":1,"4":1,"101":3,"106":4,"116":2,"181":1,"190":1,"214":1,"215":2,"218":1,"221":5,"222":1,"225":3,"242":2}}],["global",{"0":{"253":1}}],["gluing",{"2":{"187":1,"244":1}}],["glued",{"2":{"228":1}}],["glue",{"2":{"129":1,"160":1,"179":1,"186":2,"187":1,"188":2,"223":2,"244":1}}],["glass",{"2":{"1":1,"181":1}}],["game",{"2":{"257":1}}],["gasket",{"2":{"244":2}}],["gauge",{"2":{"218":3}}],["gain",{"2":{"71":1}}],["gather",{"0":{"169":1},"2":{"1":1,"181":1}}],["grey",{"2":{"239":1,"240":1}}],["greater",{"2":{"207":1}}],["greatly",{"2":{"199":1}}],["green",{"2":{"96":1,"184":2}}],["greeted",{"2":{"43":1,"284":1}}],["graph",{"2":{"274":1}}],["gray",{"2":{"171":2}}],["grab",{"2":{"87":1,"182":1,"239":1}}],["ground",{"2":{"1":1,"4":4,"175":1,"176":2,"179":1,"181":1}}],["gold",{"2":{"197":2}}],["good",{"0":{"159":1},"2":{"144":1,"149":1,"159":2,"161":1,"185":1,"186":1,"204":1,"205":1,"207":1,"217":1,"230":3,"254":1,"300":2}}],["got",{"2":{"79":1,"264":1}}],["go",{"2":{"46":1,"78":1,"123":1,"126":1,"188":1,"193":1,"240":1,"262":1,"283":1,"285":1}}],["going",{"2":{"36":1,"38":1,"78":1,"167":1}}],["goes",{"2":{"4":1,"78":1,"98":1,"172":1}}],["g",{"2":{"35":2,"299":1}}],["ghz",{"0":{"203":1,"207":1},"1":{"204":1},"2":{"28":1,"204":2,"207":2}}],["gh",{"2":{"25":1}}],["gumstick",{"0":{"137":1},"1":{"138":1,"139":1},"2":{"138":1}}],["guarantees",{"2":{"116":1}}],["gui",{"2":{"43":1,"284":1,"290":1}}],["guides",{"0":{"140":1},"1":{"141":1}}],["guideline",{"0":{"118":1}}],["guidelines",{"0":{"141":1},"2":{"101":2,"118":1}}],["guide",{"0":{"22":1,"163":1,"164":1,"242":1,"276":1},"1":{"23":1,"24":1,"25":1,"164":1,"165":1,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"183":1,"184":1,"185":1,"186":1,"187":1,"188":1,"243":1,"244":1,"245":1,"246":1,"247":1,"248":1},"2":{"30":1,"79":1,"84":1,"87":1,"90":1,"93":1,"100":1,"141":1,"165":1,"173":1,"174":1,"212":1,"224":1,"229":1}}],["gulp",{"2":{"25":1}}],["gesture",{"2":{"305":1}}],["gerber",{"2":{"221":1}}],["gently",{"2":{"230":1,"239":2}}],["gentle",{"2":{"171":1,"240":1}}],["generic",{"2":{"37":1,"223":2}}],["generated",{"2":{"306":1}}],["generate",{"2":{"25":1}}],["generally",{"2":{"186":2}}],["general",{"0":{"24":1}}],["getting",{"0":{"10":1,"190":1,"196":1,"285":1},"1":{"11":1,"12":1,"191":1,"192":1,"193":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"19":3,"36":1,"96":1,"159":1,"185":1,"220":1}}],["getstoredconfig",{"2":{"66":1}}],["gets",{"2":{"4":1,"228":1}}],["get",{"0":{"52":1,"100":1,"162":1},"2":{"1":1,"38":1,"58":1,"64":1,"66":6,"76":1,"90":1,"156":1,"157":1,"161":1,"174":1,"175":1,"181":1,"221":1,"230":2,"252":1,"253":1,"260":1,"265":1,"271":1,"304":1}}],["gt",{"2":{"20":2,"25":2,"30":1,"65":1,"67":6,"84":1,"94":1,"107":1,"118":1,"194":4,"266":1,"306":2}}],["gives",{"2":{"159":1}}],["given",{"2":{"67":1,"68":1}}],["give",{"0":{"159":1},"2":{"20":1,"166":1,"224":1,"281":1,"305":1}}],["github",{"0":{"268":1},"2":{"12":1,"16":1,"42":1,"78":2,"103":1,"118":1,"131":1,"141":1,"146":1,"151":1,"158":1,"268":1,"269":1,"283":1}}],["git",{"0":{"25":1},"2":{"11":1,"12":1,"24":1,"25":6,"78":4,"97":4,"268":1}}],["gnd",{"2":{"1":1,"179":1,"181":1}}],["pyinstaller",{"2":{"281":1}}],["py",{"2":{"279":1}}],["python",{"0":{"278":1,"280":1},"2":{"278":1,"279":1}}],["peel",{"2":{"230":1}}],["peeled",{"2":{"230":1}}],["people",{"2":{"153":1,"222":1}}],["periodic",{"2":{"116":1}}],["permanent",{"2":{"101":1}}],["permanently",{"2":{"36":1}}],["perfect",{"2":{"121":1,"133":1,"161":1}}],["performs",{"2":{"170":1}}],["perform",{"2":{"116":1}}],["performance",{"2":{"25":1,"202":1,"208":1}}],["perf",{"2":{"25":1}}],["per",{"2":{"2":1,"108":1,"117":1,"176":1,"182":1,"192":1}}],["physics",{"0":{"137":1},"1":{"138":1,"139":1},"2":{"127":1,"138":1}}],["photobiological",{"2":{"101":1}}],["pdf",{"2":{"118":1}}],["purchase",{"2":{"215":1}}],["purchases",{"2":{"205":1}}],["purple",{"2":{"192":1}}],["purposes",{"2":{"36":1,"44":1}}],["pushing",{"2":{"240":1}}],["push",{"2":{"133":1,"135":2,"240":1}}],["pupil",{"2":{"107":1,"159":1,"292":1,"300":1}}],["pull",{"2":{"97":1,"230":1,"231":1}}],["putting",{"2":{"135":1,"186":1,"231":1}}],["put",{"2":{"95":1,"106":2,"179":1,"182":1,"192":1,"221":1,"269":1,"289":1,"300":1}}],["piece",{"2":{"176":1,"182":1}}],["pick",{"2":{"146":1,"151":1,"197":1,"225":1}}],["picture",{"2":{"133":2,"136":1,"184":2,"193":1}}],["pio",{"2":{"81":1,"84":1,"94":1}}],["pinecil",{"2":{"223":1}}],["pine64",{"2":{"223":1}}],["pins",{"2":{"171":1,"193":2,"196":1,"240":2}}],["pinging",{"2":{"141":1}}],["ping",{"2":{"66":1,"185":1}}],["pin",{"2":{"1":1,"4":5,"178":1,"179":3,"181":1,"197":1}}],["pc",{"0":{"86":1,"263":1},"1":{"87":1,"88":1},"2":{"45":1,"51":1,"52":1,"87":2,"88":1,"90":1,"94":1,"96":1,"263":1,"266":1}}],["pcbs",{"0":{"4":1,"181":1,"184":1},"2":{"1":1,"4":2,"176":1,"181":1,"184":1,"221":2}}],["pcb",{"0":{"1":1,"2":1,"3":1,"182":1,"183":1},"2":{"1":3,"2":1,"4":1,"135":4,"181":3,"182":2}}],["pay",{"2":{"184":1,"194":1}}],["pad",{"2":{"182":1}}],["pads",{"2":{"2":1,"3":2,"170":2,"182":2,"183":1}}],["pairs",{"2":{"175":1}}],["patreon",{"2":{"221":1}}],["patient",{"0":{"165":1}}],["path",{"2":{"78":2}}],["past",{"2":{"94":1}}],["passthrough",{"2":{"136":1}}],["pass",{"2":{"68":1,"70":1,"289":1}}],["passed",{"2":{"67":1}}],["password",{"2":{"28":7,"31":4,"50":2,"68":2,"69":2}}],["panel",{"2":{"82":1,"304":1}}],["parent",{"2":{"269":1}}],["parameter",{"2":{"305":2}}],["parameters",{"0":{"303":1,"304":1,"306":1},"1":{"304":1,"305":1},"2":{"255":1,"257":3,"262":1,"274":4,"304":6,"305":1,"307":2}}],["paramaters",{"0":{"255":1}}],["params",{"0":{"67":1,"71":1},"1":{"68":1,"69":1,"70":1},"2":{"67":4}}],["param",{"2":{"65":2,"67":4,"68":2,"69":1,"70":2,"71":1}}],["partial",{"2":{"140":1}}],["part",{"2":{"38":1,"134":1,"147":3,"152":3,"171":3,"230":2,"239":1,"240":1,"242":1,"301":1}}],["parts",{"0":{"130":1,"145":1,"150":1,"167":1,"198":1,"199":1,"205":1,"209":1,"221":1,"223":1},"1":{"200":1,"201":1,"202":1,"203":1,"204":1,"206":1,"207":1,"208":1,"209":1,"210":2,"211":2,"212":2,"213":2,"214":2,"215":2,"216":2,"217":2,"218":2,"219":2,"220":2,"221":2,"222":1,"223":1,"224":2},"2":{"35":1,"102":1,"106":1,"145":3,"147":1,"150":3,"152":1,"160":1,"185":3,"209":1,"221":1,"242":1}}],["package",{"2":{"58":1,"87":1}}],["packages",{"2":{"12":1}}],["page",{"0":{"17":1,"19":1,"21":1,"120":1,"156":1,"164":1},"1":{"18":1,"19":1,"20":1,"121":1,"122":1,"123":1,"124":1,"125":1},"2":{"17":4,"18":2,"19":7,"20":3,"21":1,"33":1,"94":1,"140":1,"141":1,"145":1,"150":1,"242":1,"260":1,"302":1}}],["pages",{"0":{"16":1},"1":{"17":1,"18":1,"19":1,"20":1,"21":1},"2":{"16":2,"17":1,"18":2,"21":1,"100":1,"243":1}}],["practices",{"0":{"231":1},"2":{"229":1,"232":1}}],["practice",{"2":{"205":1}}],["pr",{"2":{"141":1}}],["pricing",{"2":{"221":1}}],["price",{"2":{"211":1}}],["primary",{"2":{"200":1,"206":1}}],["prior",{"2":{"135":1,"228":1}}],["priority",{"2":{"101":1}}],["prints",{"0":{"251":1},"1":{"252":1,"253":1}}],["printer",{"0":{"251":1},"1":{"252":1,"253":1}}],["printed",{"0":{"131":1,"146":1,"151":1,"153":1,"222":1,"244":1},"1":{"154":1},"2":{"104":1,"140":1,"157":1,"185":1,"242":1,"244":1}}],["printing",{"0":{"250":1},"1":{"251":1,"252":1,"253":1},"2":{"251":1,"252":1}}],["print",{"0":{"185":1,"252":1},"1":{"186":1,"187":1},"2":{"102":1,"131":1,"133":1,"146":1,"151":1,"161":1,"185":2,"253":2}}],["prone",{"2":{"229":1}}],["proximity",{"2":{"204":1,"207":1}}],["pros",{"2":{"202":1,"204":1,"207":1,"208":1}}],["problems",{"2":{"170":1}}],["protected",{"2":{"232":1}}],["protecting",{"0":{"229":1},"1":{"230":1,"231":1,"232":1}}],["protection",{"2":{"214":1}}],["protector",{"2":{"157":3}}],["prototype",{"2":{"131":1}}],["protocol",{"2":{"54":2,"58":1}}],["pro",{"2":{"141":1}}],["prohurtz",{"2":{"140":1,"141":1,"162":1,"185":1,"212":1}}],["proven",{"2":{"126":1}}],["provided",{"2":{"93":1,"225":1}}],["provide",{"2":{"50":2,"140":2}}],["provides",{"2":{"44":1,"129":1,"138":1,"144":1,"149":1,"165":1}}],["produce",{"2":{"88":1}}],["programs",{"0":{"259":1},"1":{"260":1,"261":1}}],["program",{"2":{"257":1}}],["programmers",{"2":{"205":1,"212":2}}],["programmer",{"0":{"87":1,"172":1},"2":{"87":4,"90":1,"172":1,"175":1,"211":2,"212":2}}],["progress",{"0":{"7":1,"165":1},"2":{"5":1,"165":1}}],["prompts",{"2":{"283":1}}],["prompt",{"2":{"81":1,"280":1,"281":1}}],["proper",{"2":{"101":1,"212":1}}],["properly",{"2":{"47":1,"78":1,"217":1}}],["property",{"2":{"19":1}}],["procedure",{"2":{"72":1}}],["process",{"2":{"41":1,"122":1,"229":1,"230":1}}],["proceed",{"0":{"41":1},"1":{"42":1,"43":1,"44":1,"45":1,"46":1,"47":1},"2":{"88":1}}],["proir",{"2":{"15":1}}],["projected",{"2":{"107":1}}],["projects",{"2":{"78":1,"105":1}}],["project",{"0":{"14":1,"27":1,"78":1,"120":1,"270":1},"1":{"15":1,"121":1,"122":1,"123":1,"124":1,"125":1},"2":{"14":1,"22":2,"25":1,"39":1,"62":1,"78":1,"94":1,"100":2,"129":1,"166":1,"269":1,"270":1,"280":1}}],["present",{"2":{"269":1}}],["pressure",{"2":{"134":1,"186":1}}],["pressing",{"2":{"51":1,"52":1,"88":2,"96":1}}],["press",{"2":{"44":1,"51":1,"81":1,"89":1,"90":1,"94":2,"95":1,"96":1,"171":1,"236":1,"238":1,"297":1,"299":1,"300":1,"301":2}}],["pre",{"2":{"266":2}}],["preparing",{"2":{"243":1}}],["prepare",{"0":{"1":1,"173":1,"181":1,"233":1,"243":1,"244":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"41":1,"72":1,"102":1}}],["prefer",{"2":{"270":1}}],["preferably",{"2":{"175":1}}],["prefaced",{"2":{"20":1}}],["precautions",{"2":{"101":1,"123":1}}],["prevent",{"2":{"66":1,"228":1}}],["previous",{"2":{"25":1,"305":1}}],["prerequisites",{"0":{"11":1,"58":1}}],["pliers",{"2":{"228":2}}],["pluggin",{"2":{"194":1}}],["plugging",{"2":{"136":1}}],["plugged",{"2":{"87":1,"90":1}}],["plug",{"0":{"174":1},"2":{"87":1,"96":1,"274":1}}],["play",{"2":{"274":1}}],["plastic",{"2":{"244":1}}],["plans",{"2":{"126":1}}],["planning",{"2":{"50":1}}],["planned",{"0":{"8":1},"2":{"5":1}}],["platform",{"2":{"84":1,"99":1}}],["platforms",{"0":{"307":1},"2":{"84":1}}],["platformio",{"0":{"77":1,"79":1,"80":1,"82":1},"1":{"80":1,"81":2,"82":2,"83":1,"84":1},"2":{"37":1,"77":1,"78":2,"79":2,"80":1,"82":2,"84":1,"94":1}}],["placed",{"2":{"134":1}}],["placeholder",{"2":{"28":1}}],["place",{"0":{"159":1},"2":{"2":1,"3":1,"99":1,"106":2,"133":3,"134":1,"135":3,"136":1,"159":2,"183":1,"186":2,"187":2,"228":1,"230":1,"266":1}}],["please",{"0":{"165":1,"299":1},"2":{"1":1,"16":2,"19":1,"20":2,"33":1,"39":2,"48":1,"66":1,"78":3,"106":1,"118":1,"123":1,"127":1,"136":1,"141":1,"167":1,"168":1,"171":1,"181":1,"196":1,"205":1,"221":1,"224":2,"255":1,"278":1}}],["poetry",{"0":{"279":1},"2":{"279":5,"280":2,"281":1}}],["popular",{"2":{"129":1}}],["potentially",{"2":{"224":1}}],["potential",{"2":{"106":1}}],["portnumber",{"2":{"274":1}}],["port",{"2":{"45":1,"69":2,"136":1,"172":1,"202":1,"208":1,"217":2,"218":1,"247":2,"262":1,"274":1,"299":2,"307":2}}],["ports",{"2":{"30":1,"90":2,"217":1}}],["position",{"2":{"188":1}}],["positioning",{"2":{"127":1}}],["positive",{"0":{"177":2,"178":1},"2":{"1":2,"175":1,"181":2}}],["possible",{"2":{"106":1,"118":1,"141":1,"159":1,"217":1,"231":1}}],["postman",{"2":{"32":1}}],["post",{"2":{"32":1,"66":5}}],["points",{"2":{"129":1}}],["point",{"2":{"28":1,"204":2,"207":2,"228":1,"246":1,"295":1,"302":1}}],["powershell",{"2":{"279":1}}],["powering",{"2":{"103":1,"175":1}}],["powered",{"2":{"94":1}}],["power",{"0":{"175":1},"2":{"1":3,"4":3,"66":1,"68":18,"70":14,"95":1,"106":2,"108":1,"123":1,"131":1,"136":1,"174":1,"176":2,"181":3,"204":3,"207":2,"218":3,"221":2,"297":1}}],["squeezethresholdv2",{"2":{"274":1}}],["squeezethresholdv1",{"2":{"274":1}}],["squeeze",{"2":{"274":3}}],["squinting",{"2":{"274":1}}],["slot",{"2":{"305":1}}],["slowly",{"2":{"186":1,"240":1,"300":1}}],["slightly",{"2":{"176":1,"202":1,"230":2}}],["slicer",{"2":{"153":1,"252":1}}],["slid",{"2":{"171":1}}],["slider",{"2":{"293":1,"300":2}}],["slide",{"2":{"135":2,"171":1,"172":1}}],["sliding",{"2":{"131":1,"186":1}}],["slimevr",{"2":{"78":2,"98":2,"199":1}}],["sketch",{"2":{"165":2}}],["skirt",{"2":{"230":1}}],["skills",{"2":{"158":1,"185":1,"224":1}}],["skip",{"2":{"28":1,"90":1,"97":1}}],["synced",{"2":{"304":2}}],["symbol",{"2":{"110":1}}],["symptoms",{"2":{"106":1}}],["system",{"2":{"4":1,"25":1,"44":1,"72":1}}],["sr",{"2":{"101":2,"108":2,"110":2,"111":1,"112":1,"113":1,"114":1,"115":1}}],["src",{"2":{"17":1,"18":1,"19":1,"20":1,"21":1,"25":1}}],["swap",{"2":{"101":1,"215":1}}],["switched",{"2":{"94":2}}],["switching",{"2":{"36":1}}],["switch",{"2":{"35":1,"37":1}}],["sdk",{"0":{"83":1,"84":1},"1":{"84":1},"2":{"83":1}}],["smoothstep",{"2":{"274":2}}],["smol",{"2":{"1":1,"181":1}}],["smd",{"2":{"221":2}}],["smaller",{"2":{"71":1,"133":1,"134":1,"215":1,"221":2}}],["small",{"2":{"45":1,"135":1,"171":1,"186":1,"196":1,"211":1,"212":1,"305":1}}],["s3",{"0":{"88":1},"2":{"37":7,"88":1,"202":1,"204":1,"211":2,"217":2,"234":1}}],["say",{"2":{"265":1,"301":1}}],["satisfactory",{"2":{"161":1}}],["safer",{"2":{"221":1}}],["safe",{"2":{"106":3,"118":1}}],["safety",{"0":{"101":1,"106":1,"107":1},"1":{"107":1,"108":1},"2":{"100":1,"101":6,"106":3,"107":1,"108":1,"116":1,"123":1}}],["saved",{"2":{"97":1,"304":1}}],["save",{"2":{"66":3,"97":1,"186":1,"297":1,"299":1}}],["same",{"2":{"30":1,"54":1,"56":1,"134":3,"136":2,"170":1,"176":1,"263":3}}],["said",{"2":{"28":1}}],["ssids",{"2":{"28":1}}],["ssid",{"2":{"28":6,"50":2,"68":2}}],["scene",{"2":{"304":1}}],["schematics",{"2":{"221":1}}],["scales",{"2":{"110":1}}],["scanning",{"2":{"69":1}}],["screwed",{"2":{"136":1}}],["screwing",{"2":{"134":5}}],["screws",{"0":{"134":1},"2":{"130":2,"136":2,"150":1}}],["screwdriver",{"2":{"130":2,"136":1,"147":1,"152":1}}],["screw",{"2":{"130":1,"134":6,"136":3,"147":4,"152":4}}],["screen",{"2":{"42":1}}],["scroll",{"2":{"52":1}}],["scripts",{"2":{"25":1}}],["scopes",{"2":{"25":2}}],["scope",{"2":{"25":1}}],["spot",{"2":{"301":1}}],["spots",{"2":{"106":1,"188":2}}],["speaker",{"2":{"175":1}}],["spend",{"2":{"172":1}}],["spell",{"2":{"141":1}}],["spec",{"2":{"281":1}}],["specs",{"2":{"123":1}}],["specified",{"2":{"36":1,"188":1}}],["specifically",{"2":{"99":1}}],["specific",{"0":{"140":1},"1":{"141":1},"2":{"14":1,"35":1,"140":3,"165":1,"193":1,"196":1}}],["special",{"2":{"28":2,"37":1,"50":1,"193":1,"212":1,"266":1}}],["sparkfun",{"2":{"76":1}}],["spaces",{"2":{"28":1}}],["space",{"2":{"25":1,"28":1}}],["surprised",{"2":{"274":1}}],["sure",{"0":{"166":1},"2":{"28":1,"50":1,"56":1,"60":2,"78":1,"87":1,"90":3,"96":1,"123":1,"135":1,"147":1,"152":1,"169":1,"172":1,"174":1,"185":1,"221":1,"263":1,"264":1}}],["super",{"2":{"170":1,"200":1,"206":1}}],["supplied",{"2":{"196":1}}],["supply",{"2":{"67":1}}],["support",{"0":{"105":1},"2":{"33":1,"37":1,"38":2,"39":1,"93":1,"136":1,"144":1,"146":1,"149":1,"151":1,"207":1,"211":2,"217":1,"255":1}}],["supported",{"2":{"28":2,"37":2,"48":1,"104":1,"200":1,"206":1,"242":1}}],["supports",{"2":{"20":1,"28":1,"31":1,"32":1,"33":1,"144":1,"149":1,"211":1,"212":1,"217":1,"257":1}}],["summary",{"0":{"117":1}}],["suffix",{"2":{"94":1,"95":1}}],["suggest",{"2":{"217":1}}],["suggested",{"2":{"90":1}}],["suggestions",{"2":{"66":1,"118":1}}],["successfully",{"2":{"90":1,"232":1}}],["successful",{"2":{"90":1}}],["such",{"2":{"25":1,"28":1,"106":1,"202":2,"208":2,"217":1,"229":1,"265":1}}],["submenu",{"2":{"305":1}}],["submit",{"2":{"141":1}}],["submitting",{"2":{"141":1}}],["submissions",{"2":{"140":1}}],["subdir",{"2":{"19":1}}],["sub",{"0":{"18":1},"2":{"18":1}}],["snug",{"2":{"135":1}}],["snaps",{"2":{"135":1,"186":1,"236":1,"238":1}}],["snap",{"2":{"131":1,"135":1}}],["snake",{"2":{"15":1}}],["sng",{"2":{"1":1,"181":1}}],["shutting",{"2":{"274":1}}],["sharp",{"2":{"231":1}}],["sharper",{"2":{"231":1}}],["shatter",{"2":{"214":1}}],["shape",{"2":{"197":1}}],["shield",{"0":{"170":1}}],["shipping",{"0":{"253":1},"2":{"168":1}}],["shot",{"2":{"224":1}}],["shove",{"2":{"171":1}}],["shortcut",{"2":{"284":1}}],["shorter",{"2":{"230":1}}],["shorts",{"2":{"196":2}}],["short",{"2":{"106":1,"176":1,"179":1,"217":2,"221":1}}],["shows",{"2":{"170":1,"188":1,"193":1,"194":1,"286":1,"287":1,"288":1}}],["showing",{"2":{"147":1,"152":1}}],["show",{"0":{"276":1},"2":{"46":1,"52":1,"72":1,"140":1,"156":1,"273":1,"304":1}}],["shown",{"2":{"37":1,"194":1,"197":1}}],["shouldemulateeyebrows",{"2":{"274":1}}],["shouldemulateeyesquint",{"2":{"274":1}}],["shouldemulateeyewiden",{"2":{"274":1}}],["should",{"0":{"27":1,"39":1},"2":{"15":1,"24":4,"36":2,"43":2,"44":1,"47":1,"69":1,"84":1,"88":1,"90":1,"94":1,"118":1,"133":1,"134":3,"170":1,"171":1,"182":1,"192":1,"221":1,"228":1,"234":1,"236":1,"240":3,"241":1,"242":2,"246":1,"263":1,"269":1,"271":2,"273":1,"274":11,"280":1,"281":2,"283":1,"284":2,"300":2,"305":1}}],["shyarn",{"2":{"12":1}}],["sh",{"2":{"12":1}}],["shcd",{"2":{"12":1}}],["shgit",{"2":{"12":1}}],["stuff",{"2":{"266":1,"269":1}}],["studio",{"0":{"73":1,"82":1,"173":1,"233":1,"270":1},"1":{"74":1,"75":1,"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"41":1,"73":1,"77":1,"82":1,"89":1,"95":1,"202":1,"204":1}}],["stls",{"2":{"162":1}}],["stl",{"0":{"252":1},"2":{"127":1,"131":4,"153":1,"252":1,"253":1}}],["steamvr",{"2":{"300":1}}],["steradians",{"2":{"108":1}}],["steps",{"2":{"39":1,"78":1,"87":1,"94":2,"97":2,"98":1,"124":1,"134":1,"156":1,"174":1,"180":1,"305":1}}],["step",{"0":{"1":1,"2":1,"42":1,"43":1,"44":1,"45":1,"46":1,"47":1,"49":1,"50":1,"51":1,"52":1,"157":1,"158":1,"159":1,"160":1,"161":1,"162":1,"164":2,"166":1,"167":1,"168":1,"169":1,"170":1,"171":1,"172":1,"173":1,"174":1,"175":1,"176":1,"177":1,"178":1,"179":1,"180":1,"181":1,"182":1,"185":1,"283":1,"284":1,"285":1,"296":1,"301":1},"1":{"186":1,"187":1,"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1,"297":1,"298":1,"299":1,"300":1},"2":{"44":1,"97":1,"100":2,"170":1,"173":1,"179":1,"237":1,"247":1,"271":2,"276":1,"300":1,"301":1}}],["stock",{"2":{"215":1}}],["stone",{"2":{"205":1}}],["stops",{"2":{"240":1}}],["stop",{"2":{"101":1}}],["stored",{"2":{"306":1}}],["store",{"2":{"35":2,"68":1,"140":1}}],["stick",{"2":{"167":1,"182":1}}],["sticking",{"2":{"87":1}}],["still",{"0":{"165":1},"2":{"32":1,"60":1,"88":1,"167":1,"171":1,"225":1}}],["stray",{"2":{"196":1}}],["strands",{"2":{"196":1}}],["strand",{"2":{"192":1,"194":1}}],["strain",{"2":{"106":1}}],["straight",{"2":{"93":1,"240":1,"301":1}}],["strictly",{"2":{"230":1}}],["strip",{"2":{"175":1,"176":1}}],["string",{"2":{"67":1}}],["stream",{"0":{"52":1},"2":{"96":1,"170":1,"174":1}}],["streaming",{"2":{"38":3,"204":1,"207":1,"212":2}}],["structure",{"0":{"14":1},"1":{"15":1},"2":{"15":1}}],["styles",{"2":{"20":1}}],["style",{"0":{"20":1,"25":1},"2":{"20":3,"24":1,"25":4}}],["stays",{"2":{"101":1}}],["stash",{"2":{"97":2}}],["stands",{"2":{"92":1,"192":2}}],["standard",{"0":{"65":1,"253":1},"2":{"25":3,"65":1}}],["standards",{"0":{"15":1,"22":1,"23":1},"1":{"23":1,"24":2,"25":2},"2":{"22":2,"101":1,"107":1}}],["state",{"2":{"97":1,"305":1}}],["status",{"2":{"39":1,"66":1,"166":1}}],["static",{"2":{"24":1,"54":1}}],["sta",{"2":{"28":2}}],["starting",{"2":{"36":1,"100":1,"204":1,"207":1,"279":1,"285":1}}],["start",{"0":{"119":1,"120":1},"1":{"120":1,"121":2,"122":2,"123":2,"124":2,"125":2},"2":{"12":1,"19":1,"133":2,"194":1,"207":1,"262":1,"294":1,"300":1}}],["started",{"0":{"10":1,"100":1},"1":{"11":1,"12":1},"2":{"19":3,"157":1}}],["separate",{"0":{"263":1},"2":{"211":3,"212":2,"252":1}}],["separately",{"2":{"39":1}}],["sequence",{"2":{"194":1}}],["search",{"2":{"157":1,"273":1}}],["selects",{"2":{"300":1}}],["selecting",{"2":{"78":1}}],["selected",{"2":{"44":1,"49":1,"50":1}}],["select",{"0":{"44":1,"49":1},"2":{"44":1,"45":1,"84":1,"94":3,"95":1,"215":1,"216":2,"217":1,"262":2,"263":1,"304":1,"305":1}}],["sent",{"2":{"307":1}}],["sensor",{"2":{"230":2}}],["sensors",{"2":{"225":1}}],["sensitive",{"2":{"116":1,"202":1}}],["sense",{"0":{"233":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"37":2,"41":1,"202":1,"204":2,"207":1,"211":1,"241":1}}],["sends",{"2":{"90":1}}],["sending",{"0":{"263":1},"2":{"52":1,"99":1,"141":1,"262":1}}],["send",{"0":{"51":1},"2":{"32":1,"51":1,"89":1,"162":2,"257":1}}],["several",{"2":{"37":1}}],["setcamera",{"2":{"66":1}}],["setdevice",{"0":{"69":1},"2":{"66":1}}],["sets",{"2":{"66":3}}],["settxpower",{"0":{"70":1},"2":{"66":1}}],["setting",{"0":{"72":1,"262":1,"300":1,"302":1,"303":1},"1":{"73":1,"74":1,"75":1,"76":1,"77":1,"78":1,"303":1,"304":2,"305":2,"306":1,"307":1},"2":{"28":1,"56":1,"173":1}}],["settings",{"0":{"252":1,"264":1,"285":1},"1":{"286":1,"287":1,"288":1,"289":1,"290":1,"291":1,"292":1,"293":1,"294":1,"295":1},"2":{"28":1,"39":1,"66":2,"67":1,"101":1,"262":2,"263":2,"264":3,"265":2,"286":1,"287":1,"288":1,"307":1}}],["setups",{"2":{"202":1,"208":1}}],["setup",{"0":{"200":1,"206":1},"1":{"207":1,"208":1},"2":{"36":1,"44":1,"100":1,"102":1,"126":1,"129":1,"140":1,"147":1,"152":1,"196":1,"202":1,"208":1,"209":1,"229":2,"236":1,"237":1,"242":1,"254":1,"255":1,"257":2,"261":1,"263":1,"271":1,"283":1}}],["set",{"0":{"254":1,"258":1},"1":{"255":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1},"2":{"28":5,"31":6,"41":1,"46":1,"56":1,"67":1,"69":1,"70":1,"87":1,"88":1,"96":1,"147":1,"152":1,"173":1,"205":1,"237":1,"242":1,"246":1,"248":1,"263":1,"269":1,"300":1,"302":1}}],["semi",{"2":{"25":1,"238":1}}],["semantic",{"2":{"25":1}}],["seems",{"2":{"167":1}}],["seeed",{"0":{"233":1},"1":{"234":1,"235":1,"236":1,"237":1,"238":1,"239":1,"240":1,"241":1},"2":{"41":1,"202":1,"204":1}}],["seedstudio",{"2":{"37":2,"211":1}}],["see",{"0":{"27":1,"154":1},"2":{"16":1,"36":1,"43":1,"84":1,"94":1,"101":1,"102":1,"104":1,"171":1,"212":1,"240":1,"247":1,"263":1,"284":1,"300":4,"305":1}}],["secure",{"2":{"185":1}}],["sections",{"2":{"82":1}}],["section",{"2":{"16":1,"56":1,"82":1,"84":1,"90":1,"97":1,"185":1,"262":1,"263":1,"265":1,"304":1,"305":3}}],["seconds",{"2":{"107":1,"133":1}}],["second",{"2":{"4":1,"38":1,"170":1,"192":1,"274":4}}],["serial",{"0":{"201":1,"208":1},"1":{"202":1},"2":{"95":1,"96":1,"247":1}}],["series",{"2":{"1":1,"181":1}}],["services",{"2":{"162":1}}],["service",{"0":{"250":1},"1":{"251":1,"252":1,"253":1},"2":{"69":4}}],["server",{"2":{"12":1,"105":1}}],["silver",{"2":{"175":1}}],["sits",{"2":{"133":1}}],["site",{"0":{"9":1},"1":{"10":1,"11":1,"12":1,"13":1,"14":1,"15":1},"2":{"9":1,"12":1,"20":2,"24":3}}],["size",{"2":{"130":3,"176":1,"211":1,"217":1}}],["similar",{"2":{"94":1,"162":1}}],["similarly",{"2":{"28":1,"266":1}}],["simple",{"2":{"87":1,"156":1,"172":1,"274":1}}],["simply",{"0":{"256":1},"1":{"257":1,"258":1,"259":1,"260":1,"261":1,"262":1,"263":1,"264":1,"265":1,"266":1,"267":1,"268":1,"269":1,"270":1,"271":1,"272":1,"273":1,"274":1},"2":{"81":1,"129":1,"170":1,"264":1,"274":1,"305":1,"306":1}}],["signal",{"2":{"170":1}}],["significantly",{"2":{"138":1,"229":1}}],["sign",{"2":{"68":1,"70":1}}],["sidebar",{"0":{"19":1},"2":{"19":4,"82":1,"84":1}}],["side",{"0":{"27":1},"2":{"1":2,"2":1,"3":1,"82":1,"84":1,"133":2,"134":1,"153":1,"181":2,"197":1,"230":4,"240":1}}],["single",{"2":{"1":1,"111":2,"112":2,"114":2,"115":2,"181":1,"196":1,"197":2}}],["since",{"2":{"1":1,"56":1,"94":1,"181":1,"273":1}}],["social",{"2":{"99":1}}],["socket",{"2":{"87":1}}],["sourced",{"2":{"104":1}}],["sources",{"2":{"101":1,"107":1}}],["source",{"0":{"221":1,"267":1,"268":1,"269":1,"275":1,"276":1},"1":{"268":1,"269":1,"270":1,"271":1,"276":1,"277":1,"278":1,"279":1,"280":1,"281":1},"2":{"99":1,"102":1,"268":1,"269":1,"270":1,"276":1}}],["sound",{"2":{"88":1}}],["soon",{"2":{"93":1}}],["software",{"0":{"121":1,"246":1,"296":1},"1":{"247":1,"248":1,"297":1,"298":1,"299":1,"300":1},"2":{"90":1,"96":1,"263":1,"301":1}}],["solve",{"2":{"170":3}}],["solid",{"2":{"108":1,"117":1}}],["solution",{"2":{"39":1,"170":1,"224":1}}],["soldered",{"2":{"221":1}}],["solderless",{"2":{"165":2}}],["soldering",{"2":{"3":1,"130":1,"133":1,"172":1,"182":1,"196":1,"202":1,"208":1,"212":1,"218":1,"220":1,"223":1}}],["solder",{"0":{"1":1,"2":1,"3":1,"178":1,"179":1,"181":1,"182":1,"183":1},"2":{"1":1,"2":2,"3":2,"138":1,"165":1,"170":1,"177":1,"178":1,"181":1,"182":4,"183":2,"196":2,"197":2,"220":5,"221":1,"223":2}}],["so",{"2":{"20":1,"32":1,"35":1,"36":1,"48":1,"62":1,"87":1,"94":1,"95":1,"97":2,"101":1,"133":2,"134":1,"147":1,"152":1,"156":1,"185":1,"194":1,"196":1,"214":2,"215":1,"217":1,"224":2,"225":1,"229":1,"230":2,"238":1,"240":1,"246":1,"257":1,"265":2,"266":1,"269":1,"301":1}}],["sometimes",{"2":{"79":1,"134":1,"266":1,"306":1}}],["something",{"0":{"27":1,"264":1},"2":{"106":1,"221":1,"265":1,"300":1}}],["some",{"2":{"1":1,"25":1,"30":1,"32":1,"36":1,"37":1,"44":1,"76":1,"78":1,"79":1,"87":1,"90":1,"98":1,"113":1,"153":1,"156":2,"170":2,"181":1,"185":1,"188":1,"205":1,"212":1,"217":1,"218":1,"222":2,"225":1,"266":1,"269":1,"285":1}}],["s",{"0":{"46":1,"128":1,"137":1,"143":1,"148":1,"157":1,"234":1,"265":1,"273":2},"1":{"129":1,"130":1,"131":1,"132":1,"133":1,"134":1,"135":1,"136":1,"138":1,"139":1,"144":1,"145":1,"146":1,"147":1,"149":1,"150":1,"151":1,"152":1},"2":{"1":1,"25":2,"37":2,"44":1,"45":1,"64":1,"76":1,"79":1,"84":1,"87":1,"100":1,"101":1,"103":1,"107":1,"118":1,"127":4,"129":1,"131":1,"134":1,"135":1,"138":1,"140":1,"143":1,"146":1,"148":1,"151":1,"157":1,"159":1,"160":1,"165":1,"166":1,"170":1,"172":2,"179":1,"181":1,"194":1,"197":1,"199":1,"200":1,"206":1,"214":1,"215":1,"216":2,"217":1,"225":1,"228":1,"242":1,"261":1,"263":3,"264":1,"265":5,"266":1,"269":1,"271":1,"273":2,"285":1,"297":1,"299":1,"300":1,"302":1,"304":2,"305":3,"306":2}}]],"serializationVersion":2}`;export{e as default}; diff --git a/assets/chunks/Accordion.aff4964d.js b/assets/chunks/Accordion.44247159.js similarity index 93% rename from assets/chunks/Accordion.aff4964d.js rename to assets/chunks/Accordion.44247159.js index 4157395..5f80330 100644 --- a/assets/chunks/Accordion.aff4964d.js +++ b/assets/chunks/Accordion.44247159.js @@ -1 +1 @@ -import{_ as l,o as t,c as r,k as n,r as i,n as d,$ as c,a0 as p}from"./framework.47aa8d5b.js";const u={data(){return{isOpen:!1}},methods:{toggleAccordion(){this.isOpen=!this.isOpen}}},f=["aria-expanded","aria-controls"],m=["id"];function w(e,s,h,k,o,a){return t(),r("div",null,[n("button",{onClick:s[0]||(s[0]=v=>a.toggleAccordion()),class:"flex items-center space-x-3","aria-expanded":o.isOpen,"aria-controls":`collapse${e._uid}`},[i(e.$slots,"title"),(t(),r("svg",{class:d(["w-3 transition-all duration-200 transform",{"rotate-180":o.isOpen,"rotate-0":!o.isOpen}]),fill:"none",stroke:"currentColor",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 10","aria-hidden":"true"},s[1]||(s[1]=[n("path",{d:"M15 1.2l-7 7-7-7","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)]),2))],8,f),c(n("div",{id:`collapse${e._uid}`},[i(e.$slots,"content")],8,m),[[p,o.isOpen]])])}const O=l(u,[["render",w]]);export{O as A}; +import{_ as l,o as t,c as r,k as n,r as i,n as d,$ as c,a0 as p}from"./framework.ece1a6f0.js";const u={data(){return{isOpen:!1}},methods:{toggleAccordion(){this.isOpen=!this.isOpen}}},f=["aria-expanded","aria-controls"],m=["id"];function w(e,s,h,k,o,a){return t(),r("div",null,[n("button",{onClick:s[0]||(s[0]=v=>a.toggleAccordion()),class:"flex items-center space-x-3","aria-expanded":o.isOpen,"aria-controls":`collapse${e._uid}`},[i(e.$slots,"title"),(t(),r("svg",{class:d(["w-3 transition-all duration-200 transform",{"rotate-180":o.isOpen,"rotate-0":!o.isOpen}]),fill:"none",stroke:"currentColor",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 16 10","aria-hidden":"true"},s[1]||(s[1]=[n("path",{d:"M15 1.2l-7 7-7-7","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round"},null,-1)]),2))],8,f),c(n("div",{id:`collapse${e._uid}`},[i(e.$slots,"content")],8,m),[[p,o.isOpen]])])}const O=l(u,[["render",w]]);export{O as A}; diff --git a/assets/chunks/CheckBoxList.80273cd9.js b/assets/chunks/CheckBoxList.1747249a.js similarity index 92% rename from assets/chunks/CheckBoxList.80273cd9.js rename to assets/chunks/CheckBoxList.1747249a.js index a0cb541..101dace 100644 --- a/assets/chunks/CheckBoxList.80273cd9.js +++ b/assets/chunks/CheckBoxList.1747249a.js @@ -1 +1 @@ -import{o as e,c as t,k as l,F as i,B as _,t as a}from"./framework.47aa8d5b.js";const r={class:"checkboxes"},k={style:{"list-style":"none"}},d={key:0},h={key:0},p=["href"],u={key:1},b={key:1},y={key:0},f=["href"],x={key:1},v={__name:"CheckBoxList",props:["options"],setup(c){const o=c;return(B,n)=>(e(),t("div",r,[l("ul",k,[(e(!0),t(i,null,_(o.options.object,s=>(e(),t("li",null,[o.options.state?(e(),t("div",d,[n[0]||(n[0]=l("input",{type:"checkbox",checked:""},null,-1)),s.link!==null||o.link!==""?(e(),t("label",h,[l("a",{href:s.link,target:"_blank"},a(s.label),9,p)])):(e(),t("label",u,a(s.label),1))])):(e(),t("div",b,[n[1]||(n[1]=l("input",{type:"checkbox",unchecked:""},null,-1)),s.link!==null||o.link!==""?(e(),t("label",y,[l("a",{href:s.link,target:"_blank"},a(s.label),9,f)])):(e(),t("label",x,a(s.label),1))]))]))),256))])]))}};export{v as _}; +import{o as e,c as t,k as l,F as i,B as _,t as a}from"./framework.ece1a6f0.js";const r={class:"checkboxes"},k={style:{"list-style":"none"}},d={key:0},h={key:0},p=["href"],u={key:1},b={key:1},y={key:0},f=["href"],x={key:1},v={__name:"CheckBoxList",props:["options"],setup(c){const o=c;return(B,n)=>(e(),t("div",r,[l("ul",k,[(e(!0),t(i,null,_(o.options.object,s=>(e(),t("li",null,[o.options.state?(e(),t("div",d,[n[0]||(n[0]=l("input",{type:"checkbox",checked:""},null,-1)),s.link!==null||o.link!==""?(e(),t("label",h,[l("a",{href:s.link,target:"_blank"},a(s.label),9,p)])):(e(),t("label",u,a(s.label),1))])):(e(),t("div",b,[n[1]||(n[1]=l("input",{type:"checkbox",unchecked:""},null,-1)),s.link!==null||o.link!==""?(e(),t("label",y,[l("a",{href:s.link,target:"_blank"},a(s.label),9,f)])):(e(),t("label",x,a(s.label),1))]))]))),256))])]))}};export{v as _}; diff --git a/assets/chunks/PartsList.b49df916.js b/assets/chunks/PartsList.a520a26d.js similarity index 97% rename from assets/chunks/PartsList.b49df916.js rename to assets/chunks/PartsList.a520a26d.js index 50f75bd..602d612 100644 --- a/assets/chunks/PartsList.b49df916.js +++ b/assets/chunks/PartsList.a520a26d.js @@ -1 +1 @@ -import{A as l}from"./Accordion.aff4964d.js";import{o as e,c as t,F as s,B as o,b as c,w as u,k as r,t as i,e as m,l as _}from"./framework.47aa8d5b.js";const h={hmds:[{hmd:"Quest 3",parts:[""],hyper_links:[{url:"https://www.thingiverse.com/thing:6439510",desc:"★ Quest 3 V4 Mount by BasilAldwin & Dentohn (Eye_Tracking_Ring_V21-B.stl)"}],link_id:1},{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/V4/Prohurtz",desc:"★ V4 Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/lordnathan",desc:"★ ESP-32CAM mount by lordnathan"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"V3 Camera and IR emitter mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/Prohurtz",desc:"V3 Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/Quest_2_ESP_Mount_v2_By_Arkfall.stl",desc:"ESP mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/Quest_2_ESP_Mounts_By_Prohurtz.stl",desc:"ESP mount by Prohurtz"}],link_id:2},{hmd:"Valve Index",parts:[""],hyper_links:[{url:"https://github.com/Physics-Dude/Phys-Index-EyetrackVR-HW/blob/main/ETVR%20ValveIndex%20Cam-LED%20Mount%20Rings/Index-EyetrackVRv4%20v18%20Print%20Me.stl",desc:"★ 160° V4 IR and Camera mount by Physics Dude and bitbyt3r."},{url:"https://makerworld.com/en/models/196741#profileId-217255",desc:"★ 160/130° V4 IR and Camera mount by Foow17 & Physics Dude"},{url:"https://makerworld.com/en/models/196791#profileId-217330",desc:"★ 160/130° VROptician V4 IR and Camera mount by Foow17 & MUTE"},{url:"https://github.com/Frosty704/indexwidmo-eyetrackvr/tree/main/v2",desc:"★ 160/120° WidmoVR V4 IR and Camera mount by frosty704 & lerx-cnm"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)",desc:" ESP frunk mod by MUTE the Cyberwolf"},{url:"https://github.com/Physics-Dude/Phys-Index-EyetrackVR-HW/tree/main",desc:"Gum Stick USB Hub Dongle by Physics Dude"}],link_id:3},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ V3 Camera and IR emitter mount by Breakdown"}],link_id:4},{hmd:"Quest 1",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ V3 Camera and IR emitter mount by G0LDJAY"}],link_id:5},{hmd:"Vive Pro 2",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ V3 Camera and IR emitter mount by StormFox"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Vive_Pro_2/cat_who_loves_pie/Vive_Pro_2_VROptician_by_cat_who_loves_pie.stl",desc:"V3 VROptician camera and IR emitter mount by cat_who_loves_pie"}],link_id:6},{hmd:"Vive & Vive Pro",parts:[],hyper_links:[{url:"https://www.thingiverse.com/thing:6438138",desc:"★ Vive & Vive Pro EyeTrackVR V4 mount by SunGear"}],link_id:6},{hmd:"Pico 4",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Pico_4/V4/RamesTheGeneric/Pico%20ET%20V4%20Mount_L.stl",desc:"★ V4 IR and camera mount by RamesTheGeneric"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Pico_4/V4/RamesTheGeneric",desc:"★ V4 board, and XIAO ESP mounts by RamesTheGeneric"}],link_id:8},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:9}]},y={class:"font-semibold text-xl"},k={class:""},V={style:{"list-style":"none"}},b=["href"],T={__name:"PartsList",setup(p){return(d,E)=>(e(),t("div",null,[(e(!0),t(s,null,o(_(h).hmds,a=>(e(),c(l,{class:"mb-4"},{title:u(()=>[r("span",y,i(a.hmd),1)]),content:u(()=>[r("div",null,[r("span",k,[r("blockquote",null,[r("ul",V,[a.hyper_links!=d.NULL&&a.hyper_links!=""?(e(!0),t(s,{key:0},o(a.hyper_links,n=>(e(),t("p",null,[r("a",{href:n.url,target:"_blank"},i(n.desc),9,b)]))),256)):m("",!0),(e(!0),t(s,null,o(a.parts,n=>(e(),t("li",{key:n},i(n),1))),128))])])])])]),_:2},1024))),256))]))}};export{T as _}; +import{A as l}from"./Accordion.44247159.js";import{o as e,c as t,F as s,B as o,b as c,w as u,k as r,t as i,e as m,l as _}from"./framework.ece1a6f0.js";const h={hmds:[{hmd:"Quest 3",parts:[""],hyper_links:[{url:"https://www.thingiverse.com/thing:6439510",desc:"★ Quest 3 V4 Mount by BasilAldwin & Dentohn (Eye_Tracking_Ring_V21-B.stl)"}],link_id:1},{hmd:"Quest 2",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/V4/Prohurtz",desc:"★ V4 Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/lordnathan",desc:"★ ESP-32CAM mount by lordnathan"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/EyeTrack_Quest_2_Mount_v10_By_Arkfall.stl",desc:"V3 Camera and IR emitter mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Quest_2/Prohurtz",desc:"V3 Camera and IR emitter mount by Prohurtz"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Arkfall/Quest_2_ESP_Mount_v2_By_Arkfall.stl",desc:"ESP mount by Arkfall"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_2/Prohurtz/Quest_2_ESP_Mounts_By_Prohurtz.stl",desc:"ESP mount by Prohurtz"}],link_id:2},{hmd:"Valve Index",parts:[""],hyper_links:[{url:"https://github.com/Physics-Dude/Phys-Index-EyetrackVR-HW/blob/main/ETVR%20ValveIndex%20Cam-LED%20Mount%20Rings/Index-EyetrackVRv4%20v18%20Print%20Me.stl",desc:"★ 160° V4 IR and Camera mount by Physics Dude and bitbyt3r."},{url:"https://makerworld.com/en/models/196741#profileId-217255",desc:"★ 160/130° V4 IR and Camera mount by Foow17 & Physics Dude"},{url:"https://makerworld.com/en/models/196791#profileId-217330",desc:"★ 160/130° VROptician V4 IR and Camera mount by Foow17 & MUTE"},{url:"https://github.com/Frosty704/indexwidmo-eyetrackvr/tree/main/v2",desc:"★ 160/120° WidmoVR V4 IR and Camera mount by frosty704 & lerx-cnm"},{url:"https://github.com/MUTEtheCyberwolf/VALVE-INDEX-DEV-Frunk-1.0/tree/main/3D%20Print%20Files%20STL(Ascii)",desc:" ESP frunk mod by MUTE the Cyberwolf"},{url:"https://github.com/Physics-Dude/Phys-Index-EyetrackVR-HW/tree/main",desc:"Gum Stick USB Hub Dongle by Physics Dude"}],link_id:3},{hmd:"Samsung Odyssey +",parts:["ESP mount: Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Samsung_Odyssey%2B/Breakdown/Samsung%20Odyssey%2B%20Left%20by%20Breakdown.stl",desc:"★ V3 Camera and IR emitter mount by Breakdown"}],link_id:4},{hmd:"Quest 1",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Quest_1/G0LDJAY/Quest_1_Cam_mount_v5_By_G0LDJAY.stl",desc:"★ V3 Camera and IR emitter mount by G0LDJAY"}],link_id:5},{hmd:"Vive Pro 2",parts:["ESP mount : Refer to general ESP Mounts"],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Vive_Pro_2/StormFox",desc:"★ V3 Camera and IR emitter mount by StormFox"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Vive_Pro_2/cat_who_loves_pie/Vive_Pro_2_VROptician_by_cat_who_loves_pie.stl",desc:"V3 VROptician camera and IR emitter mount by cat_who_loves_pie"}],link_id:6},{hmd:"Vive & Vive Pro",parts:[],hyper_links:[{url:"https://www.thingiverse.com/thing:6438138",desc:"★ Vive & Vive Pro EyeTrackVR V4 mount by SunGear"}],link_id:6},{hmd:"Pico 4",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/blob/main/3d_Printed_Mounts/Pico_4/V4/RamesTheGeneric/Pico%20ET%20V4%20Mount_L.stl",desc:"★ V4 IR and camera mount by RamesTheGeneric"},{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/Pico_4/V4/RamesTheGeneric",desc:"★ V4 board, and XIAO ESP mounts by RamesTheGeneric"}],link_id:8},{hmd:"General ESP Mounts",parts:[""],hyper_links:[{url:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/3d_Printed_Mounts/General_ESP32-CAM_Mounts",desc:"★ ESP mount by G0LDJAY for general HMD use (use if there are no specific HMD mounts available)"}],link_id:9}]},y={class:"font-semibold text-xl"},k={class:""},V={style:{"list-style":"none"}},b=["href"],T={__name:"PartsList",setup(p){return(d,E)=>(e(),t("div",null,[(e(!0),t(s,null,o(_(h).hmds,a=>(e(),c(l,{class:"mb-4"},{title:u(()=>[r("span",y,i(a.hmd),1)]),content:u(()=>[r("div",null,[r("span",k,[r("blockquote",null,[r("ul",V,[a.hyper_links!=d.NULL&&a.hyper_links!=""?(e(!0),t(s,{key:0},o(a.hyper_links,n=>(e(),t("p",null,[r("a",{href:n.url,target:"_blank"},i(n.desc),9,b)]))),256)):m("",!0),(e(!0),t(s,null,o(a.parts,n=>(e(),t("li",{key:n},i(n),1))),128))])])])])]),_:2},1024))),256))]))}};export{T as _}; diff --git a/assets/chunks/VPLocalSearchBox.5befaea8.js b/assets/chunks/VPLocalSearchBox.5befaea8.js deleted file mode 100644 index 20bb834..0000000 --- a/assets/chunks/VPLocalSearchBox.5befaea8.js +++ /dev/null @@ -1,8 +0,0 @@ -import{S as vt,h as ie,s as _e,af as Tt,ag as Ct,d as Nt,C as be,ah as et,g as Ne,ai as It,aj as Dt,v as Ot,ak as Mt,j as Ie,M as de,Q as we,al as Rt,am as Lt,U as Pt,p as zt,an as _t,o as Z,b as Bt,k as S,Y as Vt,l as K,$ as $t,ao as jt,ap as Wt,c as ee,n as tt,e as xe,B as rt,F as nt,a as he,t as ve,aq as Kt,ar as at,as as Jt,a4 as Ut,aa as Ht,_ as Gt}from"./framework.47aa8d5b.js";import{u as Qt,d as qt}from"./theme.cd06fb64.js";const Yt={root:()=>vt(()=>import("./@localSearchIndexroot.42785e48.js"),[])};/*! -* tabbable 6.2.0 -* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE -*/var pt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Se=pt.join(","),yt=typeof Element>"u",se=yt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ae=!yt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},ke=function o(e,t){var r;t===void 0&&(t=!0);var n=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),a=n===""||n==="true",i=a||t&&e&&o(e.parentNode);return i},Zt=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},mt=function(e,t,r){if(ke(e))return[];var n=Array.prototype.slice.apply(e.querySelectorAll(Se));return t&&se.call(e,Se)&&n.unshift(e),n=n.filter(r),n},gt=function o(e,t,r){for(var n=[],a=Array.from(e);a.length;){var i=a.shift();if(!ke(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?n.push.apply(n,l):n.push({scopeParent:i,candidates:l})}else{var f=se.call(i,Se);f&&r.filter(i)&&(t||!e.includes(i))&&n.push(i);var h=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!ke(h,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(h&&v){var m=o(h===!0?i.children:h.children,!0,r);r.flatten?n.push.apply(n,m):n.push({scopeParent:i,candidates:m})}else a.unshift.apply(a,i.children)}}return n},bt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},oe=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||Zt(e))&&!bt(e)?0:e.tabIndex},Xt=function(e,t){var r=oe(e);return r<0&&t&&!bt(e)?0:r},er=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},wt=function(e){return e.tagName==="INPUT"},tr=function(e){return wt(e)&&e.type==="hidden"},rr=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},nr=function(e,t){for(var r=0;rsummary:first-of-type"),i=a?e.parentElement:e;if(se.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof n=="function"){for(var s=e;e;){var u=e.parentElement,l=Ae(e);if(u&&!u.shadowRoot&&n(u)===!0)return it(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(sr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return it(e);return!1},lr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},fr=function o(e){var t=[],r=[];return e.forEach(function(n,a){var i=!!n.scopeParent,s=i?n.scopeParent:n,u=Xt(s,i),l=i?o(n.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:a,tabIndex:u,item:n,isScope:i,content:l})}),r.sort(er).reduce(function(n,a){return a.isScope?n.push.apply(n,a.content):n.push(a.content),n},[]).concat(t)},dr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=gt([e],t.includeContainer,{filter:Be.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:cr}):r=mt(e,t.includeContainer,Be.bind(null,t)),fr(r)},hr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=gt([e],t.includeContainer,{filter:Te.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=mt(e,t.includeContainer,Te.bind(null,t)),r},ue=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return se.call(e,Se)===!1?!1:Be(t,e)},vr=pt.concat("iframe").join(","),De=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return se.call(e,vr)===!1?!1:Te(t,e)};/*! -* focus-trap 7.6.4 -* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE -*/function Ve(o,e){(e==null||e>o.length)&&(e=o.length);for(var t=0,r=Array(e);t0){var r=e[e.length-1];r!==t&&r._setPausedState(!0)}var n=e.indexOf(t);n===-1||e.splice(n,1),e.push(t)},deactivateTrap:function(e,t){var r=e.indexOf(t);r!==-1&&e.splice(r,1),e.length>0&&!e[e.length-1]._isManuallyPaused()&&e[e.length-1]._setPausedState(!1)}},Er=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Sr=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},me=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Ar=function(e){return me(e)&&!e.shiftKey},kr=function(e){return me(e)&&e.shiftKey},lt=function(e){return setTimeout(e,0)},pe=function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),n=1;n1&&arguments[1]!==void 0?arguments[1]:{},x=d.hasFallback,T=x===void 0?!1:x,N=d.params,R=N===void 0?[]:N,p=a[c];if(typeof p=="function"&&(p=p.apply(void 0,br(R))),p===!0&&(p=void 0),!p){if(p===void 0||p===!1)return p;throw new Error("`".concat(c,"` was specified but was not a node, or did not return a node"))}var y=p;if(typeof p=="string"){try{y=r.querySelector(p)}catch(O){throw new Error("`".concat(c,'` appears to be an invalid selector; error="').concat(O.message,'"'))}if(!y&&!T)throw new Error("`".concat(c,"` as selector refers to no known node"))}return y},h=function(){var c=f("initialFocus",{hasFallback:!0});if(c===!1)return!1;if(c===void 0||c&&!De(c,a.tabbableOptions))if(l(r.activeElement)>=0)c=r.activeElement;else{var d=i.tabbableGroups[0],x=d&&d.firstTabbableNode;c=x||f("fallbackFocus")}else c===null&&(c=f("fallbackFocus"));if(!c)throw new Error("Your focus-trap needs to have at least one focusable element");return c},v=function(){if(i.containerGroups=i.containers.map(function(c){var d=dr(c,a.tabbableOptions),x=hr(c,a.tabbableOptions),T=d.length>0?d[0]:void 0,N=d.length>0?d[d.length-1]:void 0,R=x.find(function(O){return ue(O)}),p=x.slice().reverse().find(function(O){return ue(O)}),y=!!d.find(function(O){return oe(O)>0});return{container:c,tabbableNodes:d,focusableNodes:x,posTabIndexesFound:y,firstTabbableNode:T,lastTabbableNode:N,firstDomTabbableNode:R,lastDomTabbableNode:p,nextTabbableNode:function(U){var Q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,W=d.indexOf(U);return W<0?Q?x.slice(x.indexOf(U)+1).find(function(V){return ue(V)}):x.slice(0,x.indexOf(U)).reverse().find(function(V){return ue(V)}):d[W+(Q?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(c){return c.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!f("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(c){return c.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},m=function(c){var d=c.activeElement;if(d)return d.shadowRoot&&d.shadowRoot.activeElement!==null?m(d.shadowRoot):d},b=function(c){if(c!==!1&&c!==m(document)){if(!c||!c.focus){b(h());return}c.focus({preventScroll:!!a.preventScroll}),i.mostRecentlyFocusedNode=c,Er(c)&&c.select()}},w=function(c){var d=f("setReturnFocus",{params:[c]});return d||(d===!1?!1:c)},F=function(c){var d=c.target,x=c.event,T=c.isBackward,N=T===void 0?!1:T;d=d||Fe(x),v();var R=null;if(i.tabbableGroups.length>0){var p=l(d,x),y=p>=0?i.containerGroups[p]:void 0;if(p<0)N?R=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:R=i.tabbableGroups[0].firstTabbableNode;else if(N){var O=i.tabbableGroups.findIndex(function(G){var te=G.firstTabbableNode;return d===te});if(O<0&&(y.container===d||De(d,a.tabbableOptions)&&!ue(d,a.tabbableOptions)&&!y.nextTabbableNode(d,!1))&&(O=p),O>=0){var U=O===0?i.tabbableGroups.length-1:O-1,Q=i.tabbableGroups[U];R=oe(d)>=0?Q.lastTabbableNode:Q.lastDomTabbableNode}else me(x)||(R=y.nextTabbableNode(d,!1))}else{var W=i.tabbableGroups.findIndex(function(G){var te=G.lastTabbableNode;return d===te});if(W<0&&(y.container===d||De(d,a.tabbableOptions)&&!ue(d,a.tabbableOptions)&&!y.nextTabbableNode(d))&&(W=p),W>=0){var V=W===i.tabbableGroups.length-1?0:W+1,H=i.tabbableGroups[V];R=oe(d)>=0?H.firstTabbableNode:H.firstDomTabbableNode}else me(x)||(R=y.nextTabbableNode(d))}}else R=f("fallbackFocus");return R},k=function(c){var d=Fe(c);if(!(l(d,c)>=0)){if(pe(a.clickOutsideDeactivates,c)){s.deactivate({returnFocus:a.returnFocusOnDeactivate});return}pe(a.allowOutsideClick,c)||c.preventDefault()}},C=function(c){var d=Fe(c),x=l(d,c)>=0;if(x||d instanceof Document)x&&(i.mostRecentlyFocusedNode=d);else{c.stopImmediatePropagation();var T,N=!0;if(i.mostRecentlyFocusedNode)if(oe(i.mostRecentlyFocusedNode)>0){var R=l(i.mostRecentlyFocusedNode),p=i.containerGroups[R].tabbableNodes;if(p.length>0){var y=p.findIndex(function(O){return O===i.mostRecentlyFocusedNode});y>=0&&(a.isKeyForward(i.recentNavEvent)?y+1=0&&(T=p[y-1],N=!1))}}else i.containerGroups.some(function(O){return O.tabbableNodes.some(function(U){return oe(U)>0})})||(N=!1);else N=!1;N&&(T=F({target:i.mostRecentlyFocusedNode,isBackward:a.isKeyBackward(i.recentNavEvent)})),b(T||i.mostRecentlyFocusedNode||h())}i.recentNavEvent=void 0},A=function(c){var d=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=c;var x=F({event:c,isBackward:d});x&&(me(c)&&c.preventDefault(),b(x))},z=function(c){(a.isKeyForward(c)||a.isKeyBackward(c))&&A(c,a.isKeyBackward(c))},M=function(c){Sr(c)&&pe(a.escapeDeactivates,c)!==!1&&(c.preventDefault(),s.deactivate())},B=function(c){var d=Fe(c);l(d,c)>=0||pe(a.clickOutsideDeactivates,c)||pe(a.allowOutsideClick,c)||(c.preventDefault(),c.stopImmediatePropagation())},E=function(){if(i.active)return ut.activateTrap(n,s),i.delayInitialFocusTimer=a.delayInitialFocus?lt(function(){b(h())}):b(h()),r.addEventListener("focusin",C,!0),r.addEventListener("mousedown",k,{capture:!0,passive:!1}),r.addEventListener("touchstart",k,{capture:!0,passive:!1}),r.addEventListener("click",B,{capture:!0,passive:!1}),r.addEventListener("keydown",z,{capture:!0,passive:!1}),r.addEventListener("keydown",M),s},I=function(){if(i.active)return r.removeEventListener("focusin",C,!0),r.removeEventListener("mousedown",k,!0),r.removeEventListener("touchstart",k,!0),r.removeEventListener("click",B,!0),r.removeEventListener("keydown",z,!0),r.removeEventListener("keydown",M),s},L=function(c){var d=c.some(function(x){var T=Array.from(x.removedNodes);return T.some(function(N){return N===i.mostRecentlyFocusedNode})});d&&b(h())},_=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(L):void 0,P=function(){_&&(_.disconnect(),i.active&&!i.paused&&i.containers.map(function(c){_.observe(c,{subtree:!0,childList:!0})}))};return s={get active(){return i.active},get paused(){return i.paused},activate:function(c){if(i.active)return this;var d=u(c,"onActivate"),x=u(c,"onPostActivate"),T=u(c,"checkCanFocusTrap");T||v(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=r.activeElement,d==null||d();var N=function(){T&&v(),E(),P(),x==null||x()};return T?(T(i.containers.concat()).then(N,N),this):(N(),this)},deactivate:function(c){if(!i.active)return this;var d=st({onDeactivate:a.onDeactivate,onPostDeactivate:a.onPostDeactivate,checkCanReturnFocus:a.checkCanReturnFocus},c);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,I(),i.active=!1,i.paused=!1,P(),ut.deactivateTrap(n,s);var x=u(d,"onDeactivate"),T=u(d,"onPostDeactivate"),N=u(d,"checkCanReturnFocus"),R=u(d,"returnFocus","returnFocusOnDeactivate");x==null||x();var p=function(){lt(function(){R&&b(w(i.nodeFocusedBeforeActivation)),T==null||T()})};return R&&N?(N(w(i.nodeFocusedBeforeActivation)).then(p,p),this):(p(),this)},pause:function(c){return i.active?(i.manuallyPaused=!0,this._setPausedState(!0,c)):this},unpause:function(c){return i.active?(i.manuallyPaused=!1,n[n.length-1]!==this?this:this._setPausedState(!1,c)):this},updateContainerElements:function(c){var d=[].concat(c).filter(Boolean);return i.containers=d.map(function(x){return typeof x=="string"?r.querySelector(x):x}),i.active&&v(),P(),this}},Object.defineProperties(s,{_isManuallyPaused:{value:function(){return i.manuallyPaused}},_setPausedState:{value:function(c,d){if(i.paused===c)return this;if(i.paused=c,c){var x=u(d,"onPause"),T=u(d,"onPostPause");x==null||x(),I(),P(),T==null||T()}else{var N=u(d,"onUnpause"),R=u(d,"onPostUnpause");N==null||N(),v(),E(),P(),R==null||R()}return this}}}),s.updateContainerElements(e),s};function Nr(o,e={}){let t;const{immediate:r,...n}=e,a=ie(!1),i=ie(!1),s=h=>t&&t.activate(h),u=h=>t&&t.deactivate(h),l=()=>{t&&(t.pause(),i.value=!0)},f=()=>{t&&(t.unpause(),i.value=!1)};return _e(()=>Tt(o),h=>{h&&(t=Cr(h,{...n,onActivate(){a.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){a.value=!1,e.onDeactivate&&e.onDeactivate()}}),r&&s())},{flush:"post"}),Ct(()=>u()),{hasFocus:a,isPaused:i,activate:s,deactivate:u,pause:l,unpause:f}}class ce{constructor(e,t=!0,r=[],n=5e3){this.ctx=e,this.iframes=t,this.exclude=r,this.iframesTimeout=n}static matches(e,t){const r=typeof t=="string"?[t]:t,n=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(n){let a=!1;return r.every(i=>n.call(e,i)?(a=!0,!1):!0),a}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(r=>{const n=t.filter(a=>a.contains(r)).length>0;t.indexOf(r)===-1&&!n&&t.push(r)}),t}getIframeContents(e,t,r=()=>{}){let n;try{const a=e.contentWindow;if(n=a.document,!a||!n)throw new Error("iframe inaccessible")}catch{r()}n&&t(n)}isIframeBlank(e){const t="about:blank",r=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&r!==t&&r}observeIframeLoad(e,t,r){let n=!1,a=null;const i=()=>{if(!n){n=!0,clearTimeout(a);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,r))}catch{r()}}};e.addEventListener("load",i),a=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,r){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch{r()}}waitForIframes(e,t){let r=0;this.forEachIframe(e,()=>!0,n=>{r++,this.waitForIframes(n.querySelector("html"),()=>{--r||t()})},n=>{n||t()})}forEachIframe(e,t,r,n=()=>{}){let a=e.querySelectorAll("iframe"),i=a.length,s=0;a=Array.prototype.slice.call(a);const u=()=>{--i<=0&&n(s)};i||u(),a.forEach(l=>{ce.matches(l,this.exclude)?u():this.onIframeReady(l,f=>{t(l)&&(s++,r(f)),u()},u)})}createIterator(e,t,r){return document.createNodeIterator(e,t,r,!1)}createInstanceOnIframe(e){return new ce(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,r){const n=e.compareDocumentPosition(r),a=Node.DOCUMENT_POSITION_PRECEDING;if(n&a)if(t!==null){const i=t.compareDocumentPosition(r),s=Node.DOCUMENT_POSITION_FOLLOWING;if(i&s)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let r;return t===null?r=e.nextNode():r=e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}checkIframeFilter(e,t,r,n){let a=!1,i=!1;return n.forEach((s,u)=>{s.val===r&&(a=u,i=s.handled)}),this.compareNodeIframe(e,t,r)?(a===!1&&!i?n.push({val:r,handled:!0}):a!==!1&&!i&&(n[a].handled=!0),!0):(a===!1&&n.push({val:r,handled:!1}),!1)}handleOpenIframes(e,t,r,n){e.forEach(a=>{a.handled||this.getIframeContents(a.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,r,n)})})}iterateThroughNodes(e,t,r,n,a){const i=this.createIterator(t,e,n);let s=[],u=[],l,f,h=()=>({prevNode:f,node:l}=this.getIteratorNode(i),l);for(;h();)this.iframes&&this.forEachIframe(t,v=>this.checkIframeFilter(l,f,v,s),v=>{this.createInstanceOnIframe(v).forEachNode(e,m=>u.push(m),n)}),u.push(l);u.forEach(v=>{r(v)}),this.iframes&&this.handleOpenIframes(s,e,r,n),a()}forEachNode(e,t,r,n=()=>{}){const a=this.getContexts();let i=a.length;i||n(),a.forEach(s=>{const u=()=>{this.iterateThroughNodes(e,s,t,r,()=>{--i<=0&&n()})};this.iframes?this.waitForIframes(s,u):u()})}}let Ir=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ce(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const r=this.opt.log;this.opt.debug&&typeof r=="object"&&typeof r[t]=="function"&&r[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",n=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let a in t)if(t.hasOwnProperty(a)){const i=t[a],s=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(a):this.escapeStr(a),u=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);s!==""&&u!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(s)}|${this.escapeStr(u)})`,`gm${r}`),n+`(${this.processSynomyms(s)}|${this.processSynomyms(u)})`+n))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,r,n)=>{let a=n.charAt(r+1);return/[(|)\\]/.test(a)||a===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",r=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let n=[];return e.split("").forEach(a=>{r.every(i=>{if(i.indexOf(a)!==-1){if(n.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),n.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let r=this.opt.accuracy,n=typeof r=="string"?r:r.value,a=typeof r=="string"?[]:r.limiters,i="";switch(a.forEach(s=>{i+=`|${this.escapeStr(s)}`}),n){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(r=>{this.opt.separateWordSearch?r.split(" ").forEach(n=>{n.trim()&&t.indexOf(n)===-1&&t.push(n)}):r.trim()&&t.indexOf(r)===-1&&t.push(r)}),{keywords:t.sort((r,n)=>n.length-r.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let r=0;return e.sort((n,a)=>n.start-a.start).forEach(n=>{let{start:a,end:i,valid:s}=this.callNoMatchOnInvalidRanges(n,r);s&&(n.start=a,n.length=i-a,t.push(n),r=i)}),t}callNoMatchOnInvalidRanges(e,t){let r,n,a=!1;return e&&typeof e.start<"u"?(r=parseInt(e.start,10),n=r+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&n-t>0&&n-r>0?a=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:r,end:n,valid:a}}checkWhitespaceRanges(e,t,r){let n,a=!0,i=r.length,s=t-i,u=parseInt(e.start,10)-s;return u=u>i?i:u,n=u+parseInt(e.length,10),n>i&&(n=i,this.log(`End range automatically set to the max value of ${i}`)),u<0||n-u<0||u>i||n>i?(a=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):r.substring(u,n).replace(/\s+/g,"")===""&&(a=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:u,end:n,valid:a}}getTextNodes(e){let t="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,n=>{r.push({start:t.length,end:(t+=n.textContent).length,node:n})},n=>this.matchesExclude(n.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:r})})}matchesExclude(e){return ce.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,r){const n=this.opt.element?this.opt.element:"mark",a=e.splitText(t),i=a.splitText(r-t);let s=document.createElement(n);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=a.textContent,a.parentNode.replaceChild(s,a),i}wrapRangeInMappedTextNode(e,t,r,n,a){e.nodes.every((i,s)=>{const u=e.nodes[s+1];if(typeof u>"u"||u.start>t){if(!n(i.node))return!1;const l=t-i.start,f=(r>i.end?i.end:r)-i.start,h=e.value.substr(0,i.start),v=e.value.substr(f+i.start);if(i.node=this.wrapRangeInTextNode(i.node,l,f),e.value=h+v,e.nodes.forEach((m,b)=>{b>=s&&(e.nodes[b].start>0&&b!==s&&(e.nodes[b].start-=f),e.nodes[b].end-=f)}),r-=f,a(i.node.previousSibling,i.start),r>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,r,n,a){const i=t===0?0:t+1;this.getTextNodes(s=>{s.nodes.forEach(u=>{u=u.node;let l;for(;(l=e.exec(u.textContent))!==null&&l[i]!=="";){if(!r(l[i],u))continue;let f=l.index;if(i!==0)for(let h=1;h{let u;for(;(u=e.exec(s.value))!==null&&u[i]!=="";){let l=u.index;if(i!==0)for(let h=1;hr(u[i],h),(h,v)=>{e.lastIndex=v,n(h)})}a()})}wrapRangeFromIndex(e,t,r,n){this.getTextNodes(a=>{const i=a.value.length;e.forEach((s,u)=>{let{start:l,end:f,valid:h}=this.checkWhitespaceRanges(s,i,a.value);h&&this.wrapRangeInMappedTextNode(a,l,f,v=>t(v,s,a.value.substring(l,f),u),v=>{r(v,s)})}),n()})}unwrapMatches(e){const t=e.parentNode;let r=document.createDocumentFragment();for(;e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let r=0,n="wrapMatches";const a=i=>{r++,this.opt.each(i)};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),this[n](e,this.opt.ignoreGroups,(i,s)=>this.opt.filter(s,i,r),a,()=>{r===0&&this.opt.noMatch(e),this.opt.done(r)})}mark(e,t){this.opt=t;let r=0,n="wrapMatches";const{keywords:a,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),s=this.opt.caseSensitive?"":"i",u=l=>{let f=new RegExp(this.createRegExp(l),`gm${s}`),h=0;this.log(`Searching with expression "${f}"`),this[n](f,1,(v,m)=>this.opt.filter(m,l,r,h),v=>{h++,r++,this.opt.each(v)},()=>{h===0&&this.opt.noMatch(l),a[i-1]===l?this.opt.done(r):u(a[a.indexOf(l)+1])})};this.opt.acrossElements&&(n="wrapMatchesAcrossElements"),i===0?this.opt.done(r):u(a[0])}markRanges(e,t){this.opt=t;let r=0,n=this.checkRanges(e);n&&n.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(n)),this.wrapRangeFromIndex(n,(a,i,s,u)=>this.opt.filter(a,i,s,u),(a,i)=>{r++,this.opt.each(a,i)},()=>{this.opt.done(r)})):this.opt.done(r)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,r=>{this.unwrapMatches(r)},r=>{const n=ce.matches(r,t),a=this.matchesExclude(r);return!n||a?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Dr(o){const e=new Ir(o);return this.mark=(t,r)=>(e.mark(t,r),this),this.markRegExp=(t,r)=>(e.markRegExp(t,r),this),this.markRanges=(t,r)=>(e.markRanges(t,r),this),this.unmark=t=>(e.unmark(t),this),this}var $=function(){return $=Object.assign||function(e){for(var t,r=1,n=arguments.length;r0&&a[a.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!a||l[1]>a[0]&&l[1]=o.length&&(o=void 0),{value:o&&o[r++],done:!o}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function j(o,e){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var r=t.call(o),n,a=[],i;try{for(;(e===void 0||e-- >0)&&!(n=r.next()).done;)a.push(n.value)}catch(s){i={error:s}}finally{try{n&&!n.done&&(t=r.return)&&t.call(r)}finally{if(i)throw i.error}}return a}var Rr="ENTRIES",xt="KEYS",Ft="VALUES",J="",Oe=function(){function o(e,t){var r=e._tree,n=Array.from(r.keys());this.set=e,this._type=t,this._path=n.length>0?[{node:r,keys:n}]:[]}return o.prototype.next=function(){var e=this.dive();return this.backtrack(),e},o.prototype.dive=function(){if(this._path.length===0)return{done:!0,value:void 0};var e=le(this._path),t=e.node,r=e.keys;if(le(r)===J)return{done:!1,value:this.result()};var n=t.get(le(r));return this._path.push({node:n,keys:Array.from(n.keys())}),this.dive()},o.prototype.backtrack=function(){if(this._path.length!==0){var e=le(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}},o.prototype.key=function(){return this.set._prefix+this._path.map(function(e){var t=e.keys;return le(t)}).filter(function(e){return e!==J}).join("")},o.prototype.value=function(){return le(this._path).node.get(J)},o.prototype.result=function(){switch(this._type){case Ft:return this.value();case xt:return this.key();default:return[this.key(),this.value()]}},o.prototype[Symbol.iterator]=function(){return this},o}(),le=function(o){return o[o.length-1]},Lr=function(o,e,t){var r=new Map;if(e===void 0)return r;for(var n=e.length+1,a=n+t,i=new Uint8Array(a*n).fill(t+1),s=0;st)continue e}Et(o.get(m),e,t,r,n,w,i,s+m)}}}catch(c){u={error:c}}finally{try{v&&!v.done&&(l=h.return)&&l.call(h)}finally{if(u)throw u.error}}},Me=function(){function o(e,t){e===void 0&&(e=new Map),t===void 0&&(t=""),this._size=void 0,this._tree=e,this._prefix=t}return o.prototype.atPrefix=function(e){var t,r;if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");var n=j(Ce(this._tree,e.slice(this._prefix.length)),2),a=n[0],i=n[1];if(a===void 0){var s=j(Ke(i),2),u=s[0],l=s[1];try{for(var f=D(u.keys()),h=f.next();!h.done;h=f.next()){var v=h.value;if(v!==J&&v.startsWith(l)){var m=new Map;return m.set(v.slice(l.length),u.get(v)),new o(m,e)}}}catch(b){t={error:b}}finally{try{h&&!h.done&&(r=f.return)&&r.call(f)}finally{if(t)throw t.error}}}return new o(a,e)},o.prototype.clear=function(){this._size=void 0,this._tree.clear()},o.prototype.delete=function(e){return this._size=void 0,Pr(this._tree,e)},o.prototype.entries=function(){return new Oe(this,Rr)},o.prototype.forEach=function(e){var t,r;try{for(var n=D(this),a=n.next();!a.done;a=n.next()){var i=j(a.value,2),s=i[0],u=i[1];e(s,u,this)}}catch(l){t={error:l}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},o.prototype.fuzzyGet=function(e,t){return Lr(this._tree,e,t)},o.prototype.get=function(e){var t=$e(this._tree,e);return t!==void 0?t.get(J):void 0},o.prototype.has=function(e){var t=$e(this._tree,e);return t!==void 0&&t.has(J)},o.prototype.keys=function(){return new Oe(this,xt)},o.prototype.set=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Re(this._tree,e);return r.set(J,t),this},Object.defineProperty(o.prototype,"size",{get:function(){if(this._size)return this._size;this._size=0;for(var e=this.entries();!e.next().done;)this._size+=1;return this._size},enumerable:!1,configurable:!0}),o.prototype.update=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Re(this._tree,e);return r.set(J,t(r.get(J))),this},o.prototype.fetch=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Re(this._tree,e),n=r.get(J);return n===void 0&&r.set(J,n=t()),n},o.prototype.values=function(){return new Oe(this,Ft)},o.prototype[Symbol.iterator]=function(){return this.entries()},o.from=function(e){var t,r,n=new o;try{for(var a=D(e),i=a.next();!i.done;i=a.next()){var s=j(i.value,2),u=s[0],l=s[1];n.set(u,l)}}catch(f){t={error:f}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}return n},o.fromObject=function(e){return o.from(Object.entries(e))},o}(),Ce=function(o,e,t){var r,n;if(t===void 0&&(t=[]),e.length===0||o==null)return[o,t];try{for(var a=D(o.keys()),i=a.next();!i.done;i=a.next()){var s=i.value;if(s!==J&&e.startsWith(s))return t.push([o,s]),Ce(o.get(s),e.slice(s.length),t)}}catch(u){r={error:u}}finally{try{i&&!i.done&&(n=a.return)&&n.call(a)}finally{if(r)throw r.error}}return t.push([o,e]),Ce(void 0,"",t)},$e=function(o,e){var t,r;if(e.length===0||o==null)return o;try{for(var n=D(o.keys()),a=n.next();!a.done;a=n.next()){var i=a.value;if(i!==J&&e.startsWith(i))return $e(o.get(i),e.slice(i.length))}}catch(s){t={error:s}}finally{try{a&&!a.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}},Re=function(o,e){var t,r,n=e.length;e:for(var a=0;o&&a0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Me,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}},o.prototype.discard=function(e){var t=this,r=this._idToShortId.get(e);if(r==null)throw new Error("MiniSearch: cannot discard document with ID ".concat(e,": it is not in the index"));this._idToShortId.delete(e),this._documentIds.delete(r),this._storedFields.delete(r),(this._fieldLength.get(r)||[]).forEach(function(n,a){t.removeFieldLength(r,a,t._documentCount,n)}),this._fieldLength.delete(r),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()},o.prototype.maybeAutoVacuum=function(){if(this._options.autoVacuum!==!1){var e=this._options.autoVacuum,t=e.minDirtFactor,r=e.minDirtCount,n=e.batchSize,a=e.batchWait;this.conditionalVacuum({batchSize:n,batchWait:a},{minDirtCount:r,minDirtFactor:t})}},o.prototype.discardAll=function(e){var t,r,n=this._options.autoVacuum;try{this._options.autoVacuum=!1;try{for(var a=D(e),i=a.next();!i.done;i=a.next()){var s=i.value;this.discard(s)}}catch(u){t={error:u}}finally{try{i&&!i.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}}finally{this._options.autoVacuum=n}this.maybeAutoVacuum()},o.prototype.replace=function(e){var t=this._options,r=t.idField,n=t.extractField,a=n(e,r);this.discard(a),this.add(e)},o.prototype.vacuum=function(e){return e===void 0&&(e={}),this.conditionalVacuum(e)},o.prototype.conditionalVacuum=function(e,t){var r=this;return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(function(){var n=r._enqueuedVacuumConditions;return r._enqueuedVacuumConditions=We,r.performVacuuming(e,n)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)},o.prototype.performVacuuming=function(e,t){return Or(this,void 0,void 0,function(){var r,n,a,i,s,u,l,f,h,v,m,b,w,F,k,C,A,z,M,B,E,I,L,_,P;return Mr(this,function(g){switch(g.label){case 0:if(r=this._dirtCount,!this.vacuumConditionsMet(t))return[3,10];n=e.batchSize||je.batchSize,a=e.batchWait||je.batchWait,i=1,g.label=1;case 1:g.trys.push([1,7,8,9]),s=D(this._index),u=s.next(),g.label=2;case 2:if(u.done)return[3,6];l=j(u.value,2),f=l[0],h=l[1];try{for(v=(I=void 0,D(h)),m=v.next();!m.done;m=v.next()){b=j(m.value,2),w=b[0],F=b[1];try{for(k=(_=void 0,D(F)),C=k.next();!C.done;C=k.next())A=j(C.value,1),z=A[0],!this._documentIds.has(z)&&(F.size<=1?h.delete(w):F.delete(z))}catch(c){_={error:c}}finally{try{C&&!C.done&&(P=k.return)&&P.call(k)}finally{if(_)throw _.error}}}}catch(c){I={error:c}}finally{try{m&&!m.done&&(L=v.return)&&L.call(v)}finally{if(I)throw I.error}}return this._index.get(f).size===0&&this._index.delete(f),i%n!==0?[3,4]:[4,new Promise(function(c){return setTimeout(c,a)})];case 3:g.sent(),g.label=4;case 4:i+=1,g.label=5;case 5:return u=s.next(),[3,2];case 6:return[3,9];case 7:return M=g.sent(),B={error:M},[3,9];case 8:try{u&&!u.done&&(E=s.return)&&E.call(s)}finally{if(B)throw B.error}return[7];case 9:this._dirtCount-=r,g.label=10;case 10:return[4,null];case 11:return g.sent(),this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null,[2]}})})},o.prototype.vacuumConditionsMet=function(e){if(e==null)return!0;var t=e.minDirtCount,r=e.minDirtFactor;return t=t||ze.minDirtCount,r=r||ze.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=r},Object.defineProperty(o.prototype,"isVacuuming",{get:function(){return this._currentVacuum!=null},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtCount",{get:function(){return this._dirtCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtFactor",{get:function(){return this._dirtCount/(1+this._documentCount+this._dirtCount)},enumerable:!1,configurable:!0}),o.prototype.has=function(e){return this._idToShortId.has(e)},o.prototype.getStoredFields=function(e){var t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)},o.prototype.search=function(e,t){var r,n;t===void 0&&(t={});var a=this.executeQuery(e,t),i=[];try{for(var s=D(a),u=s.next();!u.done;u=s.next()){var l=j(u.value,2),f=l[0],h=l[1],v=h.score,m=h.terms,b=h.match,w=m.length||1,F={id:this._documentIds.get(f),score:v*w,terms:Object.keys(b),queryTerms:m,match:b};Object.assign(F,this._storedFields.get(f)),(t.filter==null||t.filter(F))&&i.push(F)}}catch(k){r={error:k}}finally{try{u&&!u.done&&(n=s.return)&&n.call(s)}finally{if(r)throw r.error}}return e===o.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||i.sort(dt),i},o.prototype.autoSuggest=function(e,t){var r,n,a,i;t===void 0&&(t={}),t=$($({},this._options.autoSuggestOptions),t);var s=new Map;try{for(var u=D(this.search(e,t)),l=u.next();!l.done;l=u.next()){var f=l.value,h=f.score,v=f.terms,m=v.join(" "),b=s.get(m);b!=null?(b.score+=h,b.count+=1):s.set(m,{score:h,terms:v,count:1})}}catch(M){r={error:M}}finally{try{l&&!l.done&&(n=u.return)&&n.call(u)}finally{if(r)throw r.error}}var w=[];try{for(var F=D(s),k=F.next();!k.done;k=F.next()){var C=j(k.value,2),b=C[0],A=C[1],h=A.score,v=A.terms,z=A.count;w.push({suggestion:b,terms:v,score:h/z})}}catch(M){a={error:M}}finally{try{k&&!k.done&&(i=F.return)&&i.call(F)}finally{if(a)throw a.error}}return w.sort(dt),w},Object.defineProperty(o.prototype,"documentCount",{get:function(){return this._documentCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"termCount",{get:function(){return this._index.size},enumerable:!1,configurable:!0}),o.loadJSON=function(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)},o.getDefault=function(e){if(Pe.hasOwnProperty(e))return Le(Pe,e);throw new Error('MiniSearch: unknown option "'.concat(e,'"'))},o.loadJS=function(e,t){var r,n,a,i,s,u,l=e.index,f=e.documentCount,h=e.nextId,v=e.documentIds,m=e.fieldIds,b=e.fieldLength,w=e.averageFieldLength,F=e.storedFields,k=e.dirtCount,C=e.serializationVersion;if(C!==1&&C!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");var A=new o(t);A._documentCount=f,A._nextId=h,A._documentIds=Ee(v),A._idToShortId=new Map,A._fieldIds=m,A._fieldLength=Ee(b),A._avgFieldLength=w,A._storedFields=Ee(F),A._dirtCount=k||0,A._index=new Me;try{for(var z=D(A._documentIds),M=z.next();!M.done;M=z.next()){var B=j(M.value,2),E=B[0],I=B[1];A._idToShortId.set(I,E)}}catch(p){r={error:p}}finally{try{M&&!M.done&&(n=z.return)&&n.call(z)}finally{if(r)throw r.error}}try{for(var L=D(l),_=L.next();!_.done;_=L.next()){var P=j(_.value,2),g=P[0],c=P[1],d=new Map;try{for(var x=(s=void 0,D(Object.keys(c))),T=x.next();!T.done;T=x.next()){var N=T.value,R=c[N];C===1&&(R=R.ds),d.set(parseInt(N,10),Ee(R))}}catch(p){s={error:p}}finally{try{T&&!T.done&&(u=x.return)&&u.call(x)}finally{if(s)throw s.error}}A._index.set(g,d)}}catch(p){a={error:p}}finally{try{_&&!_.done&&(i=L.return)&&i.call(L)}finally{if(a)throw a.error}}return A},o.prototype.executeQuery=function(e,t){var r=this;if(t===void 0&&(t={}),e===o.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){var n=$($($({},t),e),{queries:void 0}),a=e.queries.map(function(F){return r.executeQuery(F,n)});return this.combineResults(a,n.combineWith)}var i=this._options,s=i.tokenize,u=i.processTerm,l=i.searchOptions,f=$($({tokenize:s,processTerm:u},l),t),h=f.tokenize,v=f.processTerm,m=h(e).flatMap(function(F){return v(F)}).filter(function(F){return!!F}),b=m.map(jr(f)),w=b.map(function(F){return r.executeQuerySpec(F,f)});return this.combineResults(w,f.combineWith)},o.prototype.executeQuerySpec=function(e,t){var r,n,a,i,s=$($({},this._options.searchOptions),t),u=(s.fields||this._options.fields).reduce(function(N,R){var p;return $($({},N),(p={},p[R]=Le(s.boost,R)||1,p))},{}),l=s.boostDocument,f=s.weights,h=s.maxFuzzy,v=s.bm25,m=$($({},ct.weights),f),b=m.fuzzy,w=m.prefix,F=this._index.get(e.term),k=this.termResults(e.term,e.term,1,F,u,l,v),C,A;if(e.prefix&&(C=this._index.atPrefix(e.term)),e.fuzzy){var z=e.fuzzy===!0?.2:e.fuzzy,M=z<1?Math.min(h,Math.round(e.term.length*z)):z;M&&(A=this._index.fuzzyGet(e.term,M))}if(C)try{for(var B=D(C),E=B.next();!E.done;E=B.next()){var I=j(E.value,2),L=I[0],_=I[1],P=L.length-e.term.length;if(P){A==null||A.delete(L);var g=w*L.length/(L.length+.3*P);this.termResults(e.term,L,g,_,u,l,v,k)}}}catch(N){r={error:N}}finally{try{E&&!E.done&&(n=B.return)&&n.call(B)}finally{if(r)throw r.error}}if(A)try{for(var c=D(A.keys()),d=c.next();!d.done;d=c.next()){var L=d.value,x=j(A.get(L),2),T=x[0],P=x[1];if(P){var g=b*L.length/(L.length+P);this.termResults(e.term,L,g,T,u,l,v,k)}}}catch(N){a={error:N}}finally{try{d&&!d.done&&(i=c.return)&&i.call(c)}finally{if(a)throw a.error}}return k},o.prototype.executeWildcardQuery=function(e){var t,r,n=new Map,a=$($({},this._options.searchOptions),e);try{for(var i=D(this._documentIds),s=i.next();!s.done;s=i.next()){var u=j(s.value,2),l=u[0],f=u[1],h=a.boostDocument?a.boostDocument(f,"",this._storedFields.get(l)):1;n.set(l,{score:h,terms:[],match:{}})}}catch(v){t={error:v}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}return n},o.prototype.combineResults=function(e,t){if(t===void 0&&(t=Je),e.length===0)return new Map;var r=t.toLowerCase();return e.reduce(Br[r])||new Map},o.prototype.toJSON=function(){var e,t,r,n,a=[];try{for(var i=D(this._index),s=i.next();!s.done;s=i.next()){var u=j(s.value,2),l=u[0],f=u[1],h={};try{for(var v=(r=void 0,D(f)),m=v.next();!m.done;m=v.next()){var b=j(m.value,2),w=b[0],F=b[1];h[w]=Object.fromEntries(F)}}catch(k){r={error:k}}finally{try{m&&!m.done&&(n=v.return)&&n.call(v)}finally{if(r)throw r.error}}a.push([l,h])}}catch(k){e={error:k}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:a,serializationVersion:2}},o.prototype.termResults=function(e,t,r,n,a,i,s,u){var l,f,h,v,m;if(u===void 0&&(u=new Map),n==null)return u;try{for(var b=D(Object.keys(a)),w=b.next();!w.done;w=b.next()){var F=w.value,k=a[F],C=this._fieldIds[F],A=n.get(C);if(A!=null){var z=A.size,M=this._avgFieldLength[C];try{for(var B=(h=void 0,D(A.keys())),E=B.next();!E.done;E=B.next()){var I=E.value;if(!this._documentIds.has(I)){this.removeTerm(C,I,t),z-=1;continue}var L=i?i(this._documentIds.get(I),t,this._storedFields.get(I)):1;if(L){var _=A.get(I),P=this._fieldLength.get(I)[C],g=$r(_,z,this._documentCount,P,M,s),c=r*k*L*g,d=u.get(I);if(d){d.score+=c,Kr(d.terms,e);var x=Le(d.match,t);x?x.push(F):d.match[t]=[F]}else u.set(I,{score:c,terms:[e],match:(m={},m[t]=[F],m)})}}}catch(T){h={error:T}}finally{try{E&&!E.done&&(v=B.return)&&v.call(B)}finally{if(h)throw h.error}}}}}catch(T){l={error:T}}finally{try{w&&!w.done&&(f=b.return)&&f.call(b)}finally{if(l)throw l.error}}return u},o.prototype.addTerm=function(e,t,r){var n=this._index.fetch(r,ht),a=n.get(e);if(a==null)a=new Map,a.set(t,1),n.set(e,a);else{var i=a.get(t);a.set(t,(i||0)+1)}},o.prototype.removeTerm=function(e,t,r){if(!this._index.has(r)){this.warnDocumentChanged(t,e,r);return}var n=this._index.fetch(r,ht),a=n.get(e);a==null||a.get(t)==null?this.warnDocumentChanged(t,e,r):a.get(t)<=1?a.size<=1?n.delete(e):a.delete(t):a.set(t,a.get(t)-1),this._index.get(r).size===0&&this._index.delete(r)},o.prototype.warnDocumentChanged=function(e,t,r){var n,a;try{for(var i=D(Object.keys(this._fieldIds)),s=i.next();!s.done;s=i.next()){var u=s.value;if(this._fieldIds[u]===t){this._options.logger("warn","MiniSearch: document with ID ".concat(this._documentIds.get(e),' has changed before removal: term "').concat(r,'" was not present in field "').concat(u,'". Removing a document after it has changed can corrupt the index!'),"version_conflict");return}}}catch(l){n={error:l}}finally{try{s&&!s.done&&(a=i.return)&&a.call(i)}finally{if(n)throw n.error}}},o.prototype.addDocumentId=function(e){var t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t},o.prototype.addFields=function(e){for(var t=0;t{var p,y,O,U,Q,W,V,H,G;return at(_r.loadJSON((O=await((y=(p=a.value)[u.value])==null?void 0:y.call(p)))==null?void 0:O.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((U=l.value.search)==null?void 0:U.provider)==="local"&&((W=(Q=l.value.search.options)==null?void 0:Q.miniSearch)==null?void 0:W.searchOptions)},...((V=l.value.search)==null?void 0:V.provider)==="local"&&((G=(H=l.value.search.options)==null?void 0:H.miniSearch)==null?void 0:G.options)}))}),v=Ne(()=>{var p,y;return((p=l.value.search)==null?void 0:p.provider)==="local"&&((y=l.value.search.options)==null?void 0:y.disableQueryPersistence)===!0}).value?ie(""):It("vitepress:local-search-filter",""),m=Dt("vitepress:local-search-detailed-list",((T=l.value.search)==null?void 0:T.provider)==="local"&&((N=l.value.search.options)==null?void 0:N.detailedView)===!0),b=Ne(()=>{var p,y,O;return((p=l.value.search)==null?void 0:p.provider)==="local"&&(((y=l.value.search.options)==null?void 0:y.disableDetailedView)===!0||((O=l.value.search.options)==null?void 0:O.detailedView)===!1)});Ot(()=>{b.value&&(m.value=!1)});const w=be([]),F=ie(!1);_e(v,()=>{F.value=!1});const k=et(async()=>{if(n.value)return at(new Dr(n.value))},null);Mt(()=>[f.value,v.value,m.value],async([p,y,O],U,Q)=>{var Ue,He,Ge,Qe;let W=!1;if(Q(()=>{W=!0}),!p)return;w.value=p.search(y).slice(0,16),F.value=!0;const V=O?await Promise.all(w.value.map(q=>C(q.id))):[];if(W)return;const H=new Map;for(const{id:q,mod:re}of V){const ne=q.slice(0,q.indexOf("#"));let X=H.get(ne);if(X)continue;X=new Map,H.set(ne,X);const Y=re.default??re;if(Y!=null&&Y.render||Y!=null&&Y.setup){const ae=Jt(Y);ae.config.warnHandler=()=>{},ae.provide(Ut,i),Object.defineProperties(ae.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const qe=document.createElement("div");ae.mount(qe),qe.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(fe=>{var Xe;const ge=(Xe=fe.querySelector("a"))==null?void 0:Xe.getAttribute("href"),Ye=(ge==null?void 0:ge.startsWith("#"))&&ge.slice(1);if(!Ye)return;let Ze="";for(;(fe=fe.nextElementSibling)&&!/^h[1-6]$/i.test(fe.tagName);)Ze+=fe.outerHTML;X.set(Ye,Ze)}),ae.unmount()}if(W)return}const G=new Set;if(w.value=w.value.map(q=>{const[re,ne]=q.id.split("#"),X=H.get(re),Y=(X==null?void 0:X.get(ne))??"";for(const ae in q.match)G.add(ae);return{...q,text:Y}}),await de(),W)return;await new Promise(q=>{var re;(re=k.value)==null||re.unmark({done:()=>{var ne;(ne=k.value)==null||ne.markRegExp(x(G),{done:q})}})});const te=((Ue=r.value)==null?void 0:Ue.querySelectorAll(".result .excerpt"))??[];for(const q of te)(He=q.querySelector('mark[data-markjs="true"]'))==null||He.scrollIntoView({block:"center"});(Qe=(Ge=n.value)==null?void 0:Ge.firstElementChild)==null||Qe.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function C(p){const y=Ht(p.slice(0,p.indexOf("#")));try{if(!y)throw new Error(`Cannot find file for id: ${p}`);return{id:p,mod:await vt(()=>import(y),[])}}catch(O){return console.error(O),{id:p,mod:{}}}}const A=ie(),z=Ne(()=>{var p;return((p=v.value)==null?void 0:p.length)<=0});function M(p=!0){var y,O;(y=A.value)==null||y.focus(),p&&((O=A.value)==null||O.select())}Ie(()=>{M()});function B(p){p.pointerType==="mouse"&&M()}const E=ie(-1),I=ie(!1);_e(w,p=>{E.value=p.length?0:-1,L()});function L(){de(()=>{const p=document.querySelector(".result.selected");p&&p.scrollIntoView({block:"nearest"})})}we("ArrowUp",p=>{p.preventDefault(),E.value--,E.value<0&&(E.value=w.value.length-1),I.value=!0,L()}),we("ArrowDown",p=>{p.preventDefault(),E.value++,E.value>=w.value.length&&(E.value=0),I.value=!0,L()});const _=Rt();we("Enter",p=>{if(p.target instanceof HTMLButtonElement&&p.target.type!=="submit")return;const y=w.value[E.value];if(p.target instanceof HTMLInputElement&&!y){p.preventDefault();return}y&&(_.go(y.id),t("close"))}),we("Escape",()=>{t("close")});const P={modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}},g=qt((R=l.value.search)==null?void 0:R.options,P);Ie(()=>{window.history.pushState(null,"",null)}),Lt("popstate",p=>{p.preventDefault(),t("close")});const c=Pt(zt?document.body:null);Ie(()=>{de(()=>{c.value=!0,de().then(()=>s())})}),_t(()=>{c.value=!1});function d(){v.value="",de().then(()=>M(!1))}function x(p){return new RegExp([...p].sort((y,O)=>O.length-y.length).map(y=>`(${y.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")})`).join("|"),"gi")}return(p,y)=>{var O,U,Q,W;return Z(),Bt(Kt,{to:"body"},[S("div",{ref_key:"el",ref:r,role:"button","aria-owns":(O=w.value)!=null&&O.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[S("div",{class:"backdrop",onClick:y[0]||(y[0]=V=>p.$emit("close"))}),S("div",Hr,[S("form",{class:"search-bar",onPointerup:y[4]||(y[4]=V=>B(V)),onSubmit:y[5]||(y[5]=Vt(()=>{},["prevent"]))},[S("label",{title:p.placeholder,id:"localsearch-label",for:"localsearch-input"},y[8]||(y[8]=[S("svg",{class:"search-icon",width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("g",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[S("circle",{cx:"11",cy:"11",r:"8"}),S("path",{d:"m21 21l-4.35-4.35"})])],-1)]),8,Gr),S("div",Qr,[S("button",{class:"back-button",title:K(g)("modal.backButtonTitle"),onClick:y[1]||(y[1]=V=>p.$emit("close"))},y[9]||(y[9]=[S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 12H5m7 7l-7-7l7-7"})],-1)]),8,qr)]),$t(S("input",{ref_key:"searchInput",ref:A,"onUpdate:modelValue":y[2]||(y[2]=V=>Wt(v)?v.value=V:null),placeholder:p.placeholder,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,Yr),[[jt,K(v)]]),S("div",Zr,[b.value?xe("",!0):(Z(),ee("button",{key:0,class:tt(["toggle-layout-button",{"detailed-list":K(m)}]),type:"button",title:K(g)("modal.displayDetails"),onClick:y[3]||(y[3]=V=>E.value>-1&&(m.value=!K(m)))},y[10]||(y[10]=[S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 14h7v7H3zM3 3h7v7H3zm11 1h7m-7 5h7m-7 6h7m-7 5h7"})],-1)]),10,Xr)),S("button",{class:"clear-button",type:"reset",disabled:z.value,title:K(g)("modal.resetButtonTitle"),onClick:d},y[11]||(y[11]=[S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 5H9l-7 7l7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-2 4l-6 6m0-6l6 6"})],-1)]),8,en)])],32),S("ul",{ref_key:"resultsEl",ref:n,id:(U=w.value)!=null&&U.length?"localsearch-list":void 0,role:(Q=w.value)!=null&&Q.length?"listbox":void 0,"aria-labelledby":(W=w.value)!=null&&W.length?"localsearch-label":void 0,class:"results",onMousemove:y[7]||(y[7]=V=>I.value=!1)},[(Z(!0),ee(nt,null,rt(w.value,(V,H)=>(Z(),ee("li",{key:V.id,role:"option","aria-selected":E.value===H?"true":"false"},[S("a",{href:V.id,class:tt(["result",{selected:E.value===H}]),"aria-label":[...V.titles,V.title].join(" > "),onMouseenter:G=>!I.value&&(E.value=H),onFocusin:G=>E.value=H,onClick:y[6]||(y[6]=G=>p.$emit("close"))},[S("div",null,[S("div",an,[y[13]||(y[13]=S("span",{class:"title-icon"},"#",-1)),(Z(!0),ee(nt,null,rt(V.titles,(G,te)=>(Z(),ee("span",{key:te,class:"title"},[S("span",{class:"text",innerHTML:G},null,8,on),y[12]||(y[12]=S("svg",{width:"18",height:"18",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"m9 18l6-6l-6-6"})],-1))]))),128)),S("span",sn,[S("span",{class:"text",innerHTML:V.title},null,8,un)])]),K(m)?(Z(),ee("div",ln,[V.text?(Z(),ee("div",cn,[S("div",{class:"vp-doc",innerHTML:V.text},null,8,fn)])):xe("",!0),y[14]||(y[14]=S("div",{class:"excerpt-gradient-bottom"},null,-1)),y[15]||(y[15]=S("div",{class:"excerpt-gradient-top"},null,-1))])):xe("",!0)])],42,nn)],8,rn))),128)),K(v)&&!w.value.length&&F.value?(Z(),ee("li",dn,[he(ve(K(g)("modal.noResultsText"))+' "',1),S("strong",null,ve(K(v)),1),y[16]||(y[16]=he('" '))])):xe("",!0)],40,tn),S("div",hn,[S("span",null,[S("kbd",{"aria-label":K(g)("modal.footer.navigateUpKeyAriaLabel")},y[17]||(y[17]=[S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 19V5m-7 7l7-7l7 7"})],-1)]),8,vn),S("kbd",{"aria-label":K(g)("modal.footer.navigateDownKeyAriaLabel")},y[18]||(y[18]=[S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v14m7-7l-7 7l-7-7"})],-1)]),8,pn),he(" "+ve(K(g)("modal.footer.navigateText")),1)]),S("span",null,[S("kbd",{"aria-label":K(g)("modal.footer.selectKeyAriaLabel")},y[19]||(y[19]=[S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("g",{fill:"none",stroke:"currentcolor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[S("path",{d:"m9 10l-5 5l5 5"}),S("path",{d:"M20 4v7a4 4 0 0 1-4 4H4"})])],-1)]),8,yn),he(" "+ve(K(g)("modal.footer.selectText")),1)]),S("span",null,[S("kbd",{"aria-label":K(g)("modal.footer.closeKeyAriaLabel")},"esc",8,mn),he(" "+ve(K(g)("modal.footer.closeText")),1)])])])],8,Ur)])}}});const En=Gt(gn,[["__scopeId","data-v-9cd6a060"]]);export{En as default}; diff --git a/assets/chunks/VPLocalSearchBox.8e2f6eb7.js b/assets/chunks/VPLocalSearchBox.8e2f6eb7.js new file mode 100644 index 0000000..7ea38fc --- /dev/null +++ b/assets/chunks/VPLocalSearchBox.8e2f6eb7.js @@ -0,0 +1,8 @@ +import{S as vt,h as ie,s as _e,af as Tt,ag as Ct,d as Nt,C as be,ah as et,g as Ne,ai as It,aj as Dt,v as Ot,ak as Mt,j as Ie,M as de,Q as we,al as Rt,am as Lt,U as Pt,p as zt,an as _t,o as Z,b as Bt,k as S,Y as Vt,l as K,$ as $t,ao as jt,ap as Wt,c as ee,n as tt,e as xe,B as rt,F as at,a as he,t as ve,aq as Kt,ar as nt,as as Jt,a4 as Ut,aa as Ht,_ as Gt}from"./framework.ece1a6f0.js";import{u as Qt,d as qt}from"./theme.d6d6d431.js";const Yt={root:()=>vt(()=>import("./@localSearchIndexroot.01187451.js"),[])};/*! +* tabbable 6.2.0 +* @license MIT, https://github.com/focus-trap/tabbable/blob/master/LICENSE +*/var pt=["input:not([inert])","select:not([inert])","textarea:not([inert])","a[href]:not([inert])","button:not([inert])","[tabindex]:not(slot):not([inert])","audio[controls]:not([inert])","video[controls]:not([inert])",'[contenteditable]:not([contenteditable="false"]):not([inert])',"details>summary:first-of-type:not([inert])","details:not([inert])"],Se=pt.join(","),yt=typeof Element>"u",se=yt?function(){}:Element.prototype.matches||Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector,Ae=!yt&&Element.prototype.getRootNode?function(o){var e;return o==null||(e=o.getRootNode)===null||e===void 0?void 0:e.call(o)}:function(o){return o==null?void 0:o.ownerDocument},ke=function o(e,t){var r;t===void 0&&(t=!0);var a=e==null||(r=e.getAttribute)===null||r===void 0?void 0:r.call(e,"inert"),n=a===""||a==="true",i=n||t&&e&&o(e.parentNode);return i},Zt=function(e){var t,r=e==null||(t=e.getAttribute)===null||t===void 0?void 0:t.call(e,"contenteditable");return r===""||r==="true"},mt=function(e,t,r){if(ke(e))return[];var a=Array.prototype.slice.apply(e.querySelectorAll(Se));return t&&se.call(e,Se)&&a.unshift(e),a=a.filter(r),a},gt=function o(e,t,r){for(var a=[],n=Array.from(e);n.length;){var i=n.shift();if(!ke(i,!1))if(i.tagName==="SLOT"){var s=i.assignedElements(),u=s.length?s:i.children,l=o(u,!0,r);r.flatten?a.push.apply(a,l):a.push({scopeParent:i,candidates:l})}else{var f=se.call(i,Se);f&&r.filter(i)&&(t||!e.includes(i))&&a.push(i);var h=i.shadowRoot||typeof r.getShadowRoot=="function"&&r.getShadowRoot(i),v=!ke(h,!1)&&(!r.shadowRootFilter||r.shadowRootFilter(i));if(h&&v){var m=o(h===!0?i.children:h.children,!0,r);r.flatten?a.push.apply(a,m):a.push({scopeParent:i,candidates:m})}else n.unshift.apply(n,i.children)}}return a},bt=function(e){return!isNaN(parseInt(e.getAttribute("tabindex"),10))},oe=function(e){if(!e)throw new Error("No node provided");return e.tabIndex<0&&(/^(AUDIO|VIDEO|DETAILS)$/.test(e.tagName)||Zt(e))&&!bt(e)?0:e.tabIndex},Xt=function(e,t){var r=oe(e);return r<0&&t&&!bt(e)?0:r},er=function(e,t){return e.tabIndex===t.tabIndex?e.documentOrder-t.documentOrder:e.tabIndex-t.tabIndex},wt=function(e){return e.tagName==="INPUT"},tr=function(e){return wt(e)&&e.type==="hidden"},rr=function(e){var t=e.tagName==="DETAILS"&&Array.prototype.slice.apply(e.children).some(function(r){return r.tagName==="SUMMARY"});return t},ar=function(e,t){for(var r=0;rsummary:first-of-type"),i=n?e.parentElement:e;if(se.call(i,"details:not([open]) *"))return!0;if(!r||r==="full"||r==="legacy-full"){if(typeof a=="function"){for(var s=e;e;){var u=e.parentElement,l=Ae(e);if(u&&!u.shadowRoot&&a(u)===!0)return it(e);e.assignedSlot?e=e.assignedSlot:!u&&l!==e.ownerDocument?e=l.host:e=u}e=s}if(sr(e))return!e.getClientRects().length;if(r!=="legacy-full")return!0}else if(r==="non-zero-area")return it(e);return!1},lr=function(e){if(/^(INPUT|BUTTON|SELECT|TEXTAREA)$/.test(e.tagName))for(var t=e.parentElement;t;){if(t.tagName==="FIELDSET"&&t.disabled){for(var r=0;r=0)},fr=function o(e){var t=[],r=[];return e.forEach(function(a,n){var i=!!a.scopeParent,s=i?a.scopeParent:a,u=Xt(s,i),l=i?o(a.candidates):s;u===0?i?t.push.apply(t,l):t.push(s):r.push({documentOrder:n,tabIndex:u,item:a,isScope:i,content:l})}),r.sort(er).reduce(function(a,n){return n.isScope?a.push.apply(a,n.content):a.push(n.content),a},[]).concat(t)},dr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=gt([e],t.includeContainer,{filter:Be.bind(null,t),flatten:!1,getShadowRoot:t.getShadowRoot,shadowRootFilter:cr}):r=mt(e,t.includeContainer,Be.bind(null,t)),fr(r)},hr=function(e,t){t=t||{};var r;return t.getShadowRoot?r=gt([e],t.includeContainer,{filter:Te.bind(null,t),flatten:!0,getShadowRoot:t.getShadowRoot}):r=mt(e,t.includeContainer,Te.bind(null,t)),r},ue=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return se.call(e,Se)===!1?!1:Be(t,e)},vr=pt.concat("iframe").join(","),De=function(e,t){if(t=t||{},!e)throw new Error("No node provided");return se.call(e,vr)===!1?!1:Te(t,e)};/*! +* focus-trap 7.6.5 +* @license MIT, https://github.com/focus-trap/focus-trap/blob/master/LICENSE +*/function Ve(o,e){(e==null||e>o.length)&&(e=o.length);for(var t=0,r=Array(e);t0){var r=e[e.length-1];r!==t&&r._setPausedState(!0)}var a=e.indexOf(t);a===-1||e.splice(a,1),e.push(t)},deactivateTrap:function(e,t){var r=e.indexOf(t);r!==-1&&e.splice(r,1),e.length>0&&!e[e.length-1]._isManuallyPaused()&&e[e.length-1]._setPausedState(!1)}},Er=function(e){return e.tagName&&e.tagName.toLowerCase()==="input"&&typeof e.select=="function"},Sr=function(e){return(e==null?void 0:e.key)==="Escape"||(e==null?void 0:e.key)==="Esc"||(e==null?void 0:e.keyCode)===27},me=function(e){return(e==null?void 0:e.key)==="Tab"||(e==null?void 0:e.keyCode)===9},Ar=function(e){return me(e)&&!e.shiftKey},kr=function(e){return me(e)&&e.shiftKey},lt=function(e){return setTimeout(e,0)},pe=function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),a=1;a1&&arguments[1]!==void 0?arguments[1]:{},x=d.hasFallback,T=x===void 0?!1:x,N=d.params,R=N===void 0?[]:N,p=n[c];if(typeof p=="function"&&(p=p.apply(void 0,br(R))),p===!0&&(p=void 0),!p){if(p===void 0||p===!1)return p;throw new Error("`".concat(c,"` was specified but was not a node, or did not return a node"))}var y=p;if(typeof p=="string"){try{y=r.querySelector(p)}catch(O){throw new Error("`".concat(c,'` appears to be an invalid selector; error="').concat(O.message,'"'))}if(!y&&!T)throw new Error("`".concat(c,"` as selector refers to no known node"))}return y},h=function(){var c=f("initialFocus",{hasFallback:!0});if(c===!1)return!1;if(c===void 0||c&&!De(c,n.tabbableOptions))if(l(r.activeElement)>=0)c=r.activeElement;else{var d=i.tabbableGroups[0],x=d&&d.firstTabbableNode;c=x||f("fallbackFocus")}else c===null&&(c=f("fallbackFocus"));if(!c)throw new Error("Your focus-trap needs to have at least one focusable element");return c},v=function(){if(i.containerGroups=i.containers.map(function(c){var d=dr(c,n.tabbableOptions),x=hr(c,n.tabbableOptions),T=d.length>0?d[0]:void 0,N=d.length>0?d[d.length-1]:void 0,R=x.find(function(O){return ue(O)}),p=x.slice().reverse().find(function(O){return ue(O)}),y=!!d.find(function(O){return oe(O)>0});return{container:c,tabbableNodes:d,focusableNodes:x,posTabIndexesFound:y,firstTabbableNode:T,lastTabbableNode:N,firstDomTabbableNode:R,lastDomTabbableNode:p,nextTabbableNode:function(U){var Q=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0,W=d.indexOf(U);return W<0?Q?x.slice(x.indexOf(U)+1).find(function(V){return ue(V)}):x.slice(0,x.indexOf(U)).reverse().find(function(V){return ue(V)}):d[W+(Q?1:-1)]}}}),i.tabbableGroups=i.containerGroups.filter(function(c){return c.tabbableNodes.length>0}),i.tabbableGroups.length<=0&&!f("fallbackFocus"))throw new Error("Your focus-trap must have at least one container with at least one tabbable node in it at all times");if(i.containerGroups.find(function(c){return c.posTabIndexesFound})&&i.containerGroups.length>1)throw new Error("At least one node with a positive tabindex was found in one of your focus-trap's multiple containers. Positive tabindexes are only supported in single-container focus-traps.")},m=function(c){var d=c.activeElement;if(d)return d.shadowRoot&&d.shadowRoot.activeElement!==null?m(d.shadowRoot):d},b=function(c){if(c!==!1&&c!==m(document)){if(!c||!c.focus){b(h());return}c.focus({preventScroll:!!n.preventScroll}),i.mostRecentlyFocusedNode=c,Er(c)&&c.select()}},w=function(c){var d=f("setReturnFocus",{params:[c]});return d||(d===!1?!1:c)},F=function(c){var d=c.target,x=c.event,T=c.isBackward,N=T===void 0?!1:T;d=d||Fe(x),v();var R=null;if(i.tabbableGroups.length>0){var p=l(d,x),y=p>=0?i.containerGroups[p]:void 0;if(p<0)N?R=i.tabbableGroups[i.tabbableGroups.length-1].lastTabbableNode:R=i.tabbableGroups[0].firstTabbableNode;else if(N){var O=i.tabbableGroups.findIndex(function(G){var te=G.firstTabbableNode;return d===te});if(O<0&&(y.container===d||De(d,n.tabbableOptions)&&!ue(d,n.tabbableOptions)&&!y.nextTabbableNode(d,!1))&&(O=p),O>=0){var U=O===0?i.tabbableGroups.length-1:O-1,Q=i.tabbableGroups[U];R=oe(d)>=0?Q.lastTabbableNode:Q.lastDomTabbableNode}else me(x)||(R=y.nextTabbableNode(d,!1))}else{var W=i.tabbableGroups.findIndex(function(G){var te=G.lastTabbableNode;return d===te});if(W<0&&(y.container===d||De(d,n.tabbableOptions)&&!ue(d,n.tabbableOptions)&&!y.nextTabbableNode(d))&&(W=p),W>=0){var V=W===i.tabbableGroups.length-1?0:W+1,H=i.tabbableGroups[V];R=oe(d)>=0?H.firstTabbableNode:H.firstDomTabbableNode}else me(x)||(R=y.nextTabbableNode(d))}}else R=f("fallbackFocus");return R},k=function(c){var d=Fe(c);if(!(l(d,c)>=0)){if(pe(n.clickOutsideDeactivates,c)){s.deactivate({returnFocus:n.returnFocusOnDeactivate});return}pe(n.allowOutsideClick,c)||c.preventDefault()}},C=function(c){var d=Fe(c),x=l(d,c)>=0;if(x||d instanceof Document)x&&(i.mostRecentlyFocusedNode=d);else{c.stopImmediatePropagation();var T,N=!0;if(i.mostRecentlyFocusedNode)if(oe(i.mostRecentlyFocusedNode)>0){var R=l(i.mostRecentlyFocusedNode),p=i.containerGroups[R].tabbableNodes;if(p.length>0){var y=p.findIndex(function(O){return O===i.mostRecentlyFocusedNode});y>=0&&(n.isKeyForward(i.recentNavEvent)?y+1=0&&(T=p[y-1],N=!1))}}else i.containerGroups.some(function(O){return O.tabbableNodes.some(function(U){return oe(U)>0})})||(N=!1);else N=!1;N&&(T=F({target:i.mostRecentlyFocusedNode,isBackward:n.isKeyBackward(i.recentNavEvent)})),b(T||i.mostRecentlyFocusedNode||h())}i.recentNavEvent=void 0},A=function(c){var d=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;i.recentNavEvent=c;var x=F({event:c,isBackward:d});x&&(me(c)&&c.preventDefault(),b(x))},z=function(c){(n.isKeyForward(c)||n.isKeyBackward(c))&&A(c,n.isKeyBackward(c))},M=function(c){Sr(c)&&pe(n.escapeDeactivates,c)!==!1&&(c.preventDefault(),s.deactivate())},B=function(c){var d=Fe(c);l(d,c)>=0||pe(n.clickOutsideDeactivates,c)||pe(n.allowOutsideClick,c)||(c.preventDefault(),c.stopImmediatePropagation())},E=function(){if(i.active)return ut.activateTrap(a,s),i.delayInitialFocusTimer=n.delayInitialFocus?lt(function(){b(h())}):b(h()),r.addEventListener("focusin",C,!0),r.addEventListener("mousedown",k,{capture:!0,passive:!1}),r.addEventListener("touchstart",k,{capture:!0,passive:!1}),r.addEventListener("click",B,{capture:!0,passive:!1}),r.addEventListener("keydown",z,{capture:!0,passive:!1}),r.addEventListener("keydown",M),s},I=function(){if(i.active)return r.removeEventListener("focusin",C,!0),r.removeEventListener("mousedown",k,!0),r.removeEventListener("touchstart",k,!0),r.removeEventListener("click",B,!0),r.removeEventListener("keydown",z,!0),r.removeEventListener("keydown",M),s},L=function(c){var d=c.some(function(x){var T=Array.from(x.removedNodes);return T.some(function(N){return N===i.mostRecentlyFocusedNode})});d&&b(h())},_=typeof window<"u"&&"MutationObserver"in window?new MutationObserver(L):void 0,P=function(){_&&(_.disconnect(),i.active&&!i.paused&&i.containers.map(function(c){_.observe(c,{subtree:!0,childList:!0})}))};return s={get active(){return i.active},get paused(){return i.paused},activate:function(c){if(i.active)return this;var d=u(c,"onActivate"),x=u(c,"onPostActivate"),T=u(c,"checkCanFocusTrap");T||v(),i.active=!0,i.paused=!1,i.nodeFocusedBeforeActivation=m(r),d==null||d();var N=function(){T&&v(),E(),P(),x==null||x()};return T?(T(i.containers.concat()).then(N,N),this):(N(),this)},deactivate:function(c){if(!i.active)return this;var d=st({onDeactivate:n.onDeactivate,onPostDeactivate:n.onPostDeactivate,checkCanReturnFocus:n.checkCanReturnFocus},c);clearTimeout(i.delayInitialFocusTimer),i.delayInitialFocusTimer=void 0,I(),i.active=!1,i.paused=!1,P(),ut.deactivateTrap(a,s);var x=u(d,"onDeactivate"),T=u(d,"onPostDeactivate"),N=u(d,"checkCanReturnFocus"),R=u(d,"returnFocus","returnFocusOnDeactivate");x==null||x();var p=function(){lt(function(){R&&b(w(i.nodeFocusedBeforeActivation)),T==null||T()})};return R&&N?(N(w(i.nodeFocusedBeforeActivation)).then(p,p),this):(p(),this)},pause:function(c){return i.active?(i.manuallyPaused=!0,this._setPausedState(!0,c)):this},unpause:function(c){return i.active?(i.manuallyPaused=!1,a[a.length-1]!==this?this:this._setPausedState(!1,c)):this},updateContainerElements:function(c){var d=[].concat(c).filter(Boolean);return i.containers=d.map(function(x){return typeof x=="string"?r.querySelector(x):x}),i.active&&v(),P(),this}},Object.defineProperties(s,{_isManuallyPaused:{value:function(){return i.manuallyPaused}},_setPausedState:{value:function(c,d){if(i.paused===c)return this;if(i.paused=c,c){var x=u(d,"onPause"),T=u(d,"onPostPause");x==null||x(),I(),P(),T==null||T()}else{var N=u(d,"onUnpause"),R=u(d,"onPostUnpause");N==null||N(),v(),E(),P(),R==null||R()}return this}}}),s.updateContainerElements(e),s};function Nr(o,e={}){let t;const{immediate:r,...a}=e,n=ie(!1),i=ie(!1),s=h=>t&&t.activate(h),u=h=>t&&t.deactivate(h),l=()=>{t&&(t.pause(),i.value=!0)},f=()=>{t&&(t.unpause(),i.value=!1)};return _e(()=>Tt(o),h=>{h&&(t=Cr(h,{...a,onActivate(){n.value=!0,e.onActivate&&e.onActivate()},onDeactivate(){n.value=!1,e.onDeactivate&&e.onDeactivate()}}),r&&s())},{flush:"post"}),Ct(()=>u()),{hasFocus:n,isPaused:i,activate:s,deactivate:u,pause:l,unpause:f}}class ce{constructor(e,t=!0,r=[],a=5e3){this.ctx=e,this.iframes=t,this.exclude=r,this.iframesTimeout=a}static matches(e,t){const r=typeof t=="string"?[t]:t,a=e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector;if(a){let n=!1;return r.every(i=>a.call(e,i)?(n=!0,!1):!0),n}else return!1}getContexts(){let e,t=[];return typeof this.ctx>"u"||!this.ctx?e=[]:NodeList.prototype.isPrototypeOf(this.ctx)?e=Array.prototype.slice.call(this.ctx):Array.isArray(this.ctx)?e=this.ctx:typeof this.ctx=="string"?e=Array.prototype.slice.call(document.querySelectorAll(this.ctx)):e=[this.ctx],e.forEach(r=>{const a=t.filter(n=>n.contains(r)).length>0;t.indexOf(r)===-1&&!a&&t.push(r)}),t}getIframeContents(e,t,r=()=>{}){let a;try{const n=e.contentWindow;if(a=n.document,!n||!a)throw new Error("iframe inaccessible")}catch{r()}a&&t(a)}isIframeBlank(e){const t="about:blank",r=e.getAttribute("src").trim();return e.contentWindow.location.href===t&&r!==t&&r}observeIframeLoad(e,t,r){let a=!1,n=null;const i=()=>{if(!a){a=!0,clearTimeout(n);try{this.isIframeBlank(e)||(e.removeEventListener("load",i),this.getIframeContents(e,t,r))}catch{r()}}};e.addEventListener("load",i),n=setTimeout(i,this.iframesTimeout)}onIframeReady(e,t,r){try{e.contentWindow.document.readyState==="complete"?this.isIframeBlank(e)?this.observeIframeLoad(e,t,r):this.getIframeContents(e,t,r):this.observeIframeLoad(e,t,r)}catch{r()}}waitForIframes(e,t){let r=0;this.forEachIframe(e,()=>!0,a=>{r++,this.waitForIframes(a.querySelector("html"),()=>{--r||t()})},a=>{a||t()})}forEachIframe(e,t,r,a=()=>{}){let n=e.querySelectorAll("iframe"),i=n.length,s=0;n=Array.prototype.slice.call(n);const u=()=>{--i<=0&&a(s)};i||u(),n.forEach(l=>{ce.matches(l,this.exclude)?u():this.onIframeReady(l,f=>{t(l)&&(s++,r(f)),u()},u)})}createIterator(e,t,r){return document.createNodeIterator(e,t,r,!1)}createInstanceOnIframe(e){return new ce(e.querySelector("html"),this.iframes)}compareNodeIframe(e,t,r){const a=e.compareDocumentPosition(r),n=Node.DOCUMENT_POSITION_PRECEDING;if(a&n)if(t!==null){const i=t.compareDocumentPosition(r),s=Node.DOCUMENT_POSITION_FOLLOWING;if(i&s)return!0}else return!0;return!1}getIteratorNode(e){const t=e.previousNode();let r;return t===null?r=e.nextNode():r=e.nextNode()&&e.nextNode(),{prevNode:t,node:r}}checkIframeFilter(e,t,r,a){let n=!1,i=!1;return a.forEach((s,u)=>{s.val===r&&(n=u,i=s.handled)}),this.compareNodeIframe(e,t,r)?(n===!1&&!i?a.push({val:r,handled:!0}):n!==!1&&!i&&(a[n].handled=!0),!0):(n===!1&&a.push({val:r,handled:!1}),!1)}handleOpenIframes(e,t,r,a){e.forEach(n=>{n.handled||this.getIframeContents(n.val,i=>{this.createInstanceOnIframe(i).forEachNode(t,r,a)})})}iterateThroughNodes(e,t,r,a,n){const i=this.createIterator(t,e,a);let s=[],u=[],l,f,h=()=>({prevNode:f,node:l}=this.getIteratorNode(i),l);for(;h();)this.iframes&&this.forEachIframe(t,v=>this.checkIframeFilter(l,f,v,s),v=>{this.createInstanceOnIframe(v).forEachNode(e,m=>u.push(m),a)}),u.push(l);u.forEach(v=>{r(v)}),this.iframes&&this.handleOpenIframes(s,e,r,a),n()}forEachNode(e,t,r,a=()=>{}){const n=this.getContexts();let i=n.length;i||a(),n.forEach(s=>{const u=()=>{this.iterateThroughNodes(e,s,t,r,()=>{--i<=0&&a()})};this.iframes?this.waitForIframes(s,u):u()})}}let Ir=class{constructor(e){this.ctx=e,this.ie=!1;const t=window.navigator.userAgent;(t.indexOf("MSIE")>-1||t.indexOf("Trident")>-1)&&(this.ie=!0)}set opt(e){this._opt=Object.assign({},{element:"",className:"",exclude:[],iframes:!1,iframesTimeout:5e3,separateWordSearch:!0,diacritics:!0,synonyms:{},accuracy:"partially",acrossElements:!1,caseSensitive:!1,ignoreJoiners:!1,ignoreGroups:0,ignorePunctuation:[],wildcards:"disabled",each:()=>{},noMatch:()=>{},filter:()=>!0,done:()=>{},debug:!1,log:window.console},e)}get opt(){return this._opt}get iterator(){return new ce(this.ctx,this.opt.iframes,this.opt.exclude,this.opt.iframesTimeout)}log(e,t="debug"){const r=this.opt.log;this.opt.debug&&typeof r=="object"&&typeof r[t]=="function"&&r[t](`mark.js: ${e}`)}escapeStr(e){return e.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,"\\$&")}createRegExp(e){return this.opt.wildcards!=="disabled"&&(e=this.setupWildcardsRegExp(e)),e=this.escapeStr(e),Object.keys(this.opt.synonyms).length&&(e=this.createSynonymsRegExp(e)),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),this.opt.diacritics&&(e=this.createDiacriticsRegExp(e)),e=this.createMergedBlanksRegExp(e),(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.createJoinersRegExp(e)),this.opt.wildcards!=="disabled"&&(e=this.createWildcardsRegExp(e)),e=this.createAccuracyRegExp(e),e}createSynonymsRegExp(e){const t=this.opt.synonyms,r=this.opt.caseSensitive?"":"i",a=this.opt.ignoreJoiners||this.opt.ignorePunctuation.length?"\0":"";for(let n in t)if(t.hasOwnProperty(n)){const i=t[n],s=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(n):this.escapeStr(n),u=this.opt.wildcards!=="disabled"?this.setupWildcardsRegExp(i):this.escapeStr(i);s!==""&&u!==""&&(e=e.replace(new RegExp(`(${this.escapeStr(s)}|${this.escapeStr(u)})`,`gm${r}`),a+`(${this.processSynomyms(s)}|${this.processSynomyms(u)})`+a))}return e}processSynomyms(e){return(this.opt.ignoreJoiners||this.opt.ignorePunctuation.length)&&(e=this.setupIgnoreJoinersRegExp(e)),e}setupWildcardsRegExp(e){return e=e.replace(/(?:\\)*\?/g,t=>t.charAt(0)==="\\"?"?":""),e.replace(/(?:\\)*\*/g,t=>t.charAt(0)==="\\"?"*":"")}createWildcardsRegExp(e){let t=this.opt.wildcards==="withSpaces";return e.replace(/\u0001/g,t?"[\\S\\s]?":"\\S?").replace(/\u0002/g,t?"[\\S\\s]*?":"\\S*")}setupIgnoreJoinersRegExp(e){return e.replace(/[^(|)\\]/g,(t,r,a)=>{let n=a.charAt(r+1);return/[(|)\\]/.test(n)||n===""?t:t+"\0"})}createJoinersRegExp(e){let t=[];const r=this.opt.ignorePunctuation;return Array.isArray(r)&&r.length&&t.push(this.escapeStr(r.join(""))),this.opt.ignoreJoiners&&t.push("\\u00ad\\u200b\\u200c\\u200d"),t.length?e.split(/\u0000+/).join(`[${t.join("")}]*`):e}createDiacriticsRegExp(e){const t=this.opt.caseSensitive?"":"i",r=this.opt.caseSensitive?["aàáảãạăằắẳẵặâầấẩẫậäåāą","AÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćč","CÇĆČ","dđď","DĐĎ","eèéẻẽẹêềếểễệëěēę","EÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïī","IÌÍỈĨỊÎÏĪ","lł","LŁ","nñňń","NÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøō","OÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rř","RŘ","sšśșş","SŠŚȘŞ","tťțţ","TŤȚŢ","uùúủũụưừứửữựûüůū","UÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿ","YÝỲỶỸỴŸ","zžżź","ZŽŻŹ"]:["aàáảãạăằắẳẵặâầấẩẫậäåāąAÀÁẢÃẠĂẰẮẲẴẶÂẦẤẨẪẬÄÅĀĄ","cçćčCÇĆČ","dđďDĐĎ","eèéẻẽẹêềếểễệëěēęEÈÉẺẼẸÊỀẾỂỄỆËĚĒĘ","iìíỉĩịîïīIÌÍỈĨỊÎÏĪ","lłLŁ","nñňńNÑŇŃ","oòóỏõọôồốổỗộơởỡớờợöøōOÒÓỎÕỌÔỒỐỔỖỘƠỞỠỚỜỢÖØŌ","rřRŘ","sšśșşSŠŚȘŞ","tťțţTŤȚŢ","uùúủũụưừứửữựûüůūUÙÚỦŨỤƯỪỨỬỮỰÛÜŮŪ","yýỳỷỹỵÿYÝỲỶỸỴŸ","zžżźZŽŻŹ"];let a=[];return e.split("").forEach(n=>{r.every(i=>{if(i.indexOf(n)!==-1){if(a.indexOf(i)>-1)return!1;e=e.replace(new RegExp(`[${i}]`,`gm${t}`),`[${i}]`),a.push(i)}return!0})}),e}createMergedBlanksRegExp(e){return e.replace(/[\s]+/gmi,"[\\s]+")}createAccuracyRegExp(e){const t="!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~¡¿";let r=this.opt.accuracy,a=typeof r=="string"?r:r.value,n=typeof r=="string"?[]:r.limiters,i="";switch(n.forEach(s=>{i+=`|${this.escapeStr(s)}`}),a){case"partially":default:return`()(${e})`;case"complementary":return i="\\s"+(i||this.escapeStr(t)),`()([^${i}]*${e}[^${i}]*)`;case"exactly":return`(^|\\s${i})(${e})(?=$|\\s${i})`}}getSeparatedKeywords(e){let t=[];return e.forEach(r=>{this.opt.separateWordSearch?r.split(" ").forEach(a=>{a.trim()&&t.indexOf(a)===-1&&t.push(a)}):r.trim()&&t.indexOf(r)===-1&&t.push(r)}),{keywords:t.sort((r,a)=>a.length-r.length),length:t.length}}isNumeric(e){return Number(parseFloat(e))==e}checkRanges(e){if(!Array.isArray(e)||Object.prototype.toString.call(e[0])!=="[object Object]")return this.log("markRanges() will only accept an array of objects"),this.opt.noMatch(e),[];const t=[];let r=0;return e.sort((a,n)=>a.start-n.start).forEach(a=>{let{start:n,end:i,valid:s}=this.callNoMatchOnInvalidRanges(a,r);s&&(a.start=n,a.length=i-n,t.push(a),r=i)}),t}callNoMatchOnInvalidRanges(e,t){let r,a,n=!1;return e&&typeof e.start<"u"?(r=parseInt(e.start,10),a=r+parseInt(e.length,10),this.isNumeric(e.start)&&this.isNumeric(e.length)&&a-t>0&&a-r>0?n=!0:(this.log(`Ignoring invalid or overlapping range: ${JSON.stringify(e)}`),this.opt.noMatch(e))):(this.log(`Ignoring invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)),{start:r,end:a,valid:n}}checkWhitespaceRanges(e,t,r){let a,n=!0,i=r.length,s=t-i,u=parseInt(e.start,10)-s;return u=u>i?i:u,a=u+parseInt(e.length,10),a>i&&(a=i,this.log(`End range automatically set to the max value of ${i}`)),u<0||a-u<0||u>i||a>i?(n=!1,this.log(`Invalid range: ${JSON.stringify(e)}`),this.opt.noMatch(e)):r.substring(u,a).replace(/\s+/g,"")===""&&(n=!1,this.log("Skipping whitespace only range: "+JSON.stringify(e)),this.opt.noMatch(e)),{start:u,end:a,valid:n}}getTextNodes(e){let t="",r=[];this.iterator.forEachNode(NodeFilter.SHOW_TEXT,a=>{r.push({start:t.length,end:(t+=a.textContent).length,node:a})},a=>this.matchesExclude(a.parentNode)?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT,()=>{e({value:t,nodes:r})})}matchesExclude(e){return ce.matches(e,this.opt.exclude.concat(["script","style","title","head","html"]))}wrapRangeInTextNode(e,t,r){const a=this.opt.element?this.opt.element:"mark",n=e.splitText(t),i=n.splitText(r-t);let s=document.createElement(a);return s.setAttribute("data-markjs","true"),this.opt.className&&s.setAttribute("class",this.opt.className),s.textContent=n.textContent,n.parentNode.replaceChild(s,n),i}wrapRangeInMappedTextNode(e,t,r,a,n){e.nodes.every((i,s)=>{const u=e.nodes[s+1];if(typeof u>"u"||u.start>t){if(!a(i.node))return!1;const l=t-i.start,f=(r>i.end?i.end:r)-i.start,h=e.value.substr(0,i.start),v=e.value.substr(f+i.start);if(i.node=this.wrapRangeInTextNode(i.node,l,f),e.value=h+v,e.nodes.forEach((m,b)=>{b>=s&&(e.nodes[b].start>0&&b!==s&&(e.nodes[b].start-=f),e.nodes[b].end-=f)}),r-=f,n(i.node.previousSibling,i.start),r>i.end)t=i.end;else return!1}return!0})}wrapMatches(e,t,r,a,n){const i=t===0?0:t+1;this.getTextNodes(s=>{s.nodes.forEach(u=>{u=u.node;let l;for(;(l=e.exec(u.textContent))!==null&&l[i]!=="";){if(!r(l[i],u))continue;let f=l.index;if(i!==0)for(let h=1;h{let u;for(;(u=e.exec(s.value))!==null&&u[i]!=="";){let l=u.index;if(i!==0)for(let h=1;hr(u[i],h),(h,v)=>{e.lastIndex=v,a(h)})}n()})}wrapRangeFromIndex(e,t,r,a){this.getTextNodes(n=>{const i=n.value.length;e.forEach((s,u)=>{let{start:l,end:f,valid:h}=this.checkWhitespaceRanges(s,i,n.value);h&&this.wrapRangeInMappedTextNode(n,l,f,v=>t(v,s,n.value.substring(l,f),u),v=>{r(v,s)})}),a()})}unwrapMatches(e){const t=e.parentNode;let r=document.createDocumentFragment();for(;e.firstChild;)r.appendChild(e.removeChild(e.firstChild));t.replaceChild(r,e),this.ie?this.normalizeTextNode(t):t.normalize()}normalizeTextNode(e){if(e){if(e.nodeType===3)for(;e.nextSibling&&e.nextSibling.nodeType===3;)e.nodeValue+=e.nextSibling.nodeValue,e.parentNode.removeChild(e.nextSibling);else this.normalizeTextNode(e.firstChild);this.normalizeTextNode(e.nextSibling)}}markRegExp(e,t){this.opt=t,this.log(`Searching with expression "${e}"`);let r=0,a="wrapMatches";const n=i=>{r++,this.opt.each(i)};this.opt.acrossElements&&(a="wrapMatchesAcrossElements"),this[a](e,this.opt.ignoreGroups,(i,s)=>this.opt.filter(s,i,r),n,()=>{r===0&&this.opt.noMatch(e),this.opt.done(r)})}mark(e,t){this.opt=t;let r=0,a="wrapMatches";const{keywords:n,length:i}=this.getSeparatedKeywords(typeof e=="string"?[e]:e),s=this.opt.caseSensitive?"":"i",u=l=>{let f=new RegExp(this.createRegExp(l),`gm${s}`),h=0;this.log(`Searching with expression "${f}"`),this[a](f,1,(v,m)=>this.opt.filter(m,l,r,h),v=>{h++,r++,this.opt.each(v)},()=>{h===0&&this.opt.noMatch(l),n[i-1]===l?this.opt.done(r):u(n[n.indexOf(l)+1])})};this.opt.acrossElements&&(a="wrapMatchesAcrossElements"),i===0?this.opt.done(r):u(n[0])}markRanges(e,t){this.opt=t;let r=0,a=this.checkRanges(e);a&&a.length?(this.log("Starting to mark with the following ranges: "+JSON.stringify(a)),this.wrapRangeFromIndex(a,(n,i,s,u)=>this.opt.filter(n,i,s,u),(n,i)=>{r++,this.opt.each(n,i)},()=>{this.opt.done(r)})):this.opt.done(r)}unmark(e){this.opt=e;let t=this.opt.element?this.opt.element:"*";t+="[data-markjs]",this.opt.className&&(t+=`.${this.opt.className}`),this.log(`Removal selector "${t}"`),this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT,r=>{this.unwrapMatches(r)},r=>{const a=ce.matches(r,t),n=this.matchesExclude(r);return!a||n?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT},this.opt.done)}};function Dr(o){const e=new Ir(o);return this.mark=(t,r)=>(e.mark(t,r),this),this.markRegExp=(t,r)=>(e.markRegExp(t,r),this),this.markRanges=(t,r)=>(e.markRanges(t,r),this),this.unmark=t=>(e.unmark(t),this),this}var $=function(){return $=Object.assign||function(e){for(var t,r=1,a=arguments.length;r0&&n[n.length-1])&&(l[0]===6||l[0]===2)){t=0;continue}if(l[0]===3&&(!n||l[1]>n[0]&&l[1]=o.length&&(o=void 0),{value:o&&o[r++],done:!o}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function j(o,e){var t=typeof Symbol=="function"&&o[Symbol.iterator];if(!t)return o;var r=t.call(o),a,n=[],i;try{for(;(e===void 0||e-- >0)&&!(a=r.next()).done;)n.push(a.value)}catch(s){i={error:s}}finally{try{a&&!a.done&&(t=r.return)&&t.call(r)}finally{if(i)throw i.error}}return n}var Rr="ENTRIES",xt="KEYS",Ft="VALUES",J="",Oe=function(){function o(e,t){var r=e._tree,a=Array.from(r.keys());this.set=e,this._type=t,this._path=a.length>0?[{node:r,keys:a}]:[]}return o.prototype.next=function(){var e=this.dive();return this.backtrack(),e},o.prototype.dive=function(){if(this._path.length===0)return{done:!0,value:void 0};var e=le(this._path),t=e.node,r=e.keys;if(le(r)===J)return{done:!1,value:this.result()};var a=t.get(le(r));return this._path.push({node:a,keys:Array.from(a.keys())}),this.dive()},o.prototype.backtrack=function(){if(this._path.length!==0){var e=le(this._path).keys;e.pop(),!(e.length>0)&&(this._path.pop(),this.backtrack())}},o.prototype.key=function(){return this.set._prefix+this._path.map(function(e){var t=e.keys;return le(t)}).filter(function(e){return e!==J}).join("")},o.prototype.value=function(){return le(this._path).node.get(J)},o.prototype.result=function(){switch(this._type){case Ft:return this.value();case xt:return this.key();default:return[this.key(),this.value()]}},o.prototype[Symbol.iterator]=function(){return this},o}(),le=function(o){return o[o.length-1]},Lr=function(o,e,t){var r=new Map;if(e===void 0)return r;for(var a=e.length+1,n=a+t,i=new Uint8Array(n*a).fill(t+1),s=0;st)continue e}Et(o.get(m),e,t,r,a,w,i,s+m)}}}catch(c){u={error:c}}finally{try{v&&!v.done&&(l=h.return)&&l.call(h)}finally{if(u)throw u.error}}},Me=function(){function o(e,t){e===void 0&&(e=new Map),t===void 0&&(t=""),this._size=void 0,this._tree=e,this._prefix=t}return o.prototype.atPrefix=function(e){var t,r;if(!e.startsWith(this._prefix))throw new Error("Mismatched prefix");var a=j(Ce(this._tree,e.slice(this._prefix.length)),2),n=a[0],i=a[1];if(n===void 0){var s=j(Ke(i),2),u=s[0],l=s[1];try{for(var f=D(u.keys()),h=f.next();!h.done;h=f.next()){var v=h.value;if(v!==J&&v.startsWith(l)){var m=new Map;return m.set(v.slice(l.length),u.get(v)),new o(m,e)}}}catch(b){t={error:b}}finally{try{h&&!h.done&&(r=f.return)&&r.call(f)}finally{if(t)throw t.error}}}return new o(n,e)},o.prototype.clear=function(){this._size=void 0,this._tree.clear()},o.prototype.delete=function(e){return this._size=void 0,Pr(this._tree,e)},o.prototype.entries=function(){return new Oe(this,Rr)},o.prototype.forEach=function(e){var t,r;try{for(var a=D(this),n=a.next();!n.done;n=a.next()){var i=j(n.value,2),s=i[0],u=i[1];e(s,u,this)}}catch(l){t={error:l}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}},o.prototype.fuzzyGet=function(e,t){return Lr(this._tree,e,t)},o.prototype.get=function(e){var t=$e(this._tree,e);return t!==void 0?t.get(J):void 0},o.prototype.has=function(e){var t=$e(this._tree,e);return t!==void 0&&t.has(J)},o.prototype.keys=function(){return new Oe(this,xt)},o.prototype.set=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Re(this._tree,e);return r.set(J,t),this},Object.defineProperty(o.prototype,"size",{get:function(){if(this._size)return this._size;this._size=0;for(var e=this.entries();!e.next().done;)this._size+=1;return this._size},enumerable:!1,configurable:!0}),o.prototype.update=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Re(this._tree,e);return r.set(J,t(r.get(J))),this},o.prototype.fetch=function(e,t){if(typeof e!="string")throw new Error("key must be a string");this._size=void 0;var r=Re(this._tree,e),a=r.get(J);return a===void 0&&r.set(J,a=t()),a},o.prototype.values=function(){return new Oe(this,Ft)},o.prototype[Symbol.iterator]=function(){return this.entries()},o.from=function(e){var t,r,a=new o;try{for(var n=D(e),i=n.next();!i.done;i=n.next()){var s=j(i.value,2),u=s[0],l=s[1];a.set(u,l)}}catch(f){t={error:f}}finally{try{i&&!i.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}return a},o.fromObject=function(e){return o.from(Object.entries(e))},o}(),Ce=function(o,e,t){var r,a;if(t===void 0&&(t=[]),e.length===0||o==null)return[o,t];try{for(var n=D(o.keys()),i=n.next();!i.done;i=n.next()){var s=i.value;if(s!==J&&e.startsWith(s))return t.push([o,s]),Ce(o.get(s),e.slice(s.length),t)}}catch(u){r={error:u}}finally{try{i&&!i.done&&(a=n.return)&&a.call(n)}finally{if(r)throw r.error}}return t.push([o,e]),Ce(void 0,"",t)},$e=function(o,e){var t,r;if(e.length===0||o==null)return o;try{for(var a=D(o.keys()),n=a.next();!n.done;n=a.next()){var i=n.value;if(i!==J&&e.startsWith(i))return $e(o.get(i),e.slice(i.length))}}catch(s){t={error:s}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(t)throw t.error}}},Re=function(o,e){var t,r,a=e.length;e:for(var n=0;o&&n0)throw new Error("Expected documents to be present. Omit the argument to remove all documents.");this._index=new Me,this._documentCount=0,this._documentIds=new Map,this._idToShortId=new Map,this._fieldLength=new Map,this._avgFieldLength=[],this._storedFields=new Map,this._nextId=0}},o.prototype.discard=function(e){var t=this,r=this._idToShortId.get(e);if(r==null)throw new Error("MiniSearch: cannot discard document with ID ".concat(e,": it is not in the index"));this._idToShortId.delete(e),this._documentIds.delete(r),this._storedFields.delete(r),(this._fieldLength.get(r)||[]).forEach(function(a,n){t.removeFieldLength(r,n,t._documentCount,a)}),this._fieldLength.delete(r),this._documentCount-=1,this._dirtCount+=1,this.maybeAutoVacuum()},o.prototype.maybeAutoVacuum=function(){if(this._options.autoVacuum!==!1){var e=this._options.autoVacuum,t=e.minDirtFactor,r=e.minDirtCount,a=e.batchSize,n=e.batchWait;this.conditionalVacuum({batchSize:a,batchWait:n},{minDirtCount:r,minDirtFactor:t})}},o.prototype.discardAll=function(e){var t,r,a=this._options.autoVacuum;try{this._options.autoVacuum=!1;try{for(var n=D(e),i=n.next();!i.done;i=n.next()){var s=i.value;this.discard(s)}}catch(u){t={error:u}}finally{try{i&&!i.done&&(r=n.return)&&r.call(n)}finally{if(t)throw t.error}}}finally{this._options.autoVacuum=a}this.maybeAutoVacuum()},o.prototype.replace=function(e){var t=this._options,r=t.idField,a=t.extractField,n=a(e,r);this.discard(n),this.add(e)},o.prototype.vacuum=function(e){return e===void 0&&(e={}),this.conditionalVacuum(e)},o.prototype.conditionalVacuum=function(e,t){var r=this;return this._currentVacuum?(this._enqueuedVacuumConditions=this._enqueuedVacuumConditions&&t,this._enqueuedVacuum!=null?this._enqueuedVacuum:(this._enqueuedVacuum=this._currentVacuum.then(function(){var a=r._enqueuedVacuumConditions;return r._enqueuedVacuumConditions=We,r.performVacuuming(e,a)}),this._enqueuedVacuum)):this.vacuumConditionsMet(t)===!1?Promise.resolve():(this._currentVacuum=this.performVacuuming(e),this._currentVacuum)},o.prototype.performVacuuming=function(e,t){return Or(this,void 0,void 0,function(){var r,a,n,i,s,u,l,f,h,v,m,b,w,F,k,C,A,z,M,B,E,I,L,_,P;return Mr(this,function(g){switch(g.label){case 0:if(r=this._dirtCount,!this.vacuumConditionsMet(t))return[3,10];a=e.batchSize||je.batchSize,n=e.batchWait||je.batchWait,i=1,g.label=1;case 1:g.trys.push([1,7,8,9]),s=D(this._index),u=s.next(),g.label=2;case 2:if(u.done)return[3,6];l=j(u.value,2),f=l[0],h=l[1];try{for(v=(I=void 0,D(h)),m=v.next();!m.done;m=v.next()){b=j(m.value,2),w=b[0],F=b[1];try{for(k=(_=void 0,D(F)),C=k.next();!C.done;C=k.next())A=j(C.value,1),z=A[0],!this._documentIds.has(z)&&(F.size<=1?h.delete(w):F.delete(z))}catch(c){_={error:c}}finally{try{C&&!C.done&&(P=k.return)&&P.call(k)}finally{if(_)throw _.error}}}}catch(c){I={error:c}}finally{try{m&&!m.done&&(L=v.return)&&L.call(v)}finally{if(I)throw I.error}}return this._index.get(f).size===0&&this._index.delete(f),i%a!==0?[3,4]:[4,new Promise(function(c){return setTimeout(c,n)})];case 3:g.sent(),g.label=4;case 4:i+=1,g.label=5;case 5:return u=s.next(),[3,2];case 6:return[3,9];case 7:return M=g.sent(),B={error:M},[3,9];case 8:try{u&&!u.done&&(E=s.return)&&E.call(s)}finally{if(B)throw B.error}return[7];case 9:this._dirtCount-=r,g.label=10;case 10:return[4,null];case 11:return g.sent(),this._currentVacuum=this._enqueuedVacuum,this._enqueuedVacuum=null,[2]}})})},o.prototype.vacuumConditionsMet=function(e){if(e==null)return!0;var t=e.minDirtCount,r=e.minDirtFactor;return t=t||ze.minDirtCount,r=r||ze.minDirtFactor,this.dirtCount>=t&&this.dirtFactor>=r},Object.defineProperty(o.prototype,"isVacuuming",{get:function(){return this._currentVacuum!=null},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtCount",{get:function(){return this._dirtCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"dirtFactor",{get:function(){return this._dirtCount/(1+this._documentCount+this._dirtCount)},enumerable:!1,configurable:!0}),o.prototype.has=function(e){return this._idToShortId.has(e)},o.prototype.getStoredFields=function(e){var t=this._idToShortId.get(e);if(t!=null)return this._storedFields.get(t)},o.prototype.search=function(e,t){var r,a;t===void 0&&(t={});var n=this.executeQuery(e,t),i=[];try{for(var s=D(n),u=s.next();!u.done;u=s.next()){var l=j(u.value,2),f=l[0],h=l[1],v=h.score,m=h.terms,b=h.match,w=m.length||1,F={id:this._documentIds.get(f),score:v*w,terms:Object.keys(b),queryTerms:m,match:b};Object.assign(F,this._storedFields.get(f)),(t.filter==null||t.filter(F))&&i.push(F)}}catch(k){r={error:k}}finally{try{u&&!u.done&&(a=s.return)&&a.call(s)}finally{if(r)throw r.error}}return e===o.wildcard&&t.boostDocument==null&&this._options.searchOptions.boostDocument==null||i.sort(dt),i},o.prototype.autoSuggest=function(e,t){var r,a,n,i;t===void 0&&(t={}),t=$($({},this._options.autoSuggestOptions),t);var s=new Map;try{for(var u=D(this.search(e,t)),l=u.next();!l.done;l=u.next()){var f=l.value,h=f.score,v=f.terms,m=v.join(" "),b=s.get(m);b!=null?(b.score+=h,b.count+=1):s.set(m,{score:h,terms:v,count:1})}}catch(M){r={error:M}}finally{try{l&&!l.done&&(a=u.return)&&a.call(u)}finally{if(r)throw r.error}}var w=[];try{for(var F=D(s),k=F.next();!k.done;k=F.next()){var C=j(k.value,2),b=C[0],A=C[1],h=A.score,v=A.terms,z=A.count;w.push({suggestion:b,terms:v,score:h/z})}}catch(M){n={error:M}}finally{try{k&&!k.done&&(i=F.return)&&i.call(F)}finally{if(n)throw n.error}}return w.sort(dt),w},Object.defineProperty(o.prototype,"documentCount",{get:function(){return this._documentCount},enumerable:!1,configurable:!0}),Object.defineProperty(o.prototype,"termCount",{get:function(){return this._index.size},enumerable:!1,configurable:!0}),o.loadJSON=function(e,t){if(t==null)throw new Error("MiniSearch: loadJSON should be given the same options used when serializing the index");return this.loadJS(JSON.parse(e),t)},o.getDefault=function(e){if(Pe.hasOwnProperty(e))return Le(Pe,e);throw new Error('MiniSearch: unknown option "'.concat(e,'"'))},o.loadJS=function(e,t){var r,a,n,i,s,u,l=e.index,f=e.documentCount,h=e.nextId,v=e.documentIds,m=e.fieldIds,b=e.fieldLength,w=e.averageFieldLength,F=e.storedFields,k=e.dirtCount,C=e.serializationVersion;if(C!==1&&C!==2)throw new Error("MiniSearch: cannot deserialize an index created with an incompatible version");var A=new o(t);A._documentCount=f,A._nextId=h,A._documentIds=Ee(v),A._idToShortId=new Map,A._fieldIds=m,A._fieldLength=Ee(b),A._avgFieldLength=w,A._storedFields=Ee(F),A._dirtCount=k||0,A._index=new Me;try{for(var z=D(A._documentIds),M=z.next();!M.done;M=z.next()){var B=j(M.value,2),E=B[0],I=B[1];A._idToShortId.set(I,E)}}catch(p){r={error:p}}finally{try{M&&!M.done&&(a=z.return)&&a.call(z)}finally{if(r)throw r.error}}try{for(var L=D(l),_=L.next();!_.done;_=L.next()){var P=j(_.value,2),g=P[0],c=P[1],d=new Map;try{for(var x=(s=void 0,D(Object.keys(c))),T=x.next();!T.done;T=x.next()){var N=T.value,R=c[N];C===1&&(R=R.ds),d.set(parseInt(N,10),Ee(R))}}catch(p){s={error:p}}finally{try{T&&!T.done&&(u=x.return)&&u.call(x)}finally{if(s)throw s.error}}A._index.set(g,d)}}catch(p){n={error:p}}finally{try{_&&!_.done&&(i=L.return)&&i.call(L)}finally{if(n)throw n.error}}return A},o.prototype.executeQuery=function(e,t){var r=this;if(t===void 0&&(t={}),e===o.wildcard)return this.executeWildcardQuery(t);if(typeof e!="string"){var a=$($($({},t),e),{queries:void 0}),n=e.queries.map(function(F){return r.executeQuery(F,a)});return this.combineResults(n,a.combineWith)}var i=this._options,s=i.tokenize,u=i.processTerm,l=i.searchOptions,f=$($({tokenize:s,processTerm:u},l),t),h=f.tokenize,v=f.processTerm,m=h(e).flatMap(function(F){return v(F)}).filter(function(F){return!!F}),b=m.map(jr(f)),w=b.map(function(F){return r.executeQuerySpec(F,f)});return this.combineResults(w,f.combineWith)},o.prototype.executeQuerySpec=function(e,t){var r,a,n,i,s=$($({},this._options.searchOptions),t),u=(s.fields||this._options.fields).reduce(function(N,R){var p;return $($({},N),(p={},p[R]=Le(s.boost,R)||1,p))},{}),l=s.boostDocument,f=s.weights,h=s.maxFuzzy,v=s.bm25,m=$($({},ct.weights),f),b=m.fuzzy,w=m.prefix,F=this._index.get(e.term),k=this.termResults(e.term,e.term,1,F,u,l,v),C,A;if(e.prefix&&(C=this._index.atPrefix(e.term)),e.fuzzy){var z=e.fuzzy===!0?.2:e.fuzzy,M=z<1?Math.min(h,Math.round(e.term.length*z)):z;M&&(A=this._index.fuzzyGet(e.term,M))}if(C)try{for(var B=D(C),E=B.next();!E.done;E=B.next()){var I=j(E.value,2),L=I[0],_=I[1],P=L.length-e.term.length;if(P){A==null||A.delete(L);var g=w*L.length/(L.length+.3*P);this.termResults(e.term,L,g,_,u,l,v,k)}}}catch(N){r={error:N}}finally{try{E&&!E.done&&(a=B.return)&&a.call(B)}finally{if(r)throw r.error}}if(A)try{for(var c=D(A.keys()),d=c.next();!d.done;d=c.next()){var L=d.value,x=j(A.get(L),2),T=x[0],P=x[1];if(P){var g=b*L.length/(L.length+P);this.termResults(e.term,L,g,T,u,l,v,k)}}}catch(N){n={error:N}}finally{try{d&&!d.done&&(i=c.return)&&i.call(c)}finally{if(n)throw n.error}}return k},o.prototype.executeWildcardQuery=function(e){var t,r,a=new Map,n=$($({},this._options.searchOptions),e);try{for(var i=D(this._documentIds),s=i.next();!s.done;s=i.next()){var u=j(s.value,2),l=u[0],f=u[1],h=n.boostDocument?n.boostDocument(f,"",this._storedFields.get(l)):1;a.set(l,{score:h,terms:[],match:{}})}}catch(v){t={error:v}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}return a},o.prototype.combineResults=function(e,t){if(t===void 0&&(t=Je),e.length===0)return new Map;var r=t.toLowerCase();return e.reduce(Br[r])||new Map},o.prototype.toJSON=function(){var e,t,r,a,n=[];try{for(var i=D(this._index),s=i.next();!s.done;s=i.next()){var u=j(s.value,2),l=u[0],f=u[1],h={};try{for(var v=(r=void 0,D(f)),m=v.next();!m.done;m=v.next()){var b=j(m.value,2),w=b[0],F=b[1];h[w]=Object.fromEntries(F)}}catch(k){r={error:k}}finally{try{m&&!m.done&&(a=v.return)&&a.call(v)}finally{if(r)throw r.error}}n.push([l,h])}}catch(k){e={error:k}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}return{documentCount:this._documentCount,nextId:this._nextId,documentIds:Object.fromEntries(this._documentIds),fieldIds:this._fieldIds,fieldLength:Object.fromEntries(this._fieldLength),averageFieldLength:this._avgFieldLength,storedFields:Object.fromEntries(this._storedFields),dirtCount:this._dirtCount,index:n,serializationVersion:2}},o.prototype.termResults=function(e,t,r,a,n,i,s,u){var l,f,h,v,m;if(u===void 0&&(u=new Map),a==null)return u;try{for(var b=D(Object.keys(n)),w=b.next();!w.done;w=b.next()){var F=w.value,k=n[F],C=this._fieldIds[F],A=a.get(C);if(A!=null){var z=A.size,M=this._avgFieldLength[C];try{for(var B=(h=void 0,D(A.keys())),E=B.next();!E.done;E=B.next()){var I=E.value;if(!this._documentIds.has(I)){this.removeTerm(C,I,t),z-=1;continue}var L=i?i(this._documentIds.get(I),t,this._storedFields.get(I)):1;if(L){var _=A.get(I),P=this._fieldLength.get(I)[C],g=$r(_,z,this._documentCount,P,M,s),c=r*k*L*g,d=u.get(I);if(d){d.score+=c,Kr(d.terms,e);var x=Le(d.match,t);x?x.push(F):d.match[t]=[F]}else u.set(I,{score:c,terms:[e],match:(m={},m[t]=[F],m)})}}}catch(T){h={error:T}}finally{try{E&&!E.done&&(v=B.return)&&v.call(B)}finally{if(h)throw h.error}}}}}catch(T){l={error:T}}finally{try{w&&!w.done&&(f=b.return)&&f.call(b)}finally{if(l)throw l.error}}return u},o.prototype.addTerm=function(e,t,r){var a=this._index.fetch(r,ht),n=a.get(e);if(n==null)n=new Map,n.set(t,1),a.set(e,n);else{var i=n.get(t);n.set(t,(i||0)+1)}},o.prototype.removeTerm=function(e,t,r){if(!this._index.has(r)){this.warnDocumentChanged(t,e,r);return}var a=this._index.fetch(r,ht),n=a.get(e);n==null||n.get(t)==null?this.warnDocumentChanged(t,e,r):n.get(t)<=1?n.size<=1?a.delete(e):n.delete(t):n.set(t,n.get(t)-1),this._index.get(r).size===0&&this._index.delete(r)},o.prototype.warnDocumentChanged=function(e,t,r){var a,n;try{for(var i=D(Object.keys(this._fieldIds)),s=i.next();!s.done;s=i.next()){var u=s.value;if(this._fieldIds[u]===t){this._options.logger("warn","MiniSearch: document with ID ".concat(this._documentIds.get(e),' has changed before removal: term "').concat(r,'" was not present in field "').concat(u,'". Removing a document after it has changed can corrupt the index!'),"version_conflict");return}}}catch(l){a={error:l}}finally{try{s&&!s.done&&(n=i.return)&&n.call(i)}finally{if(a)throw a.error}}},o.prototype.addDocumentId=function(e){var t=this._nextId;return this._idToShortId.set(e,t),this._documentIds.set(t,e),this._documentCount+=1,this._nextId+=1,t},o.prototype.addFields=function(e){for(var t=0;t{var p,y,O,U,Q,W,V,H,G;return nt(_r.loadJSON((O=await((y=(p=n.value)[u.value])==null?void 0:y.call(p)))==null?void 0:O.default,{fields:["title","titles","text"],storeFields:["title","titles"],searchOptions:{fuzzy:.2,prefix:!0,boost:{title:4,text:2,titles:1},...((U=l.value.search)==null?void 0:U.provider)==="local"&&((W=(Q=l.value.search.options)==null?void 0:Q.miniSearch)==null?void 0:W.searchOptions)},...((V=l.value.search)==null?void 0:V.provider)==="local"&&((G=(H=l.value.search.options)==null?void 0:H.miniSearch)==null?void 0:G.options)}))}),v=Ne(()=>{var p,y;return((p=l.value.search)==null?void 0:p.provider)==="local"&&((y=l.value.search.options)==null?void 0:y.disableQueryPersistence)===!0}).value?ie(""):It("vitepress:local-search-filter",""),m=Dt("vitepress:local-search-detailed-list",((T=l.value.search)==null?void 0:T.provider)==="local"&&((N=l.value.search.options)==null?void 0:N.detailedView)===!0),b=Ne(()=>{var p,y,O;return((p=l.value.search)==null?void 0:p.provider)==="local"&&(((y=l.value.search.options)==null?void 0:y.disableDetailedView)===!0||((O=l.value.search.options)==null?void 0:O.detailedView)===!1)});Ot(()=>{b.value&&(m.value=!1)});const w=be([]),F=ie(!1);_e(v,()=>{F.value=!1});const k=et(async()=>{if(a.value)return nt(new Dr(a.value))},null);Mt(()=>[f.value,v.value,m.value],async([p,y,O],U,Q)=>{var Ue,He,Ge,Qe;let W=!1;if(Q(()=>{W=!0}),!p)return;w.value=p.search(y).slice(0,16),F.value=!0;const V=O?await Promise.all(w.value.map(q=>C(q.id))):[];if(W)return;const H=new Map;for(const{id:q,mod:re}of V){const ae=q.slice(0,q.indexOf("#"));let X=H.get(ae);if(X)continue;X=new Map,H.set(ae,X);const Y=re.default??re;if(Y!=null&&Y.render||Y!=null&&Y.setup){const ne=Jt(Y);ne.config.warnHandler=()=>{},ne.provide(Ut,i),Object.defineProperties(ne.config.globalProperties,{$frontmatter:{get(){return i.frontmatter.value}},$params:{get(){return i.page.value.params}}});const qe=document.createElement("div");ne.mount(qe),qe.querySelectorAll("h1, h2, h3, h4, h5, h6").forEach(fe=>{var Xe;const ge=(Xe=fe.querySelector("a"))==null?void 0:Xe.getAttribute("href"),Ye=(ge==null?void 0:ge.startsWith("#"))&&ge.slice(1);if(!Ye)return;let Ze="";for(;(fe=fe.nextElementSibling)&&!/^h[1-6]$/i.test(fe.tagName);)Ze+=fe.outerHTML;X.set(Ye,Ze)}),ne.unmount()}if(W)return}const G=new Set;if(w.value=w.value.map(q=>{const[re,ae]=q.id.split("#"),X=H.get(re),Y=(X==null?void 0:X.get(ae))??"";for(const ne in q.match)G.add(ne);return{...q,text:Y}}),await de(),W)return;await new Promise(q=>{var re;(re=k.value)==null||re.unmark({done:()=>{var ae;(ae=k.value)==null||ae.markRegExp(x(G),{done:q})}})});const te=((Ue=r.value)==null?void 0:Ue.querySelectorAll(".result .excerpt"))??[];for(const q of te)(He=q.querySelector('mark[data-markjs="true"]'))==null||He.scrollIntoView({block:"center"});(Qe=(Ge=a.value)==null?void 0:Ge.firstElementChild)==null||Qe.scrollIntoView({block:"start"})},{debounce:200,immediate:!0});async function C(p){const y=Ht(p.slice(0,p.indexOf("#")));try{if(!y)throw new Error(`Cannot find file for id: ${p}`);return{id:p,mod:await vt(()=>import(y),[])}}catch(O){return console.error(O),{id:p,mod:{}}}}const A=ie(),z=Ne(()=>{var p;return((p=v.value)==null?void 0:p.length)<=0});function M(p=!0){var y,O;(y=A.value)==null||y.focus(),p&&((O=A.value)==null||O.select())}Ie(()=>{M()});function B(p){p.pointerType==="mouse"&&M()}const E=ie(-1),I=ie(!1);_e(w,p=>{E.value=p.length?0:-1,L()});function L(){de(()=>{const p=document.querySelector(".result.selected");p&&p.scrollIntoView({block:"nearest"})})}we("ArrowUp",p=>{p.preventDefault(),E.value--,E.value<0&&(E.value=w.value.length-1),I.value=!0,L()}),we("ArrowDown",p=>{p.preventDefault(),E.value++,E.value>=w.value.length&&(E.value=0),I.value=!0,L()});const _=Rt();we("Enter",p=>{if(p.target instanceof HTMLButtonElement&&p.target.type!=="submit")return;const y=w.value[E.value];if(p.target instanceof HTMLInputElement&&!y){p.preventDefault();return}y&&(_.go(y.id),t("close"))}),we("Escape",()=>{t("close")});const P={modal:{displayDetails:"Display detailed list",resetButtonTitle:"Reset search",backButtonTitle:"Close search",noResultsText:"No results for",footer:{selectText:"to select",selectKeyAriaLabel:"enter",navigateText:"to navigate",navigateUpKeyAriaLabel:"up arrow",navigateDownKeyAriaLabel:"down arrow",closeText:"to close",closeKeyAriaLabel:"escape"}}},g=qt((R=l.value.search)==null?void 0:R.options,P);Ie(()=>{window.history.pushState(null,"",null)}),Lt("popstate",p=>{p.preventDefault(),t("close")});const c=Pt(zt?document.body:null);Ie(()=>{de(()=>{c.value=!0,de().then(()=>s())})}),_t(()=>{c.value=!1});function d(){v.value="",de().then(()=>M(!1))}function x(p){return new RegExp([...p].sort((y,O)=>O.length-y.length).map(y=>`(${y.replace(/[|\\{}()[\]^$+*?.]/g,"\\$&").replace(/-/g,"\\x2d")})`).join("|"),"gi")}return(p,y)=>{var O,U,Q,W;return Z(),Bt(Kt,{to:"body"},[S("div",{ref_key:"el",ref:r,role:"button","aria-owns":(O=w.value)!=null&&O.length?"localsearch-list":void 0,"aria-expanded":"true","aria-haspopup":"listbox","aria-labelledby":"localsearch-label",class:"VPLocalSearchBox"},[S("div",{class:"backdrop",onClick:y[0]||(y[0]=V=>p.$emit("close"))}),S("div",Hr,[S("form",{class:"search-bar",onPointerup:y[4]||(y[4]=V=>B(V)),onSubmit:y[5]||(y[5]=Vt(()=>{},["prevent"]))},[S("label",{title:p.placeholder,id:"localsearch-label",for:"localsearch-input"},y[8]||(y[8]=[S("svg",{class:"search-icon",width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("g",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[S("circle",{cx:"11",cy:"11",r:"8"}),S("path",{d:"m21 21l-4.35-4.35"})])],-1)]),8,Gr),S("div",Qr,[S("button",{class:"back-button",title:K(g)("modal.backButtonTitle"),onClick:y[1]||(y[1]=V=>p.$emit("close"))},y[9]||(y[9]=[S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 12H5m7 7l-7-7l7-7"})],-1)]),8,qr)]),$t(S("input",{ref_key:"searchInput",ref:A,"onUpdate:modelValue":y[2]||(y[2]=V=>Wt(v)?v.value=V:null),placeholder:p.placeholder,id:"localsearch-input","aria-labelledby":"localsearch-label",class:"search-input"},null,8,Yr),[[jt,K(v)]]),S("div",Zr,[b.value?xe("",!0):(Z(),ee("button",{key:0,class:tt(["toggle-layout-button",{"detailed-list":K(m)}]),type:"button",title:K(g)("modal.displayDetails"),onClick:y[3]||(y[3]=V=>E.value>-1&&(m.value=!K(m)))},y[10]||(y[10]=[S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 14h7v7H3zM3 3h7v7H3zm11 1h7m-7 5h7m-7 6h7m-7 5h7"})],-1)]),10,Xr)),S("button",{class:"clear-button",type:"reset",disabled:z.value,title:K(g)("modal.resetButtonTitle"),onClick:d},y[11]||(y[11]=[S("svg",{width:"18",height:"18",viewBox:"0 0 24 24","aria-hidden":"true"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M20 5H9l-7 7l7 7h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2Zm-2 4l-6 6m0-6l6 6"})],-1)]),8,ea)])],32),S("ul",{ref_key:"resultsEl",ref:a,id:(U=w.value)!=null&&U.length?"localsearch-list":void 0,role:(Q=w.value)!=null&&Q.length?"listbox":void 0,"aria-labelledby":(W=w.value)!=null&&W.length?"localsearch-label":void 0,class:"results",onMousemove:y[7]||(y[7]=V=>I.value=!1)},[(Z(!0),ee(at,null,rt(w.value,(V,H)=>(Z(),ee("li",{key:V.id,role:"option","aria-selected":E.value===H?"true":"false"},[S("a",{href:V.id,class:tt(["result",{selected:E.value===H}]),"aria-label":[...V.titles,V.title].join(" > "),onMouseenter:G=>!I.value&&(E.value=H),onFocusin:G=>E.value=H,onClick:y[6]||(y[6]=G=>p.$emit("close"))},[S("div",null,[S("div",na,[y[13]||(y[13]=S("span",{class:"title-icon"},"#",-1)),(Z(!0),ee(at,null,rt(V.titles,(G,te)=>(Z(),ee("span",{key:te,class:"title"},[S("span",{class:"text",innerHTML:G},null,8,ia),y[12]||(y[12]=S("svg",{width:"18",height:"18",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"m9 18l6-6l-6-6"})],-1))]))),128)),S("span",oa,[S("span",{class:"text",innerHTML:V.title},null,8,sa)])]),K(m)?(Z(),ee("div",ua,[V.text?(Z(),ee("div",la,[S("div",{class:"vp-doc",innerHTML:V.text},null,8,ca)])):xe("",!0),y[14]||(y[14]=S("div",{class:"excerpt-gradient-bottom"},null,-1)),y[15]||(y[15]=S("div",{class:"excerpt-gradient-top"},null,-1))])):xe("",!0)])],42,aa)],8,ra))),128)),K(v)&&!w.value.length&&F.value?(Z(),ee("li",fa,[he(ve(K(g)("modal.noResultsText"))+' "',1),S("strong",null,ve(K(v)),1),y[16]||(y[16]=he('" '))])):xe("",!0)],40,ta),S("div",da,[S("span",null,[S("kbd",{"aria-label":K(g)("modal.footer.navigateUpKeyAriaLabel")},y[17]||(y[17]=[S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 19V5m-7 7l7-7l7 7"})],-1)]),8,ha),S("kbd",{"aria-label":K(g)("modal.footer.navigateDownKeyAriaLabel")},y[18]||(y[18]=[S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("path",{fill:"none",stroke:"currentColor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M12 5v14m7-7l-7 7l-7-7"})],-1)]),8,va),he(" "+ve(K(g)("modal.footer.navigateText")),1)]),S("span",null,[S("kbd",{"aria-label":K(g)("modal.footer.selectKeyAriaLabel")},y[19]||(y[19]=[S("svg",{width:"14",height:"14",viewBox:"0 0 24 24"},[S("g",{fill:"none",stroke:"currentcolor","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2"},[S("path",{d:"m9 10l-5 5l5 5"}),S("path",{d:"M20 4v7a4 4 0 0 1-4 4H4"})])],-1)]),8,pa),he(" "+ve(K(g)("modal.footer.selectText")),1)]),S("span",null,[S("kbd",{"aria-label":K(g)("modal.footer.closeKeyAriaLabel")},"esc",8,ya),he(" "+ve(K(g)("modal.footer.closeText")),1)])])])],8,Ur)])}}});const Fa=Gt(ma,[["__scopeId","data-v-9cd6a060"]]);export{Fa as default}; diff --git a/assets/chunks/framework.47aa8d5b.js b/assets/chunks/framework.47aa8d5b.js deleted file mode 100644 index 8c5f590..0000000 --- a/assets/chunks/framework.47aa8d5b.js +++ /dev/null @@ -1,34 +0,0 @@ -/** -* @vue/shared v3.5.13 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**//*! #__NO_SIDE_EFFECTS__ */function Lt(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ee={},Ct=[],De=()=>{},rl=()=>!1,cn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Fr=e=>e.startsWith("onUpdate:"),fe=Object.assign,$r=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},sl=Object.prototype.hasOwnProperty,Z=(e,t)=>sl.call(e,t),W=Array.isArray,At=e=>$n(e)==="[object Map]",fi=e=>$n(e)==="[object Set]",K=e=>typeof e=="function",te=e=>typeof e=="string",Ge=e=>typeof e=="symbol",se=e=>e!==null&&typeof e=="object",ui=e=>(se(e)||K(e))&&K(e.then)&&K(e.catch),di=Object.prototype.toString,$n=e=>di.call(e),il=e=>$n(e).slice(8,-1),hi=e=>$n(e)==="[object Object]",kr=e=>te(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Mt=Lt(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),kn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},ol=/-(\w)/g,Ie=kn(e=>e.replace(ol,(t,n)=>n?n.toUpperCase():"")),ll=/\B([A-Z])/g,ze=kn(e=>e.replace(ll,"-$1").toLowerCase()),Vn=kn(e=>e.charAt(0).toUpperCase()+e.slice(1)),Tn=kn(e=>e?`on${Vn(e)}`:""),it=(e,t)=>!Object.is(e,t),Sn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},br=e=>{const t=parseFloat(e);return isNaN(t)?e:t},cl=e=>{const t=te(e)?Number(e):NaN;return isNaN(t)?e:t};let as;const an=()=>as||(as=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function jn(e){if(W(e)){const t={};for(let n=0;n{if(n){const r=n.split(fl);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function hl(e){if(!e)return"";if(te(e))return e;let t="";for(const n in e){const r=e[n];if(te(r)||typeof r=="number"){const s=n.startsWith("--")?n:ze(n);t+=`${s}:${r};`}}return t}function Un(e){let t="";if(te(e))t=e;else if(W(e))for(let n=0;n?@[\\\]^`{|}~]/g;function vl(e,t){return e.replace(_l,n=>t?n==='"'?'\\\\\\"':`\\\\${n}`:`\\${n}`)}const mi=e=>!!(e&&e.__v_isRef===!0),bl=e=>te(e)?e:e==null?"":W(e)||se(e)&&(e.toString===di||!K(e.toString))?mi(e)?bl(e.value):JSON.stringify(e,yi,2):String(e),yi=(e,t)=>mi(t)?yi(e,t.value):At(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],i)=>(n[rr(r,i)+" =>"]=s,n),{})}:fi(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>rr(n))}:Ge(t)?rr(t):se(t)&&!W(t)&&!hi(t)?String(t):t,rr=(e,t="")=>{var n;return Ge(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.5.13 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let we;class wl{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=we,!t&&we&&(this.index=(we.scopes||(we.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0)return;if(Wt){let t=Wt;for(Wt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Bt;){let t=Bt;for(Bt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function xi(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Ti(e){let t,n=e.depsTail,r=n;for(;r;){const s=r.prevDep;r.version===-1?(r===n&&(n=s),Br(r),Tl(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=s}e.deps=t,e.depsTail=n}function wr(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Si(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Si(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Xt))return;e.globalVersion=Xt;const t=e.dep;if(e.flags|=2,t.version>0&&!e.isSSR&&e.deps&&!wr(e)){e.flags&=-3;return}const n=re,r=He;re=e,He=!0;try{xi(e);const s=e.fn(e._value);(t.version===0||it(s,e._value))&&(e._value=s,t.version++)}catch(s){throw t.version++,s}finally{re=n,He=r,Ti(e),e.flags&=-3}}function Br(e,t=!1){const{dep:n,prevSub:r,nextSub:s}=e;if(r&&(r.nextSub=s,e.prevSub=void 0),s&&(s.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Br(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Tl(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let He=!0;const Ei=[];function Je(){Ei.push(He),He=!1}function Xe(){const e=Ei.pop();He=e===void 0?!0:e}function us(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=re;re=void 0;try{t()}finally{re=n}}}let Xt=0;class Sl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Bn{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!re||!He||re===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==re)n=this.activeLink=new Sl(re,this),re.deps?(n.prevDep=re.depsTail,re.depsTail.nextDep=n,re.depsTail=n):re.deps=re.depsTail=n,Ci(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=re.depsTail,n.nextDep=void 0,re.depsTail.nextDep=n,re.depsTail=n,re.deps===n&&(re.deps=r)}return n}trigger(t){this.version++,Xt++,this.notify(t)}notify(t){jr();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Ur()}}}function Ci(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)Ci(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const On=new WeakMap,mt=Symbol(""),xr=Symbol(""),Zt=Symbol("");function ge(e,t,n){if(He&&re){let r=On.get(e);r||On.set(e,r=new Map);let s=r.get(n);s||(r.set(n,s=new Bn),s.map=r,s.key=n),s.track()}}function qe(e,t,n,r,s,i){const o=On.get(e);if(!o){Xt++;return}const l=c=>{c&&c.trigger()};if(jr(),t==="clear")o.forEach(l);else{const c=W(e),f=c&&kr(n);if(c&&n==="length"){const a=Number(r);o.forEach((h,y)=>{(y==="length"||y===Zt||!Ge(y)&&y>=a)&&l(h)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),f&&l(o.get(Zt)),t){case"add":c?f&&l(o.get("length")):(l(o.get(mt)),At(e)&&l(o.get(xr)));break;case"delete":c||(l(o.get(mt)),At(e)&&l(o.get(xr)));break;case"set":At(e)&&l(o.get(mt));break}}Ur()}function El(e,t){const n=On.get(e);return n&&n.get(t)}function Tt(e){const t=J(e);return t===e?t:(ge(t,"iterate",Zt),Pe(e)?t:t.map(me))}function Wn(e){return ge(e=J(e),"iterate",Zt),e}const Cl={__proto__:null,[Symbol.iterator](){return ir(this,Symbol.iterator,me)},concat(...e){return Tt(this).concat(...e.map(t=>W(t)?Tt(t):t))},entries(){return ir(this,"entries",e=>(e[1]=me(e[1]),e))},every(e,t){return Be(this,"every",e,t,void 0,arguments)},filter(e,t){return Be(this,"filter",e,t,n=>n.map(me),arguments)},find(e,t){return Be(this,"find",e,t,me,arguments)},findIndex(e,t){return Be(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Be(this,"findLast",e,t,me,arguments)},findLastIndex(e,t){return Be(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Be(this,"forEach",e,t,void 0,arguments)},includes(...e){return or(this,"includes",e)},indexOf(...e){return or(this,"indexOf",e)},join(e){return Tt(this).join(e)},lastIndexOf(...e){return or(this,"lastIndexOf",e)},map(e,t){return Be(this,"map",e,t,void 0,arguments)},pop(){return $t(this,"pop")},push(...e){return $t(this,"push",e)},reduce(e,...t){return ds(this,"reduce",e,t)},reduceRight(e,...t){return ds(this,"reduceRight",e,t)},shift(){return $t(this,"shift")},some(e,t){return Be(this,"some",e,t,void 0,arguments)},splice(...e){return $t(this,"splice",e)},toReversed(){return Tt(this).toReversed()},toSorted(e){return Tt(this).toSorted(e)},toSpliced(...e){return Tt(this).toSpliced(...e)},unshift(...e){return $t(this,"unshift",e)},values(){return ir(this,"values",me)}};function ir(e,t,n){const r=Wn(e),s=r[t]();return r!==e&&!Pe(e)&&(s._next=s.next,s.next=()=>{const i=s._next();return i.value&&(i.value=n(i.value)),i}),s}const Al=Array.prototype;function Be(e,t,n,r,s,i){const o=Wn(e),l=o!==e&&!Pe(e),c=o[t];if(c!==Al[t]){const h=c.apply(e,i);return l?me(h):h}let f=n;o!==e&&(l?f=function(h,y){return n.call(this,me(h),y,e)}:n.length>2&&(f=function(h,y){return n.call(this,h,y,e)}));const a=c.call(o,f,r);return l&&s?s(a):a}function ds(e,t,n,r){const s=Wn(e);let i=n;return s!==e&&(Pe(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,me(l),c,e)}),s[t](i,...r)}function or(e,t,n){const r=J(e);ge(r,"iterate",Zt);const s=r[t](...n);return(s===-1||s===!1)&&qr(n[0])?(n[0]=J(n[0]),r[t](...n)):s}function $t(e,t,n=[]){Je(),jr();const r=J(e)[t].apply(e,n);return Ur(),Xe(),r}const Ml=Lt("__proto__,__v_isRef,__isVue"),Ai=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ge));function Rl(e){Ge(e)||(e=String(e));const t=J(this);return ge(t,"has",e),t.hasOwnProperty(e)}class Mi{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n==="__v_skip")return t.__v_skip;const s=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return i;if(n==="__v_raw")return r===(s?i?kl:Ii:i?Pi:Oi).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const o=W(t);if(!s){let c;if(o&&(c=Cl[n]))return c;if(n==="hasOwnProperty")return Rl}const l=Reflect.get(t,n,ae(t)?t:r);return(Ge(n)?Ai.has(n):Ml(n))||(s||ge(t,"get",n),i)?l:ae(l)?o&&kr(n)?l:l.value:se(l)?s?qn(l):Kn(l):l}}class Ri extends Mi{constructor(t=!1){super(!1,t)}set(t,n,r,s){let i=t[n];if(!this._isShallow){const c=wt(i);if(!Pe(r)&&!wt(r)&&(i=J(i),r=J(r)),!W(t)&&ae(i)&&!ae(r))return c?!1:(i.value=r,!0)}const o=W(t)&&kr(n)?Number(n)e,pn=e=>Reflect.getPrototypeOf(e);function Dl(e,t,n){return function(...r){const s=this.__v_raw,i=J(s),o=At(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,f=s[e](...r),a=n?Tr:t?Sr:me;return!t&&ge(i,"iterate",c?xr:mt),{next(){const{value:h,done:y}=f.next();return y?{value:h,done:y}:{value:l?[a(h[0]),a(h[1])]:a(h),done:y}},[Symbol.iterator](){return this}}}}function gn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Hl(e,t){const n={get(s){const i=this.__v_raw,o=J(i),l=J(s);e||(it(s,l)&&ge(o,"get",s),ge(o,"get",l));const{has:c}=pn(o),f=t?Tr:e?Sr:me;if(c.call(o,s))return f(i.get(s));if(c.call(o,l))return f(i.get(l));i!==o&&i.get(s)},get size(){const s=this.__v_raw;return!e&&ge(J(s),"iterate",mt),Reflect.get(s,"size",s)},has(s){const i=this.__v_raw,o=J(i),l=J(s);return e||(it(s,l)&&ge(o,"has",s),ge(o,"has",l)),s===l?i.has(s):i.has(s)||i.has(l)},forEach(s,i){const o=this,l=o.__v_raw,c=J(l),f=t?Tr:e?Sr:me;return!e&&ge(c,"iterate",mt),l.forEach((a,h)=>s.call(i,f(a),f(h),o))}};return fe(n,e?{add:gn("add"),set:gn("set"),delete:gn("delete"),clear:gn("clear")}:{add(s){!t&&!Pe(s)&&!wt(s)&&(s=J(s));const i=J(this);return pn(i).has.call(i,s)||(i.add(s),qe(i,"add",s,s)),this},set(s,i){!t&&!Pe(i)&&!wt(i)&&(i=J(i));const o=J(this),{has:l,get:c}=pn(o);let f=l.call(o,s);f||(s=J(s),f=l.call(o,s));const a=c.call(o,s);return o.set(s,i),f?it(i,a)&&qe(o,"set",s,i):qe(o,"add",s,i),this},delete(s){const i=J(this),{has:o,get:l}=pn(i);let c=o.call(i,s);c||(s=J(s),c=o.call(i,s)),l&&l.call(i,s);const f=i.delete(s);return c&&qe(i,"delete",s,void 0),f},clear(){const s=J(this),i=s.size!==0,o=s.clear();return i&&qe(s,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(s=>{n[s]=Dl(s,e,t)}),n}function Wr(e,t){const n=Hl(e,t);return(r,s,i)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(Z(n,s)&&s in r?n:r,s,i)}const Nl={get:Wr(!1,!1)},Fl={get:Wr(!1,!0)},$l={get:Wr(!0,!1)};const Oi=new WeakMap,Pi=new WeakMap,Ii=new WeakMap,kl=new WeakMap;function Vl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function jl(e){return e.__v_skip||!Object.isExtensible(e)?0:Vl(il(e))}function Kn(e){return wt(e)?e:Kr(e,!1,Pl,Nl,Oi)}function Ul(e){return Kr(e,!1,Ll,Fl,Pi)}function qn(e){return Kr(e,!0,Il,$l,Ii)}function Kr(e,t,n,r,s){if(!se(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=s.get(e);if(i)return i;const o=jl(e);if(o===0)return e;const l=new Proxy(e,o===2?r:n);return s.set(e,l),l}function yt(e){return wt(e)?yt(e.__v_raw):!!(e&&e.__v_isReactive)}function wt(e){return!!(e&&e.__v_isReadonly)}function Pe(e){return!!(e&&e.__v_isShallow)}function qr(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function En(e){return!Z(e,"__v_skip")&&Object.isExtensible(e)&&pi(e,"__v_skip",!0),e}const me=e=>se(e)?Kn(e):e,Sr=e=>se(e)?qn(e):e;function ae(e){return e?e.__v_isRef===!0:!1}function ue(e){return Li(e,!1)}function Yr(e){return Li(e,!0)}function Li(e,t){return ae(e)?e:new Bl(e,t)}class Bl{constructor(t,n){this.dep=new Bn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:J(t),this._value=n?t:me(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||Pe(t)||wt(t);t=r?t:J(t),it(t,n)&&(this._rawValue=t,this._value=r?t:me(t),this.dep.trigger())}}function Di(e){return ae(e)?e.value:e}const Wl={get:(e,t,n)=>t==="__v_raw"?e:Di(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return ae(s)&&!ae(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function Hi(e){return yt(e)?e:new Proxy(e,Wl)}class Kl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Bn,{get:r,set:s}=t(n.track.bind(n),n.trigger.bind(n));this._get=r,this._set=s}get value(){return this._value=this._get()}set value(t){this._set(t)}}function ql(e){return new Kl(e)}class Yl{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return El(J(this._object),this._key)}}class Gl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function zl(e,t,n){return ae(e)?e:K(e)?new Gl(e):se(e)&&arguments.length>1?Jl(e,t,n):ue(e)}function Jl(e,t,n){const r=e[t];return ae(r)?r:new Yl(e,t,n)}class Xl{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Bn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Xt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&re!==this)return wi(this,!0),!0}get value(){const t=this.dep.track();return Si(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Zl(e,t,n=!1){let r,s;return K(e)?r=e:(r=e.get,s=e.set),new Xl(r,s,n)}const mn={},Pn=new WeakMap;let ht;function Ql(e,t=!1,n=ht){if(n){let r=Pn.get(n);r||Pn.set(n,r=[]),r.push(e)}}function ec(e,t,n=ee){const{immediate:r,deep:s,once:i,scheduler:o,augmentJob:l,call:c}=n,f=g=>s?g:Pe(g)||s===!1||s===0?Ye(g,1):Ye(g);let a,h,y,_,w=!1,b=!1;if(ae(e)?(h=()=>e.value,w=Pe(e)):yt(e)?(h=()=>f(e),w=!0):W(e)?(b=!0,w=e.some(g=>yt(g)||Pe(g)),h=()=>e.map(g=>{if(ae(g))return g.value;if(yt(g))return f(g);if(K(g))return c?c(g,2):g()})):K(e)?t?h=c?()=>c(e,2):e:h=()=>{if(y){Je();try{y()}finally{Xe()}}const g=ht;ht=a;try{return c?c(e,3,[_]):e(_)}finally{ht=g}}:h=De,t&&s){const g=h,A=s===!0?1/0:s;h=()=>Ye(g(),A)}const N=_i(),L=()=>{a.stop(),N&&N.active&&$r(N.effects,a)};if(i&&t){const g=t;t=(...A)=>{g(...A),L()}}let U=b?new Array(e.length).fill(mn):mn;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const A=a.run();if(s||w||(b?A.some((H,$)=>it(H,U[$])):it(A,U))){y&&y();const H=ht;ht=a;try{const $=[A,U===mn?void 0:b&&U[0]===mn?[]:U,_];c?c(t,3,$):t(...$),U=A}finally{ht=H}}}else a.run()};return l&&l(p),a=new vi(h),a.scheduler=o?()=>o(p,!1):p,_=g=>Ql(g,!1,a),y=a.onStop=()=>{const g=Pn.get(a);if(g){if(c)c(g,4);else for(const A of g)A();Pn.delete(a)}},t?r?p(!0):U=a.run():o?o(p.bind(null,!0),!0):a.run(),L.pause=a.pause.bind(a),L.resume=a.resume.bind(a),L.stop=L,L}function Ye(e,t=1/0,n){if(t<=0||!se(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,ae(e))Ye(e.value,t,n);else if(W(e))for(let r=0;r{Ye(r,t,n)});else if(hi(e)){for(const r in e)Ye(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&Ye(e[r],t,n)}return e}/** -* @vue/runtime-core v3.5.13 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/const Kt=[];let lr=!1;function tt(e,...t){if(lr)return;lr=!0,Je();const n=Kt.length?Kt[Kt.length-1].component:null,r=n&&n.appContext.config.warnHandler,s=tc();if(r)Dt(r,n,11,[e+t.map(i=>{var o,l;return(l=(o=i.toString)==null?void 0:o.call(i))!=null?l:JSON.stringify(i)}).join(""),n&&n.proxy,s.map(({vnode:i})=>`at <${Po(n,i.type)}>`).join(` -`),s]);else{const i=[`[Vue warn]: ${e}`,...t];s.length&&i.push(` -`,...nc(s)),console.warn(...i)}Xe(),lr=!1}function tc(){let e=Kt[Kt.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const r=e.component&&e.component.parent;e=r&&r.vnode}return t}function nc(e){const t=[];return e.forEach((n,r)=>{t.push(...r===0?[]:[` -`],...rc(n))}),t}function rc({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",r=e.component?e.component.parent==null:!1,s=` at <${Po(e.component,e.type,r)}`,i=">"+n;return e.props?[s,...sc(e.props),i]:[s+i]}function sc(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach(r=>{t.push(...Ni(r,e[r]))}),n.length>3&&t.push(" ..."),t}function Ni(e,t,n){return te(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):typeof t=="number"||typeof t=="boolean"||t==null?n?t:[`${e}=${t}`]:ae(t)?(t=Ni(e,J(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):K(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=J(t),n?t:[`${e}=`,t])}function Dt(e,t,n,r){try{return r?e(...r):e()}catch(s){fn(s,t,n)}}function Ne(e,t,n,r){if(K(e)){const s=Dt(e,t,n,r);return s&&ui(s)&&s.catch(i=>{fn(i,t,n)}),s}if(W(e)){const s=[];for(let i=0;i>>1,s=xe[r],i=Qt(s);i=Qt(n)?xe.push(e):xe.splice(oc(t),0,e),e.flags|=1,$i()}}function $i(){In||(In=Fi.then(ki))}function lc(e){W(e)?Rt.push(...e):nt&&e.id===-1?nt.splice(St+1,0,e):e.flags&1||(Rt.push(e),e.flags|=1),$i()}function hs(e,t,n=ke+1){for(;nQt(n)-Qt(r));if(Rt.length=0,nt){nt.push(...t);return}for(nt=t,St=0;Ste.id==null?e.flags&2?-1:1/0:e.id;function ki(e){const t=De;try{for(ke=0;ke{r._d&&Os(-1);const i=Dn(t);let o;try{o=e(...s)}finally{Dn(i),r._d&&Os(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function $f(e,t){if(he===null)return e;const n=Qn(he),r=e.dirs||(e.dirs=[]);for(let s=0;se.__isTeleport,qt=e=>e&&(e.disabled||e.disabled===""),ps=e=>e&&(e.defer||e.defer===""),gs=e=>typeof SVGElement<"u"&&e instanceof SVGElement,ms=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Er=(e,t)=>{const n=e&&e.to;return te(n)?t?t(n):null:n},Bi={name:"Teleport",__isTeleport:!0,process(e,t,n,r,s,i,o,l,c,f){const{mc:a,pc:h,pbc:y,o:{insert:_,querySelector:w,createText:b,createComment:N}}=f,L=qt(t.props);let{shapeFlag:U,children:p,dynamicChildren:g}=t;if(e==null){const A=t.el=b(""),H=t.anchor=b("");_(A,n,r),_(H,n,r);const $=(R,v)=>{U&16&&(s&&s.isCE&&(s.ce._teleportTarget=R),a(p,R,v,s,i,o,l,c))},k=()=>{const R=t.target=Er(t.props,w),v=Wi(R,t,b,_);R&&(o!=="svg"&&gs(R)?o="svg":o!=="mathml"&&ms(R)&&(o="mathml"),L||($(R,v),Cn(t,!1)))};L&&($(n,H),Cn(t,!0)),ps(t.props)?be(()=>{k(),t.el.__isMounted=!0},i):k()}else{if(ps(t.props)&&!e.el.__isMounted){be(()=>{Bi.process(e,t,n,r,s,i,o,l,c,f),delete e.el.__isMounted},i);return}t.el=e.el,t.targetStart=e.targetStart;const A=t.anchor=e.anchor,H=t.target=e.target,$=t.targetAnchor=e.targetAnchor,k=qt(e.props),R=k?n:H,v=k?A:$;if(o==="svg"||gs(H)?o="svg":(o==="mathml"||ms(H))&&(o="mathml"),g?(y(e.dynamicChildren,g,R,s,i,o,l),es(e,t,!0)):c||h(e,t,R,v,s,i,o,l,!1),L)k?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):yn(t,n,A,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const D=t.target=Er(t.props,w);D&&yn(t,D,null,f,0)}else k&&yn(t,H,$,f,1);Cn(t,L)}},remove(e,t,n,{um:r,o:{remove:s}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:f,targetAnchor:a,target:h,props:y}=e;if(h&&(s(f),s(a)),i&&s(c),o&16){const _=i||!qt(y);for(let w=0;w{e.isMounted=!0}),Qi(()=>{e.isUnmounting=!0}),e}const Ae=[Function,Array],Ki={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Ae,onEnter:Ae,onAfterEnter:Ae,onEnterCancelled:Ae,onBeforeLeave:Ae,onLeave:Ae,onAfterLeave:Ae,onLeaveCancelled:Ae,onBeforeAppear:Ae,onAppear:Ae,onAfterAppear:Ae,onAppearCancelled:Ae},qi=e=>{const t=e.subTree;return t.component?qi(t.component):t},uc={name:"BaseTransition",props:Ki,setup(e,{slots:t}){const n=Zn(),r=fc();return()=>{const s=t.default&&zi(t.default(),!0);if(!s||!s.length)return;const i=Yi(s),o=J(e),{mode:l}=o;if(r.isLeaving)return cr(i);const c=ys(i);if(!c)return cr(i);let f=Cr(c,o,r,n,h=>f=h);c.type!==_e&&en(c,f);let a=n.subTree&&ys(n.subTree);if(a&&a.type!==_e&&!gt(c,a)&&qi(n).type!==_e){let h=Cr(a,o,r,n);if(en(a,h),l==="out-in"&&c.type!==_e)return r.isLeaving=!0,h.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete h.afterLeave,a=void 0},cr(i);l==="in-out"&&c.type!==_e?h.delayLeave=(y,_,w)=>{const b=Gi(r,a);b[String(a.key)]=a,y[rt]=()=>{_(),y[rt]=void 0,delete f.delayedLeave,a=void 0},f.delayedLeave=()=>{w(),delete f.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function Yi(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==_e){t=n;break}}return t}const dc=uc;function Gi(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Cr(e,t,n,r,s){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:f,onAfterEnter:a,onEnterCancelled:h,onBeforeLeave:y,onLeave:_,onAfterLeave:w,onLeaveCancelled:b,onBeforeAppear:N,onAppear:L,onAfterAppear:U,onAppearCancelled:p}=t,g=String(e.key),A=Gi(n,e),H=(R,v)=>{R&&Ne(R,r,9,v)},$=(R,v)=>{const D=v[1];H(R,v),W(R)?R.every(C=>C.length<=1)&&D():R.length<=1&&D()},k={mode:o,persisted:l,beforeEnter(R){let v=c;if(!n.isMounted)if(i)v=N||c;else return;R[rt]&&R[rt](!0);const D=A[g];D&>(e,D)&&D.el[rt]&&D.el[rt](),H(v,[R])},enter(R){let v=f,D=a,C=h;if(!n.isMounted)if(i)v=L||f,D=U||a,C=p||h;else return;let Y=!1;const X=R[_n]=ie=>{Y||(Y=!0,ie?H(C,[R]):H(D,[R]),k.delayedLeave&&k.delayedLeave(),R[_n]=void 0)};v?$(v,[R,X]):X()},leave(R,v){const D=String(e.key);if(R[_n]&&R[_n](!0),n.isUnmounting)return v();H(y,[R]);let C=!1;const Y=R[rt]=X=>{C||(C=!0,v(),X?H(b,[R]):H(w,[R]),R[rt]=void 0,A[D]===e&&delete A[D])};A[D]=e,_?$(_,[R,Y]):Y()},clone(R){const v=Cr(R,t,n,r,s);return s&&s(v),v}};return k}function cr(e){if(un(e))return e=lt(e),e.children=null,e}function ys(e){if(!un(e))return Ui(e.type)&&e.children?Yi(e.children):e;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&K(n.default))return n.default()}}function en(e,t){e.shapeFlag&6&&e.component?(e.transition=t,en(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function zi(e,t=!1,n){let r=[],s=0;for(let i=0;i1)for(let i=0;ife({name:e.name},t,{setup:e}))():e}function Jr(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function tn(e,t,n,r,s=!1){if(W(e)){e.forEach((w,b)=>tn(w,t&&(W(t)?t[b]:t),n,r,s));return}if(_t(r)&&!s){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&tn(e,t,n,r.component.subTree);return}const i=r.shapeFlag&4?Qn(r.component):r.el,o=s?null:i,{i:l,r:c}=e,f=t&&t.r,a=l.refs===ee?l.refs={}:l.refs,h=l.setupState,y=J(h),_=h===ee?()=>!1:w=>Z(y,w);if(f!=null&&f!==c&&(te(f)?(a[f]=null,_(f)&&(h[f]=null)):ae(f)&&(f.value=null)),K(c))Dt(c,l,12,[o,a]);else{const w=te(c),b=ae(c);if(w||b){const N=()=>{if(e.f){const L=w?_(c)?h[c]:a[c]:c.value;s?W(L)&&$r(L,i):W(L)?L.includes(i)||L.push(i):w?(a[c]=[i],_(c)&&(h[c]=a[c])):(c.value=[i],e.k&&(a[e.k]=c.value))}else w?(a[c]=o,_(c)&&(h[c]=o)):b&&(c.value=o,e.k&&(a[e.k]=o))};o?(N.id=-1,be(N,n)):N()}}}let _s=!1;const at=()=>{_s||(console.error("Hydration completed but contains mismatches."),_s=!0)},hc=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",pc=e=>e.namespaceURI.includes("MathML"),vn=e=>{if(e.nodeType===1){if(hc(e))return"svg";if(pc(e))return"mathml"}},pt=e=>e.nodeType===8;function gc(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:f}}=e,a=(p,g)=>{if(!g.hasChildNodes()){__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&tt("Attempting to hydrate existing markup but container is empty. Performing full mount instead."),n(null,p,g),Ln(),g._vnode=p;return}h(g.firstChild,p,null,null,null),Ln(),g._vnode=p},h=(p,g,A,H,$,k=!1)=>{k=k||!!g.dynamicChildren;const R=pt(p)&&p.data==="[",v=()=>b(p,g,A,H,$,R),{type:D,ref:C,shapeFlag:Y,patchFlag:X}=g;let ie=p.nodeType;g.el=p,X===-2&&(k=!1,g.dynamicChildren=null);let j=null;switch(D){case vt:ie!==3?g.children===""?(c(g.el=s(""),o(p),p),j=p):j=v():(p.data!==g.children&&(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&tt("Hydration text mismatch in",p.parentNode,` - - rendered on server: ${JSON.stringify(p.data)} - - expected on client: ${JSON.stringify(g.children)}`),at(),p.data=g.children),j=i(p));break;case _e:U(p)?(j=i(p),L(g.el=p.content.firstChild,p,A)):ie!==8||R?j=v():j=i(p);break;case Gt:if(R&&(p=i(p),ie=p.nodeType),ie===1||ie===3){j=p;const G=!g.children.length;for(let V=0;V{k=k||!!g.dynamicChildren;const{type:R,props:v,patchFlag:D,shapeFlag:C,dirs:Y,transition:X}=g,ie=R==="input"||R==="option";if(ie||D!==-1){Y&&Ve(g,null,A,"created");let j=!1;if(U(p)){j=mo(null,X)&&A&&A.vnode.props&&A.vnode.props.appear;const V=p.content.firstChild;j&&X.beforeEnter(V),L(V,p,A),g.el=p=V}if(C&16&&!(v&&(v.innerHTML||v.textContent))){let V=_(p.firstChild,g,p,A,H,$,k),ce=!1;for(;V;){jt(p,1)||(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&!ce&&(tt("Hydration children mismatch on",p,` -Server rendered element contains more child nodes than client vdom.`),ce=!0),at());const Qe=V;V=V.nextSibling,l(Qe)}}else if(C&8){let V=g.children;V[0]===` -`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(V=V.slice(1)),p.textContent!==V&&(jt(p,0)||(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&tt("Hydration text content mismatch on",p,` - - rendered on server: ${p.textContent} - - expected on client: ${g.children}`),at()),p.textContent=g.children)}if(v){if(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__||ie||!k||D&48){const V=p.tagName.includes("-");for(const ce in v)__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&!(Y&&Y.some(Qe=>Qe.dir.created))&&mc(p,ce,v[ce],g,A)&&at(),(ie&&(ce.endsWith("value")||ce==="indeterminate")||cn(ce)&&!Mt(ce)||ce[0]==="."||V)&&r(p,ce,null,v[ce],void 0,A)}else if(v.onClick)r(p,"onClick",null,v.onClick,void 0,A);else if(D&4&&yt(v.style))for(const V in v.style)v.style[V]}let G;(G=v&&v.onVnodeBeforeMount)&&Me(G,A,g),Y&&Ve(g,null,A,"beforeMount"),((G=v&&v.onVnodeMounted)||Y||j)&&xo(()=>{G&&Me(G,A,g),j&&X.enter(p),Y&&Ve(g,null,A,"mounted")},H)}return p.nextSibling},_=(p,g,A,H,$,k,R)=>{R=R||!!g.dynamicChildren;const v=g.children,D=v.length;let C=!1;for(let Y=0;Y{const{slotScopeIds:R}=g;R&&($=$?$.concat(R):R);const v=o(p),D=_(i(p),g,v,A,H,$,k);return D&&pt(D)&&D.data==="]"?i(g.anchor=D):(at(),c(g.anchor=f("]"),v,D),D)},b=(p,g,A,H,$,k)=>{if(jt(p.parentElement,1)||(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&tt(`Hydration node mismatch: -- rendered on server:`,p,p.nodeType===3?"(text)":pt(p)&&p.data==="["?"(start of fragment)":"",` -- expected on client:`,g.type),at()),g.el=null,k){const D=N(p);for(;;){const C=i(p);if(C&&C!==D)l(C);else break}}const R=i(p),v=o(p);return l(p),n(null,g,v,R,A,H,vn(v),$),A&&(A.vnode.el=g.el,bo(A,g.el)),R},N=(p,g="[",A="]")=>{let H=0;for(;p;)if(p=i(p),p&&pt(p)&&(p.data===g&&H++,p.data===A)){if(H===0)return i(p);H--}return p},L=(p,g,A)=>{const H=g.parentNode;H&&H.replaceChild(p,g);let $=A;for(;$;)$.vnode.el===g&&($.vnode.el=$.subTree.el=p),$=$.parent},U=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,h]}function mc(e,t,n,r,s){let i,o,l,c;if(t==="class")l=e.getAttribute("class"),c=Un(n),yc(vs(l||""),vs(c))||(i=2,o="class");else if(t==="style"){l=e.getAttribute("style")||"",c=te(n)?n:hl(jn(n));const f=bs(l),a=bs(c);if(r.dirs)for(const{dir:h,value:y}of r.dirs)h.name==="show"&&!y&&a.set("display","none");s&&Ji(s,r,a),_c(f,a)||(i=3,o="style")}else(e instanceof SVGElement&&ml(t)||e instanceof HTMLElement&&(fs(t)||gl(t)))&&(fs(t)?(l=e.hasAttribute(t),c=Vr(n)):n==null?(l=e.hasAttribute(t),c=!1):(e.hasAttribute(t)?l=e.getAttribute(t):t==="value"&&e.tagName==="TEXTAREA"?l=e.value:l=!1,c=yl(n)?String(n):!1),l!==c&&(i=4,o=t));if(i!=null&&!jt(e,i)){const f=y=>y===!1?"(not rendered)":`${o}="${y}"`,a=`Hydration ${Xi[i]} mismatch on`,h=` - - rendered on server: ${f(l)} - - expected on client: ${f(c)} - Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead. - You should fix the source of the mismatch.`;return tt(a,e,h),!0}return!1}function vs(e){return new Set(e.trim().split(/\s+/))}function yc(e,t){if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0}function bs(e){const t=new Map;for(const n of e.split(";")){let[r,s]=n.split(":");r=r.trim(),s=s&&s.trim(),r&&s&&t.set(r,s)}return t}function _c(e,t){if(e.size!==t.size)return!1;for(const[n,r]of e)if(r!==t.get(n))return!1;return!0}function Ji(e,t,n){const r=e.subTree;if(e.getCssVars&&(t===r||r&&r.type===ye&&r.children.includes(t))){const s=e.getCssVars();for(const i in s)n.set(`--${vl(i,!1)}`,String(s[i]))}t===r&&e.parent&&Ji(e.parent,e.vnode,n)}const ws="data-allow-mismatch",Xi={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function jt(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(ws);)e=e.parentElement;const n=e&&e.getAttribute(ws);if(n==null)return!1;if(n==="")return!0;{const r=n.split(",");return t===0&&r.includes("children")?!0:n.split(",").includes(Xi[t])}}an().requestIdleCallback;an().cancelIdleCallback;function vc(e,t){if(pt(e)&&e.data==="["){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(pt(r))if(r.data==="]"){if(--n===0)break}else r.data==="["&&n++;r=r.nextSibling}}else t(e)}const _t=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Vf(e){K(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let f=null,a,h=0;const y=()=>(h++,f=null,_()),_=()=>{let w;return f||(w=f=t().catch(b=>{if(b=b instanceof Error?b:new Error(String(b)),c)return new Promise((N,L)=>{c(b,()=>N(y()),()=>L(b),h+1)});throw b}).then(b=>w!==f&&f?f:(b&&(b.__esModule||b[Symbol.toStringTag]==="Module")&&(b=b.default),a=b,b)))};return zr({name:"AsyncComponentWrapper",__asyncLoader:_,__asyncHydrate(w,b,N){const L=i?()=>{const U=i(N,p=>vc(w,p));U&&(b.bum||(b.bum=[])).push(U)}:N;a?L():_().then(()=>!b.isUnmounted&&L())},get __asyncResolved(){return a},setup(){const w=de;if(Jr(w),a)return()=>ar(a,w);const b=p=>{f=null,fn(p,w,13,!r)};if(l&&w.suspense||It)return _().then(p=>()=>ar(p,w)).catch(p=>(b(p),()=>r?le(r,{error:p}):null));const N=ue(!1),L=ue(),U=ue(!!s);return s&&setTimeout(()=>{U.value=!1},s),o!=null&&setTimeout(()=>{if(!N.value&&!L.value){const p=new Error(`Async component timed out after ${o}ms.`);b(p),L.value=p}},o),_().then(()=>{N.value=!0,w.parent&&un(w.parent.vnode)&&w.parent.update()}).catch(p=>{b(p),L.value=p}),()=>{if(N.value&&a)return ar(a,w);if(L.value&&r)return le(r,{error:L.value});if(n&&!U.value)return le(n)}}})}function ar(e,t){const{ref:n,props:r,children:s,ce:i}=t.vnode,o=le(e,r,s);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const un=e=>e.type.__isKeepAlive;function bc(e,t){Zi(e,"a",t)}function wc(e,t){Zi(e,"da",t)}function Zi(e,t,n=de){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(Gn(t,r,n),n){let s=n.parent;for(;s&&s.parent;)un(s.parent.vnode)&&xc(r,t,n,s),s=s.parent}}function xc(e,t,n,r){const s=Gn(t,e,r,!0);zn(()=>{$r(r[t],s)},n)}function Gn(e,t,n=de,r=!1){if(n){const s=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{Je();const l=dn(n),c=Ne(t,n,e,o);return l(),Xe(),c});return r?s.unshift(i):s.push(i),i}}const Ze=e=>(t,n=de)=>{(!It||e==="sp")&&Gn(e,(...r)=>t(...r),n)},Tc=Ze("bm"),Ht=Ze("m"),Sc=Ze("bu"),Ec=Ze("u"),Qi=Ze("bum"),zn=Ze("um"),Cc=Ze("sp"),Ac=Ze("rtg"),Mc=Ze("rtc");function Rc(e,t=de){Gn("ec",e,t)}const Xr="components";function jf(e,t){return to(Xr,e,!0,t)||e}const eo=Symbol.for("v-ndc");function Uf(e){return te(e)?to(Xr,e,!1)||e:e||eo}function to(e,t,n=!0,r=!1){const s=he||de;if(s){const i=s.type;if(e===Xr){const l=Oo(i,!1);if(l&&(l===t||l===Ie(t)||l===Vn(Ie(t))))return i}const o=xs(s[e]||i[e],t)||xs(s.appContext[e],t);return!o&&r?i:o}}function xs(e,t){return e&&(e[t]||e[Ie(t)]||e[Vn(Ie(t))])}function Bf(e,t,n,r){let s;const i=n&&n[r],o=W(e);if(o||te(e)){const l=o&&yt(e);let c=!1;l&&(c=!Pe(e),e=Wn(e)),s=new Array(e.length);for(let f=0,a=e.length;ft(l,c,void 0,i&&i[c]));else{const l=Object.keys(e);s=new Array(l.length);for(let c=0,f=l.length;crn(t)?!(t.type===_e||t.type===ye&&!no(t.children)):!0)?e:null}function Kf(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:Tn(r)]=e[r];return n}const Ar=e=>e?Ao(e)?Qn(e):Ar(e.parent):null,Yt=fe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ar(e.parent),$root:e=>Ar(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Zr(e),$forceUpdate:e=>e.f||(e.f=()=>{Gr(e.update)}),$nextTick:e=>e.n||(e.n=Yn.bind(e.proxy)),$watch:e=>Zc.bind(e)}),fr=(e,t)=>e!==ee&&!e.__isScriptSetup&&Z(e,t),Oc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:s,props:i,accessCache:o,type:l,appContext:c}=e;let f;if(t[0]!=="$"){const _=o[t];if(_!==void 0)switch(_){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return i[t]}else{if(fr(r,t))return o[t]=1,r[t];if(s!==ee&&Z(s,t))return o[t]=2,s[t];if((f=e.propsOptions[0])&&Z(f,t))return o[t]=3,i[t];if(n!==ee&&Z(n,t))return o[t]=4,n[t];Mr&&(o[t]=0)}}const a=Yt[t];let h,y;if(a)return t==="$attrs"&&ge(e.attrs,"get",""),a(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==ee&&Z(n,t))return o[t]=4,n[t];if(y=c.config.globalProperties,Z(y,t))return y[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:i}=e;return fr(s,t)?(s[t]=n,!0):r!==ee&&Z(r,t)?(r[t]=n,!0):Z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:i}},o){let l;return!!n[o]||e!==ee&&Z(e,o)||fr(t,o)||(l=i[0])&&Z(l,o)||Z(r,o)||Z(Yt,o)||Z(s.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function qf(){return Pc().slots}function Pc(){const e=Zn();return e.setupContext||(e.setupContext=Ro(e))}function Ts(e){return W(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Mr=!0;function Ic(e){const t=Zr(e),n=e.proxy,r=e.ctx;Mr=!1,t.beforeCreate&&Ss(t.beforeCreate,e,"bc");const{data:s,computed:i,methods:o,watch:l,provide:c,inject:f,created:a,beforeMount:h,mounted:y,beforeUpdate:_,updated:w,activated:b,deactivated:N,beforeDestroy:L,beforeUnmount:U,destroyed:p,unmounted:g,render:A,renderTracked:H,renderTriggered:$,errorCaptured:k,serverPrefetch:R,expose:v,inheritAttrs:D,components:C,directives:Y,filters:X}=t;if(f&&Lc(f,r,null),o)for(const G in o){const V=o[G];K(V)&&(r[G]=V.bind(n))}if(s){const G=s.call(n,n);se(G)&&(e.data=Kn(G))}if(Mr=!0,i)for(const G in i){const V=i[G],ce=K(V)?V.bind(n,n):K(V.get)?V.get.bind(n,n):De,Qe=!K(V)&&K(V.set)?V.set.bind(n):De,ct=oe({get:ce,set:Qe});Object.defineProperty(r,G,{enumerable:!0,configurable:!0,get:()=>ct.value,set:Fe=>ct.value=Fe})}if(l)for(const G in l)ro(l[G],r,n,G);if(c){const G=K(c)?c.call(n):c;Reflect.ownKeys(G).forEach(V=>{kc(V,G[V])})}a&&Ss(a,e,"c");function j(G,V){W(V)?V.forEach(ce=>G(ce.bind(n))):V&&G(V.bind(n))}if(j(Tc,h),j(Ht,y),j(Sc,_),j(Ec,w),j(bc,b),j(wc,N),j(Rc,k),j(Mc,H),j(Ac,$),j(Qi,U),j(zn,g),j(Cc,R),W(v))if(v.length){const G=e.exposed||(e.exposed={});v.forEach(V=>{Object.defineProperty(G,V,{get:()=>n[V],set:ce=>n[V]=ce})})}else e.exposed||(e.exposed={});A&&e.render===De&&(e.render=A),D!=null&&(e.inheritAttrs=D),C&&(e.components=C),Y&&(e.directives=Y),R&&Jr(e)}function Lc(e,t,n=De){W(e)&&(e=Rr(e));for(const r in e){const s=e[r];let i;se(s)?"default"in s?i=Pt(s.from||r,s.default,!0):i=Pt(s.from||r):i=Pt(s),ae(i)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[r]=i}}function Ss(e,t,n){Ne(W(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function ro(e,t,n,r){let s=r.includes(".")?_o(n,r):()=>n[r];if(te(e)){const i=t[e];K(i)&&ot(s,i)}else if(K(e))ot(s,e.bind(n));else if(se(e))if(W(e))e.forEach(i=>ro(i,t,n,r));else{const i=K(e.handler)?e.handler.bind(n):t[e.handler];K(i)&&ot(s,i,e)}}function Zr(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(f=>Hn(c,f,o,!0)),Hn(c,t,o)),se(t)&&i.set(t,c),c}function Hn(e,t,n,r=!1){const{mixins:s,extends:i}=t;i&&Hn(e,i,n,!0),s&&s.forEach(o=>Hn(e,o,n,!0));for(const o in t)if(!(r&&o==="expose")){const l=Dc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Dc={data:Es,props:Cs,emits:Cs,methods:Ut,computed:Ut,beforeCreate:ve,created:ve,beforeMount:ve,mounted:ve,beforeUpdate:ve,updated:ve,beforeDestroy:ve,beforeUnmount:ve,destroyed:ve,unmounted:ve,activated:ve,deactivated:ve,errorCaptured:ve,serverPrefetch:ve,components:Ut,directives:Ut,watch:Nc,provide:Es,inject:Hc};function Es(e,t){return t?e?function(){return fe(K(e)?e.call(this,this):e,K(t)?t.call(this,this):t)}:t:e}function Hc(e,t){return Ut(Rr(e),Rr(t))}function Rr(e){if(W(e)){const t={};for(let n=0;n1)return n&&K(t)?t.call(r&&r.proxy):t}}const io={},oo=()=>Object.create(io),lo=e=>Object.getPrototypeOf(e)===io;function Vc(e,t,n,r=!1){const s={},i=oo();e.propsDefaults=Object.create(null),co(e,t,s,i);for(const o in e.propsOptions[0])o in s||(s[o]=void 0);n?e.props=r?s:Ul(s):e.type.props?e.props=s:e.props=i,e.attrs=i}function jc(e,t,n,r){const{props:s,attrs:i,vnode:{patchFlag:o}}=e,l=J(s),[c]=e.propsOptions;let f=!1;if((r||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[y,_]=ao(h,t,!0);fe(o,y),_&&l.push(..._)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return se(e)&&r.set(e,Ct),Ct;if(W(i))for(let a=0;ae[0]==="_"||e==="$stable",Qr=e=>W(e)?e.map(Re):[Re(e)],Bc=(e,t,n)=>{if(t._n)return t;const r=cc((...s)=>Qr(t(...s)),n);return r._c=!1,r},uo=(e,t,n)=>{const r=e._ctx;for(const s in e){if(fo(s))continue;const i=e[s];if(K(i))t[s]=Bc(s,i,r);else if(i!=null){const o=Qr(i);t[s]=()=>o}}},ho=(e,t)=>{const n=Qr(t);e.slots.default=()=>n},po=(e,t,n)=>{for(const r in t)(n||r!=="_")&&(e[r]=t[r])},Wc=(e,t,n)=>{const r=e.slots=oo();if(e.vnode.shapeFlag&32){const s=t._;s?(po(r,t,n),n&&pi(r,"_",s,!0)):uo(t,r)}else t&&ho(e,t)},Kc=(e,t,n)=>{const{vnode:r,slots:s}=e;let i=!0,o=ee;if(r.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:po(s,t,n):(i=!t.$stable,uo(t,s)),o=t}else t&&(ho(e,t),o={default:1});if(i)for(const l in s)!fo(l)&&o[l]==null&&delete s[l]};function qc(){typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__!="boolean"&&(an().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__=!1)}const be=xo;function Yc(e){return go(e)}function Gc(e){return go(e,gc)}function go(e,t){qc();const n=an();n.__VUE__=!0;const{insert:r,remove:s,patchProp:i,createElement:o,createText:l,createComment:c,setText:f,setElementText:a,parentNode:h,nextSibling:y,setScopeId:_=De,insertStaticContent:w}=e,b=(u,d,m,S=null,x=null,T=null,P=void 0,O=null,M=!!d.dynamicChildren)=>{if(u===d)return;u&&!gt(u,d)&&(S=hn(u),Fe(u,x,T,!0),u=null),d.patchFlag===-2&&(M=!1,d.dynamicChildren=null);const{type:E,ref:B,shapeFlag:I}=d;switch(E){case vt:N(u,d,m,S);break;case _e:L(u,d,m,S);break;case Gt:u==null&&U(d,m,S,P);break;case ye:C(u,d,m,S,x,T,P,O,M);break;default:I&1?A(u,d,m,S,x,T,P,O,M):I&6?Y(u,d,m,S,x,T,P,O,M):(I&64||I&128)&&E.process(u,d,m,S,x,T,P,O,M,xt)}B!=null&&x&&tn(B,u&&u.ref,T,d||u,!d)},N=(u,d,m,S)=>{if(u==null)r(d.el=l(d.children),m,S);else{const x=d.el=u.el;d.children!==u.children&&f(x,d.children)}},L=(u,d,m,S)=>{u==null?r(d.el=c(d.children||""),m,S):d.el=u.el},U=(u,d,m,S)=>{[u.el,u.anchor]=w(u.children,d,m,S,u.el,u.anchor)},p=({el:u,anchor:d},m,S)=>{let x;for(;u&&u!==d;)x=y(u),r(u,m,S),u=x;r(d,m,S)},g=({el:u,anchor:d})=>{let m;for(;u&&u!==d;)m=y(u),s(u),u=m;s(d)},A=(u,d,m,S,x,T,P,O,M)=>{d.type==="svg"?P="svg":d.type==="math"&&(P="mathml"),u==null?H(d,m,S,x,T,P,O,M):R(u,d,x,T,P,O,M)},H=(u,d,m,S,x,T,P,O)=>{let M,E;const{props:B,shapeFlag:I,transition:F,dirs:q}=u;if(M=u.el=o(u.type,T,B&&B.is,B),I&8?a(M,u.children):I&16&&k(u.children,M,null,S,x,ur(u,T),P,O),q&&Ve(u,null,S,"created"),$(M,u,u.scopeId,P,S),B){for(const ne in B)ne!=="value"&&!Mt(ne)&&i(M,ne,null,B[ne],T,S);"value"in B&&i(M,"value",null,B.value,T),(E=B.onVnodeBeforeMount)&&Me(E,S,u)}q&&Ve(u,null,S,"beforeMount");const z=mo(x,F);z&&F.beforeEnter(M),r(M,d,m),((E=B&&B.onVnodeMounted)||z||q)&&be(()=>{E&&Me(E,S,u),z&&F.enter(M),q&&Ve(u,null,S,"mounted")},x)},$=(u,d,m,S,x)=>{if(m&&_(u,m),S)for(let T=0;T{for(let E=M;E{const O=d.el=u.el;let{patchFlag:M,dynamicChildren:E,dirs:B}=d;M|=u.patchFlag&16;const I=u.props||ee,F=d.props||ee;let q;if(m&&ft(m,!1),(q=F.onVnodeBeforeUpdate)&&Me(q,m,d,u),B&&Ve(d,u,m,"beforeUpdate"),m&&ft(m,!0),(I.innerHTML&&F.innerHTML==null||I.textContent&&F.textContent==null)&&a(O,""),E?v(u.dynamicChildren,E,O,m,S,ur(d,x),T):P||V(u,d,O,null,m,S,ur(d,x),T,!1),M>0){if(M&16)D(O,I,F,m,x);else if(M&2&&I.class!==F.class&&i(O,"class",null,F.class,x),M&4&&i(O,"style",I.style,F.style,x),M&8){const z=d.dynamicProps;for(let ne=0;ne{q&&Me(q,m,d,u),B&&Ve(d,u,m,"updated")},S)},v=(u,d,m,S,x,T,P)=>{for(let O=0;O{if(d!==m){if(d!==ee)for(const T in d)!Mt(T)&&!(T in m)&&i(u,T,d[T],null,x,S);for(const T in m){if(Mt(T))continue;const P=m[T],O=d[T];P!==O&&T!=="value"&&i(u,T,O,P,x,S)}"value"in m&&i(u,"value",d.value,m.value,x)}},C=(u,d,m,S,x,T,P,O,M)=>{const E=d.el=u?u.el:l(""),B=d.anchor=u?u.anchor:l("");let{patchFlag:I,dynamicChildren:F,slotScopeIds:q}=d;q&&(O=O?O.concat(q):q),u==null?(r(E,m,S),r(B,m,S),k(d.children||[],m,B,x,T,P,O,M)):I>0&&I&64&&F&&u.dynamicChildren?(v(u.dynamicChildren,F,m,x,T,P,O),(d.key!=null||x&&d===x.subTree)&&es(u,d,!0)):V(u,d,m,B,x,T,P,O,M)},Y=(u,d,m,S,x,T,P,O,M)=>{d.slotScopeIds=O,u==null?d.shapeFlag&512?x.ctx.activate(d,m,S,P,M):X(d,m,S,x,T,P,M):ie(u,d,M)},X=(u,d,m,S,x,T,P)=>{const O=u.component=fa(u,S,x);if(un(u)&&(O.ctx.renderer=xt),ua(O,!1,P),O.asyncDep){if(x&&x.registerDep(O,j,P),!u.el){const M=O.subTree=le(_e);L(null,M,d,m)}}else j(O,u,d,m,x,T,P)},ie=(u,d,m)=>{const S=d.component=u.component;if(ra(u,d,m))if(S.asyncDep&&!S.asyncResolved){G(S,d,m);return}else S.next=d,S.update();else d.el=u.el,S.vnode=d},j=(u,d,m,S,x,T,P)=>{const O=()=>{if(u.isMounted){let{next:I,bu:F,u:q,parent:z,vnode:ne}=u;{const Se=yo(u);if(Se){I&&(I.el=ne.el,G(u,I,P)),Se.asyncDep.then(()=>{u.isUnmounted||O()});return}}let Q=I,Te;ft(u,!1),I?(I.el=ne.el,G(u,I,P)):I=ne,F&&Sn(F),(Te=I.props&&I.props.onVnodeBeforeUpdate)&&Me(Te,z,I,ne),ft(u,!0);const pe=dr(u),Le=u.subTree;u.subTree=pe,b(Le,pe,h(Le.el),hn(Le),u,x,T),I.el=pe.el,Q===null&&bo(u,pe.el),q&&be(q,x),(Te=I.props&&I.props.onVnodeUpdated)&&be(()=>Me(Te,z,I,ne),x)}else{let I;const{el:F,props:q}=d,{bm:z,m:ne,parent:Q,root:Te,type:pe}=u,Le=_t(d);if(ft(u,!1),z&&Sn(z),!Le&&(I=q&&q.onVnodeBeforeMount)&&Me(I,Q,d),ft(u,!0),F&&nr){const Se=()=>{u.subTree=dr(u),nr(F,u.subTree,u,x,null)};Le&&pe.__asyncHydrate?pe.__asyncHydrate(F,u,Se):Se()}else{Te.ce&&Te.ce._injectChildStyle(pe);const Se=u.subTree=dr(u);b(null,Se,m,S,u,x,T),d.el=Se.el}if(ne&&be(ne,x),!Le&&(I=q&&q.onVnodeMounted)){const Se=d;be(()=>Me(I,Q,Se),x)}(d.shapeFlag&256||Q&&_t(Q.vnode)&&Q.vnode.shapeFlag&256)&&u.a&&be(u.a,x),u.isMounted=!0,d=m=S=null}};u.scope.on();const M=u.effect=new vi(O);u.scope.off();const E=u.update=M.run.bind(M),B=u.job=M.runIfDirty.bind(M);B.i=u,B.id=u.uid,M.scheduler=()=>Gr(B),ft(u,!0),E()},G=(u,d,m)=>{d.component=u;const S=u.vnode.props;u.vnode=d,u.next=null,jc(u,d.props,S,m),Kc(u,d.children,m),Je(),hs(u),Xe()},V=(u,d,m,S,x,T,P,O,M=!1)=>{const E=u&&u.children,B=u?u.shapeFlag:0,I=d.children,{patchFlag:F,shapeFlag:q}=d;if(F>0){if(F&128){Qe(E,I,m,S,x,T,P,O,M);return}else if(F&256){ce(E,I,m,S,x,T,P,O,M);return}}q&8?(B&16&&Nt(E,x,T),I!==E&&a(m,I)):B&16?q&16?Qe(E,I,m,S,x,T,P,O,M):Nt(E,x,T,!0):(B&8&&a(m,""),q&16&&k(I,m,S,x,T,P,O,M))},ce=(u,d,m,S,x,T,P,O,M)=>{u=u||Ct,d=d||Ct;const E=u.length,B=d.length,I=Math.min(E,B);let F;for(F=0;FB?Nt(u,x,T,!0,!1,I):k(d,m,S,x,T,P,O,M,I)},Qe=(u,d,m,S,x,T,P,O,M)=>{let E=0;const B=d.length;let I=u.length-1,F=B-1;for(;E<=I&&E<=F;){const q=u[E],z=d[E]=M?st(d[E]):Re(d[E]);if(gt(q,z))b(q,z,m,null,x,T,P,O,M);else break;E++}for(;E<=I&&E<=F;){const q=u[I],z=d[F]=M?st(d[F]):Re(d[F]);if(gt(q,z))b(q,z,m,null,x,T,P,O,M);else break;I--,F--}if(E>I){if(E<=F){const q=F+1,z=qF)for(;E<=I;)Fe(u[E],x,T,!0),E++;else{const q=E,z=E,ne=new Map;for(E=z;E<=F;E++){const Ee=d[E]=M?st(d[E]):Re(d[E]);Ee.key!=null&&ne.set(Ee.key,E)}let Q,Te=0;const pe=F-z+1;let Le=!1,Se=0;const Ft=new Array(pe);for(E=0;E=pe){Fe(Ee,x,T,!0);continue}let $e;if(Ee.key!=null)$e=ne.get(Ee.key);else for(Q=z;Q<=F;Q++)if(Ft[Q-z]===0&>(Ee,d[Q])){$e=Q;break}$e===void 0?Fe(Ee,x,T,!0):(Ft[$e-z]=E+1,$e>=Se?Se=$e:Le=!0,b(Ee,d[$e],m,null,x,T,P,O,M),Te++)}const ls=Le?zc(Ft):Ct;for(Q=ls.length-1,E=pe-1;E>=0;E--){const Ee=z+E,$e=d[Ee],cs=Ee+1{const{el:T,type:P,transition:O,children:M,shapeFlag:E}=u;if(E&6){ct(u.component.subTree,d,m,S);return}if(E&128){u.suspense.move(d,m,S);return}if(E&64){P.move(u,d,m,xt);return}if(P===ye){r(T,d,m);for(let I=0;IO.enter(T),x);else{const{leave:I,delayLeave:F,afterLeave:q}=O,z=()=>r(T,d,m),ne=()=>{I(T,()=>{z(),q&&q()})};F?F(T,z,ne):ne()}else r(T,d,m)},Fe=(u,d,m,S=!1,x=!1)=>{const{type:T,props:P,ref:O,children:M,dynamicChildren:E,shapeFlag:B,patchFlag:I,dirs:F,cacheIndex:q}=u;if(I===-2&&(x=!1),O!=null&&tn(O,null,m,u,!0),q!=null&&(d.renderCache[q]=void 0),B&256){d.ctx.deactivate(u);return}const z=B&1&&F,ne=!_t(u);let Q;if(ne&&(Q=P&&P.onVnodeBeforeUnmount)&&Me(Q,d,u),B&6)nl(u.component,m,S);else{if(B&128){u.suspense.unmount(m,S);return}z&&Ve(u,null,d,"beforeUnmount"),B&64?u.type.remove(u,d,m,xt,S):E&&!E.hasOnce&&(T!==ye||I>0&&I&64)?Nt(E,d,m,!1,!0):(T===ye&&I&384||!x&&B&16)&&Nt(M,d,m),S&&is(u)}(ne&&(Q=P&&P.onVnodeUnmounted)||z)&&be(()=>{Q&&Me(Q,d,u),z&&Ve(u,null,d,"unmounted")},m)},is=u=>{const{type:d,el:m,anchor:S,transition:x}=u;if(d===ye){tl(m,S);return}if(d===Gt){g(u);return}const T=()=>{s(m),x&&!x.persisted&&x.afterLeave&&x.afterLeave()};if(u.shapeFlag&1&&x&&!x.persisted){const{leave:P,delayLeave:O}=x,M=()=>P(m,T);O?O(u.el,T,M):M()}else T()},tl=(u,d)=>{let m;for(;u!==d;)m=y(u),s(u),u=m;s(d)},nl=(u,d,m)=>{const{bum:S,scope:x,job:T,subTree:P,um:O,m:M,a:E}=u;Ms(M),Ms(E),S&&Sn(S),x.stop(),T&&(T.flags|=8,Fe(P,u,d,m)),O&&be(O,d),be(()=>{u.isUnmounted=!0},d),d&&d.pendingBranch&&!d.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===d.pendingId&&(d.deps--,d.deps===0&&d.resolve())},Nt=(u,d,m,S=!1,x=!1,T=0)=>{for(let P=T;P{if(u.shapeFlag&6)return hn(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const d=y(u.anchor||u.el),m=d&&d[ji];return m?y(m):d};let er=!1;const os=(u,d,m)=>{u==null?d._vnode&&Fe(d._vnode,null,null,!0):b(d._vnode||null,u,d,null,null,null,m),d._vnode=u,er||(er=!0,hs(),Ln(),er=!1)},xt={p:b,um:Fe,m:ct,r:is,mt:X,mc:k,pc:V,pbc:v,n:hn,o:e};let tr,nr;return t&&([tr,nr]=t(xt)),{render:os,hydrate:tr,createApp:$c(os,tr)}}function ur({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function ft({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function mo(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function es(e,t,n=!1){const r=e.children,s=t.children;if(W(r)&&W(s))for(let i=0;i>1,e[n[l]]0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function yo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:yo(t)}function Ms(e){if(e)for(let t=0;tPt(Jc);function ts(e,t){return Jn(e,null,t)}function Yf(e,t){return Jn(e,null,{flush:"post"})}function ot(e,t,n){return Jn(e,t,n)}function Jn(e,t,n=ee){const{immediate:r,deep:s,flush:i,once:o}=n,l=fe({},n),c=t&&r||!t&&i!=="post";let f;if(It){if(i==="sync"){const _=Xc();f=_.__watcherHandles||(_.__watcherHandles=[])}else if(!c){const _=()=>{};return _.stop=De,_.resume=De,_.pause=De,_}}const a=de;l.call=(_,w,b)=>Ne(_,a,w,b);let h=!1;i==="post"?l.scheduler=_=>{be(_,a&&a.suspense)}:i!=="sync"&&(h=!0,l.scheduler=(_,w)=>{w?_():Gr(_)}),l.augmentJob=_=>{t&&(_.flags|=4),h&&(_.flags|=2,a&&(_.id=a.uid,_.i=a))};const y=ec(e,t,l);return It&&(f?f.push(y):c&&y()),y}function Zc(e,t,n){const r=this.proxy,s=te(e)?e.includes(".")?_o(r,e):()=>r[e]:e.bind(r,r);let i;K(t)?i=t:(i=t.handler,n=t);const o=dn(this),l=Jn(s,i.bind(r),n);return o(),l}function _o(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ie(t)}Modifiers`]||e[`${ze(t)}Modifiers`];function ea(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||ee;let s=n;const i=t.startsWith("update:"),o=i&&Qc(r,t.slice(7));o&&(o.trim&&(s=n.map(a=>te(a)?a.trim():a)),o.number&&(s=n.map(br)));let l,c=r[l=Tn(t)]||r[l=Tn(Ie(t))];!c&&i&&(c=r[l=Tn(ze(t))]),c&&Ne(c,e,6,s);const f=r[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ne(f,e,6,s)}}function vo(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const i=e.emits;let o={},l=!1;if(!K(e)){const c=f=>{const a=vo(f,t,!0);a&&(l=!0,fe(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(se(e)&&r.set(e,null),null):(W(i)?i.forEach(c=>o[c]=null):fe(o,i),se(e)&&r.set(e,o),o)}function Xn(e,t){return!e||!cn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,ze(t))||Z(e,t))}function dr(e){const{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[i],slots:o,attrs:l,emit:c,render:f,renderCache:a,props:h,data:y,setupState:_,ctx:w,inheritAttrs:b}=e,N=Dn(e);let L,U;try{if(n.shapeFlag&4){const g=s||r,A=g;L=Re(f.call(A,g,a,h,_,y,w)),U=l}else{const g=t;L=Re(g.length>1?g(h,{attrs:l,slots:o,emit:c}):g(h,null)),U=t.props?l:ta(l)}}catch(g){zt.length=0,fn(g,e,1),L=le(_e)}let p=L;if(U&&b!==!1){const g=Object.keys(U),{shapeFlag:A}=p;g.length&&A&7&&(i&&g.some(Fr)&&(U=na(U,i)),p=lt(p,U,!1,!0))}return n.dirs&&(p=lt(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&en(p,n.transition),L=p,Dn(N),L}const ta=e=>{let t;for(const n in e)(n==="class"||n==="style"||cn(n))&&((t||(t={}))[n]=e[n]);return t},na=(e,t)=>{const n={};for(const r in e)(!Fr(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function ra(e,t,n){const{props:r,children:s,component:i}=e,{props:o,children:l,patchFlag:c}=t,f=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?Rs(r,o,f):!!o;if(c&8){const a=t.dynamicProps;for(let h=0;he.__isSuspense;function xo(e,t){t&&t.pendingBranch?W(e)?t.effects.push(...e):t.effects.push(e):lc(e)}const ye=Symbol.for("v-fgt"),vt=Symbol.for("v-txt"),_e=Symbol.for("v-cmt"),Gt=Symbol.for("v-stc"),zt=[];let Ce=null;function Pr(e=!1){zt.push(Ce=e?null:[])}function sa(){zt.pop(),Ce=zt[zt.length-1]||null}let nn=1;function Os(e,t=!1){nn+=e,e<0&&Ce&&t&&(Ce.hasOnce=!0)}function To(e){return e.dynamicChildren=nn>0?Ce||Ct:null,sa(),nn>0&&Ce&&Ce.push(e),e}function Gf(e,t,n,r,s,i){return To(Eo(e,t,n,r,s,i,!0))}function Ir(e,t,n,r,s){return To(le(e,t,n,r,s,!0))}function rn(e){return e?e.__v_isVNode===!0:!1}function gt(e,t){return e.type===t.type&&e.key===t.key}const So=({key:e})=>e??null,An=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?te(e)||ae(e)||K(e)?{i:he,r:e,k:t,f:!!n}:e:null);function Eo(e,t=null,n=null,r=0,s=null,i=e===ye?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&So(t),ref:t&&An(t),scopeId:Vi,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:he};return l?(ns(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=te(n)?8:16),nn>0&&!o&&Ce&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ce.push(c),c}const le=ia;function ia(e,t=null,n=null,r=0,s=null,i=!1){if((!e||e===eo)&&(e=_e),rn(e)){const l=lt(e,t,!0);return n&&ns(l,n),nn>0&&!i&&Ce&&(l.shapeFlag&6?Ce[Ce.indexOf(e)]=l:Ce.push(l)),l.patchFlag=-2,l}if(ma(e)&&(e=e.__vccOpts),t){t=oa(t);let{class:l,style:c}=t;l&&!te(l)&&(t.class=Un(l)),se(c)&&(qr(c)&&!W(c)&&(c=fe({},c)),t.style=jn(c))}const o=te(e)?1:wo(e)?128:Ui(e)?64:se(e)?4:K(e)?2:0;return Eo(e,t,n,r,s,o,i,!0)}function oa(e){return e?qr(e)||lo(e)?fe({},e):e:null}function lt(e,t,n=!1,r=!1){const{props:s,ref:i,patchFlag:o,children:l,transition:c}=e,f=t?la(s||{},t):s,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&So(f),ref:t&&t.ref?n&&i?W(i)?i.concat(An(t)):[i,An(t)]:An(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ye?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&<(e.ssContent),ssFallback:e.ssFallback&<(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&en(a,c.clone(a)),a}function Co(e=" ",t=0){return le(vt,null,e,t)}function zf(e,t){const n=le(Gt,null,e);return n.staticCount=t,n}function Jf(e="",t=!1){return t?(Pr(),Ir(_e,null,e)):le(_e,null,e)}function Re(e){return e==null||typeof e=="boolean"?le(_e):W(e)?le(ye,null,e.slice()):rn(e)?st(e):le(vt,null,String(e))}function st(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:lt(e)}function ns(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(W(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),ns(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!lo(t)?t._ctx=he:s===3&&he&&(he.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else K(t)?(t={default:t,_ctx:he},n=32):(t=String(t),r&64?(n=16,t=[Co(t)]):n=8);e.children=t,e.shapeFlag|=n}function la(...e){const t={};for(let n=0;nde||he;let Nn,Lr;{const e=an(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),i=>{s.length>1?s.forEach(o=>o(i)):s[0](i)}};Nn=t("__VUE_INSTANCE_SETTERS__",n=>de=n),Lr=t("__VUE_SSR_SETTERS__",n=>It=n)}const dn=e=>{const t=de;return Nn(e),e.scope.on(),()=>{e.scope.off(),Nn(t)}},Ps=()=>{de&&de.scope.off(),Nn(null)};function Ao(e){return e.vnode.shapeFlag&4}let It=!1;function ua(e,t=!1,n=!1){t&&Lr(t);const{props:r,children:s}=e.vnode,i=Ao(e);Vc(e,r,i,t),Wc(e,s,n);const o=i?da(e,t):void 0;return t&&Lr(!1),o}function da(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Oc);const{setup:r}=n;if(r){Je();const s=e.setupContext=r.length>1?Ro(e):null,i=dn(e),o=Dt(r,e,0,[e.props,s]),l=ui(o);if(Xe(),i(),(l||e.sp)&&!_t(e)&&Jr(e),l){if(o.then(Ps,Ps),t)return o.then(c=>{Is(e,c,t)}).catch(c=>{fn(c,e,0)});e.asyncDep=o}else Is(e,o,t)}else Mo(e,t)}function Is(e,t,n){K(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:se(t)&&(e.setupState=Hi(t)),Mo(e,n)}let Ls;function Mo(e,t,n){const r=e.type;if(!e.render){if(!t&&Ls&&!r.render){const s=r.template||Zr(e).template;if(s){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,f=fe(fe({isCustomElement:i,delimiters:l},o),c);r.render=Ls(s,f)}}e.render=r.render||De}{const s=dn(e);Je();try{Ic(e)}finally{Xe(),s()}}}const ha={get(e,t){return ge(e,"get",""),e[t]}};function Ro(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,ha),slots:e.slots,emit:e.emit,expose:t}}function Qn(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Hi(En(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Yt)return Yt[n](e)},has(t,n){return n in t||n in Yt}})):e.proxy}const pa=/(?:^|[-_])(\w)/g,ga=e=>e.replace(pa,t=>t.toUpperCase()).replace(/[-_]/g,"");function Oo(e,t=!0){return K(e)?e.displayName||e.name:e.name||t&&e.__name}function Po(e,t,n=!1){let r=Oo(t);if(!r&&t.__file){const s=t.__file.match(/([^/\\]+)\.\w+$/);s&&(r=s[1])}if(!r&&e&&e.parent){const s=i=>{for(const o in i)if(i[o]===t)return o};r=s(e.components||e.parent.type.components)||s(e.appContext.components)}return r?ga(r):n?"App":"Anonymous"}function ma(e){return K(e)&&"__vccOpts"in e}const oe=(e,t)=>Zl(e,t,It);function Dr(e,t,n){const r=arguments.length;return r===2?se(t)&&!W(t)?rn(t)?le(e,null,[t]):le(e,t):le(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&rn(n)&&(n=[n]),le(e,t,n))}const ya="3.5.13";/** -* @vue/runtime-dom v3.5.13 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Hr;const Ds=typeof window<"u"&&window.trustedTypes;if(Ds)try{Hr=Ds.createPolicy("vue",{createHTML:e=>e})}catch{}const Io=Hr?e=>Hr.createHTML(e):e=>e,_a="http://www.w3.org/2000/svg",va="http://www.w3.org/1998/Math/MathML",Ke=typeof document<"u"?document:null,Hs=Ke&&Ke.createElement("template"),ba={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?Ke.createElementNS(_a,e):t==="mathml"?Ke.createElementNS(va,e):n?Ke.createElement(e,{is:n}):Ke.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>Ke.createTextNode(e),createComment:e=>Ke.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ke.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,i){const o=n?n.previousSibling:t.lastChild;if(s&&(s===i||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===i||!(s=s.nextSibling)););else{Hs.innerHTML=Io(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const l=Hs.content;if(r==="svg"||r==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},et="transition",kt="animation",sn=Symbol("_vtc"),Lo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},wa=fe({},Ki,Lo),xa=e=>(e.displayName="Transition",e.props=wa,e),Xf=xa((e,{slots:t})=>Dr(dc,Ta(e),t)),ut=(e,t=[])=>{W(e)?e.forEach(n=>n(...t)):e&&e(...t)},Ns=e=>e?W(e)?e.some(t=>t.length>1):e.length>1:!1;function Ta(e){const t={};for(const C in e)C in Lo||(t[C]=e[C]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:f=o,appearToClass:a=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:y=`${n}-leave-active`,leaveToClass:_=`${n}-leave-to`}=e,w=Sa(s),b=w&&w[0],N=w&&w[1],{onBeforeEnter:L,onEnter:U,onEnterCancelled:p,onLeave:g,onLeaveCancelled:A,onBeforeAppear:H=L,onAppear:$=U,onAppearCancelled:k=p}=t,R=(C,Y,X,ie)=>{C._enterCancelled=ie,dt(C,Y?a:l),dt(C,Y?f:o),X&&X()},v=(C,Y)=>{C._isLeaving=!1,dt(C,h),dt(C,_),dt(C,y),Y&&Y()},D=C=>(Y,X)=>{const ie=C?$:U,j=()=>R(Y,C,X);ut(ie,[Y,j]),Fs(()=>{dt(Y,C?c:i),We(Y,C?a:l),Ns(ie)||$s(Y,r,b,j)})};return fe(t,{onBeforeEnter(C){ut(L,[C]),We(C,i),We(C,o)},onBeforeAppear(C){ut(H,[C]),We(C,c),We(C,f)},onEnter:D(!1),onAppear:D(!0),onLeave(C,Y){C._isLeaving=!0;const X=()=>v(C,Y);We(C,h),C._enterCancelled?(We(C,y),js()):(js(),We(C,y)),Fs(()=>{C._isLeaving&&(dt(C,h),We(C,_),Ns(g)||$s(C,r,N,X))}),ut(g,[C,X])},onEnterCancelled(C){R(C,!1,void 0,!0),ut(p,[C])},onAppearCancelled(C){R(C,!0,void 0,!0),ut(k,[C])},onLeaveCancelled(C){v(C),ut(A,[C])}})}function Sa(e){if(e==null)return null;if(se(e))return[hr(e.enter),hr(e.leave)];{const t=hr(e);return[t,t]}}function hr(e){return cl(e)}function We(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[sn]||(e[sn]=new Set)).add(t)}function dt(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[sn];n&&(n.delete(t),n.size||(e[sn]=void 0))}function Fs(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Ea=0;function $s(e,t,n,r){const s=e._endId=++Ea,i=()=>{s===e._endId&&r()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=Ca(e,t);if(!o)return r();const f=o+"end";let a=0;const h=()=>{e.removeEventListener(f,y),i()},y=_=>{_.target===e&&++a>=c&&h()};setTimeout(()=>{a(n[w]||"").split(", "),s=r(`${et}Delay`),i=r(`${et}Duration`),o=ks(s,i),l=r(`${kt}Delay`),c=r(`${kt}Duration`),f=ks(l,c);let a=null,h=0,y=0;t===et?o>0&&(a=et,h=o,y=i.length):t===kt?f>0&&(a=kt,h=f,y=c.length):(h=Math.max(o,f),a=h>0?o>f?et:kt:null,y=a?a===et?i.length:c.length:0);const _=a===et&&/\b(transform|all)(,|$)/.test(r(`${et}Property`).toString());return{type:a,timeout:h,propCount:y,hasTransform:_}}function ks(e,t){for(;e.lengthVs(n)+Vs(e[r])))}function Vs(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function js(){return document.body.offsetHeight}function Aa(e,t,n){const r=e[sn];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Fn=Symbol("_vod"),Do=Symbol("_vsh"),Zf={beforeMount(e,{value:t},{transition:n}){e[Fn]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Vt(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Vt(e,!0),r.enter(e)):r.leave(e,()=>{Vt(e,!1)}):Vt(e,t))},beforeUnmount(e,{value:t}){Vt(e,t)}};function Vt(e,t){e.style.display=t?e[Fn]:"none",e[Do]=!t}const Ma=Symbol(""),Ra=/(^|;)\s*display\s*:/;function Oa(e,t,n){const r=e.style,s=te(n);let i=!1;if(n&&!s){if(t)if(te(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&Mn(r,l,"")}else for(const o in t)n[o]==null&&Mn(r,o,"");for(const o in n)o==="display"&&(i=!0),Mn(r,o,n[o])}else if(s){if(t!==n){const o=r[Ma];o&&(n+=";"+o),r.cssText=n,i=Ra.test(n)}}else t&&e.removeAttribute("style");Fn in e&&(e[Fn]=i?r.display:"",e[Do]&&(r.display="none"))}const Us=/\s*!important$/;function Mn(e,t,n){if(W(n))n.forEach(r=>Mn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Pa(e,t);Us.test(n)?e.setProperty(ze(r),n.replace(Us,""),"important"):e[r]=n}}const Bs=["Webkit","Moz","ms"],pr={};function Pa(e,t){const n=pr[t];if(n)return n;let r=Ie(t);if(r!=="filter"&&r in e)return pr[t]=r;r=Vn(r);for(let s=0;sgr||(Ha.then(()=>gr=0),gr=Date.now());function Fa(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Ne($a(r,n.value),t,5,[r])};return n.value=e,n.attached=Na(),n}function $a(e,t){if(W(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const zs=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,ka=(e,t,n,r,s,i)=>{const o=s==="svg";t==="class"?Aa(e,r,o):t==="style"?Oa(e,n,r):cn(t)?Fr(t)||La(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Va(e,t,r,o))?(qs(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Ks(e,t,r,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!te(r))?qs(e,Ie(t),r,i,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),Ks(e,t,r,o))};function Va(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&zs(t)&&K(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return zs(t)&&te(n)?!1:t in e}const Js=e=>{const t=e.props["onUpdate:modelValue"]||!1;return W(t)?n=>Sn(t,n):t};function ja(e){e.target.composing=!0}function Xs(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const mr=Symbol("_assign"),Qf={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[mr]=Js(s);const i=r||s.props&&s.props.type==="number";Et(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=br(l)),e[mr](l)}),n&&Et(e,"change",()=>{e.value=e.value.trim()}),t||(Et(e,"compositionstart",ja),Et(e,"compositionend",Xs),Et(e,"change",Xs))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:i}},o){if(e[mr]=Js(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?br(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||s&&e.value.trim()===c)||(e.value=c))}},Ua=["ctrl","shift","alt","meta"],Ba={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Ua.some(n=>e[`${n}Key`]&&!t.includes(n))},eu=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(s,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=s=>{if(!("key"in s))return;const i=ze(s.key);if(t.some(o=>o===i||Wa[o]===i))return e(s)})},Ho=fe({patchProp:ka},ba);let Jt,Zs=!1;function Ka(){return Jt||(Jt=Yc(Ho))}function qa(){return Jt=Zs?Jt:Gc(Ho),Zs=!0,Jt}const nu=(...e)=>{const t=Ka().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Fo(r);if(!s)return;const i=t._component;!K(i)&&!i.render&&!i.template&&(i.template=s.innerHTML),s.nodeType===1&&(s.textContent="");const o=n(s,!1,No(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),o},t},ru=(...e)=>{const t=qa().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Fo(r);if(s)return n(s,!0,No(s))},t};function No(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Fo(e){return te(e)?document.querySelector(e):e}const su=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},Ya=window.__VP_SITE_DATA__;function rs(e){return _i()?(xl(e),!0):!1}function je(e){return typeof e=="function"?e():Di(e)}const $o=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Ga=Object.prototype.toString,za=e=>Ga.call(e)==="[object Object]",on=()=>{},Qs=Ja();function Ja(){var e,t;return $o&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function Xa(e,t){function n(...r){return new Promise((s,i)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(i)})}return n}const ko=e=>e();function Za(e,t={}){let n,r,s=on;const i=l=>{clearTimeout(l),s(),s=on};return l=>{const c=je(e),f=je(t.maxWait);return n&&i(n),c<=0||f!==void 0&&f<=0?(r&&(i(r),r=null),Promise.resolve(l())):new Promise((a,h)=>{s=t.rejectOnCancel?h:a,f&&!r&&(r=setTimeout(()=>{n&&i(n),r=null,a(l())},f)),n=setTimeout(()=>{r&&i(r),r=null,a(l())},c)})}}function Qa(e=ko){const t=ue(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...i)=>{t.value&&e(...i)};return{isActive:qn(t),pause:n,resume:r,eventFilter:s}}function ef(e){return e||Zn()}function Vo(...e){if(e.length!==1)return zl(...e);const t=e[0];return typeof t=="function"?qn(ql(()=>({get:t,set:on}))):ue(t)}function jo(e,t,n={}){const{eventFilter:r=ko,...s}=n;return ot(e,Xa(r,t),s)}function tf(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:i,pause:o,resume:l,isActive:c}=Qa(r);return{stop:jo(e,t,{...s,eventFilter:i}),pause:o,resume:l,isActive:c}}function Uo(e,t=!0,n){ef()?Ht(e,n):t?e():Yn(e)}function iu(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...i}=n;return jo(e,t,{...i,eventFilter:Za(r,{maxWait:s})})}function ou(e,t,n){let r;ae(n)?r={evaluating:n}:r=n||{};const{lazy:s=!1,evaluating:i=void 0,shallow:o=!0,onError:l=on}=r,c=ue(!s),f=o?Yr(t):ue(t);let a=0;return ts(async h=>{if(!c.value)return;a++;const y=a;let _=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const w=await e(b=>{h(()=>{i&&(i.value=!1),_||b()})});y===a&&(f.value=w)}catch(w){l(w)}finally{i&&y===a&&(i.value=!1),_=!0}}),s?oe(()=>(c.value=!0,f.value)):f}function Bo(e){var t;const n=je(e);return(t=n==null?void 0:n.$el)!=null?t:n}const Ue=$o?window:void 0;function ln(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=Ue):[t,n,r,s]=e,!t)return on;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const i=[],o=()=>{i.forEach(a=>a()),i.length=0},l=(a,h,y,_)=>(a.addEventListener(h,y,_),()=>a.removeEventListener(h,y,_)),c=ot(()=>[Bo(t),je(s)],([a,h])=>{if(o(),!a)return;const y=za(h)?{...h}:h;i.push(...n.flatMap(_=>r.map(w=>l(a,_,w,y))))},{immediate:!0,flush:"post"}),f=()=>{c(),o()};return rs(f),f}function nf(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function lu(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=Ue,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=r,c=nf(t);return ln(s,i,a=>{a.repeat&&je(l)||c(a)&&n(a)},o)}function rf(){const e=ue(!1),t=Zn();return t&&Ht(()=>{e.value=!0},t),e}function sf(e){const t=rf();return oe(()=>(t.value,!!e()))}function of(e,t={}){const{window:n=Ue}=t,r=sf(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const i=ue(!1),o=f=>{i.value=f.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",o):s.removeListener(o))},c=ts(()=>{r.value&&(l(),s=n.matchMedia(je(e)),"addEventListener"in s?s.addEventListener("change",o):s.addListener(o),i.value=s.matches)});return rs(()=>{c(),l(),s=void 0}),i}const bn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},wn="__vueuse_ssr_handlers__",lf=cf();function cf(){return wn in bn||(bn[wn]=bn[wn]||{}),bn[wn]}function Wo(e,t){return lf[e]||t}function af(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const ff={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},ei="vueuse-storage";function ss(e,t,n,r={}){var s;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:a,window:h=Ue,eventFilter:y,onError:_=v=>{console.error(v)},initOnMounted:w}=r,b=(a?Yr:ue)(typeof t=="function"?t():t);if(!n)try{n=Wo("getDefaultStorage",()=>{var v;return(v=Ue)==null?void 0:v.localStorage})()}catch(v){_(v)}if(!n)return b;const N=je(t),L=af(N),U=(s=r.serializer)!=null?s:ff[L],{pause:p,resume:g}=tf(b,()=>H(b.value),{flush:i,deep:o,eventFilter:y});h&&l&&Uo(()=>{ln(h,"storage",k),ln(h,ei,R),w&&k()}),w||k();function A(v,D){h&&h.dispatchEvent(new CustomEvent(ei,{detail:{key:e,oldValue:v,newValue:D,storageArea:n}}))}function H(v){try{const D=n.getItem(e);if(v==null)A(D,null),n.removeItem(e);else{const C=U.write(v);D!==C&&(n.setItem(e,C),A(D,C))}}catch(D){_(D)}}function $(v){const D=v?v.newValue:n.getItem(e);if(D==null)return c&&N!=null&&n.setItem(e,U.write(N)),N;if(!v&&f){const C=U.read(D);return typeof f=="function"?f(C,N):L==="object"&&!Array.isArray(C)?{...N,...C}:C}else return typeof D!="string"?D:U.read(D)}function k(v){if(!(v&&v.storageArea!==n)){if(v&&v.key==null){b.value=N;return}if(!(v&&v.key!==e)){p();try{(v==null?void 0:v.newValue)!==U.write(b.value)&&(b.value=$(v))}catch(D){_(D)}finally{v?Yn(g):g()}}}}function R(v){k(v.detail)}return b}function Ko(e){return of("(prefers-color-scheme: dark)",e)}function uf(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=Ue,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:f,disableTransition:a=!0}=e,h={auto:"",light:"light",dark:"dark",...e.modes||{}},y=Ko({window:s}),_=oe(()=>y.value?"dark":"light"),w=c||(o==null?Vo(r):ss(o,r,i,{window:s,listenToStorageChanges:l})),b=oe(()=>w.value==="auto"?_.value:w.value),N=Wo("updateHTMLAttrs",(g,A,H)=>{const $=typeof g=="string"?s==null?void 0:s.document.querySelector(g):Bo(g);if(!$)return;let k;if(a){k=s.document.createElement("style");const R="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";k.appendChild(document.createTextNode(R)),s.document.head.appendChild(k)}if(A==="class"){const R=H.split(/\s/g);Object.values(h).flatMap(v=>(v||"").split(/\s/g)).filter(Boolean).forEach(v=>{R.includes(v)?$.classList.add(v):$.classList.remove(v)})}else $.setAttribute(A,H);a&&(s.getComputedStyle(k).opacity,document.head.removeChild(k))});function L(g){var A;N(t,n,(A=h[g])!=null?A:g)}function U(g){e.onChanged?e.onChanged(g,L):L(g)}ot(b,U,{flush:"post",immediate:!0}),Uo(()=>U(b.value));const p=oe({get(){return f?w.value:b.value},set(g){w.value=g}});try{return Object.assign(p,{store:w,system:_,state:b})}catch{return p}}function df(e={}){const{valueDark:t="dark",valueLight:n="",window:r=Ue}=e,s=uf({...e,onChanged:(l,c)=>{var f;e.onChanged?(f=e.onChanged)==null||f.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),i=oe(()=>s.system?s.system.value:Ko({window:r}).value?"dark":"light");return oe({get(){return s.value==="dark"},set(l){const c=l?"dark":"light";i.value===c?s.value="auto":s.value=c}})}function yr(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function cu(e,t,n={}){const{window:r=Ue}=n;return ss(e,t,r==null?void 0:r.localStorage,n)}function qo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const _r=new WeakMap;function au(e,t=!1){const n=ue(t);let r=null,s="";ot(Vo(e),l=>{const c=yr(je(l));if(c){const f=c;if(_r.get(f)||_r.set(f,f.style.overflow),f.style.overflow!=="hidden"&&(s=f.style.overflow),f.style.overflow==="hidden")return n.value=!0;if(n.value)return f.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=yr(je(e));!l||n.value||(Qs&&(r=ln(l,"touchmove",c=>{hf(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=yr(je(e));!l||!n.value||(Qs&&(r==null||r()),l.style.overflow=s,_r.delete(l),n.value=!1)};return rs(o),oe({get(){return n.value},set(l){l?i():o()}})}function fu(e,t,n={}){const{window:r=Ue}=n;return ss(e,t,r==null?void 0:r.sessionStorage,n)}function uu(e={}){const{window:t=Ue,behavior:n="auto"}=e;if(!t)return{x:ue(0),y:ue(0)};const r=ue(t.scrollX),s=ue(t.scrollY),i=oe({get(){return r.value},set(l){scrollTo({left:l,behavior:n})}}),o=oe({get(){return s.value},set(l){scrollTo({top:l,behavior:n})}});return ln(t,"scroll",()=>{r.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:i,y:o}}const Yo=/^[a-z]+:/i,pf="vitepress-theme-appearance",Go=/#.*$/,gf=/(index)?\.(md|html)$/,Oe=typeof document<"u",zo={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function mf(e,t,n=!1){if(t===void 0)return!1;if(e=ti(`/${e}`),n)return new RegExp(t).test(e);if(ti(t)!==e)return!1;const r=t.match(Go);return r?(Oe?location.hash:"")===r[0]:!0}function ti(e){return decodeURI(e).replace(Go,"").replace(gf,"")}function yf(e){return Yo.test(e)}function _f(e,t){var r,s,i,o,l,c,f;const n=Object.keys(e.locales).find(a=>a!=="root"&&!yf(a)&&mf(t,`/${a}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Xo(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(f=e.locales[n])==null?void 0:f.themeConfig}})}function Jo(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=vf(e.title,r);return`${n}${s}`}function vf(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function bf(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([i,o])=>i===n&&o[s[0]]===s[1])}function Xo(e,t){return[...e.filter(n=>!bf(t,n)),...t]}const wf=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,xf=/^[a-z]:/i;function ni(e){const t=xf.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(wf,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Tf=Symbol(),bt=Yr(Ya);function du(e){const t=oe(()=>_f(bt.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?ue(!0):n?df({storageKey:pf,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):ue(!1);return{site:t,theme:oe(()=>t.value.themeConfig),page:oe(()=>e.data),frontmatter:oe(()=>e.data.frontmatter),params:oe(()=>e.data.params),lang:oe(()=>t.value.lang),dir:oe(()=>t.value.dir),localeIndex:oe(()=>t.value.localeIndex||"root"),title:oe(()=>Jo(t.value,e.data)),description:oe(()=>e.data.description||t.value.description),isDark:r}}function Sf(){const e=Pt(Tf);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ef(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function ri(e){return Yo.test(e)||!e.startsWith("/")?e:Ef(bt.value.base,e)}function Cf(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Oe){const n="/";t=ni(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${ni(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let Rn=[];function hu(e){Rn.push(e),zn(()=>{Rn=Rn.filter(t=>t!==e)})}const Af=Symbol(),Zo="http://a.com",Mf=()=>({path:"/",component:null,data:zo});function pu(e,t){const n=Kn(Mf()),r={route:n,go:s};async function s(l=Oe?location.href:"/"){var c,f;l=Nr(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(oi(l),await o(l),await((f=r.onAfterRouteChanged)==null?void 0:f.call(r,l)))}let i=null;async function o(l,c=0,f=!1){var y;if(await((y=r.onBeforePageLoad)==null?void 0:y.call(r,l))===!1)return;const a=new URL(l,Zo),h=i=a.pathname;try{let _=await e(h);if(!_)throw new Error(`Page not found: ${h}`);if(i===h){i=null;const{default:w,__pageData:b}=_;if(!w)throw new Error(`Invalid route component: ${w}`);n.path=Oe?h:ri(h),n.component=En(w),n.data=En(b),Oe&&Yn(()=>{let N=bt.value.base+b.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!bt.value.cleanUrls&&!N.endsWith("/")&&(N+=".html"),N!==a.pathname&&(a.pathname=N,l=N+a.search+a.hash,history.replaceState(null,"",l)),a.hash&&!c){let L=null;try{L=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(U){console.warn(U)}if(L){si(L,a.hash);return}}window.scrollTo(0,c)})}}catch(_){if(!/fetch|Page not found/.test(_.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(_),!f)try{const w=await fetch(bt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await w.json(),await o(l,c,!0);return}catch{}i===h&&(i=null,n.path=Oe?h:ri(h),n.component=t?En(t):null,n.data=zo)}}return Oe&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const f=l.target.closest("a");if(f&&!f.closest(".vp-raw")&&(f instanceof SVGElement||!f.download)){const{target:a}=f,{href:h,origin:y,pathname:_,hash:w,search:b}=new URL(f.href instanceof SVGAnimatedString?f.href.animVal:f.href,f.baseURI),N=window.location,L=_.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!a&&y===N.origin&&!(L&&L[0]!==".html")&&(l.preventDefault(),_===N.pathname&&b===N.search?(w!==N.hash&&(history.pushState(null,"",w),window.dispatchEvent(new Event("hashchange"))),w?si(f,w,f.classList.contains("header-anchor")):(oi(h),window.scrollTo(0,0))):s(h))}},{capture:!0}),window.addEventListener("popstate",l=>{o(Nr(location.href),l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function Rf(){const e=Pt(Af);if(!e)throw new Error("useRouter() is called without provider.");return e}function Qo(){return Rf().route}function si(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let f=function(){!n||Math.abs(c-window.scrollY)>window.innerHeight?window.scrollTo(0,c):window.scrollTo({left:0,top:c,behavior:"smooth"})},s=bt.value.scrollOffset,i=0,o=24;if(typeof s=="object"&&"padding"in s&&(o=s.padding,s=s.selector),typeof s=="number")i=s;else if(typeof s=="string")i=ii(s,o);else if(Array.isArray(s))for(const a of s){const h=ii(a,o);if(h){i=h;break}}const l=parseInt(window.getComputedStyle(r).paddingTop,10),c=window.scrollY+r.getBoundingClientRect().top-i+l;requestAnimationFrame(f)}}function ii(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}function oi(e){Oe&&e!==Nr(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function Nr(e){const t=new URL(e,Zo);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),bt.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const li=()=>Rn.forEach(e=>e()),gu=zr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Qo(),{site:n}=Sf();return()=>Dr(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?Dr(t.component,{onVnodeMounted:li,onVnodeUpdated:li}):"404 Page Not Found"])}}),Of="modulepreload",Pf=function(e){return"/"+e},ci={},mu=function(t,n,r){if(!n||n.length===0)return t();const s=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=Pf(i),i in ci)return;ci[i]=!0;const o=i.endsWith(".css"),l=o?'[rel="stylesheet"]':"";if(!!r)for(let a=s.length-1;a>=0;a--){const h=s[a];if(h.href===i&&(!o||h.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const f=document.createElement("link");if(f.rel=o?"stylesheet":Of,o||(f.as="script",f.crossOrigin=""),f.href=i,document.head.appendChild(f),o)return new Promise((a,h)=>{f.addEventListener("load",a),f.addEventListener("error",()=>h(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t()).catch(i=>{const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=i,window.dispatchEvent(o),!o.defaultPrevented)throw i})},yu=zr({setup(e,{slots:t}){const n=ue(!1);return Ht(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function _u(){Oe&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const i=r.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(f=>f.classList.contains("active"));if(!o)return;const l=i.children[s];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function vu(){if(Oe){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,i=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className);let l="";i.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` -`),l=l.slice(0,-1),o&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),If(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function If(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function bu(e,t){let n=[],r=!0;const s=i=>{if(r){r=!1;return}n.forEach(o=>document.head.removeChild(o)),n=[],i.forEach(o=>{const l=ai(o);document.head.appendChild(l),n.push(l)})};ts(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[];document.title=Jo(o,i);const f=l||o.description;let a=document.querySelector("meta[name=description]");a?a.setAttribute("content",f):ai(["meta",{name:"description",content:f}]),s(Xo(o.head,Df(c)))})}function ai([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function Lf(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Df(e){return e.filter(t=>!Lf(t))}const vr=new Set,el=()=>document.createElement("link"),Hf=e=>{const t=el();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Nf=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let xn;const Ff=Oe&&(xn=el())&&xn.relList&&xn.relList.supports&&xn.relList.supports("prefetch")?Hf:Nf;function wu(){if(!Oe||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const r=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!vr.has(c)){vr.add(c);const f=Cf(c);f&&Ff(f)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):vr.add(l))})})};Ht(r);const s=Qo();ot(()=>s.path,r),zn(()=>{n&&n.disconnect()})}export{$f as $,jf as A,Bf as B,Yr as C,hu as D,le as E,ye as F,Uf as G,Yo as H,Qo as I,la as J,Pt as K,jn as L,Yn as M,uu as N,zf as O,qn as P,lu as Q,Vf as R,mu as S,Xf as T,au as U,kc as V,Kf as W,tu as X,eu as Y,qf as Z,su as _,Co as a,Zf as a0,bu as a1,Af as a2,du as a3,Tf as a4,gu as a5,yu as a6,bt as a7,ru as a8,pu as a9,Cf as aa,wu as ab,vu as ac,_u as ad,Dr as ae,Bo as af,rs as ag,ou as ah,fu as ai,cu as aj,iu as ak,Rf as al,ln as am,Qi as an,Qf as ao,ae as ap,kf as aq,En as ar,nu as as,Ir as b,Gf as c,zr as d,Jf as e,ri as f,oe as g,ue as h,yf as i,Ht as j,Eo as k,Di as l,mf as m,Un as n,Pr as o,Oe as p,of as q,Wf as r,ot as s,bl as t,Sf as u,ts as v,cc as w,zn as x,Yf as y,Ec as z}; diff --git a/assets/chunks/framework.ece1a6f0.js b/assets/chunks/framework.ece1a6f0.js new file mode 100644 index 0000000..3cd4a3d --- /dev/null +++ b/assets/chunks/framework.ece1a6f0.js @@ -0,0 +1,34 @@ +/** +* @vue/shared v3.5.16 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**//*! #__NO_SIDE_EFFECTS__ */function Lt(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const ee={},Ct=[],De=()=>{},rl=()=>!1,cn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Fr=e=>e.startsWith("onUpdate:"),fe=Object.assign,$r=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},sl=Object.prototype.hasOwnProperty,Z=(e,t)=>sl.call(e,t),W=Array.isArray,At=e=>kn(e)==="[object Map]",ui=e=>kn(e)==="[object Set]",K=e=>typeof e=="function",te=e=>typeof e=="string",Je=e=>typeof e=="symbol",se=e=>e!==null&&typeof e=="object",di=e=>(se(e)||K(e))&&K(e.then)&&K(e.catch),hi=Object.prototype.toString,kn=e=>hi.call(e),il=e=>kn(e).slice(8,-1),pi=e=>kn(e)==="[object Object]",kr=e=>te(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,Mt=Lt(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Vn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},ol=/-(\w)/g,Pe=Vn(e=>e.replace(ol,(t,n)=>n?n.toUpperCase():"")),ll=/\B([A-Z])/g,Xe=Vn(e=>e.replace(ll,"-$1").toLowerCase()),jn=Vn(e=>e.charAt(0).toUpperCase()+e.slice(1)),Tn=Vn(e=>e?`on${jn(e)}`:""),it=(e,t)=>!Object.is(e,t),Sn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:r,value:n})},wr=e=>{const t=parseFloat(e);return isNaN(t)?e:t},cl=e=>{const t=te(e)?Number(e):NaN;return isNaN(t)?e:t};let fs;const an=()=>fs||(fs=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Un(e){if(W(e)){const t={};for(let n=0;n{if(n){const r=n.split(fl);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function hl(e){if(!e)return"";if(te(e))return e;let t="";for(const n in e){const r=e[n];if(te(r)||typeof r=="number"){const s=n.startsWith("--")?n:Xe(n);t+=`${s}:${r};`}}return t}function Bn(e){let t="";if(te(e))t=e;else if(W(e))for(let n=0;n?@[\\\]^`{|}~]/g;function vl(e,t){return e.replace(_l,n=>t?n==='"'?'\\\\\\"':`\\\\${n}`:`\\${n}`)}const yi=e=>!!(e&&e.__v_isRef===!0),bl=e=>te(e)?e:e==null?"":W(e)||se(e)&&(e.toString===hi||!K(e.toString))?yi(e)?bl(e.value):JSON.stringify(e,_i,2):String(e),_i=(e,t)=>yi(t)?_i(e,t.value):At(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s],i)=>(n[sr(r,i)+" =>"]=s,n),{})}:ui(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>sr(n))}:Je(t)?sr(t):se(t)&&!W(t)&&!pi(t)?String(t):t,sr=(e,t="")=>{var n;return Je(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** +* @vue/reactivity v3.5.16 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let ye;class wl{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=ye,!t&&ye&&(this.index=(ye.scopes||(ye.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(ye=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,r;for(n=0,r=this.effects.length;n0)return;if(Wt){let t=Wt;for(Wt=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;Bt;){let t=Bt;for(Bt=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(r){e||(e=r)}t=n}}if(e)throw e}function Ti(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Si(e){let t,n=e.depsTail,r=n;for(;r;){const s=r.prevDep;r.version===-1?(r===n&&(n=s),Br(r),Tl(r)):t=r,r.dep.activeLink=r.prevActiveLink,r.prevActiveLink=void 0,r=s}e.deps=t,e.depsTail=n}function xr(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Ei(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Ei(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Xt)||(e.globalVersion=Xt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!xr(e))))return;e.flags|=2;const t=e.dep,n=re,r=He;re=e,He=!0;try{Ti(e);const s=e.fn(e._value);(t.version===0||it(s,e._value))&&(e.flags|=128,e._value=s,t.version++)}catch(s){throw t.version++,s}finally{re=n,He=r,Si(e),e.flags&=-3}}function Br(e,t=!1){const{dep:n,prevSub:r,nextSub:s}=e;if(r&&(r.nextSub=s,e.prevSub=void 0),s&&(s.prevSub=r,e.nextSub=void 0),n.subs===e&&(n.subs=r,!r&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)Br(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Tl(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let He=!0;const Ci=[];function Ue(){Ci.push(He),He=!1}function Be(){const e=Ci.pop();He=e===void 0?!0:e}function ds(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=re;re=void 0;try{t()}finally{re=n}}}let Xt=0;class Sl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Wn{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0}track(t){if(!re||!He||re===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==re)n=this.activeLink=new Sl(re,this),re.deps?(n.prevDep=re.depsTail,re.depsTail.nextDep=n,re.depsTail=n):re.deps=re.depsTail=n,Ai(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const r=n.nextDep;r.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=r),n.prevDep=re.depsTail,n.nextDep=void 0,re.depsTail.nextDep=n,re.depsTail=n,re.deps===n&&(re.deps=r)}return n}trigger(t){this.version++,Xt++,this.notify(t)}notify(t){jr();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{Ur()}}}function Ai(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let r=t.deps;r;r=r.nextDep)Ai(r)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const On=new WeakMap,yt=Symbol(""),Tr=Symbol(""),Zt=Symbol("");function _e(e,t,n){if(He&&re){let r=On.get(e);r||On.set(e,r=new Map);let s=r.get(n);s||(r.set(n,s=new Wn),s.map=r,s.key=n),s.track()}}function Ge(e,t,n,r,s,i){const o=On.get(e);if(!o){Xt++;return}const l=c=>{c&&c.trigger()};if(jr(),t==="clear")o.forEach(l);else{const c=W(e),f=c&&kr(n);if(c&&n==="length"){const a=Number(r);o.forEach((d,y)=>{(y==="length"||y===Zt||!Je(y)&&y>=a)&&l(d)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),f&&l(o.get(Zt)),t){case"add":c?f&&l(o.get("length")):(l(o.get(yt)),At(e)&&l(o.get(Tr)));break;case"delete":c||(l(o.get(yt)),At(e)&&l(o.get(Tr)));break;case"set":At(e)&&l(o.get(yt));break}}Ur()}function El(e,t){const n=On.get(e);return n&&n.get(t)}function Tt(e){const t=J(e);return t===e?t:(_e(t,"iterate",Zt),Ie(e)?t:t.map(pe))}function Kn(e){return _e(e=J(e),"iterate",Zt),e}const Cl={__proto__:null,[Symbol.iterator](){return or(this,Symbol.iterator,pe)},concat(...e){return Tt(this).concat(...e.map(t=>W(t)?Tt(t):t))},entries(){return or(this,"entries",e=>(e[1]=pe(e[1]),e))},every(e,t){return Ke(this,"every",e,t,void 0,arguments)},filter(e,t){return Ke(this,"filter",e,t,n=>n.map(pe),arguments)},find(e,t){return Ke(this,"find",e,t,pe,arguments)},findIndex(e,t){return Ke(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ke(this,"findLast",e,t,pe,arguments)},findLastIndex(e,t){return Ke(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ke(this,"forEach",e,t,void 0,arguments)},includes(...e){return lr(this,"includes",e)},indexOf(...e){return lr(this,"indexOf",e)},join(e){return Tt(this).join(e)},lastIndexOf(...e){return lr(this,"lastIndexOf",e)},map(e,t){return Ke(this,"map",e,t,void 0,arguments)},pop(){return $t(this,"pop")},push(...e){return $t(this,"push",e)},reduce(e,...t){return hs(this,"reduce",e,t)},reduceRight(e,...t){return hs(this,"reduceRight",e,t)},shift(){return $t(this,"shift")},some(e,t){return Ke(this,"some",e,t,void 0,arguments)},splice(...e){return $t(this,"splice",e)},toReversed(){return Tt(this).toReversed()},toSorted(e){return Tt(this).toSorted(e)},toSpliced(...e){return Tt(this).toSpliced(...e)},unshift(...e){return $t(this,"unshift",e)},values(){return or(this,"values",pe)}};function or(e,t,n){const r=Kn(e),s=r[t]();return r!==e&&!Ie(e)&&(s._next=s.next,s.next=()=>{const i=s._next();return i.value&&(i.value=n(i.value)),i}),s}const Al=Array.prototype;function Ke(e,t,n,r,s,i){const o=Kn(e),l=o!==e&&!Ie(e),c=o[t];if(c!==Al[t]){const d=c.apply(e,i);return l?pe(d):d}let f=n;o!==e&&(l?f=function(d,y){return n.call(this,pe(d),y,e)}:n.length>2&&(f=function(d,y){return n.call(this,d,y,e)}));const a=c.call(o,f,r);return l&&s?s(a):a}function hs(e,t,n,r){const s=Kn(e);let i=n;return s!==e&&(Ie(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,pe(l),c,e)}),s[t](i,...r)}function lr(e,t,n){const r=J(e);_e(r,"iterate",Zt);const s=r[t](...n);return(s===-1||s===!1)&&qr(n[0])?(n[0]=J(n[0]),r[t](...n)):s}function $t(e,t,n=[]){Ue(),jr();const r=J(e)[t].apply(e,n);return Ur(),Be(),r}const Ml=Lt("__proto__,__v_isRef,__isVue"),Mi=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Je));function Rl(e){Je(e)||(e=String(e));const t=J(this);return _e(t,"has",e),t.hasOwnProperty(e)}class Ri{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,r){if(n==="__v_skip")return t.__v_skip;const s=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!s;if(n==="__v_isReadonly")return s;if(n==="__v_isShallow")return i;if(n==="__v_raw")return r===(s?i?kl:Li:i?Pi:Ii).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(r)?t:void 0;const o=W(t);if(!s){let c;if(o&&(c=Cl[n]))return c;if(n==="hasOwnProperty")return Rl}const l=Reflect.get(t,n,ae(t)?t:r);return(Je(n)?Mi.has(n):Ml(n))||(s||_e(t,"get",n),i)?l:ae(l)?o&&kr(n)?l:l.value:se(l)?s?Yn(l):qn(l):l}}class Oi extends Ri{constructor(t=!1){super(!1,t)}set(t,n,r,s){let i=t[n];if(!this._isShallow){const c=lt(i);if(!Ie(r)&&!lt(r)&&(i=J(i),r=J(r)),!W(t)&&ae(i)&&!ae(r))return c?!1:(i.value=r,!0)}const o=W(t)&&kr(n)?Number(n)e,pn=e=>Reflect.getPrototypeOf(e);function Dl(e,t,n){return function(...r){const s=this.__v_raw,i=J(s),o=At(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,f=s[e](...r),a=n?Sr:t?In:pe;return!t&&_e(i,"iterate",c?Tr:yt),{next(){const{value:d,done:y}=f.next();return y?{value:d,done:y}:{value:l?[a(d[0]),a(d[1])]:a(d),done:y}},[Symbol.iterator](){return this}}}}function gn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Hl(e,t){const n={get(s){const i=this.__v_raw,o=J(i),l=J(s);e||(it(s,l)&&_e(o,"get",s),_e(o,"get",l));const{has:c}=pn(o),f=t?Sr:e?In:pe;if(c.call(o,s))return f(i.get(s));if(c.call(o,l))return f(i.get(l));i!==o&&i.get(s)},get size(){const s=this.__v_raw;return!e&&_e(J(s),"iterate",yt),Reflect.get(s,"size",s)},has(s){const i=this.__v_raw,o=J(i),l=J(s);return e||(it(s,l)&&_e(o,"has",s),_e(o,"has",l)),s===l?i.has(s):i.has(s)||i.has(l)},forEach(s,i){const o=this,l=o.__v_raw,c=J(l),f=t?Sr:e?In:pe;return!e&&_e(c,"iterate",yt),l.forEach((a,d)=>s.call(i,f(a),f(d),o))}};return fe(n,e?{add:gn("add"),set:gn("set"),delete:gn("delete"),clear:gn("clear")}:{add(s){!t&&!Ie(s)&&!lt(s)&&(s=J(s));const i=J(this);return pn(i).has.call(i,s)||(i.add(s),Ge(i,"add",s,s)),this},set(s,i){!t&&!Ie(i)&&!lt(i)&&(i=J(i));const o=J(this),{has:l,get:c}=pn(o);let f=l.call(o,s);f||(s=J(s),f=l.call(o,s));const a=c.call(o,s);return o.set(s,i),f?it(i,a)&&Ge(o,"set",s,i):Ge(o,"add",s,i),this},delete(s){const i=J(this),{has:o,get:l}=pn(i);let c=o.call(i,s);c||(s=J(s),c=o.call(i,s)),l&&l.call(i,s);const f=i.delete(s);return c&&Ge(i,"delete",s,void 0),f},clear(){const s=J(this),i=s.size!==0,o=s.clear();return i&&Ge(s,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(s=>{n[s]=Dl(s,e,t)}),n}function Wr(e,t){const n=Hl(e,t);return(r,s,i)=>s==="__v_isReactive"?!e:s==="__v_isReadonly"?e:s==="__v_raw"?r:Reflect.get(Z(n,s)&&s in r?n:r,s,i)}const Nl={get:Wr(!1,!1)},Fl={get:Wr(!1,!0)},$l={get:Wr(!0,!1)};const Ii=new WeakMap,Pi=new WeakMap,Li=new WeakMap,kl=new WeakMap;function Vl(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function jl(e){return e.__v_skip||!Object.isExtensible(e)?0:Vl(il(e))}function qn(e){return lt(e)?e:Kr(e,!1,Il,Nl,Ii)}function Ul(e){return Kr(e,!1,Ll,Fl,Pi)}function Yn(e){return Kr(e,!0,Pl,$l,Li)}function Kr(e,t,n,r,s){if(!se(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=jl(e);if(i===0)return e;const o=s.get(e);if(o)return o;const l=new Proxy(e,i===2?r:n);return s.set(e,l),l}function _t(e){return lt(e)?_t(e.__v_raw):!!(e&&e.__v_isReactive)}function lt(e){return!!(e&&e.__v_isReadonly)}function Ie(e){return!!(e&&e.__v_isShallow)}function qr(e){return e?!!e.__v_raw:!1}function J(e){const t=e&&e.__v_raw;return t?J(t):e}function En(e){return!Z(e,"__v_skip")&&Object.isExtensible(e)&&gi(e,"__v_skip",!0),e}const pe=e=>se(e)?qn(e):e,In=e=>se(e)?Yn(e):e;function ae(e){return e?e.__v_isRef===!0:!1}function ue(e){return Di(e,!1)}function Yr(e){return Di(e,!0)}function Di(e,t){return ae(e)?e:new Bl(e,t)}class Bl{constructor(t,n){this.dep=new Wn,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:J(t),this._value=n?t:pe(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,r=this.__v_isShallow||Ie(t)||lt(t);t=r?t:J(t),it(t,n)&&(this._rawValue=t,this._value=r?t:pe(t),this.dep.trigger())}}function Hi(e){return ae(e)?e.value:e}const Wl={get:(e,t,n)=>t==="__v_raw"?e:Hi(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return ae(s)&&!ae(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function Ni(e){return _t(e)?e:new Proxy(e,Wl)}class Kl{constructor(t){this.__v_isRef=!0,this._value=void 0;const n=this.dep=new Wn,{get:r,set:s}=t(n.track.bind(n),n.trigger.bind(n));this._get=r,this._set=s}get value(){return this._value=this._get()}set value(t){this._set(t)}}function ql(e){return new Kl(e)}class Yl{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0,this._value=void 0}get value(){const t=this._object[this._key];return this._value=t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return El(J(this._object),this._key)}}class Gl{constructor(t){this._getter=t,this.__v_isRef=!0,this.__v_isReadonly=!0,this._value=void 0}get value(){return this._value=this._getter()}}function zl(e,t,n){return ae(e)?e:K(e)?new Gl(e):se(e)&&arguments.length>1?Jl(e,t,n):ue(e)}function Jl(e,t,n){const r=e[t];return ae(r)?r:new Yl(e,t,n)}class Xl{constructor(t,n,r){this.fn=t,this.setter=n,this._value=void 0,this.dep=new Wn(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Xt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=r}notify(){if(this.flags|=16,!(this.flags&8)&&re!==this)return xi(this,!0),!0}get value(){const t=this.dep.track();return Ei(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Zl(e,t,n=!1){let r,s;return K(e)?r=e:(r=e.get,s=e.set),new Xl(r,s,n)}const mn={},Pn=new WeakMap;let pt;function Ql(e,t=!1,n=pt){if(n){let r=Pn.get(n);r||Pn.set(n,r=[]),r.push(e)}}function ec(e,t,n=ee){const{immediate:r,deep:s,once:i,scheduler:o,augmentJob:l,call:c}=n,f=g=>s?g:Ie(g)||s===!1||s===0?ze(g,1):ze(g);let a,d,y,_,w=!1,b=!1;if(ae(e)?(d=()=>e.value,w=Ie(e)):_t(e)?(d=()=>f(e),w=!0):W(e)?(b=!0,w=e.some(g=>_t(g)||Ie(g)),d=()=>e.map(g=>{if(ae(g))return g.value;if(_t(g))return f(g);if(K(g))return c?c(g,2):g()})):K(e)?t?d=c?()=>c(e,2):e:d=()=>{if(y){Ue();try{y()}finally{Be()}}const g=pt;pt=a;try{return c?c(e,3,[_]):e(_)}finally{pt=g}}:d=De,t&&s){const g=d,A=s===!0?1/0:s;d=()=>ze(g(),A)}const $=vi(),L=()=>{a.stop(),$&&$.active&&$r($.effects,a)};if(i&&t){const g=t;t=(...A)=>{g(...A),L()}}let B=b?new Array(e.length).fill(mn):mn;const p=g=>{if(!(!(a.flags&1)||!a.dirty&&!g))if(t){const A=a.run();if(s||w||(b?A.some((N,k)=>it(N,B[k])):it(A,B))){y&&y();const N=pt;pt=a;try{const k=[A,B===mn?void 0:b&&B[0]===mn?[]:B,_];B=A,c?c(t,3,k):t(...k)}finally{pt=N}}}else a.run()};return l&&l(p),a=new bi(d),a.scheduler=o?()=>o(p,!1):p,_=g=>Ql(g,!1,a),y=a.onStop=()=>{const g=Pn.get(a);if(g){if(c)c(g,4);else for(const A of g)A();Pn.delete(a)}},t?r?p(!0):B=a.run():o?o(p.bind(null,!0),!0):a.run(),L.pause=a.pause.bind(a),L.resume=a.resume.bind(a),L.stop=L,L}function ze(e,t=1/0,n){if(t<=0||!se(e)||e.__v_skip||(n=n||new Set,n.has(e)))return e;if(n.add(e),t--,ae(e))ze(e.value,t,n);else if(W(e))for(let r=0;r{ze(r,t,n)});else if(pi(e)){for(const r in e)ze(e[r],t,n);for(const r of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,r)&&ze(e[r],t,n)}return e}/** +* @vue/runtime-core v3.5.16 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/const Kt=[];let cr=!1;function tt(e,...t){if(cr)return;cr=!0,Ue();const n=Kt.length?Kt[Kt.length-1].component:null,r=n&&n.appContext.config.warnHandler,s=tc();if(r)Dt(r,n,11,[e+t.map(i=>{var o,l;return(l=(o=i.toString)==null?void 0:o.call(i))!=null?l:JSON.stringify(i)}).join(""),n&&n.proxy,s.map(({vnode:i})=>`at <${Io(n,i.type)}>`).join(` +`),s]);else{const i=[`[Vue warn]: ${e}`,...t];s.length&&i.push(` +`,...nc(s)),console.warn(...i)}Be(),cr=!1}function tc(){let e=Kt[Kt.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const r=e.component&&e.component.parent;e=r&&r.vnode}return t}function nc(e){const t=[];return e.forEach((n,r)=>{t.push(...r===0?[]:[` +`],...rc(n))}),t}function rc({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:"",r=e.component?e.component.parent==null:!1,s=` at <${Io(e.component,e.type,r)}`,i=">"+n;return e.props?[s,...sc(e.props),i]:[s+i]}function sc(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach(r=>{t.push(...Fi(r,e[r]))}),n.length>3&&t.push(" ..."),t}function Fi(e,t,n){return te(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):typeof t=="number"||typeof t=="boolean"||t==null?n?t:[`${e}=${t}`]:ae(t)?(t=Fi(e,J(t.value),!0),n?t:[`${e}=Ref<`,t,">"]):K(t)?[`${e}=fn${t.name?`<${t.name}>`:""}`]:(t=J(t),n?t:[`${e}=`,t])}function Dt(e,t,n,r){try{return r?e(...r):e()}catch(s){fn(s,t,n)}}function Ne(e,t,n,r){if(K(e)){const s=Dt(e,t,n,r);return s&&di(s)&&s.catch(i=>{fn(i,t,n)}),s}if(W(e)){const s=[];for(let i=0;i>>1,s=xe[r],i=Qt(s);i=Qt(n)?xe.push(e):xe.splice(oc(t),0,e),e.flags|=1,ki()}}function ki(){Ln||(Ln=$i.then(Vi))}function lc(e){W(e)?Rt.push(...e):nt&&e.id===-1?nt.splice(St+1,0,e):e.flags&1||(Rt.push(e),e.flags|=1),ki()}function ps(e,t,n=ke+1){for(;nQt(n)-Qt(r));if(Rt.length=0,nt){nt.push(...t);return}for(nt=t,St=0;Ste.id==null?e.flags&2?-1:1/0:e.id;function Vi(e){const t=De;try{for(ke=0;ke{r._d&&Is(-1);const i=Hn(t);let o;try{o=e(...s)}finally{Hn(i),r._d&&Is(1)}return o};return r._n=!0,r._c=!0,r._d=!0,r}function $f(e,t){if(he===null)return e;const n=er(he),r=e.dirs||(e.dirs=[]);for(let s=0;se.__isTeleport,qt=e=>e&&(e.disabled||e.disabled===""),gs=e=>e&&(e.defer||e.defer===""),ms=e=>typeof SVGElement<"u"&&e instanceof SVGElement,ys=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Er=(e,t)=>{const n=e&&e.to;return te(n)?t?t(n):null:n},Wi={name:"Teleport",__isTeleport:!0,process(e,t,n,r,s,i,o,l,c,f){const{mc:a,pc:d,pbc:y,o:{insert:_,querySelector:w,createText:b,createComment:$}}=f,L=qt(t.props);let{shapeFlag:B,children:p,dynamicChildren:g}=t;if(e==null){const A=t.el=b(""),N=t.anchor=b("");_(A,n,r),_(N,n,r);const k=(R,v)=>{B&16&&(s&&s.isCE&&(s.ce._teleportTarget=R),a(p,R,v,s,i,o,l,c))},V=()=>{const R=t.target=Er(t.props,w),v=Ki(R,t,b,_);R&&(o!=="svg"&&ms(R)?o="svg":o!=="mathml"&&ys(R)&&(o="mathml"),L||(k(R,v),Cn(t,!1)))};L&&(k(n,N),Cn(t,!0)),gs(t.props)?(t.el.__isMounted=!1,we(()=>{V(),delete t.el.__isMounted},i)):V()}else{if(gs(t.props)&&e.el.__isMounted===!1){we(()=>{Wi.process(e,t,n,r,s,i,o,l,c,f)},i);return}t.el=e.el,t.targetStart=e.targetStart;const A=t.anchor=e.anchor,N=t.target=e.target,k=t.targetAnchor=e.targetAnchor,V=qt(e.props),R=V?n:N,v=V?A:k;if(o==="svg"||ms(N)?o="svg":(o==="mathml"||ys(N))&&(o="mathml"),g?(y(e.dynamicChildren,g,R,s,i,o,l),ts(e,t,!0)):c||d(e,t,R,v,s,i,o,l,!1),L)V?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):yn(t,n,A,f,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const D=t.target=Er(t.props,w);D&&yn(t,D,null,f,0)}else V&&yn(t,N,k,f,1);Cn(t,L)}},remove(e,t,n,{um:r,o:{remove:s}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:f,targetAnchor:a,target:d,props:y}=e;if(d&&(s(f),s(a)),i&&s(c),o&16){const _=i||!qt(y);for(let w=0;w{e.isMounted=!0}),eo(()=>{e.isUnmounting=!0}),e}const Ae=[Function,Array],qi={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Ae,onEnter:Ae,onAfterEnter:Ae,onEnterCancelled:Ae,onBeforeLeave:Ae,onLeave:Ae,onAfterLeave:Ae,onLeaveCancelled:Ae,onBeforeAppear:Ae,onAppear:Ae,onAfterAppear:Ae,onAppearCancelled:Ae},Yi=e=>{const t=e.subTree;return t.component?Yi(t.component):t},uc={name:"BaseTransition",props:qi,setup(e,{slots:t}){const n=Qn(),r=fc();return()=>{const s=t.default&&Ji(t.default(),!0);if(!s||!s.length)return;const i=Gi(s),o=J(e),{mode:l}=o;if(r.isLeaving)return ar(i);const c=_s(i);if(!c)return ar(i);let f=Cr(c,o,r,n,d=>f=d);c.type!==ge&&en(c,f);let a=n.subTree&&_s(n.subTree);if(a&&a.type!==ge&&!mt(c,a)&&Yi(n).type!==ge){let d=Cr(a,o,r,n);if(en(a,d),l==="out-in"&&c.type!==ge)return r.isLeaving=!0,d.afterLeave=()=>{r.isLeaving=!1,n.job.flags&8||n.update(),delete d.afterLeave,a=void 0},ar(i);l==="in-out"&&c.type!==ge?d.delayLeave=(y,_,w)=>{const b=zi(r,a);b[String(a.key)]=a,y[rt]=()=>{_(),y[rt]=void 0,delete f.delayedLeave,a=void 0},f.delayedLeave=()=>{w(),delete f.delayedLeave,a=void 0}}:a=void 0}else a&&(a=void 0);return i}}};function Gi(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ge){t=n;break}}return t}const dc=uc;function zi(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Cr(e,t,n,r,s){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:f,onAfterEnter:a,onEnterCancelled:d,onBeforeLeave:y,onLeave:_,onAfterLeave:w,onLeaveCancelled:b,onBeforeAppear:$,onAppear:L,onAfterAppear:B,onAppearCancelled:p}=t,g=String(e.key),A=zi(n,e),N=(R,v)=>{R&&Ne(R,r,9,v)},k=(R,v)=>{const D=v[1];N(R,v),W(R)?R.every(C=>C.length<=1)&&D():R.length<=1&&D()},V={mode:o,persisted:l,beforeEnter(R){let v=c;if(!n.isMounted)if(i)v=$||c;else return;R[rt]&&R[rt](!0);const D=A[g];D&&mt(e,D)&&D.el[rt]&&D.el[rt](),N(v,[R])},enter(R){let v=f,D=a,C=d;if(!n.isMounted)if(i)v=L||f,D=B||a,C=p||d;else return;let Y=!1;const X=R[_n]=ie=>{Y||(Y=!0,ie?N(C,[R]):N(D,[R]),V.delayedLeave&&V.delayedLeave(),R[_n]=void 0)};v?k(v,[R,X]):X()},leave(R,v){const D=String(e.key);if(R[_n]&&R[_n](!0),n.isUnmounting)return v();N(y,[R]);let C=!1;const Y=R[rt]=X=>{C||(C=!0,v(),X?N(b,[R]):N(w,[R]),R[rt]=void 0,A[D]===e&&delete A[D])};A[D]=e,_?k(_,[R,Y]):Y()},clone(R){const v=Cr(R,t,n,r,s);return s&&s(v),v}};return V}function ar(e){if(un(e))return e=ct(e),e.children=null,e}function _s(e){if(!un(e))return Bi(e.type)&&e.children?Gi(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&K(n.default))return n.default()}}function en(e,t){e.shapeFlag&6&&e.component?(e.transition=t,en(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Ji(e,t=!1,n){let r=[],s=0;for(let i=0;i1)for(let i=0;ife({name:e.name},t,{setup:e}))():e}function Jr(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}function tn(e,t,n,r,s=!1){if(W(e)){e.forEach((w,b)=>tn(w,t&&(W(t)?t[b]:t),n,r,s));return}if(vt(r)&&!s){r.shapeFlag&512&&r.type.__asyncResolved&&r.component.subTree.component&&tn(e,t,n,r.component.subTree);return}const i=r.shapeFlag&4?er(r.component):r.el,o=s?null:i,{i:l,r:c}=e,f=t&&t.r,a=l.refs===ee?l.refs={}:l.refs,d=l.setupState,y=J(d),_=d===ee?()=>!1:w=>Z(y,w);if(f!=null&&f!==c&&(te(f)?(a[f]=null,_(f)&&(d[f]=null)):ae(f)&&(f.value=null)),K(c))Dt(c,l,12,[o,a]);else{const w=te(c),b=ae(c);if(w||b){const $=()=>{if(e.f){const L=w?_(c)?d[c]:a[c]:c.value;s?W(L)&&$r(L,i):W(L)?L.includes(i)||L.push(i):w?(a[c]=[i],_(c)&&(d[c]=a[c])):(c.value=[i],e.k&&(a[e.k]=c.value))}else w?(a[c]=o,_(c)&&(d[c]=o)):b&&(c.value=o,e.k&&(a[e.k]=o))};o?($.id=-1,we($,n)):$()}}}let vs=!1;const ft=()=>{vs||(console.error("Hydration completed but contains mismatches."),vs=!0)},hc=e=>e.namespaceURI.includes("svg")&&e.tagName!=="foreignObject",pc=e=>e.namespaceURI.includes("MathML"),vn=e=>{if(e.nodeType===1){if(hc(e))return"svg";if(pc(e))return"mathml"}},gt=e=>e.nodeType===8;function gc(e){const{mt:t,p:n,o:{patchProp:r,createText:s,nextSibling:i,parentNode:o,remove:l,insert:c,createComment:f}}=e,a=(p,g)=>{if(!g.hasChildNodes()){__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&tt("Attempting to hydrate existing markup but container is empty. Performing full mount instead."),n(null,p,g),Dn(),g._vnode=p;return}d(g.firstChild,p,null,null,null),Dn(),g._vnode=p},d=(p,g,A,N,k,V=!1)=>{V=V||!!g.dynamicChildren;const R=gt(p)&&p.data==="[",v=()=>b(p,g,A,N,k,R),{type:D,ref:C,shapeFlag:Y,patchFlag:X}=g;let ie=p.nodeType;g.el=p,X===-2&&(V=!1,g.dynamicChildren=null);let j=null;switch(D){case bt:ie!==3?g.children===""?(c(g.el=s(""),o(p),p),j=p):j=v():(p.data!==g.children&&(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&tt("Hydration text mismatch in",p.parentNode,` + - rendered on server: ${JSON.stringify(p.data)} + - expected on client: ${JSON.stringify(g.children)}`),ft(),p.data=g.children),j=i(p));break;case ge:B(p)?(j=i(p),L(g.el=p.content.firstChild,p,A)):ie!==8||R?j=v():j=i(p);break;case Gt:if(R&&(p=i(p),ie=p.nodeType),ie===1||ie===3){j=p;const G=!g.children.length;for(let F=0;F{V=V||!!g.dynamicChildren;const{type:R,props:v,patchFlag:D,shapeFlag:C,dirs:Y,transition:X}=g,ie=R==="input"||R==="option";if(ie||D!==-1){Y&&Ve(g,null,A,"created");let j=!1;if(B(p)){j=mo(null,X)&&A&&A.vnode.props&&A.vnode.props.appear;const F=p.content.firstChild;if(j){const oe=F.getAttribute("class");oe&&(F.$cls=oe),X.beforeEnter(F)}L(F,p,A),g.el=p=F}if(C&16&&!(v&&(v.innerHTML||v.textContent))){let F=_(p.firstChild,g,p,A,N,k,V),oe=!1;for(;F;){jt(p,1)||(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&!oe&&(tt("Hydration children mismatch on",p,` +Server rendered element contains more child nodes than client vdom.`),oe=!0),ft());const Qe=F;F=F.nextSibling,l(Qe)}}else if(C&8){let F=g.children;F[0]===` +`&&(p.tagName==="PRE"||p.tagName==="TEXTAREA")&&(F=F.slice(1)),p.textContent!==F&&(jt(p,0)||(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&tt("Hydration text content mismatch on",p,` + - rendered on server: ${p.textContent} + - expected on client: ${g.children}`),ft()),p.textContent=g.children)}if(v){if(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__||ie||!V||D&48){const F=p.tagName.includes("-");for(const oe in v)__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&!(Y&&Y.some(Qe=>Qe.dir.created))&&mc(p,oe,v[oe],g,A)&&ft(),(ie&&(oe.endsWith("value")||oe==="indeterminate")||cn(oe)&&!Mt(oe)||oe[0]==="."||F)&&r(p,oe,null,v[oe],void 0,A)}else if(v.onClick)r(p,"onClick",null,v.onClick,void 0,A);else if(D&4&&_t(v.style))for(const F in v.style)v.style[F]}let G;(G=v&&v.onVnodeBeforeMount)&&Me(G,A,g),Y&&Ve(g,null,A,"beforeMount"),((G=v&&v.onVnodeMounted)||Y||j)&&xo(()=>{G&&Me(G,A,g),j&&X.enter(p),Y&&Ve(g,null,A,"mounted")},N)}return p.nextSibling},_=(p,g,A,N,k,V,R)=>{R=R||!!g.dynamicChildren;const v=g.children,D=v.length;let C=!1;for(let Y=0;Y{const{slotScopeIds:R}=g;R&&(k=k?k.concat(R):R);const v=o(p),D=_(i(p),g,v,A,N,k,V);return D&>(D)&&D.data==="]"?i(g.anchor=D):(ft(),c(g.anchor=f("]"),v,D),D)},b=(p,g,A,N,k,V)=>{if(jt(p.parentElement,1)||(__VUE_PROD_HYDRATION_MISMATCH_DETAILS__&&tt(`Hydration node mismatch: +- rendered on server:`,p,p.nodeType===3?"(text)":gt(p)&&p.data==="["?"(start of fragment)":"",` +- expected on client:`,g.type),ft()),g.el=null,V){const D=$(p);for(;;){const C=i(p);if(C&&C!==D)l(C);else break}}const R=i(p),v=o(p);return l(p),n(null,g,v,R,A,N,vn(v),k),A&&(A.vnode.el=g.el,bo(A,g.el)),R},$=(p,g="[",A="]")=>{let N=0;for(;p;)if(p=i(p),p&>(p)&&(p.data===g&&N++,p.data===A)){if(N===0)return i(p);N--}return p},L=(p,g,A)=>{const N=g.parentNode;N&&N.replaceChild(p,g);let k=A;for(;k;)k.vnode.el===g&&(k.vnode.el=k.subTree.el=p),k=k.parent},B=p=>p.nodeType===1&&p.tagName==="TEMPLATE";return[a,d]}function mc(e,t,n,r,s){let i,o,l,c;if(t==="class")e.$cls?(l=e.$cls,delete e.$cls):l=e.getAttribute("class"),c=Bn(n),yc(bs(l||""),bs(c))||(i=2,o="class");else if(t==="style"){l=e.getAttribute("style")||"",c=te(n)?n:hl(Un(n));const f=ws(l),a=ws(c);if(r.dirs)for(const{dir:d,value:y}of r.dirs)d.name==="show"&&!y&&a.set("display","none");s&&Xi(s,r,a),_c(f,a)||(i=3,o="style")}else(e instanceof SVGElement&&ml(t)||e instanceof HTMLElement&&(us(t)||gl(t)))&&(us(t)?(l=e.hasAttribute(t),c=Vr(n)):n==null?(l=e.hasAttribute(t),c=!1):(e.hasAttribute(t)?l=e.getAttribute(t):t==="value"&&e.tagName==="TEXTAREA"?l=e.value:l=!1,c=yl(n)?String(n):!1),l!==c&&(i=4,o=t));if(i!=null&&!jt(e,i)){const f=y=>y===!1?"(not rendered)":`${o}="${y}"`,a=`Hydration ${Zi[i]} mismatch on`,d=` + - rendered on server: ${f(l)} + - expected on client: ${f(c)} + Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead. + You should fix the source of the mismatch.`;return tt(a,e,d),!0}return!1}function bs(e){return new Set(e.trim().split(/\s+/))}function yc(e,t){if(e.size!==t.size)return!1;for(const n of e)if(!t.has(n))return!1;return!0}function ws(e){const t=new Map;for(const n of e.split(";")){let[r,s]=n.split(":");r=r.trim(),s=s&&s.trim(),r&&s&&t.set(r,s)}return t}function _c(e,t){if(e.size!==t.size)return!1;for(const[n,r]of e)if(r!==t.get(n))return!1;return!0}function Xi(e,t,n){const r=e.subTree;if(e.getCssVars&&(t===r||r&&r.type===ve&&r.children.includes(t))){const s=e.getCssVars();for(const i in s)n.set(`--${vl(i,!1)}`,String(s[i]))}t===r&&e.parent&&Xi(e.parent,e.vnode,n)}const xs="data-allow-mismatch",Zi={0:"text",1:"children",2:"class",3:"style",4:"attribute"};function jt(e,t){if(t===0||t===1)for(;e&&!e.hasAttribute(xs);)e=e.parentElement;const n=e&&e.getAttribute(xs);if(n==null)return!1;if(n==="")return!0;{const r=n.split(",");return t===0&&r.includes("children")?!0:n.split(",").includes(Zi[t])}}an().requestIdleCallback;an().cancelIdleCallback;function vc(e,t){if(gt(e)&&e.data==="["){let n=1,r=e.nextSibling;for(;r;){if(r.nodeType===1){if(t(r)===!1)break}else if(gt(r))if(r.data==="]"){if(--n===0)break}else r.data==="["&&n++;r=r.nextSibling}}else t(e)}const vt=e=>!!e.type.__asyncLoader;/*! #__NO_SIDE_EFFECTS__ */function Vf(e){K(e)&&(e={loader:e});const{loader:t,loadingComponent:n,errorComponent:r,delay:s=200,hydrate:i,timeout:o,suspensible:l=!0,onError:c}=e;let f=null,a,d=0;const y=()=>(d++,f=null,_()),_=()=>{let w;return f||(w=f=t().catch(b=>{if(b=b instanceof Error?b:new Error(String(b)),c)return new Promise(($,L)=>{c(b,()=>$(y()),()=>L(b),d+1)});throw b}).then(b=>w!==f&&f?f:(b&&(b.__esModule||b[Symbol.toStringTag]==="Module")&&(b=b.default),a=b,b)))};return zr({name:"AsyncComponentWrapper",__asyncLoader:_,__asyncHydrate(w,b,$){const L=i?()=>{const p=i(()=>{$()},g=>vc(w,g));p&&(b.bum||(b.bum=[])).push(p),(b.u||(b.u=[])).push(()=>!0)}:$;a?L():_().then(()=>!b.isUnmounted&&L())},get __asyncResolved(){return a},setup(){const w=de;if(Jr(w),a)return()=>fr(a,w);const b=p=>{f=null,fn(p,w,13,!r)};if(l&&w.suspense||Pt)return _().then(p=>()=>fr(p,w)).catch(p=>(b(p),()=>r?ce(r,{error:p}):null));const $=ue(!1),L=ue(),B=ue(!!s);return s&&setTimeout(()=>{B.value=!1},s),o!=null&&setTimeout(()=>{if(!$.value&&!L.value){const p=new Error(`Async component timed out after ${o}ms.`);b(p),L.value=p}},o),_().then(()=>{$.value=!0,w.parent&&un(w.parent.vnode)&&w.parent.update()}).catch(p=>{b(p),L.value=p}),()=>{if($.value&&a)return fr(a,w);if(L.value&&r)return ce(r,{error:L.value});if(n&&!B.value)return ce(n)}}})}function fr(e,t){const{ref:n,props:r,children:s,ce:i}=t.vnode,o=ce(e,r,s);return o.ref=n,o.ce=i,delete t.vnode.ce,o}const un=e=>e.type.__isKeepAlive;function bc(e,t){Qi(e,"a",t)}function wc(e,t){Qi(e,"da",t)}function Qi(e,t,n=de){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(zn(t,r,n),n){let s=n.parent;for(;s&&s.parent;)un(s.parent.vnode)&&xc(r,t,n,s),s=s.parent}}function xc(e,t,n,r){const s=zn(t,e,r,!0);Jn(()=>{$r(r[t],s)},n)}function zn(e,t,n=de,r=!1){if(n){const s=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{Ue();const l=dn(n),c=Ne(t,n,e,o);return l(),Be(),c});return r?s.unshift(i):s.push(i),i}}const Ze=e=>(t,n=de)=>{(!Pt||e==="sp")&&zn(e,(...r)=>t(...r),n)},Tc=Ze("bm"),Ht=Ze("m"),Sc=Ze("bu"),Ec=Ze("u"),eo=Ze("bum"),Jn=Ze("um"),Cc=Ze("sp"),Ac=Ze("rtg"),Mc=Ze("rtc");function Rc(e,t=de){zn("ec",e,t)}const Xr="components";function jf(e,t){return no(Xr,e,!0,t)||e}const to=Symbol.for("v-ndc");function Uf(e){return te(e)?no(Xr,e,!1)||e:e||to}function no(e,t,n=!0,r=!1){const s=he||de;if(s){const i=s.type;if(e===Xr){const l=Oo(i,!1);if(l&&(l===t||l===Pe(t)||l===jn(Pe(t))))return i}const o=Ts(s[e]||i[e],t)||Ts(s.appContext[e],t);return!o&&r?i:o}}function Ts(e,t){return e&&(e[t]||e[Pe(t)]||e[jn(Pe(t))])}function Bf(e,t,n,r){let s;const i=n&&n[r],o=W(e);if(o||te(e)){const l=o&&_t(e);let c=!1,f=!1;l&&(c=!Ie(e),f=lt(e),e=Kn(e)),s=new Array(e.length);for(let a=0,d=e.length;at(l,c,void 0,i&&i[c]));else{const l=Object.keys(e);s=new Array(l.length);for(let c=0,f=l.length;crn(t)?!(t.type===ge||t.type===ve&&!ro(t.children)):!0)?e:null}function Kf(e,t){const n={};for(const r in e)n[t&&/[A-Z]/.test(r)?`on:${r}`:Tn(r)]=e[r];return n}const Ar=e=>e?Ao(e)?er(e):Ar(e.parent):null,Yt=fe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Ar(e.parent),$root:e=>Ar(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Zr(e),$forceUpdate:e=>e.f||(e.f=()=>{Gr(e.update)}),$nextTick:e=>e.n||(e.n=Gn.bind(e.proxy)),$watch:e=>Zc.bind(e)}),ur=(e,t)=>e!==ee&&!e.__isScriptSetup&&Z(e,t),Oc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:r,data:s,props:i,accessCache:o,type:l,appContext:c}=e;let f;if(t[0]!=="$"){const _=o[t];if(_!==void 0)switch(_){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return i[t]}else{if(ur(r,t))return o[t]=1,r[t];if(s!==ee&&Z(s,t))return o[t]=2,s[t];if((f=e.propsOptions[0])&&Z(f,t))return o[t]=3,i[t];if(n!==ee&&Z(n,t))return o[t]=4,n[t];Mr&&(o[t]=0)}}const a=Yt[t];let d,y;if(a)return t==="$attrs"&&_e(e.attrs,"get",""),a(e);if((d=l.__cssModules)&&(d=d[t]))return d;if(n!==ee&&Z(n,t))return o[t]=4,n[t];if(y=c.config.globalProperties,Z(y,t))return y[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:i}=e;return ur(s,t)?(s[t]=n,!0):r!==ee&&Z(r,t)?(r[t]=n,!0):Z(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:i}},o){let l;return!!n[o]||e!==ee&&Z(e,o)||ur(t,o)||(l=i[0])&&Z(l,o)||Z(r,o)||Z(Yt,o)||Z(s.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Z(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function qf(){return Ic().slots}function Ic(){const e=Qn();return e.setupContext||(e.setupContext=Ro(e))}function Ss(e){return W(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Mr=!0;function Pc(e){const t=Zr(e),n=e.proxy,r=e.ctx;Mr=!1,t.beforeCreate&&Es(t.beforeCreate,e,"bc");const{data:s,computed:i,methods:o,watch:l,provide:c,inject:f,created:a,beforeMount:d,mounted:y,beforeUpdate:_,updated:w,activated:b,deactivated:$,beforeDestroy:L,beforeUnmount:B,destroyed:p,unmounted:g,render:A,renderTracked:N,renderTriggered:k,errorCaptured:V,serverPrefetch:R,expose:v,inheritAttrs:D,components:C,directives:Y,filters:X}=t;if(f&&Lc(f,r,null),o)for(const G in o){const F=o[G];K(F)&&(r[G]=F.bind(n))}if(s){const G=s.call(n,n);se(G)&&(e.data=qn(G))}if(Mr=!0,i)for(const G in i){const F=i[G],oe=K(F)?F.bind(n,n):K(F.get)?F.get.bind(n,n):De,Qe=!K(F)&&K(F.set)?F.set.bind(n):De,at=le({get:oe,set:Qe});Object.defineProperty(r,G,{enumerable:!0,configurable:!0,get:()=>at.value,set:Fe=>at.value=Fe})}if(l)for(const G in l)so(l[G],r,n,G);if(c){const G=K(c)?c.call(n):c;Reflect.ownKeys(G).forEach(F=>{kc(F,G[F])})}a&&Es(a,e,"c");function j(G,F){W(F)?F.forEach(oe=>G(oe.bind(n))):F&&G(F.bind(n))}if(j(Tc,d),j(Ht,y),j(Sc,_),j(Ec,w),j(bc,b),j(wc,$),j(Rc,V),j(Mc,N),j(Ac,k),j(eo,B),j(Jn,g),j(Cc,R),W(v))if(v.length){const G=e.exposed||(e.exposed={});v.forEach(F=>{Object.defineProperty(G,F,{get:()=>n[F],set:oe=>n[F]=oe})})}else e.exposed||(e.exposed={});A&&e.render===De&&(e.render=A),D!=null&&(e.inheritAttrs=D),C&&(e.components=C),Y&&(e.directives=Y),R&&Jr(e)}function Lc(e,t,n=De){W(e)&&(e=Rr(e));for(const r in e){const s=e[r];let i;se(s)?"default"in s?i=It(s.from||r,s.default,!0):i=It(s.from||r):i=It(s),ae(i)?Object.defineProperty(t,r,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[r]=i}}function Es(e,t,n){Ne(W(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function so(e,t,n,r){let s=r.includes(".")?_o(n,r):()=>n[r];if(te(e)){const i=t[e];K(i)&&ot(s,i)}else if(K(e))ot(s,e.bind(n));else if(se(e))if(W(e))e.forEach(i=>so(i,t,n,r));else{const i=K(e.handler)?e.handler.bind(n):t[e.handler];K(i)&&ot(s,i,e)}}function Zr(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!s.length&&!n&&!r?c=t:(c={},s.length&&s.forEach(f=>Nn(c,f,o,!0)),Nn(c,t,o)),se(t)&&i.set(t,c),c}function Nn(e,t,n,r=!1){const{mixins:s,extends:i}=t;i&&Nn(e,i,n,!0),s&&s.forEach(o=>Nn(e,o,n,!0));for(const o in t)if(!(r&&o==="expose")){const l=Dc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Dc={data:Cs,props:As,emits:As,methods:Ut,computed:Ut,beforeCreate:be,created:be,beforeMount:be,mounted:be,beforeUpdate:be,updated:be,beforeDestroy:be,beforeUnmount:be,destroyed:be,unmounted:be,activated:be,deactivated:be,errorCaptured:be,serverPrefetch:be,components:Ut,directives:Ut,watch:Nc,provide:Cs,inject:Hc};function Cs(e,t){return t?e?function(){return fe(K(e)?e.call(this,this):e,K(t)?t.call(this,this):t)}:t:e}function Hc(e,t){return Ut(Rr(e),Rr(t))}function Rr(e){if(W(e)){const t={};for(let n=0;n1)return n&&K(t)?t.call(r&&r.proxy):t}}const oo={},lo=()=>Object.create(oo),co=e=>Object.getPrototypeOf(e)===oo;function Vc(e,t,n,r=!1){const s={},i=lo();e.propsDefaults=Object.create(null),ao(e,t,s,i);for(const o in e.propsOptions[0])o in s||(s[o]=void 0);n?e.props=r?s:Ul(s):e.type.props?e.props=s:e.props=i,e.attrs=i}function jc(e,t,n,r){const{props:s,attrs:i,vnode:{patchFlag:o}}=e,l=J(s),[c]=e.propsOptions;let f=!1;if((r||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let d=0;d{c=!0;const[y,_]=fo(d,t,!0);fe(o,y),_&&l.push(..._)};!n&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!c)return se(e)&&r.set(e,Ct),Ct;if(W(i))for(let a=0;ae[0]==="_"||e==="$stable",es=e=>W(e)?e.map(Re):[Re(e)],Bc=(e,t,n)=>{if(t._n)return t;const r=cc((...s)=>es(t(...s)),n);return r._c=!1,r},uo=(e,t,n)=>{const r=e._ctx;for(const s in e){if(Qr(s))continue;const i=e[s];if(K(i))t[s]=Bc(s,i,r);else if(i!=null){const o=es(i);t[s]=()=>o}}},ho=(e,t)=>{const n=es(t);e.slots.default=()=>n},po=(e,t,n)=>{for(const r in t)(n||!Qr(r))&&(e[r]=t[r])},Wc=(e,t,n)=>{const r=e.slots=lo();if(e.vnode.shapeFlag&32){const s=t._;s?(po(r,t,n),n&&gi(r,"_",s,!0)):uo(t,r)}else t&&ho(e,t)},Kc=(e,t,n)=>{const{vnode:r,slots:s}=e;let i=!0,o=ee;if(r.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:po(s,t,n):(i=!t.$stable,uo(t,s)),o=t}else t&&(ho(e,t),o={default:1});if(i)for(const l in s)!Qr(l)&&o[l]==null&&delete s[l]};function qc(){typeof __VUE_PROD_HYDRATION_MISMATCH_DETAILS__!="boolean"&&(an().__VUE_PROD_HYDRATION_MISMATCH_DETAILS__=!1)}const we=xo;function Yc(e){return go(e)}function Gc(e){return go(e,gc)}function go(e,t){qc();const n=an();n.__VUE__=!0;const{insert:r,remove:s,patchProp:i,createElement:o,createText:l,createComment:c,setText:f,setElementText:a,parentNode:d,nextSibling:y,setScopeId:_=De,insertStaticContent:w}=e,b=(u,h,m,S=null,x=null,T=null,I=void 0,O=null,M=!!h.dynamicChildren)=>{if(u===h)return;u&&!mt(u,h)&&(S=hn(u),Fe(u,x,T,!0),u=null),h.patchFlag===-2&&(M=!1,h.dynamicChildren=null);const{type:E,ref:U,shapeFlag:P}=h;switch(E){case bt:$(u,h,m,S);break;case ge:L(u,h,m,S);break;case Gt:u==null&&B(h,m,S,I);break;case ve:C(u,h,m,S,x,T,I,O,M);break;default:P&1?A(u,h,m,S,x,T,I,O,M):P&6?Y(u,h,m,S,x,T,I,O,M):(P&64||P&128)&&E.process(u,h,m,S,x,T,I,O,M,xt)}U!=null&&x&&tn(U,u&&u.ref,T,h||u,!h)},$=(u,h,m,S)=>{if(u==null)r(h.el=l(h.children),m,S);else{const x=h.el=u.el;h.children!==u.children&&f(x,h.children)}},L=(u,h,m,S)=>{u==null?r(h.el=c(h.children||""),m,S):h.el=u.el},B=(u,h,m,S)=>{[u.el,u.anchor]=w(u.children,h,m,S,u.el,u.anchor)},p=({el:u,anchor:h},m,S)=>{let x;for(;u&&u!==h;)x=y(u),r(u,m,S),u=x;r(h,m,S)},g=({el:u,anchor:h})=>{let m;for(;u&&u!==h;)m=y(u),s(u),u=m;s(h)},A=(u,h,m,S,x,T,I,O,M)=>{h.type==="svg"?I="svg":h.type==="math"&&(I="mathml"),u==null?N(h,m,S,x,T,I,O,M):R(u,h,x,T,I,O,M)},N=(u,h,m,S,x,T,I,O)=>{let M,E;const{props:U,shapeFlag:P,transition:H,dirs:q}=u;if(M=u.el=o(u.type,T,U&&U.is,U),P&8?a(M,u.children):P&16&&V(u.children,M,null,S,x,dr(u,T),I,O),q&&Ve(u,null,S,"created"),k(M,u,u.scopeId,I,S),U){for(const ne in U)ne!=="value"&&!Mt(ne)&&i(M,ne,null,U[ne],T,S);"value"in U&&i(M,"value",null,U.value,T),(E=U.onVnodeBeforeMount)&&Me(E,S,u)}q&&Ve(u,null,S,"beforeMount");const z=mo(x,H);z&&H.beforeEnter(M),r(M,h,m),((E=U&&U.onVnodeMounted)||z||q)&&we(()=>{E&&Me(E,S,u),z&&H.enter(M),q&&Ve(u,null,S,"mounted")},x)},k=(u,h,m,S,x)=>{if(m&&_(u,m),S)for(let T=0;T{for(let E=M;E{const O=h.el=u.el;let{patchFlag:M,dynamicChildren:E,dirs:U}=h;M|=u.patchFlag&16;const P=u.props||ee,H=h.props||ee;let q;if(m&&ut(m,!1),(q=H.onVnodeBeforeUpdate)&&Me(q,m,h,u),U&&Ve(h,u,m,"beforeUpdate"),m&&ut(m,!0),(P.innerHTML&&H.innerHTML==null||P.textContent&&H.textContent==null)&&a(O,""),E?v(u.dynamicChildren,E,O,m,S,dr(h,x),T):I||F(u,h,O,null,m,S,dr(h,x),T,!1),M>0){if(M&16)D(O,P,H,m,x);else if(M&2&&P.class!==H.class&&i(O,"class",null,H.class,x),M&4&&i(O,"style",P.style,H.style,x),M&8){const z=h.dynamicProps;for(let ne=0;ne{q&&Me(q,m,h,u),U&&Ve(h,u,m,"updated")},S)},v=(u,h,m,S,x,T,I)=>{for(let O=0;O{if(h!==m){if(h!==ee)for(const T in h)!Mt(T)&&!(T in m)&&i(u,T,h[T],null,x,S);for(const T in m){if(Mt(T))continue;const I=m[T],O=h[T];I!==O&&T!=="value"&&i(u,T,O,I,x,S)}"value"in m&&i(u,"value",h.value,m.value,x)}},C=(u,h,m,S,x,T,I,O,M)=>{const E=h.el=u?u.el:l(""),U=h.anchor=u?u.anchor:l("");let{patchFlag:P,dynamicChildren:H,slotScopeIds:q}=h;q&&(O=O?O.concat(q):q),u==null?(r(E,m,S),r(U,m,S),V(h.children||[],m,U,x,T,I,O,M)):P>0&&P&64&&H&&u.dynamicChildren?(v(u.dynamicChildren,H,m,x,T,I,O),(h.key!=null||x&&h===x.subTree)&&ts(u,h,!0)):F(u,h,m,U,x,T,I,O,M)},Y=(u,h,m,S,x,T,I,O,M)=>{h.slotScopeIds=O,u==null?h.shapeFlag&512?x.ctx.activate(h,m,S,I,M):X(h,m,S,x,T,I,M):ie(u,h,M)},X=(u,h,m,S,x,T,I)=>{const O=u.component=fa(u,S,x);if(un(u)&&(O.ctx.renderer=xt),ua(O,!1,I),O.asyncDep){if(x&&x.registerDep(O,j,I),!u.el){const M=O.subTree=ce(ge);L(null,M,h,m)}}else j(O,u,h,m,x,T,I)},ie=(u,h,m)=>{const S=h.component=u.component;if(ra(u,h,m))if(S.asyncDep&&!S.asyncResolved){G(S,h,m);return}else S.next=h,S.update();else h.el=u.el,S.vnode=h},j=(u,h,m,S,x,T,I)=>{const O=()=>{if(u.isMounted){let{next:P,bu:H,u:q,parent:z,vnode:ne}=u;{const Se=yo(u);if(Se){P&&(P.el=ne.el,G(u,P,I)),Se.asyncDep.then(()=>{u.isUnmounted||O()});return}}let Q=P,Te;ut(u,!1),P?(P.el=ne.el,G(u,P,I)):P=ne,H&&Sn(H),(Te=P.props&&P.props.onVnodeBeforeUpdate)&&Me(Te,z,P,ne),ut(u,!0);const me=hr(u),Le=u.subTree;u.subTree=me,b(Le,me,d(Le.el),hn(Le),u,x,T),P.el=me.el,Q===null&&bo(u,me.el),q&&we(q,x),(Te=P.props&&P.props.onVnodeUpdated)&&we(()=>Me(Te,z,P,ne),x)}else{let P;const{el:H,props:q}=h,{bm:z,m:ne,parent:Q,root:Te,type:me}=u,Le=vt(h);if(ut(u,!1),z&&Sn(z),!Le&&(P=q&&q.onVnodeBeforeMount)&&Me(P,Q,h),ut(u,!0),H&&rr){const Se=()=>{u.subTree=hr(u),rr(H,u.subTree,u,x,null)};Le&&me.__asyncHydrate?me.__asyncHydrate(H,u,Se):Se()}else{Te.ce&&Te.ce._injectChildStyle(me);const Se=u.subTree=hr(u);b(null,Se,m,S,u,x,T),h.el=Se.el}if(ne&&we(ne,x),!Le&&(P=q&&q.onVnodeMounted)){const Se=h;we(()=>Me(P,Q,Se),x)}(h.shapeFlag&256||Q&&vt(Q.vnode)&&Q.vnode.shapeFlag&256)&&u.a&&we(u.a,x),u.isMounted=!0,h=m=S=null}};u.scope.on();const M=u.effect=new bi(O);u.scope.off();const E=u.update=M.run.bind(M),U=u.job=M.runIfDirty.bind(M);U.i=u,U.id=u.uid,M.scheduler=()=>Gr(U),ut(u,!0),E()},G=(u,h,m)=>{h.component=u;const S=u.vnode.props;u.vnode=h,u.next=null,jc(u,h.props,S,m),Kc(u,h.children,m),Ue(),ps(u),Be()},F=(u,h,m,S,x,T,I,O,M=!1)=>{const E=u&&u.children,U=u?u.shapeFlag:0,P=h.children,{patchFlag:H,shapeFlag:q}=h;if(H>0){if(H&128){Qe(E,P,m,S,x,T,I,O,M);return}else if(H&256){oe(E,P,m,S,x,T,I,O,M);return}}q&8?(U&16&&Nt(E,x,T),P!==E&&a(m,P)):U&16?q&16?Qe(E,P,m,S,x,T,I,O,M):Nt(E,x,T,!0):(U&8&&a(m,""),q&16&&V(P,m,S,x,T,I,O,M))},oe=(u,h,m,S,x,T,I,O,M)=>{u=u||Ct,h=h||Ct;const E=u.length,U=h.length,P=Math.min(E,U);let H;for(H=0;HU?Nt(u,x,T,!0,!1,P):V(h,m,S,x,T,I,O,M,P)},Qe=(u,h,m,S,x,T,I,O,M)=>{let E=0;const U=h.length;let P=u.length-1,H=U-1;for(;E<=P&&E<=H;){const q=u[E],z=h[E]=M?st(h[E]):Re(h[E]);if(mt(q,z))b(q,z,m,null,x,T,I,O,M);else break;E++}for(;E<=P&&E<=H;){const q=u[P],z=h[H]=M?st(h[H]):Re(h[H]);if(mt(q,z))b(q,z,m,null,x,T,I,O,M);else break;P--,H--}if(E>P){if(E<=H){const q=H+1,z=qH)for(;E<=P;)Fe(u[E],x,T,!0),E++;else{const q=E,z=E,ne=new Map;for(E=z;E<=H;E++){const Ee=h[E]=M?st(h[E]):Re(h[E]);Ee.key!=null&&ne.set(Ee.key,E)}let Q,Te=0;const me=H-z+1;let Le=!1,Se=0;const Ft=new Array(me);for(E=0;E=me){Fe(Ee,x,T,!0);continue}let $e;if(Ee.key!=null)$e=ne.get(Ee.key);else for(Q=z;Q<=H;Q++)if(Ft[Q-z]===0&&mt(Ee,h[Q])){$e=Q;break}$e===void 0?Fe(Ee,x,T,!0):(Ft[$e-z]=E+1,$e>=Se?Se=$e:Le=!0,b(Ee,h[$e],m,null,x,T,I,O,M),Te++)}const cs=Le?zc(Ft):Ct;for(Q=cs.length-1,E=me-1;E>=0;E--){const Ee=z+E,$e=h[Ee],as=Ee+1{const{el:T,type:I,transition:O,children:M,shapeFlag:E}=u;if(E&6){at(u.component.subTree,h,m,S);return}if(E&128){u.suspense.move(h,m,S);return}if(E&64){I.move(u,h,m,xt);return}if(I===ve){r(T,h,m);for(let P=0;PO.enter(T),x);else{const{leave:P,delayLeave:H,afterLeave:q}=O,z=()=>{u.ctx.isUnmounted?s(T):r(T,h,m)},ne=()=>{P(T,()=>{z(),q&&q()})};H?H(T,z,ne):ne()}else r(T,h,m)},Fe=(u,h,m,S=!1,x=!1)=>{const{type:T,props:I,ref:O,children:M,dynamicChildren:E,shapeFlag:U,patchFlag:P,dirs:H,cacheIndex:q}=u;if(P===-2&&(x=!1),O!=null&&(Ue(),tn(O,null,m,u,!0),Be()),q!=null&&(h.renderCache[q]=void 0),U&256){h.ctx.deactivate(u);return}const z=U&1&&H,ne=!vt(u);let Q;if(ne&&(Q=I&&I.onVnodeBeforeUnmount)&&Me(Q,h,u),U&6)nl(u.component,m,S);else{if(U&128){u.suspense.unmount(m,S);return}z&&Ve(u,null,h,"beforeUnmount"),U&64?u.type.remove(u,h,m,xt,S):E&&!E.hasOnce&&(T!==ve||P>0&&P&64)?Nt(E,h,m,!1,!0):(T===ve&&P&384||!x&&U&16)&&Nt(M,h,m),S&&os(u)}(ne&&(Q=I&&I.onVnodeUnmounted)||z)&&we(()=>{Q&&Me(Q,h,u),z&&Ve(u,null,h,"unmounted")},m)},os=u=>{const{type:h,el:m,anchor:S,transition:x}=u;if(h===ve){tl(m,S);return}if(h===Gt){g(u);return}const T=()=>{s(m),x&&!x.persisted&&x.afterLeave&&x.afterLeave()};if(u.shapeFlag&1&&x&&!x.persisted){const{leave:I,delayLeave:O}=x,M=()=>I(m,T);O?O(u.el,T,M):M()}else T()},tl=(u,h)=>{let m;for(;u!==h;)m=y(u),s(u),u=m;s(h)},nl=(u,h,m)=>{const{bum:S,scope:x,job:T,subTree:I,um:O,m:M,a:E,parent:U,slots:{__:P}}=u;Rs(M),Rs(E),S&&Sn(S),U&&W(P)&&P.forEach(H=>{U.renderCache[H]=void 0}),x.stop(),T&&(T.flags|=8,Fe(I,u,h,m)),O&&we(O,h),we(()=>{u.isUnmounted=!0},h),h&&h.pendingBranch&&!h.isUnmounted&&u.asyncDep&&!u.asyncResolved&&u.suspenseId===h.pendingId&&(h.deps--,h.deps===0&&h.resolve())},Nt=(u,h,m,S=!1,x=!1,T=0)=>{for(let I=T;I{if(u.shapeFlag&6)return hn(u.component.subTree);if(u.shapeFlag&128)return u.suspense.next();const h=y(u.anchor||u.el),m=h&&h[Ui];return m?y(m):h};let tr=!1;const ls=(u,h,m)=>{u==null?h._vnode&&Fe(h._vnode,null,null,!0):b(h._vnode||null,u,h,null,null,null,m),h._vnode=u,tr||(tr=!0,ps(),Dn(),tr=!1)},xt={p:b,um:Fe,m:at,r:os,mt:X,mc:V,pc:F,pbc:v,n:hn,o:e};let nr,rr;return t&&([nr,rr]=t(xt)),{render:ls,hydrate:nr,createApp:$c(ls,nr)}}function dr({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function ut({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function mo(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function ts(e,t,n=!1){const r=e.children,s=t.children;if(W(r)&&W(s))for(let i=0;i>1,e[n[l]]0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function yo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:yo(t)}function Rs(e){if(e)for(let t=0;tIt(Jc);function ns(e,t){return Xn(e,null,t)}function Yf(e,t){return Xn(e,null,{flush:"post"})}function ot(e,t,n){return Xn(e,t,n)}function Xn(e,t,n=ee){const{immediate:r,deep:s,flush:i,once:o}=n,l=fe({},n),c=t&&r||!t&&i!=="post";let f;if(Pt){if(i==="sync"){const _=Xc();f=_.__watcherHandles||(_.__watcherHandles=[])}else if(!c){const _=()=>{};return _.stop=De,_.resume=De,_.pause=De,_}}const a=de;l.call=(_,w,b)=>Ne(_,a,w,b);let d=!1;i==="post"?l.scheduler=_=>{we(_,a&&a.suspense)}:i!=="sync"&&(d=!0,l.scheduler=(_,w)=>{w?_():Gr(_)}),l.augmentJob=_=>{t&&(_.flags|=4),d&&(_.flags|=2,a&&(_.id=a.uid,_.i=a))};const y=ec(e,t,l);return Pt&&(f?f.push(y):c&&y()),y}function Zc(e,t,n){const r=this.proxy,s=te(e)?e.includes(".")?_o(r,e):()=>r[e]:e.bind(r,r);let i;K(t)?i=t:(i=t.handler,n=t);const o=dn(this),l=Xn(s,i.bind(r),n);return o(),l}function _o(e,t){const n=t.split(".");return()=>{let r=e;for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Pe(t)}Modifiers`]||e[`${Xe(t)}Modifiers`];function ea(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||ee;let s=n;const i=t.startsWith("update:"),o=i&&Qc(r,t.slice(7));o&&(o.trim&&(s=n.map(a=>te(a)?a.trim():a)),o.number&&(s=n.map(wr)));let l,c=r[l=Tn(t)]||r[l=Tn(Pe(t))];!c&&i&&(c=r[l=Tn(Xe(t))]),c&&Ne(c,e,6,s);const f=r[l+"Once"];if(f){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ne(f,e,6,s)}}function vo(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const i=e.emits;let o={},l=!1;if(!K(e)){const c=f=>{const a=vo(f,t,!0);a&&(l=!0,fe(o,a))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(se(e)&&r.set(e,null),null):(W(i)?i.forEach(c=>o[c]=null):fe(o,i),se(e)&&r.set(e,o),o)}function Zn(e,t){return!e||!cn(t)?!1:(t=t.slice(2).replace(/Once$/,""),Z(e,t[0].toLowerCase()+t.slice(1))||Z(e,Xe(t))||Z(e,t))}function hr(e){const{type:t,vnode:n,proxy:r,withProxy:s,propsOptions:[i],slots:o,attrs:l,emit:c,render:f,renderCache:a,props:d,data:y,setupState:_,ctx:w,inheritAttrs:b}=e,$=Hn(e);let L,B;try{if(n.shapeFlag&4){const g=s||r,A=g;L=Re(f.call(A,g,a,d,_,y,w)),B=l}else{const g=t;L=Re(g.length>1?g(d,{attrs:l,slots:o,emit:c}):g(d,null)),B=t.props?l:ta(l)}}catch(g){zt.length=0,fn(g,e,1),L=ce(ge)}let p=L;if(B&&b!==!1){const g=Object.keys(B),{shapeFlag:A}=p;g.length&&A&7&&(i&&g.some(Fr)&&(B=na(B,i)),p=ct(p,B,!1,!0))}return n.dirs&&(p=ct(p,null,!1,!0),p.dirs=p.dirs?p.dirs.concat(n.dirs):n.dirs),n.transition&&en(p,n.transition),L=p,Hn($),L}const ta=e=>{let t;for(const n in e)(n==="class"||n==="style"||cn(n))&&((t||(t={}))[n]=e[n]);return t},na=(e,t)=>{const n={};for(const r in e)(!Fr(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function ra(e,t,n){const{props:r,children:s,component:i}=e,{props:o,children:l,patchFlag:c}=t,f=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return r?Os(r,o,f):!!o;if(c&8){const a=t.dynamicProps;for(let d=0;de.__isSuspense;function xo(e,t){t&&t.pendingBranch?W(e)?t.effects.push(...e):t.effects.push(e):lc(e)}const ve=Symbol.for("v-fgt"),bt=Symbol.for("v-txt"),ge=Symbol.for("v-cmt"),Gt=Symbol.for("v-stc"),zt=[];let Ce=null;function Ir(e=!1){zt.push(Ce=e?null:[])}function sa(){zt.pop(),Ce=zt[zt.length-1]||null}let nn=1;function Is(e,t=!1){nn+=e,e<0&&Ce&&t&&(Ce.hasOnce=!0)}function To(e){return e.dynamicChildren=nn>0?Ce||Ct:null,sa(),nn>0&&Ce&&Ce.push(e),e}function Gf(e,t,n,r,s,i){return To(Eo(e,t,n,r,s,i,!0))}function Pr(e,t,n,r,s){return To(ce(e,t,n,r,s,!0))}function rn(e){return e?e.__v_isVNode===!0:!1}function mt(e,t){return e.type===t.type&&e.key===t.key}const So=({key:e})=>e??null,An=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?te(e)||ae(e)||K(e)?{i:he,r:e,k:t,f:!!n}:e:null);function Eo(e,t=null,n=null,r=0,s=null,i=e===ve?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&So(t),ref:t&&An(t),scopeId:ji,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null,ctx:he};return l?(rs(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=te(n)?8:16),nn>0&&!o&&Ce&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ce.push(c),c}const ce=ia;function ia(e,t=null,n=null,r=0,s=null,i=!1){if((!e||e===to)&&(e=ge),rn(e)){const l=ct(e,t,!0);return n&&rs(l,n),nn>0&&!i&&Ce&&(l.shapeFlag&6?Ce[Ce.indexOf(e)]=l:Ce.push(l)),l.patchFlag=-2,l}if(ma(e)&&(e=e.__vccOpts),t){t=oa(t);let{class:l,style:c}=t;l&&!te(l)&&(t.class=Bn(l)),se(c)&&(qr(c)&&!W(c)&&(c=fe({},c)),t.style=Un(c))}const o=te(e)?1:wo(e)?128:Bi(e)?64:se(e)?4:K(e)?2:0;return Eo(e,t,n,r,s,o,i,!0)}function oa(e){return e?qr(e)||co(e)?fe({},e):e:null}function ct(e,t,n=!1,r=!1){const{props:s,ref:i,patchFlag:o,children:l,transition:c}=e,f=t?la(s||{},t):s,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:f,key:f&&So(f),ref:t&&t.ref?n&&i?W(i)?i.concat(An(t)):[i,An(t)]:An(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ve?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ct(e.ssContent),ssFallback:e.ssFallback&&ct(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&r&&en(a,c.clone(a)),a}function Co(e=" ",t=0){return ce(bt,null,e,t)}function zf(e,t){const n=ce(Gt,null,e);return n.staticCount=t,n}function Jf(e="",t=!1){return t?(Ir(),Pr(ge,null,e)):ce(ge,null,e)}function Re(e){return e==null||typeof e=="boolean"?ce(ge):W(e)?ce(ve,null,e.slice()):rn(e)?st(e):ce(bt,null,String(e))}function st(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ct(e)}function rs(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(W(t))n=16;else if(typeof t=="object")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),rs(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!co(t)?t._ctx=he:s===3&&he&&(he.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else K(t)?(t={default:t,_ctx:he},n=32):(t=String(t),r&64?(n=16,t=[Co(t)]):n=8);e.children=t,e.shapeFlag|=n}function la(...e){const t={};for(let n=0;nde||he;let Fn,Lr;{const e=an(),t=(n,r)=>{let s;return(s=e[n])||(s=e[n]=[]),s.push(r),i=>{s.length>1?s.forEach(o=>o(i)):s[0](i)}};Fn=t("__VUE_INSTANCE_SETTERS__",n=>de=n),Lr=t("__VUE_SSR_SETTERS__",n=>Pt=n)}const dn=e=>{const t=de;return Fn(e),e.scope.on(),()=>{e.scope.off(),Fn(t)}},Ps=()=>{de&&de.scope.off(),Fn(null)};function Ao(e){return e.vnode.shapeFlag&4}let Pt=!1;function ua(e,t=!1,n=!1){t&&Lr(t);const{props:r,children:s}=e.vnode,i=Ao(e);Vc(e,r,i,t),Wc(e,s,n||t);const o=i?da(e,t):void 0;return t&&Lr(!1),o}function da(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Oc);const{setup:r}=n;if(r){Ue();const s=e.setupContext=r.length>1?Ro(e):null,i=dn(e),o=Dt(r,e,0,[e.props,s]),l=di(o);if(Be(),i(),(l||e.sp)&&!vt(e)&&Jr(e),l){if(o.then(Ps,Ps),t)return o.then(c=>{Ls(e,c,t)}).catch(c=>{fn(c,e,0)});e.asyncDep=o}else Ls(e,o,t)}else Mo(e,t)}function Ls(e,t,n){K(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:se(t)&&(e.setupState=Ni(t)),Mo(e,n)}let Ds;function Mo(e,t,n){const r=e.type;if(!e.render){if(!t&&Ds&&!r.render){const s=r.template||Zr(e).template;if(s){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:c}=r,f=fe(fe({isCustomElement:i,delimiters:l},o),c);r.render=Ds(s,f)}}e.render=r.render||De}{const s=dn(e);Ue();try{Pc(e)}finally{Be(),s()}}}const ha={get(e,t){return _e(e,"get",""),e[t]}};function Ro(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,ha),slots:e.slots,emit:e.emit,expose:t}}function er(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(Ni(En(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in Yt)return Yt[n](e)},has(t,n){return n in t||n in Yt}})):e.proxy}const pa=/(?:^|[-_])(\w)/g,ga=e=>e.replace(pa,t=>t.toUpperCase()).replace(/[-_]/g,"");function Oo(e,t=!0){return K(e)?e.displayName||e.name:e.name||t&&e.__name}function Io(e,t,n=!1){let r=Oo(t);if(!r&&t.__file){const s=t.__file.match(/([^/\\]+)\.\w+$/);s&&(r=s[1])}if(!r&&e&&e.parent){const s=i=>{for(const o in i)if(i[o]===t)return o};r=s(e.components||e.parent.type.components)||s(e.appContext.components)}return r?ga(r):n?"App":"Anonymous"}function ma(e){return K(e)&&"__vccOpts"in e}const le=(e,t)=>Zl(e,t,Pt);function Dr(e,t,n){const r=arguments.length;return r===2?se(t)&&!W(t)?rn(t)?ce(e,null,[t]):ce(e,t):ce(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&rn(n)&&(n=[n]),ce(e,t,n))}const ya="3.5.16";/** +* @vue/runtime-dom v3.5.16 +* (c) 2018-present Yuxi (Evan) You and Vue contributors +* @license MIT +**/let Hr;const Hs=typeof window<"u"&&window.trustedTypes;if(Hs)try{Hr=Hs.createPolicy("vue",{createHTML:e=>e})}catch{}const Po=Hr?e=>Hr.createHTML(e):e=>e,_a="http://www.w3.org/2000/svg",va="http://www.w3.org/1998/Math/MathML",Ye=typeof document<"u"?document:null,Ns=Ye&&Ye.createElement("template"),ba={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t==="svg"?Ye.createElementNS(_a,e):t==="mathml"?Ye.createElementNS(va,e):n?Ye.createElement(e,{is:n}):Ye.createElement(e);return e==="select"&&r&&r.multiple!=null&&s.setAttribute("multiple",r.multiple),s},createText:e=>Ye.createTextNode(e),createComment:e=>Ye.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ye.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,r,s,i){const o=n?n.previousSibling:t.lastChild;if(s&&(s===i||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===i||!(s=s.nextSibling)););else{Ns.innerHTML=Po(r==="svg"?`${e}`:r==="mathml"?`${e}`:e);const l=Ns.content;if(r==="svg"||r==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},et="transition",kt="animation",sn=Symbol("_vtc"),Lo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},wa=fe({},qi,Lo),xa=e=>(e.displayName="Transition",e.props=wa,e),Xf=xa((e,{slots:t})=>Dr(dc,Ta(e),t)),dt=(e,t=[])=>{W(e)?e.forEach(n=>n(...t)):e&&e(...t)},Fs=e=>e?W(e)?e.some(t=>t.length>1):e.length>1:!1;function Ta(e){const t={};for(const C in e)C in Lo||(t[C]=e[C]);if(e.css===!1)return t;const{name:n="v",type:r,duration:s,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:f=o,appearToClass:a=l,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:y=`${n}-leave-active`,leaveToClass:_=`${n}-leave-to`}=e,w=Sa(s),b=w&&w[0],$=w&&w[1],{onBeforeEnter:L,onEnter:B,onEnterCancelled:p,onLeave:g,onLeaveCancelled:A,onBeforeAppear:N=L,onAppear:k=B,onAppearCancelled:V=p}=t,R=(C,Y,X,ie)=>{C._enterCancelled=ie,ht(C,Y?a:l),ht(C,Y?f:o),X&&X()},v=(C,Y)=>{C._isLeaving=!1,ht(C,d),ht(C,_),ht(C,y),Y&&Y()},D=C=>(Y,X)=>{const ie=C?k:B,j=()=>R(Y,C,X);dt(ie,[Y,j]),$s(()=>{ht(Y,C?c:i),qe(Y,C?a:l),Fs(ie)||ks(Y,r,b,j)})};return fe(t,{onBeforeEnter(C){dt(L,[C]),qe(C,i),qe(C,o)},onBeforeAppear(C){dt(N,[C]),qe(C,c),qe(C,f)},onEnter:D(!1),onAppear:D(!0),onLeave(C,Y){C._isLeaving=!0;const X=()=>v(C,Y);qe(C,d),C._enterCancelled?(qe(C,y),Us()):(Us(),qe(C,y)),$s(()=>{C._isLeaving&&(ht(C,d),qe(C,_),Fs(g)||ks(C,r,$,X))}),dt(g,[C,X])},onEnterCancelled(C){R(C,!1,void 0,!0),dt(p,[C])},onAppearCancelled(C){R(C,!0,void 0,!0),dt(V,[C])},onLeaveCancelled(C){v(C),dt(A,[C])}})}function Sa(e){if(e==null)return null;if(se(e))return[pr(e.enter),pr(e.leave)];{const t=pr(e);return[t,t]}}function pr(e){return cl(e)}function qe(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[sn]||(e[sn]=new Set)).add(t)}function ht(e,t){t.split(/\s+/).forEach(r=>r&&e.classList.remove(r));const n=e[sn];n&&(n.delete(t),n.size||(e[sn]=void 0))}function $s(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Ea=0;function ks(e,t,n,r){const s=e._endId=++Ea,i=()=>{s===e._endId&&r()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=Ca(e,t);if(!o)return r();const f=o+"end";let a=0;const d=()=>{e.removeEventListener(f,y),i()},y=_=>{_.target===e&&++a>=c&&d()};setTimeout(()=>{a(n[w]||"").split(", "),s=r(`${et}Delay`),i=r(`${et}Duration`),o=Vs(s,i),l=r(`${kt}Delay`),c=r(`${kt}Duration`),f=Vs(l,c);let a=null,d=0,y=0;t===et?o>0&&(a=et,d=o,y=i.length):t===kt?f>0&&(a=kt,d=f,y=c.length):(d=Math.max(o,f),a=d>0?o>f?et:kt:null,y=a?a===et?i.length:c.length:0);const _=a===et&&/\b(transform|all)(,|$)/.test(r(`${et}Property`).toString());return{type:a,timeout:d,propCount:y,hasTransform:_}}function Vs(e,t){for(;e.lengthjs(n)+js(e[r])))}function js(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Us(){return document.body.offsetHeight}function Aa(e,t,n){const r=e[sn];r&&(t=(t?[t,...r]:[...r]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const $n=Symbol("_vod"),Do=Symbol("_vsh"),Zf={beforeMount(e,{value:t},{transition:n}){e[$n]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Vt(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),Vt(e,!0),r.enter(e)):r.leave(e,()=>{Vt(e,!1)}):Vt(e,t))},beforeUnmount(e,{value:t}){Vt(e,t)}};function Vt(e,t){e.style.display=t?e[$n]:"none",e[Do]=!t}const Ma=Symbol(""),Ra=/(^|;)\s*display\s*:/;function Oa(e,t,n){const r=e.style,s=te(n);let i=!1;if(n&&!s){if(t)if(te(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&Mn(r,l,"")}else for(const o in t)n[o]==null&&Mn(r,o,"");for(const o in n)o==="display"&&(i=!0),Mn(r,o,n[o])}else if(s){if(t!==n){const o=r[Ma];o&&(n+=";"+o),r.cssText=n,i=Ra.test(n)}}else t&&e.removeAttribute("style");$n in e&&(e[$n]=i?r.display:"",e[Do]&&(r.display="none"))}const Bs=/\s*!important$/;function Mn(e,t,n){if(W(n))n.forEach(r=>Mn(e,t,r));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const r=Ia(e,t);Bs.test(n)?e.setProperty(Xe(r),n.replace(Bs,""),"important"):e[r]=n}}const Ws=["Webkit","Moz","ms"],gr={};function Ia(e,t){const n=gr[t];if(n)return n;let r=Pe(t);if(r!=="filter"&&r in e)return gr[t]=r;r=jn(r);for(let s=0;smr||(Ha.then(()=>mr=0),mr=Date.now());function Fa(e,t){const n=r=>{if(!r._vts)r._vts=Date.now();else if(r._vts<=n.attached)return;Ne($a(r,n.value),t,5,[r])};return n.value=e,n.attached=Na(),n}function $a(e,t){if(W(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const Js=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,ka=(e,t,n,r,s,i)=>{const o=s==="svg";t==="class"?Aa(e,r,o):t==="style"?Oa(e,n,r):cn(t)?Fr(t)||La(e,t,n,r,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Va(e,t,r,o))?(Ys(e,t,r),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&qs(e,t,r,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!te(r))?Ys(e,Pe(t),r,i,t):(t==="true-value"?e._trueValue=r:t==="false-value"&&(e._falseValue=r),qs(e,t,r,o))};function Va(e,t,n,r){if(r)return!!(t==="innerHTML"||t==="textContent"||t in e&&Js(t)&&K(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const s=e.tagName;if(s==="IMG"||s==="VIDEO"||s==="CANVAS"||s==="SOURCE")return!1}return Js(t)&&te(n)?!1:t in e}const Xs=e=>{const t=e.props["onUpdate:modelValue"]||!1;return W(t)?n=>Sn(t,n):t};function ja(e){e.target.composing=!0}function Zs(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const yr=Symbol("_assign"),Qf={created(e,{modifiers:{lazy:t,trim:n,number:r}},s){e[yr]=Xs(s);const i=r||s.props&&s.props.type==="number";Et(e,t?"change":"input",o=>{if(o.target.composing)return;let l=e.value;n&&(l=l.trim()),i&&(l=wr(l)),e[yr](l)}),n&&Et(e,"change",()=>{e.value=e.value.trim()}),t||(Et(e,"compositionstart",ja),Et(e,"compositionend",Zs),Et(e,"change",Zs))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:r,trim:s,number:i}},o){if(e[yr]=Xs(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?wr(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(r&&t===n||s&&e.value.trim()===c)||(e.value=c))}},Ua=["ctrl","shift","alt","meta"],Ba={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Ua.some(n=>e[`${n}Key`]&&!t.includes(n))},eu=(e,t)=>{const n=e._withMods||(e._withMods={}),r=t.join(".");return n[r]||(n[r]=(s,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),r=t.join(".");return n[r]||(n[r]=s=>{if(!("key"in s))return;const i=Xe(s.key);if(t.some(o=>o===i||Wa[o]===i))return e(s)})},Ho=fe({patchProp:ka},ba);let Jt,Qs=!1;function Ka(){return Jt||(Jt=Yc(Ho))}function qa(){return Jt=Qs?Jt:Gc(Ho),Qs=!0,Jt}const nu=(...e)=>{const t=Ka().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Fo(r);if(!s)return;const i=t._component;!K(i)&&!i.render&&!i.template&&(i.template=s.innerHTML),s.nodeType===1&&(s.textContent="");const o=n(s,!1,No(s));return s instanceof Element&&(s.removeAttribute("v-cloak"),s.setAttribute("data-v-app","")),o},t},ru=(...e)=>{const t=qa().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Fo(r);if(s)return n(s,!0,No(s))},t};function No(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Fo(e){return te(e)?document.querySelector(e):e}const su=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n},Ya=window.__VP_SITE_DATA__;function ss(e){return vi()?(xl(e),!0):!1}function je(e){return typeof e=="function"?e():Hi(e)}const $o=typeof window<"u"&&typeof document<"u";typeof WorkerGlobalScope<"u"&&globalThis instanceof WorkerGlobalScope;const Ga=Object.prototype.toString,za=e=>Ga.call(e)==="[object Object]",on=()=>{},ei=Ja();function Ja(){var e,t;return $o&&((e=window==null?void 0:window.navigator)==null?void 0:e.userAgent)&&(/iP(?:ad|hone|od)/.test(window.navigator.userAgent)||((t=window==null?void 0:window.navigator)==null?void 0:t.maxTouchPoints)>2&&/iPad|Macintosh/.test(window==null?void 0:window.navigator.userAgent))}function Xa(e,t){function n(...r){return new Promise((s,i)=>{Promise.resolve(e(()=>t.apply(this,r),{fn:t,thisArg:this,args:r})).then(s).catch(i)})}return n}const ko=e=>e();function Za(e,t={}){let n,r,s=on;const i=l=>{clearTimeout(l),s(),s=on};return l=>{const c=je(e),f=je(t.maxWait);return n&&i(n),c<=0||f!==void 0&&f<=0?(r&&(i(r),r=null),Promise.resolve(l())):new Promise((a,d)=>{s=t.rejectOnCancel?d:a,f&&!r&&(r=setTimeout(()=>{n&&i(n),r=null,a(l())},f)),n=setTimeout(()=>{r&&i(r),r=null,a(l())},c)})}}function Qa(e=ko){const t=ue(!0);function n(){t.value=!1}function r(){t.value=!0}const s=(...i)=>{t.value&&e(...i)};return{isActive:Yn(t),pause:n,resume:r,eventFilter:s}}function ef(e){return e||Qn()}function Vo(...e){if(e.length!==1)return zl(...e);const t=e[0];return typeof t=="function"?Yn(ql(()=>({get:t,set:on}))):ue(t)}function jo(e,t,n={}){const{eventFilter:r=ko,...s}=n;return ot(e,Xa(r,t),s)}function tf(e,t,n={}){const{eventFilter:r,...s}=n,{eventFilter:i,pause:o,resume:l,isActive:c}=Qa(r);return{stop:jo(e,t,{...s,eventFilter:i}),pause:o,resume:l,isActive:c}}function Uo(e,t=!0,n){ef()?Ht(e,n):t?e():Gn(e)}function iu(e,t,n={}){const{debounce:r=0,maxWait:s=void 0,...i}=n;return jo(e,t,{...i,eventFilter:Za(r,{maxWait:s})})}function ou(e,t,n){let r;ae(n)?r={evaluating:n}:r=n||{};const{lazy:s=!1,evaluating:i=void 0,shallow:o=!0,onError:l=on}=r,c=ue(!s),f=o?Yr(t):ue(t);let a=0;return ns(async d=>{if(!c.value)return;a++;const y=a;let _=!1;i&&Promise.resolve().then(()=>{i.value=!0});try{const w=await e(b=>{d(()=>{i&&(i.value=!1),_||b()})});y===a&&(f.value=w)}catch(w){l(w)}finally{i&&y===a&&(i.value=!1),_=!0}}),s?le(()=>(c.value=!0,f.value)):f}function Bo(e){var t;const n=je(e);return(t=n==null?void 0:n.$el)!=null?t:n}const We=$o?window:void 0;function ln(...e){let t,n,r,s;if(typeof e[0]=="string"||Array.isArray(e[0])?([n,r,s]=e,t=We):[t,n,r,s]=e,!t)return on;Array.isArray(n)||(n=[n]),Array.isArray(r)||(r=[r]);const i=[],o=()=>{i.forEach(a=>a()),i.length=0},l=(a,d,y,_)=>(a.addEventListener(d,y,_),()=>a.removeEventListener(d,y,_)),c=ot(()=>[Bo(t),je(s)],([a,d])=>{if(o(),!a)return;const y=za(d)?{...d}:d;i.push(...n.flatMap(_=>r.map(w=>l(a,_,w,y))))},{immediate:!0,flush:"post"}),f=()=>{c(),o()};return ss(f),f}function nf(e){return typeof e=="function"?e:typeof e=="string"?t=>t.key===e:Array.isArray(e)?t=>e.includes(t.key):()=>!0}function lu(...e){let t,n,r={};e.length===3?(t=e[0],n=e[1],r=e[2]):e.length===2?typeof e[1]=="object"?(t=!0,n=e[0],r=e[1]):(t=e[0],n=e[1]):(t=!0,n=e[0]);const{target:s=We,eventName:i="keydown",passive:o=!1,dedupe:l=!1}=r,c=nf(t);return ln(s,i,a=>{a.repeat&&je(l)||c(a)&&n(a)},o)}function rf(){const e=ue(!1),t=Qn();return t&&Ht(()=>{e.value=!0},t),e}function sf(e){const t=rf();return le(()=>(t.value,!!e()))}function of(e,t={}){const{window:n=We}=t,r=sf(()=>n&&"matchMedia"in n&&typeof n.matchMedia=="function");let s;const i=ue(!1),o=f=>{i.value=f.matches},l=()=>{s&&("removeEventListener"in s?s.removeEventListener("change",o):s.removeListener(o))},c=ns(()=>{r.value&&(l(),s=n.matchMedia(je(e)),"addEventListener"in s?s.addEventListener("change",o):s.addListener(o),i.value=s.matches)});return ss(()=>{c(),l(),s=void 0}),i}const bn=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{},wn="__vueuse_ssr_handlers__",lf=cf();function cf(){return wn in bn||(bn[wn]=bn[wn]||{}),bn[wn]}function Wo(e,t){return lf[e]||t}function af(e){return e==null?"any":e instanceof Set?"set":e instanceof Map?"map":e instanceof Date?"date":typeof e=="boolean"?"boolean":typeof e=="string"?"string":typeof e=="object"?"object":Number.isNaN(e)?"any":"number"}const ff={boolean:{read:e=>e==="true",write:e=>String(e)},object:{read:e=>JSON.parse(e),write:e=>JSON.stringify(e)},number:{read:e=>Number.parseFloat(e),write:e=>String(e)},any:{read:e=>e,write:e=>String(e)},string:{read:e=>e,write:e=>String(e)},map:{read:e=>new Map(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e.entries()))},set:{read:e=>new Set(JSON.parse(e)),write:e=>JSON.stringify(Array.from(e))},date:{read:e=>new Date(e),write:e=>e.toISOString()}},ti="vueuse-storage";function is(e,t,n,r={}){var s;const{flush:i="pre",deep:o=!0,listenToStorageChanges:l=!0,writeDefaults:c=!0,mergeDefaults:f=!1,shallow:a,window:d=We,eventFilter:y,onError:_=v=>{console.error(v)},initOnMounted:w}=r,b=(a?Yr:ue)(typeof t=="function"?t():t);if(!n)try{n=Wo("getDefaultStorage",()=>{var v;return(v=We)==null?void 0:v.localStorage})()}catch(v){_(v)}if(!n)return b;const $=je(t),L=af($),B=(s=r.serializer)!=null?s:ff[L],{pause:p,resume:g}=tf(b,()=>N(b.value),{flush:i,deep:o,eventFilter:y});d&&l&&Uo(()=>{ln(d,"storage",V),ln(d,ti,R),w&&V()}),w||V();function A(v,D){d&&d.dispatchEvent(new CustomEvent(ti,{detail:{key:e,oldValue:v,newValue:D,storageArea:n}}))}function N(v){try{const D=n.getItem(e);if(v==null)A(D,null),n.removeItem(e);else{const C=B.write(v);D!==C&&(n.setItem(e,C),A(D,C))}}catch(D){_(D)}}function k(v){const D=v?v.newValue:n.getItem(e);if(D==null)return c&&$!=null&&n.setItem(e,B.write($)),$;if(!v&&f){const C=B.read(D);return typeof f=="function"?f(C,$):L==="object"&&!Array.isArray(C)?{...$,...C}:C}else return typeof D!="string"?D:B.read(D)}function V(v){if(!(v&&v.storageArea!==n)){if(v&&v.key==null){b.value=$;return}if(!(v&&v.key!==e)){p();try{(v==null?void 0:v.newValue)!==B.write(b.value)&&(b.value=k(v))}catch(D){_(D)}finally{v?Gn(g):g()}}}}function R(v){V(v.detail)}return b}function Ko(e){return of("(prefers-color-scheme: dark)",e)}function uf(e={}){const{selector:t="html",attribute:n="class",initialValue:r="auto",window:s=We,storage:i,storageKey:o="vueuse-color-scheme",listenToStorageChanges:l=!0,storageRef:c,emitAuto:f,disableTransition:a=!0}=e,d={auto:"",light:"light",dark:"dark",...e.modes||{}},y=Ko({window:s}),_=le(()=>y.value?"dark":"light"),w=c||(o==null?Vo(r):is(o,r,i,{window:s,listenToStorageChanges:l})),b=le(()=>w.value==="auto"?_.value:w.value),$=Wo("updateHTMLAttrs",(g,A,N)=>{const k=typeof g=="string"?s==null?void 0:s.document.querySelector(g):Bo(g);if(!k)return;let V;if(a){V=s.document.createElement("style");const R="*,*::before,*::after{-webkit-transition:none!important;-moz-transition:none!important;-o-transition:none!important;-ms-transition:none!important;transition:none!important}";V.appendChild(document.createTextNode(R)),s.document.head.appendChild(V)}if(A==="class"){const R=N.split(/\s/g);Object.values(d).flatMap(v=>(v||"").split(/\s/g)).filter(Boolean).forEach(v=>{R.includes(v)?k.classList.add(v):k.classList.remove(v)})}else k.setAttribute(A,N);a&&(s.getComputedStyle(V).opacity,document.head.removeChild(V))});function L(g){var A;$(t,n,(A=d[g])!=null?A:g)}function B(g){e.onChanged?e.onChanged(g,L):L(g)}ot(b,B,{flush:"post",immediate:!0}),Uo(()=>B(b.value));const p=le({get(){return f?w.value:b.value},set(g){w.value=g}});try{return Object.assign(p,{store:w,system:_,state:b})}catch{return p}}function df(e={}){const{valueDark:t="dark",valueLight:n="",window:r=We}=e,s=uf({...e,onChanged:(l,c)=>{var f;e.onChanged?(f=e.onChanged)==null||f.call(e,l==="dark",c,l):c(l)},modes:{dark:t,light:n}}),i=le(()=>s.system?s.system.value:Ko({window:r}).value?"dark":"light");return le({get(){return s.value==="dark"},set(l){const c=l?"dark":"light";i.value===c?s.value="auto":s.value=c}})}function _r(e){return typeof Window<"u"&&e instanceof Window?e.document.documentElement:typeof Document<"u"&&e instanceof Document?e.documentElement:e}function cu(e,t,n={}){const{window:r=We}=n;return is(e,t,r==null?void 0:r.localStorage,n)}function qo(e){const t=window.getComputedStyle(e);if(t.overflowX==="scroll"||t.overflowY==="scroll"||t.overflowX==="auto"&&e.clientWidth1?!0:(t.preventDefault&&t.preventDefault(),!1)}const vr=new WeakMap;function au(e,t=!1){const n=ue(t);let r=null,s="";ot(Vo(e),l=>{const c=_r(je(l));if(c){const f=c;if(vr.get(f)||vr.set(f,f.style.overflow),f.style.overflow!=="hidden"&&(s=f.style.overflow),f.style.overflow==="hidden")return n.value=!0;if(n.value)return f.style.overflow="hidden"}},{immediate:!0});const i=()=>{const l=_r(je(e));!l||n.value||(ei&&(r=ln(l,"touchmove",c=>{hf(c)},{passive:!1})),l.style.overflow="hidden",n.value=!0)},o=()=>{const l=_r(je(e));!l||!n.value||(ei&&(r==null||r()),l.style.overflow=s,vr.delete(l),n.value=!1)};return ss(o),le({get(){return n.value},set(l){l?i():o()}})}function fu(e,t,n={}){const{window:r=We}=n;return is(e,t,r==null?void 0:r.sessionStorage,n)}function uu(e={}){const{window:t=We,behavior:n="auto"}=e;if(!t)return{x:ue(0),y:ue(0)};const r=ue(t.scrollX),s=ue(t.scrollY),i=le({get(){return r.value},set(l){scrollTo({left:l,behavior:n})}}),o=le({get(){return s.value},set(l){scrollTo({top:l,behavior:n})}});return ln(t,"scroll",()=>{r.value=t.scrollX,s.value=t.scrollY},{capture:!1,passive:!0}),{x:i,y:o}}const Yo=/^[a-z]+:/i,pf="vitepress-theme-appearance",Go=/#.*$/,gf=/(index)?\.(md|html)$/,Oe=typeof document<"u",zo={relativePath:"",filePath:"",title:"404",description:"Not Found",headers:[],frontmatter:{sidebar:!1,layout:"page"},lastUpdated:0,isNotFound:!0};function mf(e,t,n=!1){if(t===void 0)return!1;if(e=ni(`/${e}`),n)return new RegExp(t).test(e);if(ni(t)!==e)return!1;const r=t.match(Go);return r?(Oe?location.hash:"")===r[0]:!0}function ni(e){return decodeURI(e).replace(Go,"").replace(gf,"")}function yf(e){return Yo.test(e)}function _f(e,t){var r,s,i,o,l,c,f;const n=Object.keys(e.locales).find(a=>a!=="root"&&!yf(a)&&mf(t,`/${a}/`,!0))||"root";return Object.assign({},e,{localeIndex:n,lang:((r=e.locales[n])==null?void 0:r.lang)??e.lang,dir:((s=e.locales[n])==null?void 0:s.dir)??e.dir,title:((i=e.locales[n])==null?void 0:i.title)??e.title,titleTemplate:((o=e.locales[n])==null?void 0:o.titleTemplate)??e.titleTemplate,description:((l=e.locales[n])==null?void 0:l.description)??e.description,head:Xo(e.head,((c=e.locales[n])==null?void 0:c.head)??[]),themeConfig:{...e.themeConfig,...(f=e.locales[n])==null?void 0:f.themeConfig}})}function Jo(e,t){const n=t.title||e.title,r=t.titleTemplate??e.titleTemplate;if(typeof r=="string"&&r.includes(":title"))return r.replace(/:title/g,n);const s=vf(e.title,r);return`${n}${s}`}function vf(e,t){return t===!1?"":t===!0||t===void 0?` | ${e}`:e===t?"":` | ${t}`}function bf(e,t){const[n,r]=t;if(n!=="meta")return!1;const s=Object.entries(r)[0];return s==null?!1:e.some(([i,o])=>i===n&&o[s[0]]===s[1])}function Xo(e,t){return[...e.filter(n=>!bf(t,n)),...t]}const wf=/[\u0000-\u001F"#$&*+,:;<=>?[\]^`{|}\u007F]/g,xf=/^[a-z]:/i;function ri(e){const t=xf.exec(e),n=t?t[0]:"";return n+e.slice(n.length).replace(wf,"_").replace(/(^|\/)_+(?=[^/]*$)/,"$1")}const Tf=Symbol(),wt=Yr(Ya);function du(e){const t=le(()=>_f(wt.value,e.data.relativePath)),n=t.value.appearance,r=n==="force-dark"?ue(!0):n?df({storageKey:pf,initialValue:()=>typeof n=="string"?n:"auto",...typeof n=="object"?n:{}}):ue(!1);return{site:t,theme:le(()=>t.value.themeConfig),page:le(()=>e.data),frontmatter:le(()=>e.data.frontmatter),params:le(()=>e.data.params),lang:le(()=>t.value.lang),dir:le(()=>t.value.dir),localeIndex:le(()=>t.value.localeIndex||"root"),title:le(()=>Jo(t.value,e.data)),description:le(()=>e.data.description||t.value.description),isDark:r}}function Sf(){const e=It(Tf);if(!e)throw new Error("vitepress data not properly injected in app");return e}function Ef(e,t){return`${e}${t}`.replace(/\/+/g,"/")}function si(e){return Yo.test(e)||!e.startsWith("/")?e:Ef(wt.value.base,e)}function Cf(e){let t=e.replace(/\.html$/,"");if(t=decodeURIComponent(t),t=t.replace(/\/$/,"/index"),Oe){const n="/";t=ri(t.slice(n.length).replace(/\//g,"_")||"index")+".md";let r=__VP_HASH_MAP__[t.toLowerCase()];if(r||(t=t.endsWith("_index.md")?t.slice(0,-9)+".md":t.slice(0,-3)+"_index.md",r=__VP_HASH_MAP__[t.toLowerCase()]),!r)return null;t=`${n}assets/${t}.${r}.js`}else t=`./${ri(t.slice(1).replace(/\//g,"_"))}.md.js`;return t}let Rn=[];function hu(e){Rn.push(e),Jn(()=>{Rn=Rn.filter(t=>t!==e)})}const Af=Symbol(),Zo="http://a.com",Mf=()=>({path:"/",component:null,data:zo});function pu(e,t){const n=qn(Mf()),r={route:n,go:s};async function s(l=Oe?location.href:"/"){var c,f;l=Nr(l),await((c=r.onBeforeRouteChange)==null?void 0:c.call(r,l))!==!1&&(li(l),await o(l),await((f=r.onAfterRouteChanged)==null?void 0:f.call(r,l)))}let i=null;async function o(l,c=0,f=!1){var y;if(await((y=r.onBeforePageLoad)==null?void 0:y.call(r,l))===!1)return;const a=new URL(l,Zo),d=i=a.pathname;try{let _=await e(d);if(!_)throw new Error(`Page not found: ${d}`);if(i===d){i=null;const{default:w,__pageData:b}=_;if(!w)throw new Error(`Invalid route component: ${w}`);n.path=Oe?d:si(d),n.component=En(w),n.data=En(b),Oe&&Gn(()=>{let $=wt.value.base+b.relativePath.replace(/(?:(^|\/)index)?\.md$/,"$1");if(!wt.value.cleanUrls&&!$.endsWith("/")&&($+=".html"),$!==a.pathname&&(a.pathname=$,l=$+a.search+a.hash,history.replaceState(null,"",l)),a.hash&&!c){let L=null;try{L=document.getElementById(decodeURIComponent(a.hash).slice(1))}catch(B){console.warn(B)}if(L){ii(L,a.hash);return}}window.scrollTo(0,c)})}}catch(_){if(!/fetch|Page not found/.test(_.message)&&!/^\/404(\.html|\/)?$/.test(l)&&console.error(_),!f)try{const w=await fetch(wt.value.base+"hashmap.json");window.__VP_HASH_MAP__=await w.json(),await o(l,c,!0);return}catch{}i===d&&(i=null,n.path=Oe?d:si(d),n.component=t?En(t):null,n.data=zo)}}return Oe&&(window.addEventListener("click",l=>{if(l.target.closest("button"))return;const f=l.target.closest("a");if(f&&!f.closest(".vp-raw")&&(f instanceof SVGElement||!f.download)){const{target:a}=f,{href:d,origin:y,pathname:_,hash:w,search:b}=new URL(f.href instanceof SVGAnimatedString?f.href.animVal:f.href,f.baseURI),$=window.location,L=_.match(/\.\w+$/);!l.ctrlKey&&!l.shiftKey&&!l.altKey&&!l.metaKey&&!a&&y===$.origin&&!(L&&L[0]!==".html")&&(l.preventDefault(),_===$.pathname&&b===$.search?(w!==$.hash&&(history.pushState(null,"",w),window.dispatchEvent(new Event("hashchange"))),w?ii(f,w,f.classList.contains("header-anchor")):(li(d),window.scrollTo(0,0))):s(d))}},{capture:!0}),window.addEventListener("popstate",l=>{o(Nr(location.href),l.state&&l.state.scrollPosition||0)}),window.addEventListener("hashchange",l=>{l.preventDefault()})),r}function Rf(){const e=It(Af);if(!e)throw new Error("useRouter() is called without provider.");return e}function Qo(){return Rf().route}function ii(e,t,n=!1){let r=null;try{r=e.classList.contains("header-anchor")?e:document.getElementById(decodeURIComponent(t).slice(1))}catch(s){console.warn(s)}if(r){let f=function(){!n||Math.abs(c-window.scrollY)>window.innerHeight?window.scrollTo(0,c):window.scrollTo({left:0,top:c,behavior:"smooth"})},s=wt.value.scrollOffset,i=0,o=24;if(typeof s=="object"&&"padding"in s&&(o=s.padding,s=s.selector),typeof s=="number")i=s;else if(typeof s=="string")i=oi(s,o);else if(Array.isArray(s))for(const a of s){const d=oi(a,o);if(d){i=d;break}}const l=parseInt(window.getComputedStyle(r).paddingTop,10),c=window.scrollY+r.getBoundingClientRect().top-i+l;requestAnimationFrame(f)}}function oi(e,t){const n=document.querySelector(e);if(!n)return 0;const r=n.getBoundingClientRect().bottom;return r<0?0:r+t}function li(e){Oe&&e!==Nr(location.href)&&(history.replaceState({scrollPosition:window.scrollY},document.title),history.pushState(null,"",e))}function Nr(e){const t=new URL(e,Zo);return t.pathname=t.pathname.replace(/(^|\/)index(\.html)?$/,"$1"),wt.value.cleanUrls?t.pathname=t.pathname.replace(/\.html$/,""):!t.pathname.endsWith("/")&&!t.pathname.endsWith(".html")&&(t.pathname+=".html"),t.pathname+t.search+t.hash}const ci=()=>Rn.forEach(e=>e()),gu=zr({name:"VitePressContent",props:{as:{type:[Object,String],default:"div"}},setup(e){const t=Qo(),{site:n}=Sf();return()=>Dr(e.as,n.value.contentProps??{style:{position:"relative"}},[t.component?Dr(t.component,{onVnodeMounted:ci,onVnodeUpdated:ci}):"404 Page Not Found"])}}),Of="modulepreload",If=function(e){return"/"+e},ai={},mu=function(t,n,r){if(!n||n.length===0)return t();const s=document.getElementsByTagName("link");return Promise.all(n.map(i=>{if(i=If(i),i in ai)return;ai[i]=!0;const o=i.endsWith(".css"),l=o?'[rel="stylesheet"]':"";if(!!r)for(let a=s.length-1;a>=0;a--){const d=s[a];if(d.href===i&&(!o||d.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${i}"]${l}`))return;const f=document.createElement("link");if(f.rel=o?"stylesheet":Of,o||(f.as="script",f.crossOrigin=""),f.href=i,document.head.appendChild(f),o)return new Promise((a,d)=>{f.addEventListener("load",a),f.addEventListener("error",()=>d(new Error(`Unable to preload CSS for ${i}`)))})})).then(()=>t()).catch(i=>{const o=new Event("vite:preloadError",{cancelable:!0});if(o.payload=i,window.dispatchEvent(o),!o.defaultPrevented)throw i})},yu=zr({setup(e,{slots:t}){const n=ue(!1);return Ht(()=>{n.value=!0}),()=>n.value&&t.default?t.default():null}});function _u(){Oe&&window.addEventListener("click",e=>{var n;const t=e.target;if(t.matches(".vp-code-group input")){const r=(n=t.parentElement)==null?void 0:n.parentElement;if(!r)return;const s=Array.from(r.querySelectorAll("input")).indexOf(t);if(s<0)return;const i=r.querySelector(".blocks");if(!i)return;const o=Array.from(i.children).find(f=>f.classList.contains("active"));if(!o)return;const l=i.children[s];if(!l||o===l)return;o.classList.remove("active"),l.classList.add("active");const c=r==null?void 0:r.querySelector(`label[for="${t.id}"]`);c==null||c.scrollIntoView({block:"nearest"})}})}function vu(){if(Oe){const e=new WeakMap;window.addEventListener("click",t=>{var r;const n=t.target;if(n.matches('div[class*="language-"] > button.copy')){const s=n.parentElement,i=(r=n.nextElementSibling)==null?void 0:r.nextElementSibling;if(!s||!i)return;const o=/language-(shellscript|shell|bash|sh|zsh)/.test(s.className);let l="";i.querySelectorAll("span.line:not(.diff.remove)").forEach(c=>l+=(c.textContent||"")+` +`),l=l.slice(0,-1),o&&(l=l.replace(/^ *(\$|>) /gm,"").trim()),Pf(l).then(()=>{n.classList.add("copied"),clearTimeout(e.get(n));const c=setTimeout(()=>{n.classList.remove("copied"),n.blur(),e.delete(n)},2e3);e.set(n,c)})}})}}async function Pf(e){try{return navigator.clipboard.writeText(e)}catch{const t=document.createElement("textarea"),n=document.activeElement;t.value=e,t.setAttribute("readonly",""),t.style.contain="strict",t.style.position="absolute",t.style.left="-9999px",t.style.fontSize="12pt";const r=document.getSelection(),s=r?r.rangeCount>0&&r.getRangeAt(0):null;document.body.appendChild(t),t.select(),t.selectionStart=0,t.selectionEnd=e.length,document.execCommand("copy"),document.body.removeChild(t),s&&(r.removeAllRanges(),r.addRange(s)),n&&n.focus()}}function bu(e,t){let n=[],r=!0;const s=i=>{if(r){r=!1;return}n.forEach(o=>document.head.removeChild(o)),n=[],i.forEach(o=>{const l=fi(o);document.head.appendChild(l),n.push(l)})};ns(()=>{const i=e.data,o=t.value,l=i&&i.description,c=i&&i.frontmatter.head||[];document.title=Jo(o,i);const f=l||o.description;let a=document.querySelector("meta[name=description]");a?a.setAttribute("content",f):fi(["meta",{name:"description",content:f}]),s(Xo(o.head,Df(c)))})}function fi([e,t,n]){const r=document.createElement(e);for(const s in t)r.setAttribute(s,t[s]);return n&&(r.innerHTML=n),e==="script"&&!t.async&&(r.async=!1),r}function Lf(e){return e[0]==="meta"&&e[1]&&e[1].name==="description"}function Df(e){return e.filter(t=>!Lf(t))}const br=new Set,el=()=>document.createElement("link"),Hf=e=>{const t=el();t.rel="prefetch",t.href=e,document.head.appendChild(t)},Nf=e=>{const t=new XMLHttpRequest;t.open("GET",e,t.withCredentials=!0),t.send()};let xn;const Ff=Oe&&(xn=el())&&xn.relList&&xn.relList.supports&&xn.relList.supports("prefetch")?Hf:Nf;function wu(){if(!Oe||!window.IntersectionObserver)return;let e;if((e=navigator.connection)&&(e.saveData||/2g/.test(e.effectiveType)))return;const t=window.requestIdleCallback||setTimeout;let n=null;const r=()=>{n&&n.disconnect(),n=new IntersectionObserver(i=>{i.forEach(o=>{if(o.isIntersecting){const l=o.target;n.unobserve(l);const{pathname:c}=l;if(!br.has(c)){br.add(c);const f=Cf(c);f&&Ff(f)}}})}),t(()=>{document.querySelectorAll("#app a").forEach(i=>{const{hostname:o,pathname:l}=new URL(i.href instanceof SVGAnimatedString?i.href.animVal:i.href,i.baseURI),c=l.match(/\.\w+$/);c&&c[0]!==".html"||i.target!=="_blank"&&o===location.hostname&&(l!==location.pathname?n.observe(i):br.add(l))})})};Ht(r);const s=Qo();ot(()=>s.path,r),Jn(()=>{n&&n.disconnect()})}export{$f as $,jf as A,Bf as B,Yr as C,hu as D,ce as E,ve as F,Uf as G,Yo as H,Qo as I,la as J,It as K,Un as L,Gn as M,uu as N,zf as O,Yn as P,lu as Q,Vf as R,mu as S,Xf as T,au as U,kc as V,Kf as W,tu as X,eu as Y,qf as Z,su as _,Co as a,Zf as a0,bu as a1,Af as a2,du as a3,Tf as a4,gu as a5,yu as a6,wt as a7,ru as a8,pu as a9,Cf as aa,wu as ab,vu as ac,_u as ad,Dr as ae,Bo as af,ss as ag,ou as ah,fu as ai,cu as aj,iu as ak,Rf as al,ln as am,eo as an,Qf as ao,ae as ap,kf as aq,En as ar,nu as as,Pr as b,Gf as c,zr as d,Jf as e,si as f,le as g,ue as h,yf as i,Ht as j,Eo as k,Hi as l,mf as m,Bn as n,Ir as o,Oe as p,of as q,Wf as r,ot as s,bl as t,Sf as u,ns as v,cc as w,Jn as x,Yf as y,Ec as z}; diff --git a/assets/chunks/index.c1fed1bd.js b/assets/chunks/index.41b0dfea.js similarity index 99% rename from assets/chunks/index.c1fed1bd.js rename to assets/chunks/index.41b0dfea.js index 4272142..6646ffd 100644 --- a/assets/chunks/index.c1fed1bd.js +++ b/assets/chunks/index.41b0dfea.js @@ -1 +1 @@ -import{o as i,c as a,k as m,L as p,a as h,t as r,e}from"./framework.47aa8d5b.js";const n={align:"center",class:"mb-4"},x=["href"],l=["src","alt"],g=["href"],s=["src","alt"],d={key:2},c=["href"],_={class:"iconify","data-icon":"mdi:open-in-new","data-inline":"false"},f={__name:"ImageComponent",props:["options"],setup(t){return(u,o)=>(i(),a("div",n,[m("figure",null,[t.options.url_2?(i(),a("a",{key:0,class:"no_icon",target:"_blank",rel:"noopener",href:t.options.url_2},[m("img",{class:"docimage max-w-full h-auto rounded-lg",src:t.options.url,alt:t.options.alt,style:p(t.options.max_width)},null,12,l)],8,x)):(i(),a("a",{key:1,class:"no_icon",target:"_blank",rel:"noopener",href:t.options.url},[m("img",{class:"docimage max-w-full h-auto rounded-lg",src:t.options.url,alt:t.options.alt,style:p(t.options.max_width)},null,12,s)],8,g)),t.options.caption?(i(),a("figcaption",d,[o[0]||(o[0]=m("br",null,null,-1)),h(" "+r(t.options.caption)+" ",1),t.options.caption_link?(i(),a("a",{key:0,href:t.options.caption_link,target:"_blank"},[m("span",_,r(t.options.caption_link),1)],8,c)):e("",!0)])):e("",!0)])]))}},v={camera_protect22:{url:"https://i.imgur.com/2FJ4QYR.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect21:{url:"https://i.imgur.com/OyZRfHu.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect20:{url:"https://i.imgur.com/EkrBsC1.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect19:{url:"https://i.imgur.com/qKDM8o8.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect18:{url:"https://i.imgur.com/wJGlxUO.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect17:{url:"https://i.imgur.com/NyVAhp1.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect16:{url:"https://i.imgur.com/lRDQEkX.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect15:{url:"https://i.imgur.com/IPNPHmK.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect14:{url:"https://i.imgur.com/DM4gha2.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect13:{url:"https://i.imgur.com/x8YnJBp.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect12:{url:"https://i.imgur.com/2WEXI8t.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect11:{url:"https://i.imgur.com/R4bU0YL.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect10:{url:"https://i.imgur.com/LmJrnBL.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect9:{url:"https://i.imgur.com/UNrAhv8.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect8:{url:"https://i.imgur.com/QfLmUp8.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect7:{url:"https://i.imgur.com/STZmIZS.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect6:{url:"https://i.imgur.com/EYfNWE0.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect5:{url:"https://i.imgur.com/3WupMrm.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect4:{url:"https://i.imgur.com/yUminT4.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect3:{url:"https://i.imgur.com/bU6LnSo.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect2:{url:"https://i.imgur.com/WnxDMQn.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect1:{url:"https://i.imgur.com/yw2P7BI.png",alt:"",caption:"",max_width:"max-width: 400px;"},xiao13:{url:"https://i.imgur.com/WgcyYGn.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao12:{url:"https://i.imgur.com/7LhSFFS.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao11:{url:"https://i.imgur.com/uwEzevX.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao10:{url:"https://i.imgur.com/jhYUfsJ.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao9:{url:"https://i.imgur.com/0nNosPh.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao8:{url:"https://i.imgur.com/keWlXJy.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao7:{url:"https://i.imgur.com/n14z7lw.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao6:{url:"https://i.imgur.com/qQIYRfa.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao5:{url:"https://i.imgur.com/4OJR3t0.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao4:{url:"https://i.imgur.com/qi5OWBo.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao3:{url:"https://i.imgur.com/kgZe9i6.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao2:{url:"https://i.imgur.com/zmIZFxb.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao_antenna3:{url:"https://i.imgur.com/0DN7iU7.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao_antenna2:{url:"https://i.imgur.com/jFMXXcU.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao_antenna:{url:"https://i.imgur.com/j8pSWr9.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao_kit:{url:"https://i.imgur.com/wwXu77Q.png",alt:"'img of xiao esp'",caption:"Seeed Studio XIAO Sense ESP32 Contents",max_width:"max-width: 400px;"},image_one:{url:"https://i.imgur.com/j18rRI7.jpg",alt:"'img of components'",caption:"'ESPs, cams, a programmer and a USB connector'",max_width:"max-width: 400px;"},discord_content:{url:"https://discord.com/api/guilds/946212245187199026/widget.png?style=banner3",url_2:"https://discord.gg/kkXYbVykZX",alt:"'discord banner'",max_width:"max-width: 400px;"},external_antenna:{url:"https://i.imgur.com/OzpxFMD.png",alt:"'img of external antenna'",caption:"Image from:",caption_link:"https://randomnerdtutorials.com/esp32-cam-connect-external-antenna",max_width:"max-width: 400px;"},external_antenna_resistors:{url:"https://i.imgur.com/RIFpNqW.jpg",alt:"'img of external antenna resistors'",max_width:"max-width: 400px;"},camera_socket:{url:"https://i.imgur.com/T5asLGN.jpg",alt:"'img of camera socket'",max_width:"max-width: 400px;"},camera_socket_clip:{url:"https://i.imgur.com/Z8b8Sin.jpg",alt:"'img of camera clip'",max_width:"max-width: 400px;"},camera_cable:{url:"https://i.imgur.com/dDBIi9j.jpg",alt:"'img of camera cable'",max_width:"max-width: 400px;"},camera_clip_close:{url:"https://i.imgur.com/VnFi5XS.jpg",alt:"'img of camera cable'",max_width:"max-width: 400px;"},_7_12_one:{url:"https://i.imgur.com/LsLPAcd.jpg",alt:"",max_width:"max-width: 400px;"},_7_12_two:{url:"https://i.imgur.com/Cdu9lSN.jpg",alt:"",max_width:"max-width: 400px;"},_7_12_three:{url:"https://i.imgur.com/QlRrWNn.jpg",alt:"",max_width:"max-width: 400px;"},_13_18_one:{url:"https://i.imgur.com/DhnmLBG.jpg",alt:"",max_width:"max-width: 400px;"},_13_18_two:{url:"https://i.imgur.com/PWA0gtq.jpg",alt:"",max_width:"max-width: 400px;"},_13_18_three:{url:"https://i.imgur.com/0zXY79j.jpg",alt:"",caption:"357ohm resistors and V3 PCBs",max_width:"max-width: 400px;"},_13_18_four:{url:"https://i.imgur.com/n1noWKq.png",alt:"",caption:"V3",max_width:"max-width: 400px;"},_13_18_five:{url:"https://i.imgur.com/Ap8OAWY.png",alt:"",caption:"The green markings and notched corners mark the positive sides of the LEDs pictured above.",max_width:"max-width: 400px;"},_13_18_six:{url:"https://i.imgur.com/gb4etdB.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_seven:{url:"https://i.imgur.com/ev5QFch.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_eight:{url:"https://i.imgur.com/8jCQOHw.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_nine:{url:"https://i.imgur.com/CHUb7Iv.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_ten:{url:"https://i.imgur.com/jZYAm5O.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_one:{url:"https://i.imgur.com/pjvLHJL.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_two:{url:"https://i.imgur.com/RbHZQhl.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_three:{url:"https://i.imgur.com/VyClWvp.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_four:{url:"https://i.imgur.com/tFCQTqE.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_five:{url:"https://i.imgur.com/tFCQTqE.jpeg",alt:"",caption:"",max_width:"max-width: 400px;"},end_six:{url:"https://i.imgur.com/pqDgpYP.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_seven:{url:"https://i.imgur.com/bEq6Ww0.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_eight:{url:"https://i.imgur.com/r2Jo45t.png",alt:"",caption:"",max_width:"max-width: 400px;"},end_nine:{url:"https://i.imgur.com/a6ERUFx.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_ten:{url:"https://i.imgur.com/Wy89UWy.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_eleven:{url:"https://i.imgur.com/LtKOLWo.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_twelve:{url:"https://i.imgur.com/9mty1bv.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_thirteen:{url:"https://i.imgur.com/ArLO1ls.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_fourteen:{url:"https://i.imgur.com/ZIecsMM.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_fifteen:{url:"https://i.imgur.com/tYD1KKe.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_sixteen:{url:"https://i.imgur.com/3rCRU5A.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},upload_firmware_image_one:{url:"https://i.imgur.com/dSPSpkY.png",alt:"'platformio serial monitor button'",max_width:"max-width: 500px;"},upload_firmware_image_two:{url:"https://i.imgur.com/PoHP3NC.png",alt:"'img of platformio serial monitor'",max_width:"max-width: 600px;"},upload_firmware_build_button:{url:"https://i.imgur.com/5E5u5Jz.png",alt:"'Selecting platformio environment'",max_width:"max-width: 600px;"},upload_firmware_webpage:{url:"https://i.imgur.com/wMXdZcJ.png",alt:"'Firmware uploading web page'",max_width:"max-width: 600px;"},upload_firmware_webpage_directory:{url:"https://i.imgur.com/KnnB28z.png",alt:"'An example of how the bin file directory looks like'",max_width:"max-width: 600px;"},upload_firmware_webpage_directory_file:{url:"https://i.imgur.com/Ujx3iaG.png",alt:"'An example of how the bin file looks like'",max_width:"max-width: 600px;"},upload_firmware_webpage_upload_finished:{url:"https://i.imgur.com/O2KzHAN.png",alt:"'A finished OTA upload'",max_width:"max-width: 600px;"},upload_firmware_select_env:{url:"https://i.imgur.com/8sn6FSe.png",alt:"'An example of how the popup list of envs looks like'",max_width:"max-width: 600px;"},upload_firmware_select_env_dropdown:{url:"https://i.imgur.com/nRpuBSI.png",alt:"'An example of how the button for selecting env looks like'",max_width:"max-width: 600px;"},ant_logo_platformio:{url:"https://i.imgur.com/B6zK6n8.png",alt:"Platformio logo button",max_width:"max-width: 600px;"},platformio_quick_access:{url:"https://i.imgur.com/94Xgg9k.png",alt:"Platformio logo Quick Access Section",max_width:"max-width: 600px;"},platformio_quick_access_miscellaneous:{url:"https://i.imgur.com/Zoolr2M.png",alt:"Platformio miscellaneous section",max_width:"max-width: 600px;"},platformio_quick_access_upgrade_core:{url:"https://i.imgur.com/nOF817M.png",alt:"Platformio upgrade core button",max_width:"max-width: 600px;"},platformio_pio_home:{url:"https://i.imgur.com/M7ZYAtU.png",alt:"Platformio open home",max_width:"max-width: 600px;"},platformio_pio_sidebar_platforms:{url:"https://i.imgur.com/LgnU4HG.png",alt:"Platformio platforms sidebar",max_width:"max-width: 600px;"},platformio_pio_sidebar_platforms_updates:{url:"https://i.imgur.com/ZsKos2E.png",alt:"Platformio platforms sections",max_width:"max-width: 600px;"},platformio_pio_espressif32:{url:"https://i.imgur.com/mQdM6X2.png",alt:"Platformio platforms update view",max_width:"max-width: 600px;"},setup_vscode_image_one:{url:"https://i.imgur.com/jXPXIFz.gif",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_two:{url:"https://i.imgur.com/hAm3Zu0.gif",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_three:{url:"https://i.imgur.com/ebV0IgT.gif",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_four:{url:"https://i.imgur.com/DWO5vkE.png",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_five:{url:"https://i.imgur.com/fJs4GJR.png",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_six:{url:"https://i.imgur.com/YbXpX7t.png",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_seven:{url:"https://i.imgur.com/c61Cpaz.gif",alt:"'img'",max_width:"max-width: 500px;"},configure_firmware_one:{url:"https://i.imgur.com/1Ficr7f.png",alt:"'img'",max_width:"max-width: 500px;"},configure_firmware_two:{url:"https://i.imgur.com/Sq4iQJe.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_one:{url:"https://i.imgur.com/olwRFYI.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_two:{url:"https://i.imgur.com/Ugzzgbh.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_three:{url:"https://i.imgur.com/z6V7A71.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_four:{url:"https://i.imgur.com/MJb2h74.png",alt:"'img'",caption:"See the Awaiting Eye Cropping Settings text?",max_width:"max-width: 500px;"},eyetrack_vr_guide_five:{url:"https://i.imgur.com/1pNYITS.png",alt:"'img'",caption:":O It's my eye!",max_width:"max-width: 500px;"},eyetrack_vr_guide_six:{url:"https://i.imgur.com/HZSvFBv.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_seven:{url:"https://i.imgur.com/xXTB3sM.png",alt:"'img'",caption:"It's crooked!",max_width:"max-width: 500px;"},eyetrack_vr_guide_eight:{url:"https://i.imgur.com/blsrpCX.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},eyetrack_vr_guide_nine:{url:"https://i.imgur.com/30fFadH.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},eyetrack_vr_guide_ten:{url:"https://i.imgur.com/ZjpKfCV.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},eyetrack_vr_guide_eleven:{url:"https://i.imgur.com/KPUn8S1.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},fox_ir_build_instructions_one:{url:"https://i.imgur.com/WyoVdcR.jpg",alt:"'img'",caption:"698ohm resistors and V2 PCBs",max_width:"max-width: 400px;"},fox_ir_build_instructions_two:{url:"https://i.imgur.com/sNB6ju2.png",alt:"'img'",caption:"V2",max_width:"max-width: 400px;"},fox_ir_build_instructions_three:{url:"https://i.imgur.com/Ap8OAWY.png",alt:"'img'",caption:"The green markings and notched corners mark the positive sides of the LEDs pictured above.",max_width:"max-width: 400px;"},fox_ir_build_instructions_four:{url:"https://i.imgur.com/ayQ5vkf.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_five:{url:"https://i.imgur.com/DpFwecO.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_six:{url:"https://i.imgur.com/50ydMrl.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_seven:{url:"https://i.imgur.com/Qq3cvxi.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_eight:{url:"https://i.imgur.com/yWGaKaC.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_nine:{url:"https://i.imgur.com/Ql4zYCq.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_ten:{url:"https://i.imgur.com/Xrczoyv.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_eleven:{url:"https://i.imgur.com/KKgP8qs.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_twelve:{url:"https://i.imgur.com/SvbHAuY.jpg",alt:"'img'",caption:"The LED is flipped in this Image, the green dot should face AWAY from the PCB.",max_width:"max-width: 400px;"},fox_ir_build_instructions_thirteen:{url:"https://i.imgur.com/gopjVG3.png",alt:"'drawing'",max_width:"max-width: 500px;"},pio_upgrade_command:{url:"https://i.imgur.com/taDa3vj.png",alt:"pio upgrade command in the terminal",max_width:"max-width: 500px;"},unity_vrc_expressions:{url:"https://i.imgur.com/hdbJQ0h.png",alt:"Screenshot showing expressions section of vrc avatar descriptor",max_width:"max-width: 600px;"},unity_vrc_expressions_add_fields:{url:"https://i.imgur.com/VGA0zqb.png",alt:"Screenshot showing adding parameters to parameter menu",max_width:"max-width: 600px;"},unity_vrc_expressions_fields:{url:"https://i.imgur.com/hkcT013.png",alt:"Screenshot showing the params that need to be added",max_width:"max-width: 600px;"},unity_vrc_empty_control:{url:"https://i.imgur.com/PluHjmI.png",alt:"Screenshot showing the the empty controls field",max_width:"max-width: 600px;"},unity_vrc_control_setup:{url:"https://i.imgur.com/XgN2230.png",alt:"Screenshot showing the the controls setup",max_width:"max-width: 600px;"},V4_wire_sketch:{url:"https://imgur.com/zdj9WUu.png",alt:"Sketch of V4 wiring",max_width:"max-width: 600px;"},V4_solder_wire:{url:"https://i.imgur.com/yB9e92o.jpg",alt:"Sketch of V4 wire",max_width:"max-width: 400px;"},esp_board_env:{url:"https://i.imgur.com/5BbQmCE.gif",alt:"GIF showing a switch of board environments.",max_width:"max-width: 600px;"},flashing_tool_1:{url:"https://imgur.com/vnjGE0x.png",alt:"Flashing Tool ui lower half",max_width:"max-width: 600px; width:100%"},flashing_tool_select_board:{url:"https://imgur.com/oBJc8F9.png",alt:"preview of manage boards",max_width:"max-width: 600px; width:100%"},flashing_tool_flash_firmware:{url:"https://imgur.com/3Oq2nQf.png",alt:"preview of how to install openiris",max_width:"max-width: 600px; width:100%"},flashing_tool_flash_firmware_success:{url:"https://imgur.com/mjEvTwn.png",alt:"preview of flashing success",max_width:"max-width: 600px; width:100%"},flashing_tool_logs:{url:"https://imgur.com/Dqi98qn.png",alt:"logs",max_width:"max-width: 600px; width:100%"},configure_wifi_network:{url:"https://imgur.com/5RkjWTJ.png",alt:"How to send wifi",max_width:"max-width: 600px; width:100%"},send_wifi_credentials:{url:"https://imgur.com/5pyIBgD.png",alt:"how to setup credentials",max_width:"max-width: 600px; width:100%"},flasher_camera_preview:{url:"https://imgur.com/wfdSomX.png",alt:"camera preview",max_width:"max-width: 600px; width:100%"},vrcft_etvr_module_registry:{url:"https://i.imgur.com/AKsgEyy.png",alt:"Screenshot showcasing the VRCFT module registry, with ETVR Tracking Module selected",max_width:"max-width: 600px;"},vrcft_etvr_setitgs_page:{url:"https://i.imgur.com/ectyHfl.png",alt:"Screenshot showcasing the settings page of ETVR, explaining how to setup the VRCFT module",max_width:"max-width: 600px;"},vrcft_etvr_setitgs_page_reset_settings:{url:"https://i.imgur.com/lUrNBHV.png",alt:"Screenshot showcasing the settings page of ETVR, explaining how to reset the ETVR Module",max_width:"max-width: 600px;"},vrcft_etvr_setitgs_page_inter_pc_setup:{url:"https://i.imgur.com/rQPXrER.png",alt:"Screenshot showcasing the settings page of ETVR, explaining how to setup ETVR to talk to a different PC",max_width:"max-width: 600px;"}};export{f as _,v as i}; +import{o as i,c as a,k as m,L as p,a as h,t as r,e}from"./framework.ece1a6f0.js";const n={align:"center",class:"mb-4"},x=["href"],l=["src","alt"],g=["href"],s=["src","alt"],d={key:2},c=["href"],_={class:"iconify","data-icon":"mdi:open-in-new","data-inline":"false"},f={__name:"ImageComponent",props:["options"],setup(t){return(u,o)=>(i(),a("div",n,[m("figure",null,[t.options.url_2?(i(),a("a",{key:0,class:"no_icon",target:"_blank",rel:"noopener",href:t.options.url_2},[m("img",{class:"docimage max-w-full h-auto rounded-lg",src:t.options.url,alt:t.options.alt,style:p(t.options.max_width)},null,12,l)],8,x)):(i(),a("a",{key:1,class:"no_icon",target:"_blank",rel:"noopener",href:t.options.url},[m("img",{class:"docimage max-w-full h-auto rounded-lg",src:t.options.url,alt:t.options.alt,style:p(t.options.max_width)},null,12,s)],8,g)),t.options.caption?(i(),a("figcaption",d,[o[0]||(o[0]=m("br",null,null,-1)),h(" "+r(t.options.caption)+" ",1),t.options.caption_link?(i(),a("a",{key:0,href:t.options.caption_link,target:"_blank"},[m("span",_,r(t.options.caption_link),1)],8,c)):e("",!0)])):e("",!0)])]))}},v={camera_protect22:{url:"https://i.imgur.com/2FJ4QYR.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect21:{url:"https://i.imgur.com/OyZRfHu.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect20:{url:"https://i.imgur.com/EkrBsC1.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect19:{url:"https://i.imgur.com/qKDM8o8.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect18:{url:"https://i.imgur.com/wJGlxUO.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect17:{url:"https://i.imgur.com/NyVAhp1.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect16:{url:"https://i.imgur.com/lRDQEkX.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect15:{url:"https://i.imgur.com/IPNPHmK.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect14:{url:"https://i.imgur.com/DM4gha2.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect13:{url:"https://i.imgur.com/x8YnJBp.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect12:{url:"https://i.imgur.com/2WEXI8t.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect11:{url:"https://i.imgur.com/R4bU0YL.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect10:{url:"https://i.imgur.com/LmJrnBL.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect9:{url:"https://i.imgur.com/UNrAhv8.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect8:{url:"https://i.imgur.com/QfLmUp8.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect7:{url:"https://i.imgur.com/STZmIZS.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect6:{url:"https://i.imgur.com/EYfNWE0.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect5:{url:"https://i.imgur.com/3WupMrm.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect4:{url:"https://i.imgur.com/yUminT4.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect3:{url:"https://i.imgur.com/bU6LnSo.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect2:{url:"https://i.imgur.com/WnxDMQn.png",alt:"",caption:"",max_width:"max-width: 400px;"},camera_protect1:{url:"https://i.imgur.com/yw2P7BI.png",alt:"",caption:"",max_width:"max-width: 400px;"},xiao13:{url:"https://i.imgur.com/WgcyYGn.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao12:{url:"https://i.imgur.com/7LhSFFS.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao11:{url:"https://i.imgur.com/uwEzevX.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao10:{url:"https://i.imgur.com/jhYUfsJ.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao9:{url:"https://i.imgur.com/0nNosPh.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao8:{url:"https://i.imgur.com/keWlXJy.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao7:{url:"https://i.imgur.com/n14z7lw.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao6:{url:"https://i.imgur.com/qQIYRfa.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao5:{url:"https://i.imgur.com/4OJR3t0.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao4:{url:"https://i.imgur.com/qi5OWBo.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao3:{url:"https://i.imgur.com/kgZe9i6.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao2:{url:"https://i.imgur.com/zmIZFxb.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao_antenna3:{url:"https://i.imgur.com/0DN7iU7.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao_antenna2:{url:"https://i.imgur.com/jFMXXcU.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao_antenna:{url:"https://i.imgur.com/j8pSWr9.png",alt:"'img of xiao esp'",caption:"",max_width:"max-width: 400px;"},xiao_kit:{url:"https://i.imgur.com/wwXu77Q.png",alt:"'img of xiao esp'",caption:"Seeed Studio XIAO Sense ESP32 Contents",max_width:"max-width: 400px;"},image_one:{url:"https://i.imgur.com/j18rRI7.jpg",alt:"'img of components'",caption:"'ESPs, cams, a programmer and a USB connector'",max_width:"max-width: 400px;"},discord_content:{url:"https://discord.com/api/guilds/946212245187199026/widget.png?style=banner3",url_2:"https://discord.gg/kkXYbVykZX",alt:"'discord banner'",max_width:"max-width: 400px;"},external_antenna:{url:"https://i.imgur.com/OzpxFMD.png",alt:"'img of external antenna'",caption:"Image from:",caption_link:"https://randomnerdtutorials.com/esp32-cam-connect-external-antenna",max_width:"max-width: 400px;"},external_antenna_resistors:{url:"https://i.imgur.com/RIFpNqW.jpg",alt:"'img of external antenna resistors'",max_width:"max-width: 400px;"},camera_socket:{url:"https://i.imgur.com/T5asLGN.jpg",alt:"'img of camera socket'",max_width:"max-width: 400px;"},camera_socket_clip:{url:"https://i.imgur.com/Z8b8Sin.jpg",alt:"'img of camera clip'",max_width:"max-width: 400px;"},camera_cable:{url:"https://i.imgur.com/dDBIi9j.jpg",alt:"'img of camera cable'",max_width:"max-width: 400px;"},camera_clip_close:{url:"https://i.imgur.com/VnFi5XS.jpg",alt:"'img of camera cable'",max_width:"max-width: 400px;"},_7_12_one:{url:"https://i.imgur.com/LsLPAcd.jpg",alt:"",max_width:"max-width: 400px;"},_7_12_two:{url:"https://i.imgur.com/Cdu9lSN.jpg",alt:"",max_width:"max-width: 400px;"},_7_12_three:{url:"https://i.imgur.com/QlRrWNn.jpg",alt:"",max_width:"max-width: 400px;"},_13_18_one:{url:"https://i.imgur.com/DhnmLBG.jpg",alt:"",max_width:"max-width: 400px;"},_13_18_two:{url:"https://i.imgur.com/PWA0gtq.jpg",alt:"",max_width:"max-width: 400px;"},_13_18_three:{url:"https://i.imgur.com/0zXY79j.jpg",alt:"",caption:"357ohm resistors and V3 PCBs",max_width:"max-width: 400px;"},_13_18_four:{url:"https://i.imgur.com/n1noWKq.png",alt:"",caption:"V3",max_width:"max-width: 400px;"},_13_18_five:{url:"https://i.imgur.com/Ap8OAWY.png",alt:"",caption:"The green markings and notched corners mark the positive sides of the LEDs pictured above.",max_width:"max-width: 400px;"},_13_18_six:{url:"https://i.imgur.com/gb4etdB.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_seven:{url:"https://i.imgur.com/ev5QFch.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_eight:{url:"https://i.imgur.com/8jCQOHw.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_nine:{url:"https://i.imgur.com/CHUb7Iv.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},_13_18_ten:{url:"https://i.imgur.com/jZYAm5O.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_one:{url:"https://i.imgur.com/pjvLHJL.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_two:{url:"https://i.imgur.com/RbHZQhl.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_three:{url:"https://i.imgur.com/VyClWvp.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_four:{url:"https://i.imgur.com/tFCQTqE.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_five:{url:"https://i.imgur.com/tFCQTqE.jpeg",alt:"",caption:"",max_width:"max-width: 400px;"},end_six:{url:"https://i.imgur.com/pqDgpYP.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_seven:{url:"https://i.imgur.com/bEq6Ww0.jpg",alt:"",caption:"",max_width:"max-width: 400px;"},end_eight:{url:"https://i.imgur.com/r2Jo45t.png",alt:"",caption:"",max_width:"max-width: 400px;"},end_nine:{url:"https://i.imgur.com/a6ERUFx.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_ten:{url:"https://i.imgur.com/Wy89UWy.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_eleven:{url:"https://i.imgur.com/LtKOLWo.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_twelve:{url:"https://i.imgur.com/9mty1bv.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_thirteen:{url:"https://i.imgur.com/ArLO1ls.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_fourteen:{url:"https://i.imgur.com/ZIecsMM.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},end_fifteen:{url:"https://i.imgur.com/tYD1KKe.png",alt:"",caption:"",max_width:"max-width: 500px;"},end_sixteen:{url:"https://i.imgur.com/3rCRU5A.jpg",alt:"",caption:"",max_width:"max-width: 500px;"},upload_firmware_image_one:{url:"https://i.imgur.com/dSPSpkY.png",alt:"'platformio serial monitor button'",max_width:"max-width: 500px;"},upload_firmware_image_two:{url:"https://i.imgur.com/PoHP3NC.png",alt:"'img of platformio serial monitor'",max_width:"max-width: 600px;"},upload_firmware_build_button:{url:"https://i.imgur.com/5E5u5Jz.png",alt:"'Selecting platformio environment'",max_width:"max-width: 600px;"},upload_firmware_webpage:{url:"https://i.imgur.com/wMXdZcJ.png",alt:"'Firmware uploading web page'",max_width:"max-width: 600px;"},upload_firmware_webpage_directory:{url:"https://i.imgur.com/KnnB28z.png",alt:"'An example of how the bin file directory looks like'",max_width:"max-width: 600px;"},upload_firmware_webpage_directory_file:{url:"https://i.imgur.com/Ujx3iaG.png",alt:"'An example of how the bin file looks like'",max_width:"max-width: 600px;"},upload_firmware_webpage_upload_finished:{url:"https://i.imgur.com/O2KzHAN.png",alt:"'A finished OTA upload'",max_width:"max-width: 600px;"},upload_firmware_select_env:{url:"https://i.imgur.com/8sn6FSe.png",alt:"'An example of how the popup list of envs looks like'",max_width:"max-width: 600px;"},upload_firmware_select_env_dropdown:{url:"https://i.imgur.com/nRpuBSI.png",alt:"'An example of how the button for selecting env looks like'",max_width:"max-width: 600px;"},ant_logo_platformio:{url:"https://i.imgur.com/B6zK6n8.png",alt:"Platformio logo button",max_width:"max-width: 600px;"},platformio_quick_access:{url:"https://i.imgur.com/94Xgg9k.png",alt:"Platformio logo Quick Access Section",max_width:"max-width: 600px;"},platformio_quick_access_miscellaneous:{url:"https://i.imgur.com/Zoolr2M.png",alt:"Platformio miscellaneous section",max_width:"max-width: 600px;"},platformio_quick_access_upgrade_core:{url:"https://i.imgur.com/nOF817M.png",alt:"Platformio upgrade core button",max_width:"max-width: 600px;"},platformio_pio_home:{url:"https://i.imgur.com/M7ZYAtU.png",alt:"Platformio open home",max_width:"max-width: 600px;"},platformio_pio_sidebar_platforms:{url:"https://i.imgur.com/LgnU4HG.png",alt:"Platformio platforms sidebar",max_width:"max-width: 600px;"},platformio_pio_sidebar_platforms_updates:{url:"https://i.imgur.com/ZsKos2E.png",alt:"Platformio platforms sections",max_width:"max-width: 600px;"},platformio_pio_espressif32:{url:"https://i.imgur.com/mQdM6X2.png",alt:"Platformio platforms update view",max_width:"max-width: 600px;"},setup_vscode_image_one:{url:"https://i.imgur.com/jXPXIFz.gif",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_two:{url:"https://i.imgur.com/hAm3Zu0.gif",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_three:{url:"https://i.imgur.com/ebV0IgT.gif",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_four:{url:"https://i.imgur.com/DWO5vkE.png",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_five:{url:"https://i.imgur.com/fJs4GJR.png",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_six:{url:"https://i.imgur.com/YbXpX7t.png",alt:"'img'",max_width:"max-width: 500px;"},setup_vscode_image_seven:{url:"https://i.imgur.com/c61Cpaz.gif",alt:"'img'",max_width:"max-width: 500px;"},configure_firmware_one:{url:"https://i.imgur.com/1Ficr7f.png",alt:"'img'",max_width:"max-width: 500px;"},configure_firmware_two:{url:"https://i.imgur.com/Sq4iQJe.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_one:{url:"https://i.imgur.com/olwRFYI.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_two:{url:"https://i.imgur.com/Ugzzgbh.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_three:{url:"https://i.imgur.com/z6V7A71.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_four:{url:"https://i.imgur.com/MJb2h74.png",alt:"'img'",caption:"See the Awaiting Eye Cropping Settings text?",max_width:"max-width: 500px;"},eyetrack_vr_guide_five:{url:"https://i.imgur.com/1pNYITS.png",alt:"'img'",caption:":O It's my eye!",max_width:"max-width: 500px;"},eyetrack_vr_guide_six:{url:"https://i.imgur.com/HZSvFBv.png",alt:"'img'",max_width:"max-width: 500px;"},eyetrack_vr_guide_seven:{url:"https://i.imgur.com/xXTB3sM.png",alt:"'img'",caption:"It's crooked!",max_width:"max-width: 500px;"},eyetrack_vr_guide_eight:{url:"https://i.imgur.com/blsrpCX.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},eyetrack_vr_guide_nine:{url:"https://i.imgur.com/30fFadH.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},eyetrack_vr_guide_ten:{url:"https://i.imgur.com/ZjpKfCV.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},eyetrack_vr_guide_eleven:{url:"https://i.imgur.com/KPUn8S1.png",alt:"'img'",caption:"Much better!",max_width:"max-width: 500px;"},fox_ir_build_instructions_one:{url:"https://i.imgur.com/WyoVdcR.jpg",alt:"'img'",caption:"698ohm resistors and V2 PCBs",max_width:"max-width: 400px;"},fox_ir_build_instructions_two:{url:"https://i.imgur.com/sNB6ju2.png",alt:"'img'",caption:"V2",max_width:"max-width: 400px;"},fox_ir_build_instructions_three:{url:"https://i.imgur.com/Ap8OAWY.png",alt:"'img'",caption:"The green markings and notched corners mark the positive sides of the LEDs pictured above.",max_width:"max-width: 400px;"},fox_ir_build_instructions_four:{url:"https://i.imgur.com/ayQ5vkf.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_five:{url:"https://i.imgur.com/DpFwecO.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_six:{url:"https://i.imgur.com/50ydMrl.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_seven:{url:"https://i.imgur.com/Qq3cvxi.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_eight:{url:"https://i.imgur.com/yWGaKaC.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_nine:{url:"https://i.imgur.com/Ql4zYCq.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_ten:{url:"https://i.imgur.com/Xrczoyv.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_eleven:{url:"https://i.imgur.com/KKgP8qs.jpg",alt:"'img'",max_width:"max-width: 400px;"},fox_ir_build_instructions_twelve:{url:"https://i.imgur.com/SvbHAuY.jpg",alt:"'img'",caption:"The LED is flipped in this Image, the green dot should face AWAY from the PCB.",max_width:"max-width: 400px;"},fox_ir_build_instructions_thirteen:{url:"https://i.imgur.com/gopjVG3.png",alt:"'drawing'",max_width:"max-width: 500px;"},pio_upgrade_command:{url:"https://i.imgur.com/taDa3vj.png",alt:"pio upgrade command in the terminal",max_width:"max-width: 500px;"},unity_vrc_expressions:{url:"https://i.imgur.com/hdbJQ0h.png",alt:"Screenshot showing expressions section of vrc avatar descriptor",max_width:"max-width: 600px;"},unity_vrc_expressions_add_fields:{url:"https://i.imgur.com/VGA0zqb.png",alt:"Screenshot showing adding parameters to parameter menu",max_width:"max-width: 600px;"},unity_vrc_expressions_fields:{url:"https://i.imgur.com/hkcT013.png",alt:"Screenshot showing the params that need to be added",max_width:"max-width: 600px;"},unity_vrc_empty_control:{url:"https://i.imgur.com/PluHjmI.png",alt:"Screenshot showing the the empty controls field",max_width:"max-width: 600px;"},unity_vrc_control_setup:{url:"https://i.imgur.com/XgN2230.png",alt:"Screenshot showing the the controls setup",max_width:"max-width: 600px;"},V4_wire_sketch:{url:"https://imgur.com/zdj9WUu.png",alt:"Sketch of V4 wiring",max_width:"max-width: 600px;"},V4_solder_wire:{url:"https://i.imgur.com/yB9e92o.jpg",alt:"Sketch of V4 wire",max_width:"max-width: 400px;"},esp_board_env:{url:"https://i.imgur.com/5BbQmCE.gif",alt:"GIF showing a switch of board environments.",max_width:"max-width: 600px;"},flashing_tool_1:{url:"https://imgur.com/vnjGE0x.png",alt:"Flashing Tool ui lower half",max_width:"max-width: 600px; width:100%"},flashing_tool_select_board:{url:"https://imgur.com/oBJc8F9.png",alt:"preview of manage boards",max_width:"max-width: 600px; width:100%"},flashing_tool_flash_firmware:{url:"https://imgur.com/3Oq2nQf.png",alt:"preview of how to install openiris",max_width:"max-width: 600px; width:100%"},flashing_tool_flash_firmware_success:{url:"https://imgur.com/mjEvTwn.png",alt:"preview of flashing success",max_width:"max-width: 600px; width:100%"},flashing_tool_logs:{url:"https://imgur.com/Dqi98qn.png",alt:"logs",max_width:"max-width: 600px; width:100%"},configure_wifi_network:{url:"https://imgur.com/5RkjWTJ.png",alt:"How to send wifi",max_width:"max-width: 600px; width:100%"},send_wifi_credentials:{url:"https://imgur.com/5pyIBgD.png",alt:"how to setup credentials",max_width:"max-width: 600px; width:100%"},flasher_camera_preview:{url:"https://imgur.com/wfdSomX.png",alt:"camera preview",max_width:"max-width: 600px; width:100%"},vrcft_etvr_module_registry:{url:"https://i.imgur.com/AKsgEyy.png",alt:"Screenshot showcasing the VRCFT module registry, with ETVR Tracking Module selected",max_width:"max-width: 600px;"},vrcft_etvr_setitgs_page:{url:"https://i.imgur.com/ectyHfl.png",alt:"Screenshot showcasing the settings page of ETVR, explaining how to setup the VRCFT module",max_width:"max-width: 600px;"},vrcft_etvr_setitgs_page_reset_settings:{url:"https://i.imgur.com/lUrNBHV.png",alt:"Screenshot showcasing the settings page of ETVR, explaining how to reset the ETVR Module",max_width:"max-width: 600px;"},vrcft_etvr_setitgs_page_inter_pc_setup:{url:"https://i.imgur.com/rQPXrER.png",alt:"Screenshot showcasing the settings page of ETVR, explaining how to setup ETVR to talk to a different PC",max_width:"max-width: 600px;"}};export{f as _,v as i}; diff --git a/assets/chunks/index.339f98d7.js b/assets/chunks/index.c19b2931.js similarity index 97% rename from assets/chunks/index.339f98d7.js rename to assets/chunks/index.c19b2931.js index 34da70c..3cf4143 100644 --- a/assets/chunks/index.339f98d7.js +++ b/assets/chunks/index.c19b2931.js @@ -1 +1 @@ -import{o as n,c as r,k as e,E as s,t as i,n as o,r as _,A as x}from"./framework.47aa8d5b.js";const c={class:"my-2 max-w-xs rounded-lg bg-white px-4 py-4 shadow-xl ring-1 ring-slate-900/5 dark:bg-slate-800"},d={class:"drop-shadow-lg"},b={__name:"Alerts",props:["options"],setup(t){return(l,p)=>{const a=x("Badge");return n(),r("div",c,[e("div",null,[e("span",d,[s(a,{type:t.options.type,text:t.options.badge_content},null,8,["type","text"])])]),e("div",{class:o(["mt-2 pl-1 text-2xl font-bold tracking-tight text-slate-900",t.options.title_color])},i(t.options.title),3),e("p",{class:o(["mt-2 pl-1 text-sm",t.options.text_color])},[_(l.$slots,"content")],2)])}}},u={user_warning:{type:"warning",title:"",title_color:"text-[orange]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"CAUTION"},led_power_warning:{type:"danger",title:"Please pay attention",title_color:"text-[#b63a61] dark:text-[#ea4b7d]",text_color:"text-orange-400 dark:text-orange-500",badge_content:"WARNING"},parts_list_one:{type:"warning",title:"",title_color:"text-[orange]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"CAUTION"},parts_list_two:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},parts_list_three:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},parts_list_four:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},parts_list_five:{type:"warning",title:"",title_color:"text-[orange]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"CAUTION"},parts_list_six:{type:"tip",title:"",title_color:"text-[green]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"TIP"},upload_firmware_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},configure_firmware_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},build_software_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},eyetrack_vr_guide_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},eyetrack_vr_guide_two:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},vrc_avatar_setup:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},end_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"}};export{b as _,u as a}; +import{o as n,c as r,k as e,E as s,t as i,n as o,r as _,A as x}from"./framework.ece1a6f0.js";const c={class:"my-2 max-w-xs rounded-lg bg-white px-4 py-4 shadow-xl ring-1 ring-slate-900/5 dark:bg-slate-800"},d={class:"drop-shadow-lg"},b={__name:"Alerts",props:["options"],setup(t){return(l,p)=>{const a=x("Badge");return n(),r("div",c,[e("div",null,[e("span",d,[s(a,{type:t.options.type,text:t.options.badge_content},null,8,["type","text"])])]),e("div",{class:o(["mt-2 pl-1 text-2xl font-bold tracking-tight text-slate-900",t.options.title_color])},i(t.options.title),3),e("p",{class:o(["mt-2 pl-1 text-sm",t.options.text_color])},[_(l.$slots,"content")],2)])}}},u={user_warning:{type:"warning",title:"",title_color:"text-[orange]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"CAUTION"},led_power_warning:{type:"danger",title:"Please pay attention",title_color:"text-[#b63a61] dark:text-[#ea4b7d]",text_color:"text-orange-400 dark:text-orange-500",badge_content:"WARNING"},parts_list_one:{type:"warning",title:"",title_color:"text-[orange]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"CAUTION"},parts_list_two:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},parts_list_three:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},parts_list_four:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},parts_list_five:{type:"warning",title:"",title_color:"text-[orange]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"CAUTION"},parts_list_six:{type:"tip",title:"",title_color:"text-[green]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"TIP"},upload_firmware_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},configure_firmware_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},build_software_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},eyetrack_vr_guide_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},eyetrack_vr_guide_two:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},vrc_avatar_setup:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"},end_one:{type:"info",title:"",title_color:"text-[blue]",text_color:"text-slate-500 dark:text-slate-400",badge_content:"NOTE"}};export{b as _,u as a}; diff --git a/assets/chunks/theme.cd06fb64.js b/assets/chunks/theme.d6d6d431.js similarity index 97% rename from assets/chunks/theme.cd06fb64.js rename to assets/chunks/theme.d6d6d431.js index 139949a..ca56574 100644 --- a/assets/chunks/theme.cd06fb64.js +++ b/assets/chunks/theme.d6d6d431.js @@ -1 +1 @@ -import{d as g,o as a,c as r,r as u,a as A,t as L,n as C,_ as m,b as k,w as p,e as f,T as ie,u as He,i as ze,f as ce,g as P,h as N,j as U,k as c,l as i,m as G,p as R,q as ae,s as j,v as Q,x as ue,y as Pe,z as xe,A as K,F as I,B as H,C as de,D as q,E as h,G as O,H as Ve,I as ee,J as X,K as te,L as De,M as Ee,N as we,O as Fe,P as Oe,Q as ke,R as Ge,S as Ue,U as Le,V as Se,W as je,X as Ke,Y as Re,Z as qe}from"./framework.47aa8d5b.js";const We=g({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(n){return(e,t)=>(a(),r("span",{class:C(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[A(L(e.text),1)],!0)],2))}});const Ye=m(We,[["__scopeId","data-v-4415f8bd"]]),Xe={key:0,class:"VPBackdrop"},Je=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(n){return(e,t)=>(a(),k(ie,{name:"fade"},{default:p(()=>[e.show?(a(),r("div",Xe)):f("",!0)]),_:1}))}});const Ze=m(Je,[["__scopeId","data-v-b2600058"]]),V=He;function Qe(n,e){let t,s=!1;return()=>{t&&clearTimeout(t),s?t=setTimeout(n,e):(n(),(s=!0)&&setTimeout(()=>s=!1,e))}}function le(n){return/^\//.test(n)?n:`/${n}`}function W(n){if(ze(n))return n;const{site:e}=V(),{pathname:t,search:s,hash:o}=new URL(n,"http://a.com"),l=t.endsWith("/")||t.endsWith(".html")?n:n.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${s}${o}`);return ce(l)}function Y({removeCurrent:n=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:s,page:o,theme:l}=V(),d=P(()=>{var _,b;return{label:(_=t.value.locales[s.value])==null?void 0:_.label,link:((b=t.value.locales[s.value])==null?void 0:b.link)||(s.value==="root"?"/":`/${s.value}/`)}});return{localeLinks:P(()=>Object.entries(t.value.locales).flatMap(([_,b])=>n&&d.value.label===b.label?[]:{text:b.label,link:et(b.link||(_==="root"?"/":`/${_}/`),l.value.i18nRouting!==!1&&e,o.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)})),currentLang:d}}function et(n,e,t,s){return e?n.replace(/\/$/,"")+le(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):n}const tt={class:"NotFound"},st={class:"code"},nt={class:"title"},ot={class:"quote"},at={class:"action"},lt=["href","aria-label"],rt=g({__name:"NotFound",setup(n){const{site:e,theme:t}=V(),{localeLinks:s}=Y({removeCurrent:!1}),o=N("/");return U(()=>{var d;const l=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");s.value.length&&(o.value=((d=s.value.find(({link:v})=>v.startsWith(l)))==null?void 0:d.link)||s.value[0].link)}),(l,d)=>{var v,_,b,w,S;return a(),r("div",tt,[c("p",st,L(((v=i(t).notFound)==null?void 0:v.code)??"404"),1),c("h1",nt,L(((_=i(t).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),d[0]||(d[0]=c("div",{class:"divider"},null,-1)),c("blockquote",ot,L(((b=i(t).notFound)==null?void 0:b.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),c("div",at,[c("a",{class:"link",href:i(ce)(o.value),"aria-label":((w=i(t).notFound)==null?void 0:w.linkLabel)??"go to home"},L(((S=i(t).notFound)==null?void 0:S.linkText)??"Take me home"),9,lt)])])}}});const it=m(rt,[["__scopeId","data-v-572b3891"]]);function Me(n,e){if(Array.isArray(n))return J(n);if(n==null)return[];e=le(e);const t=Object.keys(n).sort((o,l)=>l.split("/").length-o.split("/").length).find(o=>e.startsWith(le(o))),s=t?n[t]:[];return Array.isArray(s)?J(s):J(s.items,s.base)}function ct(n){const e=[];let t=0;for(const s in n){const o=n[s];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function ut(n){const e=[];function t(s){for(const o of s)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(n),e}function re(n,e){return Array.isArray(e)?e.some(t=>re(n,t)):G(n,e.link)?!0:e.items?re(n,e.items):!1}function J(n,e){return[...n].map(t=>{const s={...t},o=s.base||e;return o&&s.link&&(s.link=o+s.link),s.items&&(s.items=J(s.items,o)),s})}function E(){const{frontmatter:n,page:e,theme:t}=V(),s=ae("(min-width: 960px)"),o=N(!1),l=P(()=>{const T=t.value.sidebar,$=e.value.relativePath;return T?Me(T,$):[]}),d=N(l.value);j(l,(T,$)=>{JSON.stringify(T)!==JSON.stringify($)&&(d.value=l.value)});const v=P(()=>n.value.sidebar!==!1&&d.value.length>0&&n.value.layout!=="home"),_=P(()=>b?n.value.aside==null?t.value.aside==="left":n.value.aside==="left":!1),b=P(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:t.value.aside!==!1),w=P(()=>v.value&&s.value),S=P(()=>v.value?ct(d.value):[]);function B(){o.value=!0}function y(){o.value=!1}function M(){o.value?y():B()}return{isOpen:o,sidebar:d,sidebarGroups:S,hasSidebar:v,hasAside:b,leftAside:_,isSidebarEnabled:w,open:B,close:y,toggle:M}}function dt(n,e){let t;Q(()=>{t=n.value?document.activeElement:void 0}),U(()=>{window.addEventListener("keyup",s)}),ue(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&n.value&&(e(),t==null||t.focus())}}const Te=N(R?location.hash:"");R&&window.addEventListener("hashchange",()=>{Te.value=location.hash});function _t(n){const{page:e}=V(),t=N(!1),s=P(()=>n.value.collapsed!=null),o=P(()=>!!n.value.link),l=N(!1),d=()=>{l.value=G(e.value.relativePath,n.value.link)};j([e,n,Te],d),U(d);const v=P(()=>l.value?!0:n.value.items?re(e.value.relativePath,n.value.items):!1),_=P(()=>!!(n.value.items&&n.value.items.length));Q(()=>{t.value=!!(s.value&&n.value.collapsed)}),Pe(()=>{(l.value||v.value)&&(t.value=!1)});function b(){s.value&&(t.value=!t.value)}return{collapsed:t,collapsible:s,isLink:o,isActiveLink:l,hasActiveLink:v,hasChildren:_,toggle:b}}function vt(){const{hasSidebar:n}=E(),e=ae("(min-width: 960px)"),t=ae("(min-width: 1280px)");return{isAsideEnabled:P(()=>!t.value&&!e.value?!1:n.value?t.value:e.value)}}const pt=71;function _e(n){return typeof n.outline=="object"&&!Array.isArray(n.outline)&&n.outline.label||n.outlineTitle||"On this page"}function ve(n){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const s=Number(t.tagName[1]);return{title:ft(t),link:"#"+t.id,level:s}});return ht(e,n)}function ft(n){let e="";for(const t of n.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function ht(n,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[s,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;n=n.filter(d=>d.level>=s&&d.level<=o);const l=[];e:for(let d=0;d=0;_--){const b=n[_];if(b.level{requestAnimationFrame(l),window.addEventListener("scroll",s)}),xe(()=>{d(location.hash)}),ue(()=>{window.removeEventListener("scroll",s)});function l(){if(!t.value)return;const v=[].slice.call(n.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(y=>v.some(M=>M.hash===y.hash&&y.offsetParent!==null)),b=window.scrollY,w=window.innerHeight,S=document.body.offsetHeight,B=Math.abs(b+w-S)<1;if(_.length&&B){d(_[_.length-1].hash);return}for(let y=0;y<_.length;y++){const M=_[y],T=_[y+1],[$,z]=gt(y,M,T);if($){d(z);return}}}function d(v){o&&o.classList.remove("active"),v==null?o=null:o=n.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const _=o;_?(_.classList.add("active"),e.value.style.top=_.offsetTop+33+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function ye(n){return n.parentElement.offsetTop-pt}function gt(n,e,t){const s=window.scrollY;return n===0&&s===0?[!0,null]:s{const o=K("VPDocOutlineItem",!0);return a(),r("ul",{class:C(t.root?"root":"nested")},[(a(!0),r(I,null,H(t.headers,({children:l,link:d,title:v})=>(a(),r("li",null,[c("a",{class:"outline-link",href:d,onClick:e,title:v},L(v),9,bt),l!=null&&l.length?(a(),k(o,{key:0,headers:l},null,8,["headers"])):f("",!0)]))),256))],2)}}});const pe=m(kt,[["__scopeId","data-v-74479eb5"]]),yt={class:"content"},$t={class:"outline-title",role:"heading","aria-level":"2"},Pt={"aria-labelledby":"doc-outline-aria-label"},Vt=g({__name:"VPDocAsideOutline",setup(n){const{frontmatter:e,theme:t}=V(),s=de([]);q(()=>{s.value=ve(e.value.outline??t.value.outline)});const o=N(),l=N();return mt(o,l),(d,v)=>(a(),r("div",{class:C(["VPDocAsideOutline",{"has-outline":s.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[c("div",yt,[c("div",{class:"outline-marker",ref_key:"marker",ref:l},null,512),c("div",$t,L(i(_e)(i(t))),1),c("nav",Pt,[v[0]||(v[0]=c("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),h(pe,{headers:s.value,root:!0},null,8,["headers"])])])],2))}});const wt=m(Vt,[["__scopeId","data-v-d8517c5e"]]),Lt={class:"VPDocAsideCarbonAds"},St=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(n){const e=()=>null;return(t,s)=>(a(),r("div",Lt,[h(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Mt={class:"VPDocAside"},Tt=g({__name:"VPDocAside",setup(n){const{theme:e}=V();return(t,s)=>(a(),r("div",Mt,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),h(wt),u(t.$slots,"aside-outline-after",{},void 0,!0),s[0]||(s[0]=c("div",{class:"spacer"},null,-1)),u(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(a(),k(St,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):f("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}});const Ct=m(Tt,[["__scopeId","data-v-79cae1a0"]]);function Nt(){const{theme:n,page:e}=V();return P(()=>{const{text:t="Edit this page",pattern:s=""}=n.value.editLink||{};let o;return typeof s=="function"?o=s(e.value):o=s.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function It(){const{page:n,theme:e,frontmatter:t}=V();return P(()=>{var _,b,w,S,B,y,M,T;const s=Me(e.value.sidebar,n.value.relativePath),o=ut(s),l=o.findIndex($=>G(n.value.relativePath,$.link)),d=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,v=((b=e.value.docFooter)==null?void 0:b.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((w=o[l-1])==null?void 0:w.docFooterText)??((S=o[l-1])==null?void 0:S.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((B=o[l-1])==null?void 0:B.link)},next:v?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((y=o[l+1])==null?void 0:y.docFooterText)??((M=o[l+1])==null?void 0:M.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((T=o[l+1])==null?void 0:T.link)}}})}const Bt={},At={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"};function Ht(n,e){return a(),r("svg",At,e[0]||(e[0]=[c("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),c("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1)]))}const zt=m(Bt,[["render",Ht]]),x=g({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(n){const e=n,t=P(()=>e.tag??(e.href?"a":"span")),s=P(()=>e.href&&Ve.test(e.href));return(o,l)=>(a(),k(O(t.value),{class:C(["VPLink",{link:o.href,"vp-external-link-icon":s.value,"no-icon":o.noIcon}]),href:o.href?i(W)(o.href):void 0,target:o.target??(s.value?"_blank":void 0),rel:o.rel??(s.value?"noreferrer":void 0)},{default:p(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),xt={class:"VPLastUpdated"},Dt=["datetime"],Et=g({__name:"VPDocFooterLastUpdated",setup(n){const{theme:e,page:t,frontmatter:s,lang:o}=V(),l=P(()=>new Date(s.value.lastUpdated??t.value.lastUpdated)),d=P(()=>l.value.toISOString()),v=N("");return U(()=>{Q(()=>{var _,b,w;v.value=new Intl.DateTimeFormat((b=(_=e.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&b.forceLocale?o.value:void 0,((w=e.value.lastUpdated)==null?void 0:w.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(l.value)})}),(_,b)=>{var w;return a(),r("p",xt,[A(L(((w=i(e).lastUpdated)==null?void 0:w.text)||i(e).lastUpdatedText||"Last updated")+": ",1),c("time",{datetime:d.value},L(v.value),9,Dt)])}}});const Ft=m(Et,[["__scopeId","data-v-5be60f87"]]),Ot={key:0,class:"VPDocFooter"},Gt={key:0,class:"edit-info"},Ut={key:0,class:"edit-link"},jt={key:1,class:"last-updated"},Kt={key:1,class:"prev-next"},Rt={class:"pager"},qt=["href"],Wt=["innerHTML"],Yt=["innerHTML"],Xt={class:"pager"},Jt=["href"],Zt=["innerHTML"],Qt=["innerHTML"],es=g({__name:"VPDocFooter",setup(n){const{theme:e,page:t,frontmatter:s}=V(),o=Nt(),l=It(),d=P(()=>e.value.editLink&&s.value.editLink!==!1),v=P(()=>t.value.lastUpdated&&s.value.lastUpdated!==!1),_=P(()=>d.value||v.value||l.value.prev||l.value.next);return(b,w)=>{var S,B,y,M,T,$;return _.value?(a(),r("footer",Ot,[u(b.$slots,"doc-footer-before",{},void 0,!0),d.value||v.value?(a(),r("div",Gt,[d.value?(a(),r("div",Ut,[h(x,{class:"edit-link-button",href:i(o).url,"no-icon":!0},{default:p(()=>[h(zt,{class:"edit-link-icon","aria-label":"edit icon"}),A(" "+L(i(o).text),1)]),_:1},8,["href"])])):f("",!0),v.value?(a(),r("div",jt,[h(Ft)])):f("",!0)])):f("",!0),(S=i(l).prev)!=null&&S.link||(B=i(l).next)!=null&&B.link?(a(),r("nav",Kt,[c("div",Rt,[(y=i(l).prev)!=null&&y.link?(a(),r("a",{key:0,class:"pager-link prev",href:i(W)(i(l).prev.link)},[c("span",{class:"desc",innerHTML:((M=i(e).docFooter)==null?void 0:M.prev)||"Previous page"},null,8,Wt),c("span",{class:"title",innerHTML:i(l).prev.text},null,8,Yt)],8,qt)):f("",!0)]),c("div",Xt,[(T=i(l).next)!=null&&T.link?(a(),r("a",{key:0,class:"pager-link next",href:i(W)(i(l).next.link)},[c("span",{class:"desc",innerHTML:(($=i(e).docFooter)==null?void 0:$.next)||"Next page"},null,8,Zt),c("span",{class:"title",innerHTML:i(l).next.text},null,8,Qt)],8,Jt)):f("",!0)])])):f("",!0)])):f("",!0)}}});const ts=m(es,[["__scopeId","data-v-67de71aa"]]),ss={},ns={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function os(n,e){return a(),r("svg",ns,e[0]||(e[0]=[c("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1)]))}const fe=m(ss,[["render",os]]),as={key:0,class:"VPDocOutlineDropdown"},ls={key:0,class:"items"},rs=g({__name:"VPDocOutlineDropdown",setup(n){const{frontmatter:e,theme:t}=V(),s=N(!1);q(()=>{s.value=!1});const o=de([]);return q(()=>{o.value=ve(e.value.outline??t.value.outline)}),(l,d)=>o.value.length>0?(a(),r("div",as,[c("button",{onClick:d[0]||(d[0]=v=>s.value=!s.value),class:C({open:s.value})},[A(L(i(_e)(i(t)))+" ",1),h(fe,{class:"icon"})],2),s.value?(a(),r("div",ls,[h(pe,{headers:o.value},null,8,["headers"])])):f("",!0)])):f("",!0)}});const is=m(rs,[["__scopeId","data-v-3686ba1c"]]),cs={class:"container"},us={class:"aside-container"},ds={class:"aside-content"},_s={class:"content"},vs={class:"content-container"},ps={class:"main"},fs=g({__name:"VPDoc",setup(n){const{theme:e}=V(),t=ee(),{hasSidebar:s,hasAside:o,leftAside:l}=E(),d=P(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,_)=>{const b=K("Content");return a(),r("div",{class:C(["VPDoc",{"has-sidebar":i(s),"has-aside":i(o)}])},[u(v.$slots,"doc-top",{},void 0,!0),c("div",cs,[i(o)?(a(),r("div",{key:0,class:C(["aside",{"left-aside":i(l)}])},[_[0]||(_[0]=c("div",{class:"aside-curtain"},null,-1)),c("div",us,[c("div",ds,[h(Ct,null,{"aside-top":p(()=>[u(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[u(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[u(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[u(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[u(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[u(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),c("div",_s,[c("div",vs,[u(v.$slots,"doc-before",{},void 0,!0),h(is),c("main",ps,[h(b,{class:C(["vp-doc",[d.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),h(ts,null,{"doc-footer-before":p(()=>[u(v.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(v.$slots,"doc-after",{},void 0,!0)])])]),u(v.$slots,"doc-bottom",{},void 0,!0)],2)}}});const hs=m(fs,[["__scopeId","data-v-281cfc61"]]),ms=g({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(n){const e=n,t=P(()=>e.href&&Ve.test(e.href)),s=P(()=>e.tag||e.href?"a":"button");return(o,l)=>(a(),k(O(s.value),{class:C(["VPButton",[o.size,o.theme]]),href:o.href?i(W)(o.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:p(()=>[A(L(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const gs=m(ms,[["__scopeId","data-v-de3c2b62"]]),bs=["src","alt"],ks=g({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(n){return(e,t)=>{const s=K("VPImage",!0);return e.image?(a(),r(I,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),r("img",X({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(ce)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,bs)):(a(),r(I,{key:1},[h(s,X({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(s,X({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}});const Z=m(ks,[["__scopeId","data-v-4d414b82"]]),ys={class:"container"},$s={class:"main"},Ps={key:0,class:"name"},Vs=["innerHTML"],ws=["innerHTML"],Ls=["innerHTML"],Ss={key:0,class:"actions"},Ms={key:0,class:"image"},Ts={class:"image-container"},Cs=g({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(n){const e=te("hero-image-slot-exists");return(t,s)=>(a(),r("div",{class:C(["VPHero",{"has-image":t.image||i(e)}])},[c("div",ys,[c("div",$s,[u(t.$slots,"home-hero-info",{},()=>[t.name?(a(),r("h1",Ps,[c("span",{innerHTML:t.name,class:"clip"},null,8,Vs)])):f("",!0),t.text?(a(),r("p",{key:1,innerHTML:t.text,class:"text"},null,8,ws)):f("",!0),t.tagline?(a(),r("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Ls)):f("",!0)],!0),t.actions?(a(),r("div",Ss,[(a(!0),r(I,null,H(t.actions,o=>(a(),r("div",{key:o.link,class:"action"},[h(gs,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||i(e)?(a(),r("div",Ms,[c("div",Ts,[s[0]||(s[0]=c("div",{class:"image-bg"},null,-1)),u(t.$slots,"home-hero-image",{},()=>[t.image?(a(),k(Z,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}});const Ns=m(Cs,[["__scopeId","data-v-3d564967"]]),Is=g({__name:"VPHomeHero",setup(n){const{frontmatter:e}=V();return(t,s)=>i(e).hero?(a(),k(Ns,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info":p(()=>[u(t.$slots,"home-hero-info")]),"home-hero-image":p(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Bs={},As={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"};function Hs(n,e){return a(),r("svg",As,e[0]||(e[0]=[c("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1)]))}const zs=m(Bs,[["render",Hs]]),xs={class:"box"},Ds={key:0,class:"icon"},Es=["innerHTML"],Fs=["innerHTML"],Os=["innerHTML"],Gs={key:4,class:"link-text"},Us={class:"link-text-value"},js=g({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(n){return(e,t)=>(a(),k(x,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:p(()=>[c("article",xs,[typeof e.icon=="object"&&e.icon.wrap?(a(),r("div",Ds,[h(Z,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),k(Z,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),r("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Es)):f("",!0),c("h2",{class:"title",innerHTML:e.title},null,8,Fs),e.details?(a(),r("p",{key:3,class:"details",innerHTML:e.details},null,8,Os)):f("",!0),e.linkText?(a(),r("div",Gs,[c("p",Us,[A(L(e.linkText)+" ",1),h(zs,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const Ks=m(js,[["__scopeId","data-v-c552d5c5"]]),Rs={key:0,class:"VPFeatures"},qs={class:"container"},Ws={class:"items"},Ys=g({__name:"VPFeatures",props:{features:{}},setup(n){const e=n,t=P(()=>{const s=e.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,o)=>s.features?(a(),r("div",Rs,[c("div",qs,[c("div",Ws,[(a(!0),r(I,null,H(s.features,l=>(a(),r("div",{key:l.title,class:C(["item",[t.value]])},[h(Ks,{icon:l.icon,title:l.title,details:l.details,link:l.link,"link-text":l.linkText,rel:l.rel,target:l.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}});const Xs=m(Ys,[["__scopeId","data-v-1da4ff3d"]]),Js=g({__name:"VPHomeFeatures",setup(n){const{frontmatter:e}=V();return(t,s)=>i(e).features?(a(),k(Xs,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):f("",!0)}}),Zs={class:"VPHome"},Qs=g({__name:"VPHome",setup(n){return(e,t)=>{const s=K("Content");return a(),r("div",Zs,[u(e.$slots,"home-hero-before",{},void 0,!0),h(Is,null,{"home-hero-info":p(()=>[u(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[u(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(e.$slots,"home-hero-after",{},void 0,!0),u(e.$slots,"home-features-before",{},void 0,!0),h(Js),u(e.$slots,"home-features-after",{},void 0,!0),h(s)])}}});const en=m(Qs,[["__scopeId","data-v-8ebac4ee"]]),tn={},sn={class:"VPPage"};function nn(n,e){const t=K("Content");return a(),r("div",sn,[u(n.$slots,"page-top"),h(t),u(n.$slots,"page-bottom")])}const on=m(tn,[["render",nn]]),an=g({__name:"VPContent",setup(n){const{page:e,frontmatter:t}=V(),{hasSidebar:s}=E();return(o,l)=>(a(),r("div",{class:C(["VPContent",{"has-sidebar":i(s),"is-home":i(t).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?u(o.$slots,"not-found",{key:0},()=>[h(it)],!0):i(t).layout==="page"?(a(),k(on,{key:1},{"page-top":p(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(a(),k(en,{key:2},{"home-hero-before":p(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(a(),k(O(i(t).layout),{key:3})):(a(),k(hs,{key:4},{"doc-top":p(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const ln=m(an,[["__scopeId","data-v-b7946bfc"]]),rn={class:"container"},cn=["innerHTML"],un=["innerHTML"],dn=g({__name:"VPFooter",setup(n){const{theme:e,frontmatter:t}=V(),{hasSidebar:s}=E();return(o,l)=>i(e).footer&&i(t).footer!==!1?(a(),r("footer",{key:0,class:C(["VPFooter",{"has-sidebar":i(s)}])},[c("div",rn,[i(e).footer.message?(a(),r("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,cn)):f("",!0),i(e).footer.copyright?(a(),r("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,un)):f("",!0)])],2)):f("",!0)}});const _n=m(dn,[["__scopeId","data-v-04a39284"]]),vn={class:"header"},pn={class:"outline"},fn=g({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(n){const e=n,{theme:t}=V(),s=N(!1),o=N(0),l=N();q(()=>{s.value=!1});function d(){s.value=!s.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function v(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ee(()=>{s.value=!1}))}function _(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,w)=>(a(),r("div",{class:"VPLocalNavOutlineDropdown",style:De({"--vp-vh":o.value+"px"})},[b.headers.length>0?(a(),r("button",{key:0,onClick:d,class:C({open:s.value})},[A(L(i(_e)(i(t)))+" ",1),h(fe,{class:"icon"})],2)):(a(),r("button",{key:1,onClick:_},L(i(t).returnToTopLabel||"Return to top"),1)),h(ie,{name:"flyout"},{default:p(()=>[s.value?(a(),r("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:v},[c("div",vn,[c("a",{class:"top-link",href:"#",onClick:_},L(i(t).returnToTopLabel||"Return to top"),1)]),c("div",pn,[h(pe,{headers:b.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}});const hn=m(fn,[["__scopeId","data-v-2c1007a4"]]),mn={},gn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function bn(n,e){return a(),r("svg",gn,e[0]||(e[0]=[c("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),c("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),c("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),c("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1)]))}const kn=m(mn,[["render",bn]]),yn=["aria-expanded"],$n={class:"menu-text"},Pn=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(n){const{theme:e,frontmatter:t}=V(),{hasSidebar:s}=E(),{y:o}=we(),l=de([]),d=N(0);U(()=>{d.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),q(()=>{l.value=ve(t.value.outline??e.value.outline)});const v=P(()=>l.value.length===0&&!s.value),_=P(()=>({VPLocalNav:!0,fixed:v.value,"reached-top":o.value>=d.value}));return(b,w)=>i(t).layout!=="home"&&(!v.value||i(o)>=d.value)?(a(),r("div",{key:0,class:C(_.value)},[i(s)?(a(),r("button",{key:0,class:"menu","aria-expanded":b.open,"aria-controls":"VPSidebarNav",onClick:w[0]||(w[0]=S=>b.$emit("open-menu"))},[h(kn,{class:"menu-icon"}),c("span",$n,L(i(e).sidebarMenuLabel||"Menu"),1)],8,yn)):f("",!0),h(hn,{headers:l.value,navHeight:d.value},null,8,["headers","navHeight"])],2)):f("",!0)}});const Vn=m(Pn,[["__scopeId","data-v-3c3d80ab"]]);function wn(){const n=N(!1);function e(){n.value=!0,window.addEventListener("resize",o)}function t(){n.value=!1,window.removeEventListener("resize",o)}function s(){n.value?t():e()}function o(){window.outerWidth>=768&&t()}const l=ee();return j(()=>l.path,t),{isScreenOpen:n,openScreen:e,closeScreen:t,toggleScreen:s}}const Ln={},Sn={class:"VPSwitch",type:"button",role:"switch"},Mn={class:"check"},Tn={key:0,class:"icon"};function Cn(n,e){return a(),r("button",Sn,[c("span",Mn,[n.$slots.default?(a(),r("span",Tn,[u(n.$slots,"default",{},void 0,!0)])):f("",!0)])])}const Nn=m(Ln,[["render",Cn],["__scopeId","data-v-0b5e260c"]]),In={},Bn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function An(n,e){return a(),r("svg",Bn,e[0]||(e[0]=[c("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1)]))}const Hn=m(In,[["render",An]]),zn={},xn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function Dn(n,e){return a(),r("svg",xn,e[0]||(e[0]=[Fe('',9)]))}const En=m(zn,[["render",Dn]]),Fn=g({__name:"VPSwitchAppearance",setup(n){const{isDark:e}=V(),t=te("toggle-appearance",()=>{e.value=!e.value});return(s,o)=>(a(),k(Nn,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(t)},{default:p(()=>[h(En,{class:"sun"}),h(Hn,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const he=m(Fn,[["__scopeId","data-v-fdee46ce"]]),On={key:0,class:"VPNavBarAppearance"},Gn=g({__name:"VPNavBarAppearance",setup(n){const{site:e}=V();return(t,s)=>i(e).appearance&&i(e).appearance!=="force-dark"?(a(),r("div",On,[h(he)])):f("",!0)}});const Un=m(Gn,[["__scopeId","data-v-f774fc1d"]]),me=N();let Ce=!1,oe=0;function jn(n){const e=N(!1);if(R){!Ce&&Kn(),oe++;const t=j(me,s=>{var o,l,d;s===n.el.value||(o=n.el.value)!=null&&o.contains(s)?(e.value=!0,(l=n.onFocus)==null||l.call(n)):(e.value=!1,(d=n.onBlur)==null||d.call(n))});ue(()=>{t(),oe--,oe||Rn()})}return Oe(e)}function Kn(){document.addEventListener("focusin",Ne),Ce=!0,me.value=document.activeElement}function Rn(){document.removeEventListener("focusin",Ne)}function Ne(){me.value=document.activeElement}const qn={},Wn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function Yn(n,e){return a(),r("svg",Wn,e[0]||(e[0]=[c("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1)]))}const Ie=m(qn,[["render",Yn]]),Xn={},Jn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function Zn(n,e){return a(),r("svg",Jn,e[0]||(e[0]=[c("circle",{cx:"12",cy:"12",r:"2"},null,-1),c("circle",{cx:"19",cy:"12",r:"2"},null,-1),c("circle",{cx:"5",cy:"12",r:"2"},null,-1)]))}const Qn=m(Xn,[["render",Zn]]),eo={class:"VPMenuLink"},to=g({__name:"VPMenuLink",props:{item:{}},setup(n){const{page:e}=V();return(t,s)=>(a(),r("div",eo,[h(x,{class:C({active:i(G)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:p(()=>[A(L(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const se=m(to,[["__scopeId","data-v-71c5411b"]]),so={class:"VPMenuGroup"},no={key:0,class:"title"},oo=g({__name:"VPMenuGroup",props:{text:{},items:{}},setup(n){return(e,t)=>(a(),r("div",so,[e.text?(a(),r("p",no,L(e.text),1)):f("",!0),(a(!0),r(I,null,H(e.items,s=>(a(),r(I,null,["link"in s?(a(),k(se,{key:0,item:s},null,8,["item"])):f("",!0)],64))),256))]))}});const ao=m(oo,[["__scopeId","data-v-2bec9359"]]),lo={class:"VPMenu"},ro={key:0,class:"items"},io=g({__name:"VPMenu",props:{items:{}},setup(n){return(e,t)=>(a(),r("div",lo,[e.items?(a(),r("div",ro,[(a(!0),r(I,null,H(e.items,s=>(a(),r(I,{key:s.text},["link"in s?(a(),k(se,{key:0,item:s},null,8,["item"])):(a(),k(ao,{key:1,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):f("",!0),u(e.$slots,"default",{},void 0,!0)]))}});const co=m(io,[["__scopeId","data-v-7bffa9cd"]]),uo=["aria-expanded","aria-label"],_o={key:0,class:"text"},vo=["innerHTML"],po={class:"menu"},fo=g({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(n){const e=N(!1),t=N();jn({el:t,onBlur:s});function s(){e.value=!1}return(o,l)=>(a(),r("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:l[1]||(l[1]=d=>e.value=!0),onMouseleave:l[2]||(l[2]=d=>e.value=!1)},[c("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:l[0]||(l[0]=d=>e.value=!e.value)},[o.button||o.icon?(a(),r("span",_o,[o.icon?(a(),k(O(o.icon),{key:0,class:"option-icon"})):f("",!0),o.button?(a(),r("span",{key:1,innerHTML:o.button},null,8,vo)):f("",!0),h(Ie,{class:"text-icon"})])):(a(),k(Qn,{key:1,class:"icon"}))],8,uo),c("div",po,[h(co,{items:o.items},{default:p(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const ge=m(fo,[["__scopeId","data-v-1a2ceba0"]]),ho={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},mo=["href","aria-label","innerHTML"],go=g({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(n){const e=n,t=P(()=>typeof e.icon=="object"?e.icon.svg:ho[e.icon]);return(s,o)=>(a(),r("a",{class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,mo))}});const bo=m(go,[["__scopeId","data-v-efc53bd4"]]),ko={class:"VPSocialLinks"},yo=g({__name:"VPSocialLinks",props:{links:{}},setup(n){return(e,t)=>(a(),r("div",ko,[(a(!0),r(I,null,H(e.links,({link:s,icon:o,ariaLabel:l})=>(a(),k(bo,{key:s,icon:o,link:s,ariaLabel:l},null,8,["icon","link","ariaLabel"]))),128))]))}});const ne=m(yo,[["__scopeId","data-v-f2234a39"]]),$o={key:0,class:"group translations"},Po={class:"trans-title"},Vo={key:1,class:"group"},wo={class:"item appearance"},Lo={class:"label"},So={class:"appearance-action"},Mo={key:2,class:"group"},To={class:"item social-links"},Co=g({__name:"VPNavBarExtra",setup(n){const{site:e,theme:t}=V(),{localeLinks:s,currentLang:o}=Y({correspondingLink:!0}),l=P(()=>s.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(d,v)=>l.value?(a(),k(ge,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[i(s).length&&i(o).label?(a(),r("div",$o,[c("p",Po,L(i(o).label),1),(a(!0),r(I,null,H(i(s),_=>(a(),k(se,{key:_.link,item:_},null,8,["item"]))),128))])):f("",!0),i(e).appearance?(a(),r("div",Vo,[c("div",wo,[c("p",Lo,L(i(t).darkModeSwitchLabel||"Appearance"),1),c("div",So,[h(he)])])])):f("",!0),i(t).socialLinks?(a(),r("div",Mo,[c("div",To,[h(ne,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}});const No=m(Co,[["__scopeId","data-v-47bb42ad"]]),Io=["aria-expanded"],Bo=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(n){return(e,t)=>(a(),r("button",{type:"button",class:C(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=s=>e.$emit("click"))},t[1]||(t[1]=[c("span",{class:"container"},[c("span",{class:"top"}),c("span",{class:"middle"}),c("span",{class:"bottom"})],-1)]),10,Io))}});const Ao=m(Bo,[["__scopeId","data-v-670493dd"]]),Ho=["innerHTML"],zo=g({__name:"VPNavBarMenuLink",props:{item:{}},setup(n){const{page:e}=V();return(t,s)=>(a(),k(x,{class:C({VPNavBarMenuLink:!0,active:i(G)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:p(()=>[c("span",{innerHTML:t.item.text},null,8,Ho)]),_:1},8,["class","href","target","rel"]))}});const xo=m(zo,[["__scopeId","data-v-97d30ef6"]]),Do=g({__name:"VPNavBarMenuGroup",props:{item:{}},setup(n){const e=n,{page:t}=V(),s=l=>"link"in l?G(t.value.relativePath,l.link,!!e.item.activeMatch):l.items.some(s),o=P(()=>s(e.item));return(l,d)=>(a(),k(ge,{class:C({VPNavBarMenuGroup:!0,active:i(G)(i(t).relativePath,l.item.activeMatch,!!l.item.activeMatch)||o.value}),button:l.item.text,items:l.item.items},null,8,["class","button","items"]))}}),Eo={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Fo=g({__name:"VPNavBarMenu",setup(n){const{theme:e}=V();return(t,s)=>i(e).nav?(a(),r("nav",Eo,[s[0]||(s[0]=c("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),(a(!0),r(I,null,H(i(e).nav,o=>(a(),r(I,{key:o.text},["link"in o?(a(),k(xo,{key:0,item:o},null,8,["item"])):(a(),k(Do,{key:1,item:o},null,8,["item"]))],64))),128))])):f("",!0)}});const Oo=m(Fo,[["__scopeId","data-v-c6c3e6d4"]]);const Go={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},Uo={class:"DocSearch-Button-Container"},jo={class:"DocSearch-Button-Placeholder"},$e=g({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(n){return(e,t)=>(a(),r("button",Go,[c("span",Uo,[t[0]||(t[0]=c("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[c("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","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1)),c("span",jo,L(e.placeholder),1)]),t[1]||(t[1]=c("span",{class:"DocSearch-Button-Keys"},[c("kbd",{class:"DocSearch-Button-Key"}),c("kbd",{class:"DocSearch-Button-Key"},"K")],-1))]))}});const Ko={class:"VPNavBarSearch"},Ro={id:"local-search"},qo={key:1,id:"docsearch"},Wo=g({__name:"VPNavBarSearch",setup(n){const e=Ge(()=>Ue(()=>import("./VPLocalSearchBox.5befaea8.js"),["assets/chunks/VPLocalSearchBox.5befaea8.js","assets/chunks/framework.47aa8d5b.js"])),t=()=>null,{theme:s,localeIndex:o}=V(),l=N(!1),d=N(!1),v=P(()=>{var M,T,$,z,F,D,be;const y=((M=s.value.search)==null?void 0:M.options)??s.value.algolia;return((F=(z=($=(T=y==null?void 0:y.locales)==null?void 0:T[o.value])==null?void 0:$.translations)==null?void 0:z.button)==null?void 0:F.buttonText)||((be=(D=y==null?void 0:y.translations)==null?void 0:D.button)==null?void 0:be.buttonText)||"Search"});U(()=>{});function _(){l.value||(l.value=!0,setTimeout(b,16))}function b(){const y=new Event("keydown");y.key="k",y.metaKey=!0,window.dispatchEvent(y),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||b()},16)}function w(y){const M=y.target,T=M.tagName;return M.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const S=N(!1);ke("k",y=>{(y.ctrlKey||y.metaKey)&&(y.preventDefault(),S.value=!0)}),ke("/",y=>{w(y)||(y.preventDefault(),S.value=!0)});const B="local";return(y,M)=>{var T;return a(),r("div",Ko,[i(B)==="local"?(a(),r(I,{key:0},[S.value?(a(),k(i(e),{key:0,placeholder:v.value,onClose:M[0]||(M[0]=$=>S.value=!1)},null,8,["placeholder"])):f("",!0),c("div",Ro,[h($e,{placeholder:v.value,onClick:M[1]||(M[1]=$=>S.value=!0)},null,8,["placeholder"])])],64)):i(B)==="algolia"?(a(),r(I,{key:1},[l.value?(a(),k(i(t),{key:0,algolia:((T=i(s).search)==null?void 0:T.options)??i(s).algolia,onVnodeBeforeMount:M[2]||(M[2]=$=>d.value=!0)},null,8,["algolia"])):f("",!0),d.value?f("",!0):(a(),r("div",qo,[h($e,{placeholder:v.value,onClick:_},null,8,["placeholder"])]))],64)):f("",!0)])}}});const Yo=g({__name:"VPNavBarSocialLinks",setup(n){const{theme:e}=V();return(t,s)=>i(e).socialLinks?(a(),k(ne,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}});const Xo=m(Yo,[["__scopeId","data-v-08b35e6f"]]),Jo=["href"],Zo=g({__name:"VPNavBarTitle",setup(n){const{site:e,theme:t}=V(),{hasSidebar:s}=E(),{currentLang:o}=Y();return(l,d)=>(a(),r("div",{class:C(["VPNavBarTitle",{"has-sidebar":i(s)}])},[c("a",{class:"title",href:i(t).logoLink??i(W)(i(o).link)},[u(l.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(a(),k(Z,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):f("",!0),i(t).siteTitle?(a(),r(I,{key:1},[A(L(i(t).siteTitle),1)],64)):i(t).siteTitle===void 0?(a(),r(I,{key:2},[A(L(i(e).title),1)],64)):f("",!0),u(l.$slots,"nav-bar-title-after",{},void 0,!0)],8,Jo)],2))}});const Qo=m(Zo,[["__scopeId","data-v-2d6ff155"]]),ea={},ta={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function sa(n,e){return a(),r("svg",ta,e[0]||(e[0]=[c("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),c("path",{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 ",class:"css-c4d79v"},null,-1)]))}const Be=m(ea,[["render",sa]]),na={class:"items"},oa={class:"title"},aa=g({__name:"VPNavBarTranslations",setup(n){const{theme:e}=V(),{localeLinks:t,currentLang:s}=Y({correspondingLink:!0});return(o,l)=>i(t).length&&i(s).label?(a(),k(ge,{key:0,class:"VPNavBarTranslations",icon:Be,label:i(e).langMenuLabel||"Change language"},{default:p(()=>[c("div",na,[c("p",oa,L(i(s).label),1),(a(!0),r(I,null,H(i(t),d=>(a(),k(se,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}});const la=m(aa,[["__scopeId","data-v-3bf1c934"]]),ra={class:"container"},ia={class:"title"},ca={class:"content"},ua={class:"content-body"},da=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(n){const{y:e}=we(),{hasSidebar:t}=E(),{frontmatter:s}=V(),o=N({});return Pe(()=>{o.value={"has-sidebar":t.value,top:s.value.layout==="home"&&e.value===0}}),(l,d)=>(a(),r("div",{class:C(["VPNavBar",o.value])},[c("div",ra,[c("div",ia,[h(Qo,null,{"nav-bar-title-before":p(()=>[u(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[u(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),c("div",ca,[d[1]||(d[1]=c("div",{class:"curtain"},null,-1)),c("div",ua,[u(l.$slots,"nav-bar-content-before",{},void 0,!0),h(Wo,{class:"search"}),h(Oo,{class:"menu"}),h(la,{class:"translations"}),h(Un,{class:"appearance"}),h(Xo,{class:"social-links"}),h(No,{class:"extra"}),u(l.$slots,"nav-bar-content-after",{},void 0,!0),h(Ao,{class:"hamburger",active:l.isScreenOpen,onClick:d[0]||(d[0]=v=>l.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const _a=m(da,[["__scopeId","data-v-dfeca417"]]),va={key:0,class:"VPNavScreenAppearance"},pa={class:"text"},fa=g({__name:"VPNavScreenAppearance",setup(n){const{site:e,theme:t}=V();return(s,o)=>i(e).appearance?(a(),r("div",va,[c("p",pa,L(i(t).darkModeSwitchLabel||"Appearance"),1),h(he)])):f("",!0)}});const ha=m(fa,[["__scopeId","data-v-8d2d8cf1"]]),ma=g({__name:"VPNavScreenMenuLink",props:{item:{}},setup(n){const e=te("close-screen");return(t,s)=>(a(),k(x,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[A(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const ga=m(ma,[["__scopeId","data-v-083b71b4"]]),ba={},ka={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function ya(n,e){return a(),r("svg",ka,e[0]||(e[0]=[c("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1)]))}const $a=m(ba,[["render",ya]]),Pa=g({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(n){const e=te("close-screen");return(t,s)=>(a(),k(x,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[A(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const Ae=m(Pa,[["__scopeId","data-v-ed7bb82d"]]),Va={class:"VPNavScreenMenuGroupSection"},wa={key:0,class:"title"},La=g({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(n){return(e,t)=>(a(),r("div",Va,[e.text?(a(),r("p",wa,L(e.text),1)):f("",!0),(a(!0),r(I,null,H(e.items,s=>(a(),k(Ae,{key:s.text,item:s},null,8,["item"]))),128))]))}});const Sa=m(La,[["__scopeId","data-v-836cddb8"]]),Ma=["aria-controls","aria-expanded"],Ta={class:"button-text"},Ca=["id"],Na={key:1,class:"group"},Ia=g({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(n){const e=n,t=N(!1),s=P(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(l,d)=>(a(),r("div",{class:C(["VPNavScreenMenuGroup",{open:t.value}])},[c("button",{class:"button","aria-controls":s.value,"aria-expanded":t.value,onClick:o},[c("span",Ta,L(l.text),1),h($a,{class:"button-icon"})],8,Ma),c("div",{id:s.value,class:"items"},[(a(!0),r(I,null,H(l.items,v=>(a(),r(I,{key:v.text},["link"in v?(a(),r("div",{key:v.text,class:"item"},[h(Ae,{item:v},null,8,["item"])])):(a(),r("div",Na,[h(Sa,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Ca)],2))}});const Ba=m(Ia,[["__scopeId","data-v-31b21668"]]),Aa={key:0,class:"VPNavScreenMenu"},Ha=g({__name:"VPNavScreenMenu",setup(n){const{theme:e}=V();return(t,s)=>i(e).nav?(a(),r("nav",Aa,[(a(!0),r(I,null,H(i(e).nav,o=>(a(),r(I,{key:o.text},["link"in o?(a(),k(ga,{key:0,item:o},null,8,["item"])):(a(),k(Ba,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),za=g({__name:"VPNavScreenSocialLinks",setup(n){const{theme:e}=V();return(t,s)=>i(e).socialLinks?(a(),k(ne,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}}),xa={class:"list"},Da=g({__name:"VPNavScreenTranslations",setup(n){const{localeLinks:e,currentLang:t}=Y({correspondingLink:!0}),s=N(!1);function o(){s.value=!s.value}return(l,d)=>i(e).length&&i(t).label?(a(),r("div",{key:0,class:C(["VPNavScreenTranslations",{open:s.value}])},[c("button",{class:"title",onClick:o},[h(Be,{class:"icon lang"}),A(" "+L(i(t).label)+" ",1),h(Ie,{class:"icon chevron"})]),c("ul",xa,[(a(!0),r(I,null,H(i(e),v=>(a(),r("li",{key:v.link,class:"item"},[h(x,{class:"link",href:v.link},{default:p(()=>[A(L(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}});const Ea=m(Da,[["__scopeId","data-v-b72581fd"]]),Fa={class:"container"},Oa=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(n){const e=N(null),t=Le(R?document.body:null);return(s,o)=>(a(),k(ie,{name:"fade",onEnter:o[0]||(o[0]=l=>t.value=!0),onAfterLeave:o[1]||(o[1]=l=>t.value=!1)},{default:p(()=>[s.open?(a(),r("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[c("div",Fa,[u(s.$slots,"nav-screen-content-before",{},void 0,!0),h(Ha,{class:"menu"}),h(Ea,{class:"translations"}),h(ha,{class:"appearance"}),h(za,{class:"social-links"}),u(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}});const Ga=m(Oa,[["__scopeId","data-v-5f4e75ae"]]),Ua={key:0,class:"VPNav"},ja=g({__name:"VPNav",setup(n){const{isScreenOpen:e,closeScreen:t,toggleScreen:s}=wn(),{frontmatter:o}=V(),l=P(()=>o.value.navbar!==!1);return Se("close-screen",t),Q(()=>{R&&document.documentElement.classList.toggle("hide-nav",!l.value)}),(d,v)=>l.value?(a(),r("header",Ua,[h(_a,{"is-screen-open":i(e),onToggleScreen:i(s)},{"nav-bar-title-before":p(()=>[u(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[u(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[u(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[u(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(Ga,{open:i(e)},{"nav-screen-content-before":p(()=>[u(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[u(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}});const Ka=m(ja,[["__scopeId","data-v-a46e73f0"]]),Ra=["role","tabindex"],qa={key:1,class:"items"},Wa=g({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(n){const e=n,{collapsed:t,collapsible:s,isLink:o,isActiveLink:l,hasActiveLink:d,hasChildren:v,toggle:_}=_t(P(()=>e.item)),b=P(()=>v.value?"section":"div"),w=P(()=>o.value?"a":"div"),S=P(()=>v.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),B=P(()=>o.value?void 0:"button"),y=P(()=>[[`level-${e.depth}`],{collapsible:s.value},{collapsed:t.value},{"is-link":o.value},{"is-active":l.value},{"has-active":d.value}]);function M($){"key"in $&&$.key!=="Enter"||!e.item.link&&_()}function T(){e.item.link&&_()}return($,z)=>{const F=K("VPSidebarItem",!0);return a(),k(O(b.value),{class:C(["VPSidebarItem",y.value])},{default:p(()=>[$.item.text?(a(),r("div",X({key:0,class:"item",role:B.value},je($.item.items?{click:M,keydown:M}:{},!0),{tabindex:$.item.items&&0}),[z[0]||(z[0]=c("div",{class:"indicator"},null,-1)),$.item.link?(a(),k(x,{key:0,tag:w.value,class:"link",href:$.item.link,rel:$.item.rel,target:$.item.target},{default:p(()=>[(a(),k(O(S.value),{class:"text",innerHTML:$.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),k(O(S.value),{key:1,class:"text",innerHTML:$.item.text},null,8,["innerHTML"])),$.item.collapsed!=null?(a(),r("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:T,onKeydown:Ke(T,["enter"]),tabindex:"0"},[h(fe,{class:"caret-icon"})],32)):f("",!0)],16,Ra)):f("",!0),$.item.items&&$.item.items.length?(a(),r("div",qa,[$.depth<5?(a(!0),r(I,{key:0},H($.item.items,D=>(a(),k(F,{key:D.text,item:D,depth:$.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}});const Ya=m(Wa,[["__scopeId","data-v-f0f37ff4"]]),Xa={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ja=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(n){const{sidebarGroups:e,hasSidebar:t}=E(),s=n,o=N(null),l=Le(R?document.body:null);return j([s,o],()=>{var d;s.open?(l.value=!0,(d=o.value)==null||d.focus()):l.value=!1},{immediate:!0,flush:"post"}),(d,v)=>i(t)?(a(),r("aside",{key:0,class:C(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:v[0]||(v[0]=Re(()=>{},["stop"]))},[v[2]||(v[2]=c("div",{class:"curtain"},null,-1)),c("nav",Xa,[v[1]||(v[1]=c("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),u(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),r(I,null,H(i(e),_=>(a(),r("div",{key:_.text,class:"group"},[h(Ya,{item:_,depth:0},null,8,["item"])]))),128)),u(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}});const Za=m(Ja,[["__scopeId","data-v-45ef976a"]]),Qa=g({__name:"VPSkipLink",setup(n){const e=ee(),t=N();j(()=>e.path,()=>t.value.focus());function s({target:o}){const l=document.getElementById(decodeURIComponent(o.hash).slice(1));if(l){const d=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",d)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",d),l.focus(),window.scrollTo(0,0)}}return(o,l)=>(a(),r(I,null,[c("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),c("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}});const el=m(Qa,[["__scopeId","data-v-b22defb4"]]),tl=g({__name:"Layout",setup(n){const{isOpen:e,open:t,close:s}=E(),o=ee();j(()=>o.path,s),dt(e,s);const{frontmatter:l}=V(),d=qe(),v=P(()=>!!d["home-hero-image"]);return Se("hero-image-slot-exists",v),(_,b)=>{const w=K("Content");return i(l).layout!==!1?(a(),r("div",{key:0,class:C(["Layout",i(l).pageClass])},[u(_.$slots,"layout-top",{},void 0,!0),h(el),h(Ze,{class:"backdrop",show:i(e),onClick:i(s)},null,8,["show","onClick"]),h(Ka,null,{"nav-bar-title-before":p(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(Vn,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),h(Za,{open:i(e)},{"sidebar-nav-before":p(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(ln,null,{"page-top":p(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(_n),u(_.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),k(w,{key:1}))}}});const sl=m(tl,[["__scopeId","data-v-527a0310"]]),nl={},ol={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"};function al(n,e){return a(),r("svg",ol,e[0]||(e[0]=[c("path",{d:"M12,22.2c-0.3,0-0.5-0.1-0.7-0.3l-8.8-8.8c-2.5-2.5-2.5-6.7,0-9.2c2.5-2.5,6.7-2.5,9.2,0L12,4.3l0.4-0.4c0,0,0,0,0,0C13.6,2.7,15.2,2,16.9,2c0,0,0,0,0,0c1.7,0,3.4,0.7,4.6,1.9l0,0c1.2,1.2,1.9,2.9,1.9,4.6c0,1.7-0.7,3.4-1.9,4.6l-8.8,8.8C12.5,22.1,12.3,22.2,12,22.2zM7,4C5.9,4,4.7,4.4,3.9,5.3c-1.8,1.8-1.8,4.6,0,6.4l8.1,8.1l8.1-8.1c0.9-0.9,1.3-2,1.3-3.2c0-1.2-0.5-2.3-1.3-3.2l0,0C19.3,4.5,18.2,4,17,4c0,0,0,0,0,0c-1.2,0-2.3,0.5-3.2,1.3c0,0,0,0,0,0l-1.1,1.1c-0.4,0.4-1,0.4-1.4,0l-1.1-1.1C9.4,4.4,8.2,4,7,4z"},null,-1)]))}const ll=m(nl,[["render",al]]);const rl={},il={class:"VPTeamPage"};function cl(n,e){return a(),r("div",il,[u(n.$slots,"default")])}const Dl=m(rl,[["render",cl],["__scopeId","data-v-05fecbf1"]]);const ul={},dl={class:"VPTeamPageTitle"},_l={key:0,class:"title"},vl={key:1,class:"lead"};function pl(n,e){return a(),r("div",dl,[n.$slots.title?(a(),r("h1",_l,[u(n.$slots,"title",{},void 0,!0)])):f("",!0),n.$slots.lead?(a(),r("p",vl,[u(n.$slots,"lead",{},void 0,!0)])):f("",!0)])}const El=m(ul,[["render",pl],["__scopeId","data-v-6ce551d6"]]);const fl={},hl={class:"VPTeamPageSection"},ml={class:"title"},gl={key:0,class:"title-text"},bl={key:0,class:"lead"},kl={key:1,class:"members"};function yl(n,e){return a(),r("section",hl,[c("div",ml,[e[0]||(e[0]=c("div",{class:"title-line"},null,-1)),n.$slots.title?(a(),r("h2",gl,[u(n.$slots,"title",{},void 0,!0)])):f("",!0)]),n.$slots.lead?(a(),r("p",bl,[u(n.$slots,"lead",{},void 0,!0)])):f("",!0),n.$slots.members?(a(),r("div",kl,[u(n.$slots,"members",{},void 0,!0)])):f("",!0)])}const Fl=m(fl,[["render",yl],["__scopeId","data-v-1ac32f26"]]),$l={class:"profile"},Pl={class:"avatar"},Vl=["src","alt"],wl={class:"data"},Ll={class:"name"},Sl={key:0,class:"affiliation"},Ml={key:0,class:"title"},Tl={key:1,class:"at"},Cl=["innerHTML"],Nl={key:2,class:"links"},Il={key:0,class:"sp"},Bl=g({__name:"VPTeamMembersItem",props:{size:{default:"medium"},member:{}},setup(n){return(e,t)=>(a(),r("article",{class:C(["VPTeamMembersItem",[e.size]])},[c("div",$l,[c("figure",Pl,[c("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,Vl)]),c("div",wl,[c("h1",Ll,L(e.member.name),1),e.member.title||e.member.org?(a(),r("p",Sl,[e.member.title?(a(),r("span",Ml,L(e.member.title),1)):f("",!0),e.member.title&&e.member.org?(a(),r("span",Tl," @ ")):f("",!0),e.member.org?(a(),k(x,{key:2,class:C(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:p(()=>[A(L(e.member.org),1)]),_:1},8,["class","href"])):f("",!0)])):f("",!0),e.member.desc?(a(),r("p",{key:1,class:"desc",innerHTML:e.member.desc},null,8,Cl)):f("",!0),e.member.links?(a(),r("div",Nl,[h(ne,{links:e.member.links},null,8,["links"])])):f("",!0)])]),e.member.sponsor?(a(),r("div",Il,[h(x,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:p(()=>[h(ll,{class:"sp-icon"}),t[0]||(t[0]=A(" Sponsor "))]),_:1},8,["href"])])):f("",!0)],2))}});const Al=m(Bl,[["__scopeId","data-v-c1d54081"]]),Hl={class:"container"},zl=g({__name:"VPTeamMembers",props:{size:{default:"medium"},members:{}},setup(n){const e=n,t=P(()=>[e.size,`count-${e.members.length}`]);return(s,o)=>(a(),r("div",{class:C(["VPTeamMembers",t.value])},[c("div",Hl,[(a(!0),r(I,null,H(s.members,l=>(a(),r("div",{key:l.name,class:"item"},[h(Al,{size:s.size,member:l},null,8,["size","member"])]))),128))])],2))}});const Ol=m(zl,[["__scopeId","data-v-3ca0e3f5"]]),Gl={Layout:sl,enhanceApp:({app:n})=>{n.component("Badge",Ye)}};function Ul(n,e){const{localeIndex:t}=V();function s(o){var y,M;const l=o.split("."),d=n&&typeof n=="object",v=d&&((M=(y=n.locales)==null?void 0:y[t.value])==null?void 0:M.translations)||null,_=d&&n.translations||null;let b=v,w=_,S=e;const B=l.pop();for(const T of l){let $=null;const z=S==null?void 0:S[T];z&&($=S=z);const F=w==null?void 0:w[T];F&&($=w=F);const D=b==null?void 0:b[T];D&&($=b=D),z||(S=$),F||(w=$),D||(b=$)}return(b==null?void 0:b[B])??(w==null?void 0:w[B])??(S==null?void 0:S[B])??""}return s}export{El as V,Ol as a,Fl as b,Dl as c,Ul as d,Gl as t,V as u}; +import{d as g,o as a,c as r,r as u,a as A,t as L,n as C,_ as m,b as k,w as p,e as f,T as ie,u as He,i as ze,f as ce,g as P,h as N,j as U,k as c,l as i,m as G,p as R,q as ae,s as j,v as Q,x as ue,y as Pe,z as xe,A as K,F as I,B as H,C as de,D as q,E as h,G as O,H as Ve,I as ee,J as X,K as te,L as De,M as Ee,N as we,O as Fe,P as Oe,Q as ke,R as Ge,S as Ue,U as Le,V as Se,W as je,X as Ke,Y as Re,Z as qe}from"./framework.ece1a6f0.js";const We=g({__name:"VPBadge",props:{text:{},type:{default:"tip"}},setup(n){return(e,t)=>(a(),r("span",{class:C(["VPBadge",e.type])},[u(e.$slots,"default",{},()=>[A(L(e.text),1)],!0)],2))}});const Ye=m(We,[["__scopeId","data-v-4415f8bd"]]),Xe={key:0,class:"VPBackdrop"},Je=g({__name:"VPBackdrop",props:{show:{type:Boolean}},setup(n){return(e,t)=>(a(),k(ie,{name:"fade"},{default:p(()=>[e.show?(a(),r("div",Xe)):f("",!0)]),_:1}))}});const Ze=m(Je,[["__scopeId","data-v-b2600058"]]),V=He;function Qe(n,e){let t,s=!1;return()=>{t&&clearTimeout(t),s?t=setTimeout(n,e):(n(),(s=!0)&&setTimeout(()=>s=!1,e))}}function le(n){return/^\//.test(n)?n:`/${n}`}function W(n){if(ze(n))return n;const{site:e}=V(),{pathname:t,search:s,hash:o}=new URL(n,"http://a.com"),l=t.endsWith("/")||t.endsWith(".html")?n:n.replace(/(?:(^\.+)\/)?.*$/,`$1${t.replace(/(\.md)?$/,e.value.cleanUrls?"":".html")}${s}${o}`);return ce(l)}function Y({removeCurrent:n=!0,correspondingLink:e=!1}={}){const{site:t,localeIndex:s,page:o,theme:l}=V(),d=P(()=>{var _,b;return{label:(_=t.value.locales[s.value])==null?void 0:_.label,link:((b=t.value.locales[s.value])==null?void 0:b.link)||(s.value==="root"?"/":`/${s.value}/`)}});return{localeLinks:P(()=>Object.entries(t.value.locales).flatMap(([_,b])=>n&&d.value.label===b.label?[]:{text:b.label,link:et(b.link||(_==="root"?"/":`/${_}/`),l.value.i18nRouting!==!1&&e,o.value.relativePath.slice(d.value.link.length-1),!t.value.cleanUrls)})),currentLang:d}}function et(n,e,t,s){return e?n.replace(/\/$/,"")+le(t.replace(/(^|\/)index\.md$/,"$1").replace(/\.md$/,s?".html":"")):n}const tt={class:"NotFound"},st={class:"code"},nt={class:"title"},ot={class:"quote"},at={class:"action"},lt=["href","aria-label"],rt=g({__name:"NotFound",setup(n){const{site:e,theme:t}=V(),{localeLinks:s}=Y({removeCurrent:!1}),o=N("/");return U(()=>{var d;const l=window.location.pathname.replace(e.value.base,"").replace(/(^.*?\/).*$/,"/$1");s.value.length&&(o.value=((d=s.value.find(({link:v})=>v.startsWith(l)))==null?void 0:d.link)||s.value[0].link)}),(l,d)=>{var v,_,b,w,S;return a(),r("div",tt,[c("p",st,L(((v=i(t).notFound)==null?void 0:v.code)??"404"),1),c("h1",nt,L(((_=i(t).notFound)==null?void 0:_.title)??"PAGE NOT FOUND"),1),d[0]||(d[0]=c("div",{class:"divider"},null,-1)),c("blockquote",ot,L(((b=i(t).notFound)==null?void 0:b.quote)??"But if you don't change your direction, and if you keep looking, you may end up where you are heading."),1),c("div",at,[c("a",{class:"link",href:i(ce)(o.value),"aria-label":((w=i(t).notFound)==null?void 0:w.linkLabel)??"go to home"},L(((S=i(t).notFound)==null?void 0:S.linkText)??"Take me home"),9,lt)])])}}});const it=m(rt,[["__scopeId","data-v-572b3891"]]);function Me(n,e){if(Array.isArray(n))return J(n);if(n==null)return[];e=le(e);const t=Object.keys(n).sort((o,l)=>l.split("/").length-o.split("/").length).find(o=>e.startsWith(le(o))),s=t?n[t]:[];return Array.isArray(s)?J(s):J(s.items,s.base)}function ct(n){const e=[];let t=0;for(const s in n){const o=n[s];if(o.items){t=e.push(o);continue}e[t]||e.push({items:[]}),e[t].items.push(o)}return e}function ut(n){const e=[];function t(s){for(const o of s)o.text&&o.link&&e.push({text:o.text,link:o.link,docFooterText:o.docFooterText}),o.items&&t(o.items)}return t(n),e}function re(n,e){return Array.isArray(e)?e.some(t=>re(n,t)):G(n,e.link)?!0:e.items?re(n,e.items):!1}function J(n,e){return[...n].map(t=>{const s={...t},o=s.base||e;return o&&s.link&&(s.link=o+s.link),s.items&&(s.items=J(s.items,o)),s})}function E(){const{frontmatter:n,page:e,theme:t}=V(),s=ae("(min-width: 960px)"),o=N(!1),l=P(()=>{const T=t.value.sidebar,$=e.value.relativePath;return T?Me(T,$):[]}),d=N(l.value);j(l,(T,$)=>{JSON.stringify(T)!==JSON.stringify($)&&(d.value=l.value)});const v=P(()=>n.value.sidebar!==!1&&d.value.length>0&&n.value.layout!=="home"),_=P(()=>b?n.value.aside==null?t.value.aside==="left":n.value.aside==="left":!1),b=P(()=>n.value.layout==="home"?!1:n.value.aside!=null?!!n.value.aside:t.value.aside!==!1),w=P(()=>v.value&&s.value),S=P(()=>v.value?ct(d.value):[]);function B(){o.value=!0}function y(){o.value=!1}function M(){o.value?y():B()}return{isOpen:o,sidebar:d,sidebarGroups:S,hasSidebar:v,hasAside:b,leftAside:_,isSidebarEnabled:w,open:B,close:y,toggle:M}}function dt(n,e){let t;Q(()=>{t=n.value?document.activeElement:void 0}),U(()=>{window.addEventListener("keyup",s)}),ue(()=>{window.removeEventListener("keyup",s)});function s(o){o.key==="Escape"&&n.value&&(e(),t==null||t.focus())}}const Te=N(R?location.hash:"");R&&window.addEventListener("hashchange",()=>{Te.value=location.hash});function _t(n){const{page:e}=V(),t=N(!1),s=P(()=>n.value.collapsed!=null),o=P(()=>!!n.value.link),l=N(!1),d=()=>{l.value=G(e.value.relativePath,n.value.link)};j([e,n,Te],d),U(d);const v=P(()=>l.value?!0:n.value.items?re(e.value.relativePath,n.value.items):!1),_=P(()=>!!(n.value.items&&n.value.items.length));Q(()=>{t.value=!!(s.value&&n.value.collapsed)}),Pe(()=>{(l.value||v.value)&&(t.value=!1)});function b(){s.value&&(t.value=!t.value)}return{collapsed:t,collapsible:s,isLink:o,isActiveLink:l,hasActiveLink:v,hasChildren:_,toggle:b}}function vt(){const{hasSidebar:n}=E(),e=ae("(min-width: 960px)"),t=ae("(min-width: 1280px)");return{isAsideEnabled:P(()=>!t.value&&!e.value?!1:n.value?t.value:e.value)}}const pt=71;function _e(n){return typeof n.outline=="object"&&!Array.isArray(n.outline)&&n.outline.label||n.outlineTitle||"On this page"}function ve(n){const e=[...document.querySelectorAll(".VPDoc :where(h1,h2,h3,h4,h5,h6)")].filter(t=>t.id&&t.hasChildNodes()).map(t=>{const s=Number(t.tagName[1]);return{title:ft(t),link:"#"+t.id,level:s}});return ht(e,n)}function ft(n){let e="";for(const t of n.childNodes)if(t.nodeType===1){if(t.classList.contains("VPBadge")||t.classList.contains("header-anchor"))continue;e+=t.textContent}else t.nodeType===3&&(e+=t.textContent);return e.trim()}function ht(n,e){if(e===!1)return[];const t=(typeof e=="object"&&!Array.isArray(e)?e.level:e)||2,[s,o]=typeof t=="number"?[t,t]:t==="deep"?[2,6]:t;n=n.filter(d=>d.level>=s&&d.level<=o);const l=[];e:for(let d=0;d=0;_--){const b=n[_];if(b.level{requestAnimationFrame(l),window.addEventListener("scroll",s)}),xe(()=>{d(location.hash)}),ue(()=>{window.removeEventListener("scroll",s)});function l(){if(!t.value)return;const v=[].slice.call(n.value.querySelectorAll(".outline-link")),_=[].slice.call(document.querySelectorAll(".content .header-anchor")).filter(y=>v.some(M=>M.hash===y.hash&&y.offsetParent!==null)),b=window.scrollY,w=window.innerHeight,S=document.body.offsetHeight,B=Math.abs(b+w-S)<1;if(_.length&&B){d(_[_.length-1].hash);return}for(let y=0;y<_.length;y++){const M=_[y],T=_[y+1],[$,z]=gt(y,M,T);if($){d(z);return}}}function d(v){o&&o.classList.remove("active"),v==null?o=null:o=n.value.querySelector(`a[href="${decodeURIComponent(v)}"]`);const _=o;_?(_.classList.add("active"),e.value.style.top=_.offsetTop+33+"px",e.value.style.opacity="1"):(e.value.style.top="33px",e.value.style.opacity="0")}}function ye(n){return n.parentElement.offsetTop-pt}function gt(n,e,t){const s=window.scrollY;return n===0&&s===0?[!0,null]:s{const o=K("VPDocOutlineItem",!0);return a(),r("ul",{class:C(t.root?"root":"nested")},[(a(!0),r(I,null,H(t.headers,({children:l,link:d,title:v})=>(a(),r("li",null,[c("a",{class:"outline-link",href:d,onClick:e,title:v},L(v),9,bt),l!=null&&l.length?(a(),k(o,{key:0,headers:l},null,8,["headers"])):f("",!0)]))),256))],2)}}});const pe=m(kt,[["__scopeId","data-v-74479eb5"]]),yt={class:"content"},$t={class:"outline-title",role:"heading","aria-level":"2"},Pt={"aria-labelledby":"doc-outline-aria-label"},Vt=g({__name:"VPDocAsideOutline",setup(n){const{frontmatter:e,theme:t}=V(),s=de([]);q(()=>{s.value=ve(e.value.outline??t.value.outline)});const o=N(),l=N();return mt(o,l),(d,v)=>(a(),r("div",{class:C(["VPDocAsideOutline",{"has-outline":s.value.length>0}]),ref_key:"container",ref:o,role:"navigation"},[c("div",yt,[c("div",{class:"outline-marker",ref_key:"marker",ref:l},null,512),c("div",$t,L(i(_e)(i(t))),1),c("nav",Pt,[v[0]||(v[0]=c("span",{class:"visually-hidden",id:"doc-outline-aria-label"}," Table of Contents for current page ",-1)),h(pe,{headers:s.value,root:!0},null,8,["headers"])])])],2))}});const wt=m(Vt,[["__scopeId","data-v-d8517c5e"]]),Lt={class:"VPDocAsideCarbonAds"},St=g({__name:"VPDocAsideCarbonAds",props:{carbonAds:{}},setup(n){const e=()=>null;return(t,s)=>(a(),r("div",Lt,[h(i(e),{"carbon-ads":t.carbonAds},null,8,["carbon-ads"])]))}}),Mt={class:"VPDocAside"},Tt=g({__name:"VPDocAside",setup(n){const{theme:e}=V();return(t,s)=>(a(),r("div",Mt,[u(t.$slots,"aside-top",{},void 0,!0),u(t.$slots,"aside-outline-before",{},void 0,!0),h(wt),u(t.$slots,"aside-outline-after",{},void 0,!0),s[0]||(s[0]=c("div",{class:"spacer"},null,-1)),u(t.$slots,"aside-ads-before",{},void 0,!0),i(e).carbonAds?(a(),k(St,{key:0,"carbon-ads":i(e).carbonAds},null,8,["carbon-ads"])):f("",!0),u(t.$slots,"aside-ads-after",{},void 0,!0),u(t.$slots,"aside-bottom",{},void 0,!0)]))}});const Ct=m(Tt,[["__scopeId","data-v-79cae1a0"]]);function Nt(){const{theme:n,page:e}=V();return P(()=>{const{text:t="Edit this page",pattern:s=""}=n.value.editLink||{};let o;return typeof s=="function"?o=s(e.value):o=s.replace(/:path/g,e.value.filePath),{url:o,text:t}})}function It(){const{page:n,theme:e,frontmatter:t}=V();return P(()=>{var _,b,w,S,B,y,M,T;const s=Me(e.value.sidebar,n.value.relativePath),o=ut(s),l=o.findIndex($=>G(n.value.relativePath,$.link)),d=((_=e.value.docFooter)==null?void 0:_.prev)===!1&&!t.value.prev||t.value.prev===!1,v=((b=e.value.docFooter)==null?void 0:b.next)===!1&&!t.value.next||t.value.next===!1;return{prev:d?void 0:{text:(typeof t.value.prev=="string"?t.value.prev:typeof t.value.prev=="object"?t.value.prev.text:void 0)??((w=o[l-1])==null?void 0:w.docFooterText)??((S=o[l-1])==null?void 0:S.text),link:(typeof t.value.prev=="object"?t.value.prev.link:void 0)??((B=o[l-1])==null?void 0:B.link)},next:v?void 0:{text:(typeof t.value.next=="string"?t.value.next:typeof t.value.next=="object"?t.value.next.text:void 0)??((y=o[l+1])==null?void 0:y.docFooterText)??((M=o[l+1])==null?void 0:M.text),link:(typeof t.value.next=="object"?t.value.next.link:void 0)??((T=o[l+1])==null?void 0:T.link)}}})}const Bt={},At={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"};function Ht(n,e){return a(),r("svg",At,e[0]||(e[0]=[c("path",{d:"M18,23H4c-1.7,0-3-1.3-3-3V6c0-1.7,1.3-3,3-3h7c0.6,0,1,0.4,1,1s-0.4,1-1,1H4C3.4,5,3,5.4,3,6v14c0,0.6,0.4,1,1,1h14c0.6,0,1-0.4,1-1v-7c0-0.6,0.4-1,1-1s1,0.4,1,1v7C21,21.7,19.7,23,18,23z"},null,-1),c("path",{d:"M8,17c-0.3,0-0.5-0.1-0.7-0.3C7,16.5,6.9,16.1,7,15.8l1-4c0-0.2,0.1-0.3,0.3-0.5l9.5-9.5c1.2-1.2,3.2-1.2,4.4,0c1.2,1.2,1.2,3.2,0,4.4l-9.5,9.5c-0.1,0.1-0.3,0.2-0.5,0.3l-4,1C8.2,17,8.1,17,8,17zM9.9,12.5l-0.5,2.1l2.1-0.5l9.3-9.3c0.4-0.4,0.4-1.1,0-1.6c-0.4-0.4-1.2-0.4-1.6,0l0,0L9.9,12.5z M18.5,2.5L18.5,2.5L18.5,2.5z"},null,-1)]))}const zt=m(Bt,[["render",Ht]]),x=g({__name:"VPLink",props:{tag:{},href:{},noIcon:{type:Boolean},target:{},rel:{}},setup(n){const e=n,t=P(()=>e.tag??(e.href?"a":"span")),s=P(()=>e.href&&Ve.test(e.href));return(o,l)=>(a(),k(O(t.value),{class:C(["VPLink",{link:o.href,"vp-external-link-icon":s.value,"no-icon":o.noIcon}]),href:o.href?i(W)(o.href):void 0,target:o.target??(s.value?"_blank":void 0),rel:o.rel??(s.value?"noreferrer":void 0)},{default:p(()=>[u(o.$slots,"default")]),_:3},8,["class","href","target","rel"]))}}),xt={class:"VPLastUpdated"},Dt=["datetime"],Et=g({__name:"VPDocFooterLastUpdated",setup(n){const{theme:e,page:t,frontmatter:s,lang:o}=V(),l=P(()=>new Date(s.value.lastUpdated??t.value.lastUpdated)),d=P(()=>l.value.toISOString()),v=N("");return U(()=>{Q(()=>{var _,b,w;v.value=new Intl.DateTimeFormat((b=(_=e.value.lastUpdated)==null?void 0:_.formatOptions)!=null&&b.forceLocale?o.value:void 0,((w=e.value.lastUpdated)==null?void 0:w.formatOptions)??{dateStyle:"short",timeStyle:"short"}).format(l.value)})}),(_,b)=>{var w;return a(),r("p",xt,[A(L(((w=i(e).lastUpdated)==null?void 0:w.text)||i(e).lastUpdatedText||"Last updated")+": ",1),c("time",{datetime:d.value},L(v.value),9,Dt)])}}});const Ft=m(Et,[["__scopeId","data-v-5be60f87"]]),Ot={key:0,class:"VPDocFooter"},Gt={key:0,class:"edit-info"},Ut={key:0,class:"edit-link"},jt={key:1,class:"last-updated"},Kt={key:1,class:"prev-next"},Rt={class:"pager"},qt=["href"],Wt=["innerHTML"],Yt=["innerHTML"],Xt={class:"pager"},Jt=["href"],Zt=["innerHTML"],Qt=["innerHTML"],es=g({__name:"VPDocFooter",setup(n){const{theme:e,page:t,frontmatter:s}=V(),o=Nt(),l=It(),d=P(()=>e.value.editLink&&s.value.editLink!==!1),v=P(()=>t.value.lastUpdated&&s.value.lastUpdated!==!1),_=P(()=>d.value||v.value||l.value.prev||l.value.next);return(b,w)=>{var S,B,y,M,T,$;return _.value?(a(),r("footer",Ot,[u(b.$slots,"doc-footer-before",{},void 0,!0),d.value||v.value?(a(),r("div",Gt,[d.value?(a(),r("div",Ut,[h(x,{class:"edit-link-button",href:i(o).url,"no-icon":!0},{default:p(()=>[h(zt,{class:"edit-link-icon","aria-label":"edit icon"}),A(" "+L(i(o).text),1)]),_:1},8,["href"])])):f("",!0),v.value?(a(),r("div",jt,[h(Ft)])):f("",!0)])):f("",!0),(S=i(l).prev)!=null&&S.link||(B=i(l).next)!=null&&B.link?(a(),r("nav",Kt,[c("div",Rt,[(y=i(l).prev)!=null&&y.link?(a(),r("a",{key:0,class:"pager-link prev",href:i(W)(i(l).prev.link)},[c("span",{class:"desc",innerHTML:((M=i(e).docFooter)==null?void 0:M.prev)||"Previous page"},null,8,Wt),c("span",{class:"title",innerHTML:i(l).prev.text},null,8,Yt)],8,qt)):f("",!0)]),c("div",Xt,[(T=i(l).next)!=null&&T.link?(a(),r("a",{key:0,class:"pager-link next",href:i(W)(i(l).next.link)},[c("span",{class:"desc",innerHTML:(($=i(e).docFooter)==null?void 0:$.next)||"Next page"},null,8,Zt),c("span",{class:"title",innerHTML:i(l).next.text},null,8,Qt)],8,Jt)):f("",!0)])])):f("",!0)])):f("",!0)}}});const ts=m(es,[["__scopeId","data-v-67de71aa"]]),ss={},ns={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function os(n,e){return a(),r("svg",ns,e[0]||(e[0]=[c("path",{d:"M9,19c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l5.3-5.3L8.3,6.7c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l6,6c0.4,0.4,0.4,1,0,1.4l-6,6C9.5,18.9,9.3,19,9,19z"},null,-1)]))}const fe=m(ss,[["render",os]]),as={key:0,class:"VPDocOutlineDropdown"},ls={key:0,class:"items"},rs=g({__name:"VPDocOutlineDropdown",setup(n){const{frontmatter:e,theme:t}=V(),s=N(!1);q(()=>{s.value=!1});const o=de([]);return q(()=>{o.value=ve(e.value.outline??t.value.outline)}),(l,d)=>o.value.length>0?(a(),r("div",as,[c("button",{onClick:d[0]||(d[0]=v=>s.value=!s.value),class:C({open:s.value})},[A(L(i(_e)(i(t)))+" ",1),h(fe,{class:"icon"})],2),s.value?(a(),r("div",ls,[h(pe,{headers:o.value},null,8,["headers"])])):f("",!0)])):f("",!0)}});const is=m(rs,[["__scopeId","data-v-3686ba1c"]]),cs={class:"container"},us={class:"aside-container"},ds={class:"aside-content"},_s={class:"content"},vs={class:"content-container"},ps={class:"main"},fs=g({__name:"VPDoc",setup(n){const{theme:e}=V(),t=ee(),{hasSidebar:s,hasAside:o,leftAside:l}=E(),d=P(()=>t.path.replace(/[./]+/g,"_").replace(/_html$/,""));return(v,_)=>{const b=K("Content");return a(),r("div",{class:C(["VPDoc",{"has-sidebar":i(s),"has-aside":i(o)}])},[u(v.$slots,"doc-top",{},void 0,!0),c("div",cs,[i(o)?(a(),r("div",{key:0,class:C(["aside",{"left-aside":i(l)}])},[_[0]||(_[0]=c("div",{class:"aside-curtain"},null,-1)),c("div",us,[c("div",ds,[h(Ct,null,{"aside-top":p(()=>[u(v.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[u(v.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[u(v.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[u(v.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[u(v.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[u(v.$slots,"aside-ads-after",{},void 0,!0)]),_:3})])])],2)):f("",!0),c("div",_s,[c("div",vs,[u(v.$slots,"doc-before",{},void 0,!0),h(is),c("main",ps,[h(b,{class:C(["vp-doc",[d.value,i(e).externalLinkIcon&&"external-link-icon-enabled"]])},null,8,["class"])]),h(ts,null,{"doc-footer-before":p(()=>[u(v.$slots,"doc-footer-before",{},void 0,!0)]),_:3}),u(v.$slots,"doc-after",{},void 0,!0)])])]),u(v.$slots,"doc-bottom",{},void 0,!0)],2)}}});const hs=m(fs,[["__scopeId","data-v-281cfc61"]]),ms=g({__name:"VPButton",props:{tag:{},size:{default:"medium"},theme:{default:"brand"},text:{},href:{}},setup(n){const e=n,t=P(()=>e.href&&Ve.test(e.href)),s=P(()=>e.tag||e.href?"a":"button");return(o,l)=>(a(),k(O(s.value),{class:C(["VPButton",[o.size,o.theme]]),href:o.href?i(W)(o.href):void 0,target:t.value?"_blank":void 0,rel:t.value?"noreferrer":void 0},{default:p(()=>[A(L(o.text),1)]),_:1},8,["class","href","target","rel"]))}});const gs=m(ms,[["__scopeId","data-v-de3c2b62"]]),bs=["src","alt"],ks=g({inheritAttrs:!1,__name:"VPImage",props:{image:{},alt:{}},setup(n){return(e,t)=>{const s=K("VPImage",!0);return e.image?(a(),r(I,{key:0},[typeof e.image=="string"||"src"in e.image?(a(),r("img",X({key:0,class:"VPImage"},typeof e.image=="string"?e.$attrs:{...e.image,...e.$attrs},{src:i(ce)(typeof e.image=="string"?e.image:e.image.src),alt:e.alt??(typeof e.image=="string"?"":e.image.alt||"")}),null,16,bs)):(a(),r(I,{key:1},[h(s,X({class:"dark",image:e.image.dark,alt:e.image.alt},e.$attrs),null,16,["image","alt"]),h(s,X({class:"light",image:e.image.light,alt:e.image.alt},e.$attrs),null,16,["image","alt"])],64))],64)):f("",!0)}}});const Z=m(ks,[["__scopeId","data-v-4d414b82"]]),ys={class:"container"},$s={class:"main"},Ps={key:0,class:"name"},Vs=["innerHTML"],ws=["innerHTML"],Ls=["innerHTML"],Ss={key:0,class:"actions"},Ms={key:0,class:"image"},Ts={class:"image-container"},Cs=g({__name:"VPHero",props:{name:{},text:{},tagline:{},image:{},actions:{}},setup(n){const e=te("hero-image-slot-exists");return(t,s)=>(a(),r("div",{class:C(["VPHero",{"has-image":t.image||i(e)}])},[c("div",ys,[c("div",$s,[u(t.$slots,"home-hero-info",{},()=>[t.name?(a(),r("h1",Ps,[c("span",{innerHTML:t.name,class:"clip"},null,8,Vs)])):f("",!0),t.text?(a(),r("p",{key:1,innerHTML:t.text,class:"text"},null,8,ws)):f("",!0),t.tagline?(a(),r("p",{key:2,innerHTML:t.tagline,class:"tagline"},null,8,Ls)):f("",!0)],!0),t.actions?(a(),r("div",Ss,[(a(!0),r(I,null,H(t.actions,o=>(a(),r("div",{key:o.link,class:"action"},[h(gs,{tag:"a",size:"medium",theme:o.theme,text:o.text,href:o.link},null,8,["theme","text","href"])]))),128))])):f("",!0)]),t.image||i(e)?(a(),r("div",Ms,[c("div",Ts,[s[0]||(s[0]=c("div",{class:"image-bg"},null,-1)),u(t.$slots,"home-hero-image",{},()=>[t.image?(a(),k(Z,{key:0,class:"image-src",image:t.image},null,8,["image"])):f("",!0)],!0)])])):f("",!0)])],2))}});const Ns=m(Cs,[["__scopeId","data-v-3d564967"]]),Is=g({__name:"VPHomeHero",setup(n){const{frontmatter:e}=V();return(t,s)=>i(e).hero?(a(),k(Ns,{key:0,class:"VPHomeHero",name:i(e).hero.name,text:i(e).hero.text,tagline:i(e).hero.tagline,image:i(e).hero.image,actions:i(e).hero.actions},{"home-hero-info":p(()=>[u(t.$slots,"home-hero-info")]),"home-hero-image":p(()=>[u(t.$slots,"home-hero-image")]),_:3},8,["name","text","tagline","image","actions"])):f("",!0)}}),Bs={},As={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"};function Hs(n,e){return a(),r("svg",As,e[0]||(e[0]=[c("path",{d:"M19.9,12.4c0.1-0.2,0.1-0.5,0-0.8c-0.1-0.1-0.1-0.2-0.2-0.3l-7-7c-0.4-0.4-1-0.4-1.4,0s-0.4,1,0,1.4l5.3,5.3H5c-0.6,0-1,0.4-1,1s0.4,1,1,1h11.6l-5.3,5.3c-0.4,0.4-0.4,1,0,1.4c0.2,0.2,0.5,0.3,0.7,0.3s0.5-0.1,0.7-0.3l7-7C19.8,12.6,19.9,12.5,19.9,12.4z"},null,-1)]))}const zs=m(Bs,[["render",Hs]]),xs={class:"box"},Ds={key:0,class:"icon"},Es=["innerHTML"],Fs=["innerHTML"],Os=["innerHTML"],Gs={key:4,class:"link-text"},Us={class:"link-text-value"},js=g({__name:"VPFeature",props:{icon:{},title:{},details:{},link:{},linkText:{},rel:{},target:{}},setup(n){return(e,t)=>(a(),k(x,{class:"VPFeature",href:e.link,rel:e.rel,target:e.target,"no-icon":!0,tag:e.link?"a":"div"},{default:p(()=>[c("article",xs,[typeof e.icon=="object"&&e.icon.wrap?(a(),r("div",Ds,[h(Z,{image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])])):typeof e.icon=="object"?(a(),k(Z,{key:1,image:e.icon,alt:e.icon.alt,height:e.icon.height||48,width:e.icon.width||48},null,8,["image","alt","height","width"])):e.icon?(a(),r("div",{key:2,class:"icon",innerHTML:e.icon},null,8,Es)):f("",!0),c("h2",{class:"title",innerHTML:e.title},null,8,Fs),e.details?(a(),r("p",{key:3,class:"details",innerHTML:e.details},null,8,Os)):f("",!0),e.linkText?(a(),r("div",Gs,[c("p",Us,[A(L(e.linkText)+" ",1),h(zs,{class:"link-text-icon"})])])):f("",!0)])]),_:1},8,["href","rel","target","tag"]))}});const Ks=m(js,[["__scopeId","data-v-c552d5c5"]]),Rs={key:0,class:"VPFeatures"},qs={class:"container"},Ws={class:"items"},Ys=g({__name:"VPFeatures",props:{features:{}},setup(n){const e=n,t=P(()=>{const s=e.features.length;if(s){if(s===2)return"grid-2";if(s===3)return"grid-3";if(s%3===0)return"grid-6";if(s>3)return"grid-4"}else return});return(s,o)=>s.features?(a(),r("div",Rs,[c("div",qs,[c("div",Ws,[(a(!0),r(I,null,H(s.features,l=>(a(),r("div",{key:l.title,class:C(["item",[t.value]])},[h(Ks,{icon:l.icon,title:l.title,details:l.details,link:l.link,"link-text":l.linkText,rel:l.rel,target:l.target},null,8,["icon","title","details","link","link-text","rel","target"])],2))),128))])])])):f("",!0)}});const Xs=m(Ys,[["__scopeId","data-v-1da4ff3d"]]),Js=g({__name:"VPHomeFeatures",setup(n){const{frontmatter:e}=V();return(t,s)=>i(e).features?(a(),k(Xs,{key:0,class:"VPHomeFeatures",features:i(e).features},null,8,["features"])):f("",!0)}}),Zs={class:"VPHome"},Qs=g({__name:"VPHome",setup(n){return(e,t)=>{const s=K("Content");return a(),r("div",Zs,[u(e.$slots,"home-hero-before",{},void 0,!0),h(Is,null,{"home-hero-info":p(()=>[u(e.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[u(e.$slots,"home-hero-image",{},void 0,!0)]),_:3}),u(e.$slots,"home-hero-after",{},void 0,!0),u(e.$slots,"home-features-before",{},void 0,!0),h(Js),u(e.$slots,"home-features-after",{},void 0,!0),h(s)])}}});const en=m(Qs,[["__scopeId","data-v-8ebac4ee"]]),tn={},sn={class:"VPPage"};function nn(n,e){const t=K("Content");return a(),r("div",sn,[u(n.$slots,"page-top"),h(t),u(n.$slots,"page-bottom")])}const on=m(tn,[["render",nn]]),an=g({__name:"VPContent",setup(n){const{page:e,frontmatter:t}=V(),{hasSidebar:s}=E();return(o,l)=>(a(),r("div",{class:C(["VPContent",{"has-sidebar":i(s),"is-home":i(t).layout==="home"}]),id:"VPContent"},[i(e).isNotFound?u(o.$slots,"not-found",{key:0},()=>[h(it)],!0):i(t).layout==="page"?(a(),k(on,{key:1},{"page-top":p(()=>[u(o.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[u(o.$slots,"page-bottom",{},void 0,!0)]),_:3})):i(t).layout==="home"?(a(),k(en,{key:2},{"home-hero-before":p(()=>[u(o.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[u(o.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[u(o.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[u(o.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[u(o.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[u(o.$slots,"home-features-after",{},void 0,!0)]),_:3})):i(t).layout&&i(t).layout!=="doc"?(a(),k(O(i(t).layout),{key:3})):(a(),k(hs,{key:4},{"doc-top":p(()=>[u(o.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[u(o.$slots,"doc-bottom",{},void 0,!0)]),"doc-footer-before":p(()=>[u(o.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[u(o.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[u(o.$slots,"doc-after",{},void 0,!0)]),"aside-top":p(()=>[u(o.$slots,"aside-top",{},void 0,!0)]),"aside-outline-before":p(()=>[u(o.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[u(o.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[u(o.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[u(o.$slots,"aside-ads-after",{},void 0,!0)]),"aside-bottom":p(()=>[u(o.$slots,"aside-bottom",{},void 0,!0)]),_:3}))],2))}});const ln=m(an,[["__scopeId","data-v-b7946bfc"]]),rn={class:"container"},cn=["innerHTML"],un=["innerHTML"],dn=g({__name:"VPFooter",setup(n){const{theme:e,frontmatter:t}=V(),{hasSidebar:s}=E();return(o,l)=>i(e).footer&&i(t).footer!==!1?(a(),r("footer",{key:0,class:C(["VPFooter",{"has-sidebar":i(s)}])},[c("div",rn,[i(e).footer.message?(a(),r("p",{key:0,class:"message",innerHTML:i(e).footer.message},null,8,cn)):f("",!0),i(e).footer.copyright?(a(),r("p",{key:1,class:"copyright",innerHTML:i(e).footer.copyright},null,8,un)):f("",!0)])],2)):f("",!0)}});const _n=m(dn,[["__scopeId","data-v-04a39284"]]),vn={class:"header"},pn={class:"outline"},fn=g({__name:"VPLocalNavOutlineDropdown",props:{headers:{},navHeight:{}},setup(n){const e=n,{theme:t}=V(),s=N(!1),o=N(0),l=N();q(()=>{s.value=!1});function d(){s.value=!s.value,o.value=window.innerHeight+Math.min(window.scrollY-e.navHeight,0)}function v(b){b.target.classList.contains("outline-link")&&(l.value&&(l.value.style.transition="none"),Ee(()=>{s.value=!1}))}function _(){s.value=!1,window.scrollTo({top:0,left:0,behavior:"smooth"})}return(b,w)=>(a(),r("div",{class:"VPLocalNavOutlineDropdown",style:De({"--vp-vh":o.value+"px"})},[b.headers.length>0?(a(),r("button",{key:0,onClick:d,class:C({open:s.value})},[A(L(i(_e)(i(t)))+" ",1),h(fe,{class:"icon"})],2)):(a(),r("button",{key:1,onClick:_},L(i(t).returnToTopLabel||"Return to top"),1)),h(ie,{name:"flyout"},{default:p(()=>[s.value?(a(),r("div",{key:0,ref_key:"items",ref:l,class:"items",onClick:v},[c("div",vn,[c("a",{class:"top-link",href:"#",onClick:_},L(i(t).returnToTopLabel||"Return to top"),1)]),c("div",pn,[h(pe,{headers:b.headers},null,8,["headers"])])],512)):f("",!0)]),_:1})],4))}});const hn=m(fn,[["__scopeId","data-v-2c1007a4"]]),mn={},gn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function bn(n,e){return a(),r("svg",gn,e[0]||(e[0]=[c("path",{d:"M17,11H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,11,17,11z"},null,-1),c("path",{d:"M21,7H3C2.4,7,2,6.6,2,6s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,7,21,7z"},null,-1),c("path",{d:"M21,15H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h18c0.6,0,1,0.4,1,1S21.6,15,21,15z"},null,-1),c("path",{d:"M17,19H3c-0.6,0-1-0.4-1-1s0.4-1,1-1h14c0.6,0,1,0.4,1,1S17.6,19,17,19z"},null,-1)]))}const kn=m(mn,[["render",bn]]),yn=["aria-expanded"],$n={class:"menu-text"},Pn=g({__name:"VPLocalNav",props:{open:{type:Boolean}},emits:["open-menu"],setup(n){const{theme:e,frontmatter:t}=V(),{hasSidebar:s}=E(),{y:o}=we(),l=de([]),d=N(0);U(()=>{d.value=parseInt(getComputedStyle(document.documentElement).getPropertyValue("--vp-nav-height"))}),q(()=>{l.value=ve(t.value.outline??e.value.outline)});const v=P(()=>l.value.length===0&&!s.value),_=P(()=>({VPLocalNav:!0,fixed:v.value,"reached-top":o.value>=d.value}));return(b,w)=>i(t).layout!=="home"&&(!v.value||i(o)>=d.value)?(a(),r("div",{key:0,class:C(_.value)},[i(s)?(a(),r("button",{key:0,class:"menu","aria-expanded":b.open,"aria-controls":"VPSidebarNav",onClick:w[0]||(w[0]=S=>b.$emit("open-menu"))},[h(kn,{class:"menu-icon"}),c("span",$n,L(i(e).sidebarMenuLabel||"Menu"),1)],8,yn)):f("",!0),h(hn,{headers:l.value,navHeight:d.value},null,8,["headers","navHeight"])],2)):f("",!0)}});const Vn=m(Pn,[["__scopeId","data-v-3c3d80ab"]]);function wn(){const n=N(!1);function e(){n.value=!0,window.addEventListener("resize",o)}function t(){n.value=!1,window.removeEventListener("resize",o)}function s(){n.value?t():e()}function o(){window.outerWidth>=768&&t()}const l=ee();return j(()=>l.path,t),{isScreenOpen:n,openScreen:e,closeScreen:t,toggleScreen:s}}const Ln={},Sn={class:"VPSwitch",type:"button",role:"switch"},Mn={class:"check"},Tn={key:0,class:"icon"};function Cn(n,e){return a(),r("button",Sn,[c("span",Mn,[n.$slots.default?(a(),r("span",Tn,[u(n.$slots,"default",{},void 0,!0)])):f("",!0)])])}const Nn=m(Ln,[["render",Cn],["__scopeId","data-v-0b5e260c"]]),In={},Bn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function An(n,e){return a(),r("svg",Bn,e[0]||(e[0]=[c("path",{d:"M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"},null,-1)]))}const Hn=m(In,[["render",An]]),zn={},xn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function Dn(n,e){return a(),r("svg",xn,e[0]||(e[0]=[Fe('',9)]))}const En=m(zn,[["render",Dn]]),Fn=g({__name:"VPSwitchAppearance",setup(n){const{isDark:e}=V(),t=te("toggle-appearance",()=>{e.value=!e.value});return(s,o)=>(a(),k(Nn,{title:"toggle dark mode",class:"VPSwitchAppearance","aria-checked":i(e),onClick:i(t)},{default:p(()=>[h(En,{class:"sun"}),h(Hn,{class:"moon"})]),_:1},8,["aria-checked","onClick"]))}});const he=m(Fn,[["__scopeId","data-v-fdee46ce"]]),On={key:0,class:"VPNavBarAppearance"},Gn=g({__name:"VPNavBarAppearance",setup(n){const{site:e}=V();return(t,s)=>i(e).appearance&&i(e).appearance!=="force-dark"?(a(),r("div",On,[h(he)])):f("",!0)}});const Un=m(Gn,[["__scopeId","data-v-f774fc1d"]]),me=N();let Ce=!1,oe=0;function jn(n){const e=N(!1);if(R){!Ce&&Kn(),oe++;const t=j(me,s=>{var o,l,d;s===n.el.value||(o=n.el.value)!=null&&o.contains(s)?(e.value=!0,(l=n.onFocus)==null||l.call(n)):(e.value=!1,(d=n.onBlur)==null||d.call(n))});ue(()=>{t(),oe--,oe||Rn()})}return Oe(e)}function Kn(){document.addEventListener("focusin",Ne),Ce=!0,me.value=document.activeElement}function Rn(){document.removeEventListener("focusin",Ne)}function Ne(){me.value=document.activeElement}const qn={},Wn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function Yn(n,e){return a(),r("svg",Wn,e[0]||(e[0]=[c("path",{d:"M12,16c-0.3,0-0.5-0.1-0.7-0.3l-6-6c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l5.3,5.3l5.3-5.3c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-6,6C12.5,15.9,12.3,16,12,16z"},null,-1)]))}const Ie=m(qn,[["render",Yn]]),Xn={},Jn={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function Zn(n,e){return a(),r("svg",Jn,e[0]||(e[0]=[c("circle",{cx:"12",cy:"12",r:"2"},null,-1),c("circle",{cx:"19",cy:"12",r:"2"},null,-1),c("circle",{cx:"5",cy:"12",r:"2"},null,-1)]))}const Qn=m(Xn,[["render",Zn]]),eo={class:"VPMenuLink"},to=g({__name:"VPMenuLink",props:{item:{}},setup(n){const{page:e}=V();return(t,s)=>(a(),r("div",eo,[h(x,{class:C({active:i(G)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel},{default:p(()=>[A(L(t.item.text),1)]),_:1},8,["class","href","target","rel"])]))}});const se=m(to,[["__scopeId","data-v-71c5411b"]]),so={class:"VPMenuGroup"},no={key:0,class:"title"},oo=g({__name:"VPMenuGroup",props:{text:{},items:{}},setup(n){return(e,t)=>(a(),r("div",so,[e.text?(a(),r("p",no,L(e.text),1)):f("",!0),(a(!0),r(I,null,H(e.items,s=>(a(),r(I,null,["link"in s?(a(),k(se,{key:0,item:s},null,8,["item"])):f("",!0)],64))),256))]))}});const ao=m(oo,[["__scopeId","data-v-2bec9359"]]),lo={class:"VPMenu"},ro={key:0,class:"items"},io=g({__name:"VPMenu",props:{items:{}},setup(n){return(e,t)=>(a(),r("div",lo,[e.items?(a(),r("div",ro,[(a(!0),r(I,null,H(e.items,s=>(a(),r(I,{key:s.text},["link"in s?(a(),k(se,{key:0,item:s},null,8,["item"])):(a(),k(ao,{key:1,text:s.text,items:s.items},null,8,["text","items"]))],64))),128))])):f("",!0),u(e.$slots,"default",{},void 0,!0)]))}});const co=m(io,[["__scopeId","data-v-7bffa9cd"]]),uo=["aria-expanded","aria-label"],_o={key:0,class:"text"},vo=["innerHTML"],po={class:"menu"},fo=g({__name:"VPFlyout",props:{icon:{},button:{},label:{},items:{}},setup(n){const e=N(!1),t=N();jn({el:t,onBlur:s});function s(){e.value=!1}return(o,l)=>(a(),r("div",{class:"VPFlyout",ref_key:"el",ref:t,onMouseenter:l[1]||(l[1]=d=>e.value=!0),onMouseleave:l[2]||(l[2]=d=>e.value=!1)},[c("button",{type:"button",class:"button","aria-haspopup":"true","aria-expanded":e.value,"aria-label":o.label,onClick:l[0]||(l[0]=d=>e.value=!e.value)},[o.button||o.icon?(a(),r("span",_o,[o.icon?(a(),k(O(o.icon),{key:0,class:"option-icon"})):f("",!0),o.button?(a(),r("span",{key:1,innerHTML:o.button},null,8,vo)):f("",!0),h(Ie,{class:"text-icon"})])):(a(),k(Qn,{key:1,class:"icon"}))],8,uo),c("div",po,[h(co,{items:o.items},{default:p(()=>[u(o.$slots,"default",{},void 0,!0)]),_:3},8,["items"])])],544))}});const ge=m(fo,[["__scopeId","data-v-1a2ceba0"]]),ho={discord:'Discord',facebook:'Facebook',github:'GitHub',instagram:'Instagram',linkedin:'LinkedIn',mastodon:'Mastodon',slack:'Slack',twitter:'Twitter',x:'X',youtube:'YouTube'},mo=["href","aria-label","innerHTML"],go=g({__name:"VPSocialLink",props:{icon:{},link:{},ariaLabel:{}},setup(n){const e=n,t=P(()=>typeof e.icon=="object"?e.icon.svg:ho[e.icon]);return(s,o)=>(a(),r("a",{class:"VPSocialLink no-icon",href:s.link,"aria-label":s.ariaLabel??(typeof s.icon=="string"?s.icon:""),target:"_blank",rel:"noopener",innerHTML:t.value},null,8,mo))}});const bo=m(go,[["__scopeId","data-v-efc53bd4"]]),ko={class:"VPSocialLinks"},yo=g({__name:"VPSocialLinks",props:{links:{}},setup(n){return(e,t)=>(a(),r("div",ko,[(a(!0),r(I,null,H(e.links,({link:s,icon:o,ariaLabel:l})=>(a(),k(bo,{key:s,icon:o,link:s,ariaLabel:l},null,8,["icon","link","ariaLabel"]))),128))]))}});const ne=m(yo,[["__scopeId","data-v-f2234a39"]]),$o={key:0,class:"group translations"},Po={class:"trans-title"},Vo={key:1,class:"group"},wo={class:"item appearance"},Lo={class:"label"},So={class:"appearance-action"},Mo={key:2,class:"group"},To={class:"item social-links"},Co=g({__name:"VPNavBarExtra",setup(n){const{site:e,theme:t}=V(),{localeLinks:s,currentLang:o}=Y({correspondingLink:!0}),l=P(()=>s.value.length&&o.value.label||e.value.appearance||t.value.socialLinks);return(d,v)=>l.value?(a(),k(ge,{key:0,class:"VPNavBarExtra",label:"extra navigation"},{default:p(()=>[i(s).length&&i(o).label?(a(),r("div",$o,[c("p",Po,L(i(o).label),1),(a(!0),r(I,null,H(i(s),_=>(a(),k(se,{key:_.link,item:_},null,8,["item"]))),128))])):f("",!0),i(e).appearance?(a(),r("div",Vo,[c("div",wo,[c("p",Lo,L(i(t).darkModeSwitchLabel||"Appearance"),1),c("div",So,[h(he)])])])):f("",!0),i(t).socialLinks?(a(),r("div",Mo,[c("div",To,[h(ne,{class:"social-links-list",links:i(t).socialLinks},null,8,["links"])])])):f("",!0)]),_:1})):f("",!0)}});const No=m(Co,[["__scopeId","data-v-47bb42ad"]]),Io=["aria-expanded"],Bo=g({__name:"VPNavBarHamburger",props:{active:{type:Boolean}},emits:["click"],setup(n){return(e,t)=>(a(),r("button",{type:"button",class:C(["VPNavBarHamburger",{active:e.active}]),"aria-label":"mobile navigation","aria-expanded":e.active,"aria-controls":"VPNavScreen",onClick:t[0]||(t[0]=s=>e.$emit("click"))},t[1]||(t[1]=[c("span",{class:"container"},[c("span",{class:"top"}),c("span",{class:"middle"}),c("span",{class:"bottom"})],-1)]),10,Io))}});const Ao=m(Bo,[["__scopeId","data-v-670493dd"]]),Ho=["innerHTML"],zo=g({__name:"VPNavBarMenuLink",props:{item:{}},setup(n){const{page:e}=V();return(t,s)=>(a(),k(x,{class:C({VPNavBarMenuLink:!0,active:i(G)(i(e).relativePath,t.item.activeMatch||t.item.link,!!t.item.activeMatch)}),href:t.item.link,target:t.item.target,rel:t.item.rel,tabindex:"0"},{default:p(()=>[c("span",{innerHTML:t.item.text},null,8,Ho)]),_:1},8,["class","href","target","rel"]))}});const xo=m(zo,[["__scopeId","data-v-97d30ef6"]]),Do=g({__name:"VPNavBarMenuGroup",props:{item:{}},setup(n){const e=n,{page:t}=V(),s=l=>"link"in l?G(t.value.relativePath,l.link,!!e.item.activeMatch):l.items.some(s),o=P(()=>s(e.item));return(l,d)=>(a(),k(ge,{class:C({VPNavBarMenuGroup:!0,active:i(G)(i(t).relativePath,l.item.activeMatch,!!l.item.activeMatch)||o.value}),button:l.item.text,items:l.item.items},null,8,["class","button","items"]))}}),Eo={key:0,"aria-labelledby":"main-nav-aria-label",class:"VPNavBarMenu"},Fo=g({__name:"VPNavBarMenu",setup(n){const{theme:e}=V();return(t,s)=>i(e).nav?(a(),r("nav",Eo,[s[0]||(s[0]=c("span",{id:"main-nav-aria-label",class:"visually-hidden"},"Main Navigation",-1)),(a(!0),r(I,null,H(i(e).nav,o=>(a(),r(I,{key:o.text},["link"in o?(a(),k(xo,{key:0,item:o},null,8,["item"])):(a(),k(Do,{key:1,item:o},null,8,["item"]))],64))),128))])):f("",!0)}});const Oo=m(Fo,[["__scopeId","data-v-c6c3e6d4"]]);const Go={type:"button",class:"DocSearch DocSearch-Button","aria-label":"Search"},Uo={class:"DocSearch-Button-Container"},jo={class:"DocSearch-Button-Placeholder"},$e=g({__name:"VPNavBarSearchButton",props:{placeholder:{}},setup(n){return(e,t)=>(a(),r("button",Go,[c("span",Uo,[t[0]||(t[0]=c("svg",{class:"DocSearch-Search-Icon",width:"20",height:"20",viewBox:"0 0 20 20","aria-label":"search icon"},[c("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","fill-rule":"evenodd","stroke-linecap":"round","stroke-linejoin":"round"})],-1)),c("span",jo,L(e.placeholder),1)]),t[1]||(t[1]=c("span",{class:"DocSearch-Button-Keys"},[c("kbd",{class:"DocSearch-Button-Key"}),c("kbd",{class:"DocSearch-Button-Key"},"K")],-1))]))}});const Ko={class:"VPNavBarSearch"},Ro={id:"local-search"},qo={key:1,id:"docsearch"},Wo=g({__name:"VPNavBarSearch",setup(n){const e=Ge(()=>Ue(()=>import("./VPLocalSearchBox.8e2f6eb7.js"),["assets/chunks/VPLocalSearchBox.8e2f6eb7.js","assets/chunks/framework.ece1a6f0.js"])),t=()=>null,{theme:s,localeIndex:o}=V(),l=N(!1),d=N(!1),v=P(()=>{var M,T,$,z,F,D,be;const y=((M=s.value.search)==null?void 0:M.options)??s.value.algolia;return((F=(z=($=(T=y==null?void 0:y.locales)==null?void 0:T[o.value])==null?void 0:$.translations)==null?void 0:z.button)==null?void 0:F.buttonText)||((be=(D=y==null?void 0:y.translations)==null?void 0:D.button)==null?void 0:be.buttonText)||"Search"});U(()=>{});function _(){l.value||(l.value=!0,setTimeout(b,16))}function b(){const y=new Event("keydown");y.key="k",y.metaKey=!0,window.dispatchEvent(y),setTimeout(()=>{document.querySelector(".DocSearch-Modal")||b()},16)}function w(y){const M=y.target,T=M.tagName;return M.isContentEditable||T==="INPUT"||T==="SELECT"||T==="TEXTAREA"}const S=N(!1);ke("k",y=>{(y.ctrlKey||y.metaKey)&&(y.preventDefault(),S.value=!0)}),ke("/",y=>{w(y)||(y.preventDefault(),S.value=!0)});const B="local";return(y,M)=>{var T;return a(),r("div",Ko,[i(B)==="local"?(a(),r(I,{key:0},[S.value?(a(),k(i(e),{key:0,placeholder:v.value,onClose:M[0]||(M[0]=$=>S.value=!1)},null,8,["placeholder"])):f("",!0),c("div",Ro,[h($e,{placeholder:v.value,onClick:M[1]||(M[1]=$=>S.value=!0)},null,8,["placeholder"])])],64)):i(B)==="algolia"?(a(),r(I,{key:1},[l.value?(a(),k(i(t),{key:0,algolia:((T=i(s).search)==null?void 0:T.options)??i(s).algolia,onVnodeBeforeMount:M[2]||(M[2]=$=>d.value=!0)},null,8,["algolia"])):f("",!0),d.value?f("",!0):(a(),r("div",qo,[h($e,{placeholder:v.value,onClick:_},null,8,["placeholder"])]))],64)):f("",!0)])}}});const Yo=g({__name:"VPNavBarSocialLinks",setup(n){const{theme:e}=V();return(t,s)=>i(e).socialLinks?(a(),k(ne,{key:0,class:"VPNavBarSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}});const Xo=m(Yo,[["__scopeId","data-v-08b35e6f"]]),Jo=["href"],Zo=g({__name:"VPNavBarTitle",setup(n){const{site:e,theme:t}=V(),{hasSidebar:s}=E(),{currentLang:o}=Y();return(l,d)=>(a(),r("div",{class:C(["VPNavBarTitle",{"has-sidebar":i(s)}])},[c("a",{class:"title",href:i(t).logoLink??i(W)(i(o).link)},[u(l.$slots,"nav-bar-title-before",{},void 0,!0),i(t).logo?(a(),k(Z,{key:0,class:"logo",image:i(t).logo},null,8,["image"])):f("",!0),i(t).siteTitle?(a(),r(I,{key:1},[A(L(i(t).siteTitle),1)],64)):i(t).siteTitle===void 0?(a(),r(I,{key:2},[A(L(i(e).title),1)],64)):f("",!0),u(l.$slots,"nav-bar-title-after",{},void 0,!0)],8,Jo)],2))}});const Qo=m(Zo,[["__scopeId","data-v-2d6ff155"]]),ea={},ta={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function sa(n,e){return a(),r("svg",ta,e[0]||(e[0]=[c("path",{d:"M0 0h24v24H0z",fill:"none"},null,-1),c("path",{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 ",class:"css-c4d79v"},null,-1)]))}const Be=m(ea,[["render",sa]]),na={class:"items"},oa={class:"title"},aa=g({__name:"VPNavBarTranslations",setup(n){const{theme:e}=V(),{localeLinks:t,currentLang:s}=Y({correspondingLink:!0});return(o,l)=>i(t).length&&i(s).label?(a(),k(ge,{key:0,class:"VPNavBarTranslations",icon:Be,label:i(e).langMenuLabel||"Change language"},{default:p(()=>[c("div",na,[c("p",oa,L(i(s).label),1),(a(!0),r(I,null,H(i(t),d=>(a(),k(se,{key:d.link,item:d},null,8,["item"]))),128))])]),_:1},8,["label"])):f("",!0)}});const la=m(aa,[["__scopeId","data-v-3bf1c934"]]),ra={class:"container"},ia={class:"title"},ca={class:"content"},ua={class:"content-body"},da=g({__name:"VPNavBar",props:{isScreenOpen:{type:Boolean}},emits:["toggle-screen"],setup(n){const{y:e}=we(),{hasSidebar:t}=E(),{frontmatter:s}=V(),o=N({});return Pe(()=>{o.value={"has-sidebar":t.value,top:s.value.layout==="home"&&e.value===0}}),(l,d)=>(a(),r("div",{class:C(["VPNavBar",o.value])},[c("div",ra,[c("div",ia,[h(Qo,null,{"nav-bar-title-before":p(()=>[u(l.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[u(l.$slots,"nav-bar-title-after",{},void 0,!0)]),_:3})]),c("div",ca,[d[1]||(d[1]=c("div",{class:"curtain"},null,-1)),c("div",ua,[u(l.$slots,"nav-bar-content-before",{},void 0,!0),h(Wo,{class:"search"}),h(Oo,{class:"menu"}),h(la,{class:"translations"}),h(Un,{class:"appearance"}),h(Xo,{class:"social-links"}),h(No,{class:"extra"}),u(l.$slots,"nav-bar-content-after",{},void 0,!0),h(Ao,{class:"hamburger",active:l.isScreenOpen,onClick:d[0]||(d[0]=v=>l.$emit("toggle-screen"))},null,8,["active"])])])])],2))}});const _a=m(da,[["__scopeId","data-v-dfeca417"]]),va={key:0,class:"VPNavScreenAppearance"},pa={class:"text"},fa=g({__name:"VPNavScreenAppearance",setup(n){const{site:e,theme:t}=V();return(s,o)=>i(e).appearance?(a(),r("div",va,[c("p",pa,L(i(t).darkModeSwitchLabel||"Appearance"),1),h(he)])):f("",!0)}});const ha=m(fa,[["__scopeId","data-v-8d2d8cf1"]]),ma=g({__name:"VPNavScreenMenuLink",props:{item:{}},setup(n){const e=te("close-screen");return(t,s)=>(a(),k(x,{class:"VPNavScreenMenuLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[A(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const ga=m(ma,[["__scopeId","data-v-083b71b4"]]),ba={},ka={xmlns:"http://www.w3.org/2000/svg","aria-hidden":"true",focusable:"false",viewBox:"0 0 24 24"};function ya(n,e){return a(),r("svg",ka,e[0]||(e[0]=[c("path",{d:"M18.9,10.9h-6v-6c0-0.6-0.4-1-1-1s-1,0.4-1,1v6h-6c-0.6,0-1,0.4-1,1s0.4,1,1,1h6v6c0,0.6,0.4,1,1,1s1-0.4,1-1v-6h6c0.6,0,1-0.4,1-1S19.5,10.9,18.9,10.9z"},null,-1)]))}const $a=m(ba,[["render",ya]]),Pa=g({__name:"VPNavScreenMenuGroupLink",props:{item:{}},setup(n){const e=te("close-screen");return(t,s)=>(a(),k(x,{class:"VPNavScreenMenuGroupLink",href:t.item.link,target:t.item.target,rel:t.item.rel,onClick:i(e)},{default:p(()=>[A(L(t.item.text),1)]),_:1},8,["href","target","rel","onClick"]))}});const Ae=m(Pa,[["__scopeId","data-v-ed7bb82d"]]),Va={class:"VPNavScreenMenuGroupSection"},wa={key:0,class:"title"},La=g({__name:"VPNavScreenMenuGroupSection",props:{text:{},items:{}},setup(n){return(e,t)=>(a(),r("div",Va,[e.text?(a(),r("p",wa,L(e.text),1)):f("",!0),(a(!0),r(I,null,H(e.items,s=>(a(),k(Ae,{key:s.text,item:s},null,8,["item"]))),128))]))}});const Sa=m(La,[["__scopeId","data-v-836cddb8"]]),Ma=["aria-controls","aria-expanded"],Ta={class:"button-text"},Ca=["id"],Na={key:1,class:"group"},Ia=g({__name:"VPNavScreenMenuGroup",props:{text:{},items:{}},setup(n){const e=n,t=N(!1),s=P(()=>`NavScreenGroup-${e.text.replace(" ","-").toLowerCase()}`);function o(){t.value=!t.value}return(l,d)=>(a(),r("div",{class:C(["VPNavScreenMenuGroup",{open:t.value}])},[c("button",{class:"button","aria-controls":s.value,"aria-expanded":t.value,onClick:o},[c("span",Ta,L(l.text),1),h($a,{class:"button-icon"})],8,Ma),c("div",{id:s.value,class:"items"},[(a(!0),r(I,null,H(l.items,v=>(a(),r(I,{key:v.text},["link"in v?(a(),r("div",{key:v.text,class:"item"},[h(Ae,{item:v},null,8,["item"])])):(a(),r("div",Na,[h(Sa,{text:v.text,items:v.items},null,8,["text","items"])]))],64))),128))],8,Ca)],2))}});const Ba=m(Ia,[["__scopeId","data-v-31b21668"]]),Aa={key:0,class:"VPNavScreenMenu"},Ha=g({__name:"VPNavScreenMenu",setup(n){const{theme:e}=V();return(t,s)=>i(e).nav?(a(),r("nav",Aa,[(a(!0),r(I,null,H(i(e).nav,o=>(a(),r(I,{key:o.text},["link"in o?(a(),k(ga,{key:0,item:o},null,8,["item"])):(a(),k(Ba,{key:1,text:o.text||"",items:o.items},null,8,["text","items"]))],64))),128))])):f("",!0)}}),za=g({__name:"VPNavScreenSocialLinks",setup(n){const{theme:e}=V();return(t,s)=>i(e).socialLinks?(a(),k(ne,{key:0,class:"VPNavScreenSocialLinks",links:i(e).socialLinks},null,8,["links"])):f("",!0)}}),xa={class:"list"},Da=g({__name:"VPNavScreenTranslations",setup(n){const{localeLinks:e,currentLang:t}=Y({correspondingLink:!0}),s=N(!1);function o(){s.value=!s.value}return(l,d)=>i(e).length&&i(t).label?(a(),r("div",{key:0,class:C(["VPNavScreenTranslations",{open:s.value}])},[c("button",{class:"title",onClick:o},[h(Be,{class:"icon lang"}),A(" "+L(i(t).label)+" ",1),h(Ie,{class:"icon chevron"})]),c("ul",xa,[(a(!0),r(I,null,H(i(e),v=>(a(),r("li",{key:v.link,class:"item"},[h(x,{class:"link",href:v.link},{default:p(()=>[A(L(v.text),1)]),_:2},1032,["href"])]))),128))])],2)):f("",!0)}});const Ea=m(Da,[["__scopeId","data-v-b72581fd"]]),Fa={class:"container"},Oa=g({__name:"VPNavScreen",props:{open:{type:Boolean}},setup(n){const e=N(null),t=Le(R?document.body:null);return(s,o)=>(a(),k(ie,{name:"fade",onEnter:o[0]||(o[0]=l=>t.value=!0),onAfterLeave:o[1]||(o[1]=l=>t.value=!1)},{default:p(()=>[s.open?(a(),r("div",{key:0,class:"VPNavScreen",ref_key:"screen",ref:e,id:"VPNavScreen"},[c("div",Fa,[u(s.$slots,"nav-screen-content-before",{},void 0,!0),h(Ha,{class:"menu"}),h(Ea,{class:"translations"}),h(ha,{class:"appearance"}),h(za,{class:"social-links"}),u(s.$slots,"nav-screen-content-after",{},void 0,!0)])],512)):f("",!0)]),_:3}))}});const Ga=m(Oa,[["__scopeId","data-v-5f4e75ae"]]),Ua={key:0,class:"VPNav"},ja=g({__name:"VPNav",setup(n){const{isScreenOpen:e,closeScreen:t,toggleScreen:s}=wn(),{frontmatter:o}=V(),l=P(()=>o.value.navbar!==!1);return Se("close-screen",t),Q(()=>{R&&document.documentElement.classList.toggle("hide-nav",!l.value)}),(d,v)=>l.value?(a(),r("header",Ua,[h(_a,{"is-screen-open":i(e),onToggleScreen:i(s)},{"nav-bar-title-before":p(()=>[u(d.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[u(d.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[u(d.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[u(d.$slots,"nav-bar-content-after",{},void 0,!0)]),_:3},8,["is-screen-open","onToggleScreen"]),h(Ga,{open:i(e)},{"nav-screen-content-before":p(()=>[u(d.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[u(d.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3},8,["open"])])):f("",!0)}});const Ka=m(ja,[["__scopeId","data-v-a46e73f0"]]),Ra=["role","tabindex"],qa={key:1,class:"items"},Wa=g({__name:"VPSidebarItem",props:{item:{},depth:{}},setup(n){const e=n,{collapsed:t,collapsible:s,isLink:o,isActiveLink:l,hasActiveLink:d,hasChildren:v,toggle:_}=_t(P(()=>e.item)),b=P(()=>v.value?"section":"div"),w=P(()=>o.value?"a":"div"),S=P(()=>v.value?e.depth+2===7?"p":`h${e.depth+2}`:"p"),B=P(()=>o.value?void 0:"button"),y=P(()=>[[`level-${e.depth}`],{collapsible:s.value},{collapsed:t.value},{"is-link":o.value},{"is-active":l.value},{"has-active":d.value}]);function M($){"key"in $&&$.key!=="Enter"||!e.item.link&&_()}function T(){e.item.link&&_()}return($,z)=>{const F=K("VPSidebarItem",!0);return a(),k(O(b.value),{class:C(["VPSidebarItem",y.value])},{default:p(()=>[$.item.text?(a(),r("div",X({key:0,class:"item",role:B.value},je($.item.items?{click:M,keydown:M}:{},!0),{tabindex:$.item.items&&0}),[z[0]||(z[0]=c("div",{class:"indicator"},null,-1)),$.item.link?(a(),k(x,{key:0,tag:w.value,class:"link",href:$.item.link,rel:$.item.rel,target:$.item.target},{default:p(()=>[(a(),k(O(S.value),{class:"text",innerHTML:$.item.text},null,8,["innerHTML"]))]),_:1},8,["tag","href","rel","target"])):(a(),k(O(S.value),{key:1,class:"text",innerHTML:$.item.text},null,8,["innerHTML"])),$.item.collapsed!=null?(a(),r("div",{key:2,class:"caret",role:"button","aria-label":"toggle section",onClick:T,onKeydown:Ke(T,["enter"]),tabindex:"0"},[h(fe,{class:"caret-icon"})],32)):f("",!0)],16,Ra)):f("",!0),$.item.items&&$.item.items.length?(a(),r("div",qa,[$.depth<5?(a(!0),r(I,{key:0},H($.item.items,D=>(a(),k(F,{key:D.text,item:D,depth:$.depth+1},null,8,["item","depth"]))),128)):f("",!0)])):f("",!0)]),_:1},8,["class"])}}});const Ya=m(Wa,[["__scopeId","data-v-f0f37ff4"]]),Xa={class:"nav",id:"VPSidebarNav","aria-labelledby":"sidebar-aria-label",tabindex:"-1"},Ja=g({__name:"VPSidebar",props:{open:{type:Boolean}},setup(n){const{sidebarGroups:e,hasSidebar:t}=E(),s=n,o=N(null),l=Le(R?document.body:null);return j([s,o],()=>{var d;s.open?(l.value=!0,(d=o.value)==null||d.focus()):l.value=!1},{immediate:!0,flush:"post"}),(d,v)=>i(t)?(a(),r("aside",{key:0,class:C(["VPSidebar",{open:d.open}]),ref_key:"navEl",ref:o,onClick:v[0]||(v[0]=Re(()=>{},["stop"]))},[v[2]||(v[2]=c("div",{class:"curtain"},null,-1)),c("nav",Xa,[v[1]||(v[1]=c("span",{class:"visually-hidden",id:"sidebar-aria-label"}," Sidebar Navigation ",-1)),u(d.$slots,"sidebar-nav-before",{},void 0,!0),(a(!0),r(I,null,H(i(e),_=>(a(),r("div",{key:_.text,class:"group"},[h(Ya,{item:_,depth:0},null,8,["item"])]))),128)),u(d.$slots,"sidebar-nav-after",{},void 0,!0)])],2)):f("",!0)}});const Za=m(Ja,[["__scopeId","data-v-45ef976a"]]),Qa=g({__name:"VPSkipLink",setup(n){const e=ee(),t=N();j(()=>e.path,()=>t.value.focus());function s({target:o}){const l=document.getElementById(decodeURIComponent(o.hash).slice(1));if(l){const d=()=>{l.removeAttribute("tabindex"),l.removeEventListener("blur",d)};l.setAttribute("tabindex","-1"),l.addEventListener("blur",d),l.focus(),window.scrollTo(0,0)}}return(o,l)=>(a(),r(I,null,[c("span",{ref_key:"backToTop",ref:t,tabindex:"-1"},null,512),c("a",{href:"#VPContent",class:"VPSkipLink visually-hidden",onClick:s}," Skip to content ")],64))}});const el=m(Qa,[["__scopeId","data-v-b22defb4"]]),tl=g({__name:"Layout",setup(n){const{isOpen:e,open:t,close:s}=E(),o=ee();j(()=>o.path,s),dt(e,s);const{frontmatter:l}=V(),d=qe(),v=P(()=>!!d["home-hero-image"]);return Se("hero-image-slot-exists",v),(_,b)=>{const w=K("Content");return i(l).layout!==!1?(a(),r("div",{key:0,class:C(["Layout",i(l).pageClass])},[u(_.$slots,"layout-top",{},void 0,!0),h(el),h(Ze,{class:"backdrop",show:i(e),onClick:i(s)},null,8,["show","onClick"]),h(Ka,null,{"nav-bar-title-before":p(()=>[u(_.$slots,"nav-bar-title-before",{},void 0,!0)]),"nav-bar-title-after":p(()=>[u(_.$slots,"nav-bar-title-after",{},void 0,!0)]),"nav-bar-content-before":p(()=>[u(_.$slots,"nav-bar-content-before",{},void 0,!0)]),"nav-bar-content-after":p(()=>[u(_.$slots,"nav-bar-content-after",{},void 0,!0)]),"nav-screen-content-before":p(()=>[u(_.$slots,"nav-screen-content-before",{},void 0,!0)]),"nav-screen-content-after":p(()=>[u(_.$slots,"nav-screen-content-after",{},void 0,!0)]),_:3}),h(Vn,{open:i(e),onOpenMenu:i(t)},null,8,["open","onOpenMenu"]),h(Za,{open:i(e)},{"sidebar-nav-before":p(()=>[u(_.$slots,"sidebar-nav-before",{},void 0,!0)]),"sidebar-nav-after":p(()=>[u(_.$slots,"sidebar-nav-after",{},void 0,!0)]),_:3},8,["open"]),h(ln,null,{"page-top":p(()=>[u(_.$slots,"page-top",{},void 0,!0)]),"page-bottom":p(()=>[u(_.$slots,"page-bottom",{},void 0,!0)]),"not-found":p(()=>[u(_.$slots,"not-found",{},void 0,!0)]),"home-hero-before":p(()=>[u(_.$slots,"home-hero-before",{},void 0,!0)]),"home-hero-info":p(()=>[u(_.$slots,"home-hero-info",{},void 0,!0)]),"home-hero-image":p(()=>[u(_.$slots,"home-hero-image",{},void 0,!0)]),"home-hero-after":p(()=>[u(_.$slots,"home-hero-after",{},void 0,!0)]),"home-features-before":p(()=>[u(_.$slots,"home-features-before",{},void 0,!0)]),"home-features-after":p(()=>[u(_.$slots,"home-features-after",{},void 0,!0)]),"doc-footer-before":p(()=>[u(_.$slots,"doc-footer-before",{},void 0,!0)]),"doc-before":p(()=>[u(_.$slots,"doc-before",{},void 0,!0)]),"doc-after":p(()=>[u(_.$slots,"doc-after",{},void 0,!0)]),"doc-top":p(()=>[u(_.$slots,"doc-top",{},void 0,!0)]),"doc-bottom":p(()=>[u(_.$slots,"doc-bottom",{},void 0,!0)]),"aside-top":p(()=>[u(_.$slots,"aside-top",{},void 0,!0)]),"aside-bottom":p(()=>[u(_.$slots,"aside-bottom",{},void 0,!0)]),"aside-outline-before":p(()=>[u(_.$slots,"aside-outline-before",{},void 0,!0)]),"aside-outline-after":p(()=>[u(_.$slots,"aside-outline-after",{},void 0,!0)]),"aside-ads-before":p(()=>[u(_.$slots,"aside-ads-before",{},void 0,!0)]),"aside-ads-after":p(()=>[u(_.$slots,"aside-ads-after",{},void 0,!0)]),_:3}),h(_n),u(_.$slots,"layout-bottom",{},void 0,!0)],2)):(a(),k(w,{key:1}))}}});const sl=m(tl,[["__scopeId","data-v-527a0310"]]),nl={},ol={xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"};function al(n,e){return a(),r("svg",ol,e[0]||(e[0]=[c("path",{d:"M12,22.2c-0.3,0-0.5-0.1-0.7-0.3l-8.8-8.8c-2.5-2.5-2.5-6.7,0-9.2c2.5-2.5,6.7-2.5,9.2,0L12,4.3l0.4-0.4c0,0,0,0,0,0C13.6,2.7,15.2,2,16.9,2c0,0,0,0,0,0c1.7,0,3.4,0.7,4.6,1.9l0,0c1.2,1.2,1.9,2.9,1.9,4.6c0,1.7-0.7,3.4-1.9,4.6l-8.8,8.8C12.5,22.1,12.3,22.2,12,22.2zM7,4C5.9,4,4.7,4.4,3.9,5.3c-1.8,1.8-1.8,4.6,0,6.4l8.1,8.1l8.1-8.1c0.9-0.9,1.3-2,1.3-3.2c0-1.2-0.5-2.3-1.3-3.2l0,0C19.3,4.5,18.2,4,17,4c0,0,0,0,0,0c-1.2,0-2.3,0.5-3.2,1.3c0,0,0,0,0,0l-1.1,1.1c-0.4,0.4-1,0.4-1.4,0l-1.1-1.1C9.4,4.4,8.2,4,7,4z"},null,-1)]))}const ll=m(nl,[["render",al]]);const rl={},il={class:"VPTeamPage"};function cl(n,e){return a(),r("div",il,[u(n.$slots,"default")])}const Dl=m(rl,[["render",cl],["__scopeId","data-v-05fecbf1"]]);const ul={},dl={class:"VPTeamPageTitle"},_l={key:0,class:"title"},vl={key:1,class:"lead"};function pl(n,e){return a(),r("div",dl,[n.$slots.title?(a(),r("h1",_l,[u(n.$slots,"title",{},void 0,!0)])):f("",!0),n.$slots.lead?(a(),r("p",vl,[u(n.$slots,"lead",{},void 0,!0)])):f("",!0)])}const El=m(ul,[["render",pl],["__scopeId","data-v-6ce551d6"]]);const fl={},hl={class:"VPTeamPageSection"},ml={class:"title"},gl={key:0,class:"title-text"},bl={key:0,class:"lead"},kl={key:1,class:"members"};function yl(n,e){return a(),r("section",hl,[c("div",ml,[e[0]||(e[0]=c("div",{class:"title-line"},null,-1)),n.$slots.title?(a(),r("h2",gl,[u(n.$slots,"title",{},void 0,!0)])):f("",!0)]),n.$slots.lead?(a(),r("p",bl,[u(n.$slots,"lead",{},void 0,!0)])):f("",!0),n.$slots.members?(a(),r("div",kl,[u(n.$slots,"members",{},void 0,!0)])):f("",!0)])}const Fl=m(fl,[["render",yl],["__scopeId","data-v-1ac32f26"]]),$l={class:"profile"},Pl={class:"avatar"},Vl=["src","alt"],wl={class:"data"},Ll={class:"name"},Sl={key:0,class:"affiliation"},Ml={key:0,class:"title"},Tl={key:1,class:"at"},Cl=["innerHTML"],Nl={key:2,class:"links"},Il={key:0,class:"sp"},Bl=g({__name:"VPTeamMembersItem",props:{size:{default:"medium"},member:{}},setup(n){return(e,t)=>(a(),r("article",{class:C(["VPTeamMembersItem",[e.size]])},[c("div",$l,[c("figure",Pl,[c("img",{class:"avatar-img",src:e.member.avatar,alt:e.member.name},null,8,Vl)]),c("div",wl,[c("h1",Ll,L(e.member.name),1),e.member.title||e.member.org?(a(),r("p",Sl,[e.member.title?(a(),r("span",Ml,L(e.member.title),1)):f("",!0),e.member.title&&e.member.org?(a(),r("span",Tl," @ ")):f("",!0),e.member.org?(a(),k(x,{key:2,class:C(["org",{link:e.member.orgLink}]),href:e.member.orgLink,"no-icon":""},{default:p(()=>[A(L(e.member.org),1)]),_:1},8,["class","href"])):f("",!0)])):f("",!0),e.member.desc?(a(),r("p",{key:1,class:"desc",innerHTML:e.member.desc},null,8,Cl)):f("",!0),e.member.links?(a(),r("div",Nl,[h(ne,{links:e.member.links},null,8,["links"])])):f("",!0)])]),e.member.sponsor?(a(),r("div",Il,[h(x,{class:"sp-link",href:e.member.sponsor,"no-icon":""},{default:p(()=>[h(ll,{class:"sp-icon"}),t[0]||(t[0]=A(" Sponsor "))]),_:1,__:[0]},8,["href"])])):f("",!0)],2))}});const Al=m(Bl,[["__scopeId","data-v-c1d54081"]]),Hl={class:"container"},zl=g({__name:"VPTeamMembers",props:{size:{default:"medium"},members:{}},setup(n){const e=n,t=P(()=>[e.size,`count-${e.members.length}`]);return(s,o)=>(a(),r("div",{class:C(["VPTeamMembers",t.value])},[c("div",Hl,[(a(!0),r(I,null,H(s.members,l=>(a(),r("div",{key:l.name,class:"item"},[h(Al,{size:s.size,member:l},null,8,["size","member"])]))),128))])],2))}});const Ol=m(zl,[["__scopeId","data-v-3ca0e3f5"]]),Gl={Layout:sl,enhanceApp:({app:n})=>{n.component("Badge",Ye)}};function Ul(n,e){const{localeIndex:t}=V();function s(o){var y,M;const l=o.split("."),d=n&&typeof n=="object",v=d&&((M=(y=n.locales)==null?void 0:y[t.value])==null?void 0:M.translations)||null,_=d&&n.translations||null;let b=v,w=_,S=e;const B=l.pop();for(const T of l){let $=null;const z=S==null?void 0:S[T];z&&($=S=z);const F=w==null?void 0:w[T];F&&($=w=F);const D=b==null?void 0:b[T];D&&($=b=D),z||(S=$),F||(w=$),D||(b=$)}return(b==null?void 0:b[B])??(w==null?void 0:w[B])??(S==null?void 0:S[B])??""}return s}export{El as V,Ol as a,Fl as b,Dl as c,Ul as d,Gl as t,V as u}; diff --git a/assets/contact.md.034a53d4.js b/assets/contact.md.11afb62a.js similarity index 85% rename from assets/contact.md.034a53d4.js rename to assets/contact.md.11afb62a.js index 5570351..119a8c4 100644 --- a/assets/contact.md.034a53d4.js +++ b/assets/contact.md.11afb62a.js @@ -1 +1 @@ -import{_ as e,o,c as s,k as t,a as r}from"./chunks/framework.47aa8d5b.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"contact.md","lastUpdated":1673564209000}'),d={name:"contact.md"};function c(n,a,i,l,p,m){return o(),s("div",null,a[0]||(a[0]=[t("div",{align:"center",class:"rounded-md"},[t("h1",{class:"text-[#ab5ac7]"},"Contact Us"),t("br"),r(" Please join our Discord for updates and any questions. "),t("br"),t("br"),t("iframe",{class:"rounded-md",id:"discord-widget",src:"https://discord.com/widget?id=946212245187199026&theme=dark",width:"350",height:"500",allowtransparency:"true",frameborder:"0",sandbox:"allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts",target:"_blank"})],-1)]))}const _=e(d,[["render",c]]);export{f as __pageData,_ as default}; +import{_ as e,o,c as s,k as t,a as r}from"./chunks/framework.ece1a6f0.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"contact.md","lastUpdated":1673564209000}'),d={name:"contact.md"};function c(n,a,i,l,p,m){return o(),s("div",null,a[0]||(a[0]=[t("div",{align:"center",class:"rounded-md"},[t("h1",{class:"text-[#ab5ac7]"},"Contact Us"),t("br"),r(" Please join our Discord for updates and any questions. "),t("br"),t("br"),t("iframe",{class:"rounded-md",id:"discord-widget",src:"https://discord.com/widget?id=946212245187199026&theme=dark",width:"350",height:"500",allowtransparency:"true",frameborder:"0",sandbox:"allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts",target:"_blank"})],-1)]))}const _=e(d,[["render",c]]);export{f as __pageData,_ as default}; diff --git a/assets/contact.md.034a53d4.lean.js b/assets/contact.md.11afb62a.lean.js similarity index 85% rename from assets/contact.md.034a53d4.lean.js rename to assets/contact.md.11afb62a.lean.js index 5570351..119a8c4 100644 --- a/assets/contact.md.034a53d4.lean.js +++ b/assets/contact.md.11afb62a.lean.js @@ -1 +1 @@ -import{_ as e,o,c as s,k as t,a as r}from"./chunks/framework.47aa8d5b.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"contact.md","lastUpdated":1673564209000}'),d={name:"contact.md"};function c(n,a,i,l,p,m){return o(),s("div",null,a[0]||(a[0]=[t("div",{align:"center",class:"rounded-md"},[t("h1",{class:"text-[#ab5ac7]"},"Contact Us"),t("br"),r(" Please join our Discord for updates and any questions. "),t("br"),t("br"),t("iframe",{class:"rounded-md",id:"discord-widget",src:"https://discord.com/widget?id=946212245187199026&theme=dark",width:"350",height:"500",allowtransparency:"true",frameborder:"0",sandbox:"allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts",target:"_blank"})],-1)]))}const _=e(d,[["render",c]]);export{f as __pageData,_ as default}; +import{_ as e,o,c as s,k as t,a as r}from"./chunks/framework.ece1a6f0.js";const f=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"contact.md","filePath":"contact.md","lastUpdated":1673564209000}'),d={name:"contact.md"};function c(n,a,i,l,p,m){return o(),s("div",null,a[0]||(a[0]=[t("div",{align:"center",class:"rounded-md"},[t("h1",{class:"text-[#ab5ac7]"},"Contact Us"),t("br"),r(" Please join our Discord for updates and any questions. "),t("br"),t("br"),t("iframe",{class:"rounded-md",id:"discord-widget",src:"https://discord.com/widget?id=946212245187199026&theme=dark",width:"350",height:"500",allowtransparency:"true",frameborder:"0",sandbox:"allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts",target:"_blank"})],-1)]))}const _=e(d,[["render",c]]);export{f as __pageData,_ as default}; diff --git a/assets/dev_roadmap.md.2f96c918.js b/assets/dev_roadmap.md.881dcb79.js similarity index 92% rename from assets/dev_roadmap.md.2f96c918.js rename to assets/dev_roadmap.md.881dcb79.js index af8df12..2f2ea3e 100644 --- a/assets/dev_roadmap.md.2f96c918.js +++ b/assets/dev_roadmap.md.881dcb79.js @@ -1 +1 @@ -import{_ as l}from"./chunks/CheckBoxList.80273cd9.js";import{o as n,c as s,k as a,a as t,E as r,l as o}from"./chunks/framework.47aa8d5b.js";const i={state:!0,object:[{label:"Tracking algorithm"},{label:"Calibration"},{label:"GUI"},{label:"PCB Design for IR emitters"},{label:"Dual Eye support"},{label:"Firmware"},{label:"Better documentation over things (setup, wiring etc.)"},{label:"Setup dynamic WiFi credentials at runtime"},{label:"OTA using Platformio"},{label:"Auto threshold's"},{label:"New LED Power regulator board (V4)"},{label:"New IR LED PCB (only for the power reg board) (V4)"},{label:"Setup flashing of ESPs through anything other than VSC"}]},d={state:!1,object:[{label:"Variable eye openness tracking (being improved)"},{label:"Auto ROI cropping/better cropping"},{label:"New GUI"},{label:"New backend for new GUI"},{label:"V5 hardware (focus on wired usage)"},{label:"Dynamic foveated rendering via OpenXR"},{label:"3D, 9-point calibration via OpenXR/SteamVR overlay"},{label:"Custom cam boards/cameras"},{label:"Full hardware kits"}]},p={state:!1,object:[{label:"Game interaction SDK"},{label:"Game developer integration program"}]},g=JSON.parse('{"title":"EyeTrackVR Development Roadmap","description":"","frontmatter":{},"headers":[],"relativePath":"dev_roadmap.md","filePath":"dev_roadmap.md","lastUpdated":1676223729000}'),m={name:"dev_roadmap.md"},h=Object.assign(m,{setup(b){return(c,e)=>(n(),s("div",null,[e[0]||(e[0]=a("h1",{class:"text-[var(--font-accent)]",id:"eyetrackvr-development-roadmap",tabindex:"-1"},[t("EyeTrackVR Development Roadmap "),a("a",{class:"header-anchor",href:"#eyetrackvr-development-roadmap","aria-label":'Permalink to "EyeTrackVR Development Roadmap {.text-[var(--font-accent)]}"'},"​")],-1)),e[1]||(e[1]=a("p",null,"This will contain a list of features that are in progress, completed, and planned.",-1)),e[2]||(e[2]=a("h2",{id:"completed",tabindex:"-1"},[t("Completed "),a("a",{class:"header-anchor",href:"#completed","aria-label":'Permalink to "Completed"'},"​")],-1)),r(l,{options:{...o(i)}},null,8,["options"]),e[3]||(e[3]=a("h2",{id:"in-progress",tabindex:"-1"},[t("In Progress "),a("a",{class:"header-anchor",href:"#in-progress","aria-label":'Permalink to "In Progress"'},"​")],-1)),r(l,{options:{...o(d)}},null,8,["options"]),e[4]||(e[4]=a("h2",{id:"planned",tabindex:"-1"},[t("Planned "),a("a",{class:"header-anchor",href:"#planned","aria-label":'Permalink to "Planned"'},"​")],-1)),r(l,{options:{...o(p)}},null,8,["options"])]))}});export{g as __pageData,h as default}; +import{_ as l}from"./chunks/CheckBoxList.1747249a.js";import{o as n,c as s,k as a,a as t,E as r,l as o}from"./chunks/framework.ece1a6f0.js";const i={state:!0,object:[{label:"Tracking algorithm"},{label:"Calibration"},{label:"GUI"},{label:"PCB Design for IR emitters"},{label:"Dual Eye support"},{label:"Firmware"},{label:"Better documentation over things (setup, wiring etc.)"},{label:"Setup dynamic WiFi credentials at runtime"},{label:"OTA using Platformio"},{label:"Auto threshold's"},{label:"New LED Power regulator board (V4)"},{label:"New IR LED PCB (only for the power reg board) (V4)"},{label:"Setup flashing of ESPs through anything other than VSC"}]},d={state:!1,object:[{label:"Variable eye openness tracking (being improved)"},{label:"Auto ROI cropping/better cropping"},{label:"New GUI"},{label:"New backend for new GUI"},{label:"V5 hardware (focus on wired usage)"},{label:"Dynamic foveated rendering via OpenXR"},{label:"3D, 9-point calibration via OpenXR/SteamVR overlay"},{label:"Custom cam boards/cameras"},{label:"Full hardware kits"}]},p={state:!1,object:[{label:"Game interaction SDK"},{label:"Game developer integration program"}]},g=JSON.parse('{"title":"EyeTrackVR Development Roadmap","description":"","frontmatter":{},"headers":[],"relativePath":"dev_roadmap.md","filePath":"dev_roadmap.md","lastUpdated":1676223729000}'),m={name:"dev_roadmap.md"},h=Object.assign(m,{setup(b){return(c,e)=>(n(),s("div",null,[e[0]||(e[0]=a("h1",{class:"text-[var(--font-accent)]",id:"eyetrackvr-development-roadmap",tabindex:"-1"},[t("EyeTrackVR Development Roadmap "),a("a",{class:"header-anchor",href:"#eyetrackvr-development-roadmap","aria-label":'Permalink to "EyeTrackVR Development Roadmap {.text-[var(--font-accent)]}"'},"​")],-1)),e[1]||(e[1]=a("p",null,"This will contain a list of features that are in progress, completed, and planned.",-1)),e[2]||(e[2]=a("h2",{id:"completed",tabindex:"-1"},[t("Completed "),a("a",{class:"header-anchor",href:"#completed","aria-label":'Permalink to "Completed"'},"​")],-1)),r(l,{options:{...o(i)}},null,8,["options"]),e[3]||(e[3]=a("h2",{id:"in-progress",tabindex:"-1"},[t("In Progress "),a("a",{class:"header-anchor",href:"#in-progress","aria-label":'Permalink to "In Progress"'},"​")],-1)),r(l,{options:{...o(d)}},null,8,["options"]),e[4]||(e[4]=a("h2",{id:"planned",tabindex:"-1"},[t("Planned "),a("a",{class:"header-anchor",href:"#planned","aria-label":'Permalink to "Planned"'},"​")],-1)),r(l,{options:{...o(p)}},null,8,["options"])]))}});export{g as __pageData,h as default}; diff --git a/assets/dev_roadmap.md.2f96c918.lean.js b/assets/dev_roadmap.md.881dcb79.lean.js similarity index 92% rename from assets/dev_roadmap.md.2f96c918.lean.js rename to assets/dev_roadmap.md.881dcb79.lean.js index af8df12..2f2ea3e 100644 --- a/assets/dev_roadmap.md.2f96c918.lean.js +++ b/assets/dev_roadmap.md.881dcb79.lean.js @@ -1 +1 @@ -import{_ as l}from"./chunks/CheckBoxList.80273cd9.js";import{o as n,c as s,k as a,a as t,E as r,l as o}from"./chunks/framework.47aa8d5b.js";const i={state:!0,object:[{label:"Tracking algorithm"},{label:"Calibration"},{label:"GUI"},{label:"PCB Design for IR emitters"},{label:"Dual Eye support"},{label:"Firmware"},{label:"Better documentation over things (setup, wiring etc.)"},{label:"Setup dynamic WiFi credentials at runtime"},{label:"OTA using Platformio"},{label:"Auto threshold's"},{label:"New LED Power regulator board (V4)"},{label:"New IR LED PCB (only for the power reg board) (V4)"},{label:"Setup flashing of ESPs through anything other than VSC"}]},d={state:!1,object:[{label:"Variable eye openness tracking (being improved)"},{label:"Auto ROI cropping/better cropping"},{label:"New GUI"},{label:"New backend for new GUI"},{label:"V5 hardware (focus on wired usage)"},{label:"Dynamic foveated rendering via OpenXR"},{label:"3D, 9-point calibration via OpenXR/SteamVR overlay"},{label:"Custom cam boards/cameras"},{label:"Full hardware kits"}]},p={state:!1,object:[{label:"Game interaction SDK"},{label:"Game developer integration program"}]},g=JSON.parse('{"title":"EyeTrackVR Development Roadmap","description":"","frontmatter":{},"headers":[],"relativePath":"dev_roadmap.md","filePath":"dev_roadmap.md","lastUpdated":1676223729000}'),m={name:"dev_roadmap.md"},h=Object.assign(m,{setup(b){return(c,e)=>(n(),s("div",null,[e[0]||(e[0]=a("h1",{class:"text-[var(--font-accent)]",id:"eyetrackvr-development-roadmap",tabindex:"-1"},[t("EyeTrackVR Development Roadmap "),a("a",{class:"header-anchor",href:"#eyetrackvr-development-roadmap","aria-label":'Permalink to "EyeTrackVR Development Roadmap {.text-[var(--font-accent)]}"'},"​")],-1)),e[1]||(e[1]=a("p",null,"This will contain a list of features that are in progress, completed, and planned.",-1)),e[2]||(e[2]=a("h2",{id:"completed",tabindex:"-1"},[t("Completed "),a("a",{class:"header-anchor",href:"#completed","aria-label":'Permalink to "Completed"'},"​")],-1)),r(l,{options:{...o(i)}},null,8,["options"]),e[3]||(e[3]=a("h2",{id:"in-progress",tabindex:"-1"},[t("In Progress "),a("a",{class:"header-anchor",href:"#in-progress","aria-label":'Permalink to "In Progress"'},"​")],-1)),r(l,{options:{...o(d)}},null,8,["options"]),e[4]||(e[4]=a("h2",{id:"planned",tabindex:"-1"},[t("Planned "),a("a",{class:"header-anchor",href:"#planned","aria-label":'Permalink to "Planned"'},"​")],-1)),r(l,{options:{...o(p)}},null,8,["options"])]))}});export{g as __pageData,h as default}; +import{_ as l}from"./chunks/CheckBoxList.1747249a.js";import{o as n,c as s,k as a,a as t,E as r,l as o}from"./chunks/framework.ece1a6f0.js";const i={state:!0,object:[{label:"Tracking algorithm"},{label:"Calibration"},{label:"GUI"},{label:"PCB Design for IR emitters"},{label:"Dual Eye support"},{label:"Firmware"},{label:"Better documentation over things (setup, wiring etc.)"},{label:"Setup dynamic WiFi credentials at runtime"},{label:"OTA using Platformio"},{label:"Auto threshold's"},{label:"New LED Power regulator board (V4)"},{label:"New IR LED PCB (only for the power reg board) (V4)"},{label:"Setup flashing of ESPs through anything other than VSC"}]},d={state:!1,object:[{label:"Variable eye openness tracking (being improved)"},{label:"Auto ROI cropping/better cropping"},{label:"New GUI"},{label:"New backend for new GUI"},{label:"V5 hardware (focus on wired usage)"},{label:"Dynamic foveated rendering via OpenXR"},{label:"3D, 9-point calibration via OpenXR/SteamVR overlay"},{label:"Custom cam boards/cameras"},{label:"Full hardware kits"}]},p={state:!1,object:[{label:"Game interaction SDK"},{label:"Game developer integration program"}]},g=JSON.parse('{"title":"EyeTrackVR Development Roadmap","description":"","frontmatter":{},"headers":[],"relativePath":"dev_roadmap.md","filePath":"dev_roadmap.md","lastUpdated":1676223729000}'),m={name:"dev_roadmap.md"},h=Object.assign(m,{setup(b){return(c,e)=>(n(),s("div",null,[e[0]||(e[0]=a("h1",{class:"text-[var(--font-accent)]",id:"eyetrackvr-development-roadmap",tabindex:"-1"},[t("EyeTrackVR Development Roadmap "),a("a",{class:"header-anchor",href:"#eyetrackvr-development-roadmap","aria-label":'Permalink to "EyeTrackVR Development Roadmap {.text-[var(--font-accent)]}"'},"​")],-1)),e[1]||(e[1]=a("p",null,"This will contain a list of features that are in progress, completed, and planned.",-1)),e[2]||(e[2]=a("h2",{id:"completed",tabindex:"-1"},[t("Completed "),a("a",{class:"header-anchor",href:"#completed","aria-label":'Permalink to "Completed"'},"​")],-1)),r(l,{options:{...o(i)}},null,8,["options"]),e[3]||(e[3]=a("h2",{id:"in-progress",tabindex:"-1"},[t("In Progress "),a("a",{class:"header-anchor",href:"#in-progress","aria-label":'Permalink to "In Progress"'},"​")],-1)),r(l,{options:{...o(d)}},null,8,["options"]),e[4]||(e[4]=a("h2",{id:"planned",tabindex:"-1"},[t("Planned "),a("a",{class:"header-anchor",href:"#planned","aria-label":'Permalink to "Planned"'},"​")],-1)),r(l,{options:{...o(p)}},null,8,["options"])]))}});export{g as __pageData,h as default}; diff --git a/assets/development_docs_dev_docs.md.b7b0d76e.js b/assets/development_docs_dev_docs.md.a6e54c81.js similarity index 97% rename from assets/development_docs_dev_docs.md.b7b0d76e.js rename to assets/development_docs_dev_docs.md.a6e54c81.js index 4079794..0ffa382 100644 --- a/assets/development_docs_dev_docs.md.b7b0d76e.js +++ b/assets/development_docs_dev_docs.md.a6e54c81.js @@ -1 +1 @@ -import{_ as a,o as t,c as s,O as r}from"./chunks/framework.47aa8d5b.js";const u=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/dev_docs.md","filePath":"development/docs/dev_docs.md","lastUpdated":1689147044000}'),n={name:"development/docs/dev_docs.md"};function o(l,e,i,c,p,d){return t(),s("div",null,e[0]||(e[0]=[r('

Development Documentation for the EyeTrackVR Docs Site

This is the documentation for the EyeTrackVR Docs site. It is built using VitePress.

Getting Started

Prerequisites

  • Node.js (v14.15.4 or higher)
  • Yarn (v1.22.10 or higher)
  • Git (v2.30.1 or higher)
  • VSCode (v1.56.2 or higher)

Installation

  1. Clone the repo

    sh
    git clone https://github.com/EyeTrackVR/EyeTrackVR-Docs.git
  2. Navigate to the vitepress folder

    sh
    cd vitepress
  3. Install Yarn packages

    sh
     yarn
  4. Start the dev server

    sh
    yarn dev
  5. Open the site in your browser

Contributing

Project Structure

  1. Familiarize yourself with the VitePress documentation.
  2. Then, move on to our project specific documentation below.

Standards

  • All documentation should be written in Markdown or Vue components.
  • All file names are snake case and lowercase letters.
  • Do not make naming changes to the vitepress folder.
  • Do not make major changes to the vitepress folder structure without proir consultation of team members.
  • For Vue componentes, follow the Vue3 docs.
',12)]))}const m=a(n,[["render",o]]);export{u as __pageData,m as default}; +import{_ as a,o as t,c as s,O as r}from"./chunks/framework.ece1a6f0.js";const u=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/dev_docs.md","filePath":"development/docs/dev_docs.md","lastUpdated":1689147044000}'),n={name:"development/docs/dev_docs.md"};function o(l,e,i,c,p,d){return t(),s("div",null,e[0]||(e[0]=[r('

Development Documentation for the EyeTrackVR Docs Site

This is the documentation for the EyeTrackVR Docs site. It is built using VitePress.

Getting Started

Prerequisites

  • Node.js (v14.15.4 or higher)
  • Yarn (v1.22.10 or higher)
  • Git (v2.30.1 or higher)
  • VSCode (v1.56.2 or higher)

Installation

  1. Clone the repo

    sh
    git clone https://github.com/EyeTrackVR/EyeTrackVR-Docs.git
  2. Navigate to the vitepress folder

    sh
    cd vitepress
  3. Install Yarn packages

    sh
     yarn
  4. Start the dev server

    sh
    yarn dev
  5. Open the site in your browser

Contributing

Project Structure

  1. Familiarize yourself with the VitePress documentation.
  2. Then, move on to our project specific documentation below.

Standards

  • All documentation should be written in Markdown or Vue components.
  • All file names are snake case and lowercase letters.
  • Do not make naming changes to the vitepress folder.
  • Do not make major changes to the vitepress folder structure without proir consultation of team members.
  • For Vue componentes, follow the Vue3 docs.
',12)]))}const m=a(n,[["render",o]]);export{u as __pageData,m as default}; diff --git a/assets/development_docs_dev_docs.md.b7b0d76e.lean.js b/assets/development_docs_dev_docs.md.a6e54c81.lean.js similarity index 97% rename from assets/development_docs_dev_docs.md.b7b0d76e.lean.js rename to assets/development_docs_dev_docs.md.a6e54c81.lean.js index 4079794..0ffa382 100644 --- a/assets/development_docs_dev_docs.md.b7b0d76e.lean.js +++ b/assets/development_docs_dev_docs.md.a6e54c81.lean.js @@ -1 +1 @@ -import{_ as a,o as t,c as s,O as r}from"./chunks/framework.47aa8d5b.js";const u=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/dev_docs.md","filePath":"development/docs/dev_docs.md","lastUpdated":1689147044000}'),n={name:"development/docs/dev_docs.md"};function o(l,e,i,c,p,d){return t(),s("div",null,e[0]||(e[0]=[r('

Development Documentation for the EyeTrackVR Docs Site

This is the documentation for the EyeTrackVR Docs site. It is built using VitePress.

Getting Started

Prerequisites

  • Node.js (v14.15.4 or higher)
  • Yarn (v1.22.10 or higher)
  • Git (v2.30.1 or higher)
  • VSCode (v1.56.2 or higher)

Installation

  1. Clone the repo

    sh
    git clone https://github.com/EyeTrackVR/EyeTrackVR-Docs.git
  2. Navigate to the vitepress folder

    sh
    cd vitepress
  3. Install Yarn packages

    sh
     yarn
  4. Start the dev server

    sh
    yarn dev
  5. Open the site in your browser

Contributing

Project Structure

  1. Familiarize yourself with the VitePress documentation.
  2. Then, move on to our project specific documentation below.

Standards

  • All documentation should be written in Markdown or Vue components.
  • All file names are snake case and lowercase letters.
  • Do not make naming changes to the vitepress folder.
  • Do not make major changes to the vitepress folder structure without proir consultation of team members.
  • For Vue componentes, follow the Vue3 docs.
',12)]))}const m=a(n,[["render",o]]);export{u as __pageData,m as default}; +import{_ as a,o as t,c as s,O as r}from"./chunks/framework.ece1a6f0.js";const u=JSON.parse('{"title":"Development Documentation for the EyeTrackVR Docs Site","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/dev_docs.md","filePath":"development/docs/dev_docs.md","lastUpdated":1689147044000}'),n={name:"development/docs/dev_docs.md"};function o(l,e,i,c,p,d){return t(),s("div",null,e[0]||(e[0]=[r('

Development Documentation for the EyeTrackVR Docs Site

This is the documentation for the EyeTrackVR Docs site. It is built using VitePress.

Getting Started

Prerequisites

  • Node.js (v14.15.4 or higher)
  • Yarn (v1.22.10 or higher)
  • Git (v2.30.1 or higher)
  • VSCode (v1.56.2 or higher)

Installation

  1. Clone the repo

    sh
    git clone https://github.com/EyeTrackVR/EyeTrackVR-Docs.git
  2. Navigate to the vitepress folder

    sh
    cd vitepress
  3. Install Yarn packages

    sh
     yarn
  4. Start the dev server

    sh
    yarn dev
  5. Open the site in your browser

Contributing

Project Structure

  1. Familiarize yourself with the VitePress documentation.
  2. Then, move on to our project specific documentation below.

Standards

  • All documentation should be written in Markdown or Vue components.
  • All file names are snake case and lowercase letters.
  • Do not make naming changes to the vitepress folder.
  • Do not make major changes to the vitepress folder structure without proir consultation of team members.
  • For Vue componentes, follow the Vue3 docs.
',12)]))}const m=a(n,[["render",o]]);export{u as __pageData,m as default}; diff --git a/assets/development_docs_pages.md.85e22694.js b/assets/development_docs_pages.md.d059df93.js similarity index 98% rename from assets/development_docs_pages.md.85e22694.js rename to assets/development_docs_pages.md.d059df93.js index 74a38c5..270bcdb 100644 --- a/assets/development_docs_pages.md.85e22694.js +++ b/assets/development_docs_pages.md.d059df93.js @@ -1,4 +1,4 @@ -import{_ as s,o as a,c as o,O as n}from"./chunks/framework.47aa8d5b.js";const y=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/pages.md","filePath":"development/docs/pages.md","lastUpdated":1700510338000}'),l={name:"development/docs/pages.md"};function t(p,e,c,r,i,d){return a(),o("div",null,e[0]||(e[0]=[n(`

Pages

This section will cover how to add or edit pages on the docs website.

Please use the Github Markdown flavour for your Markdown files.

Please look at other pages to see how they are formatted, and for examples of how to use Markdown.

Adding a Page

To add a page, you will need to create a new Markdown file in the vitepress/docs/src/pages folder. The file name will be the URL of the page. For example, if you create a file called my_page.md, the URL will be https://docs.eyetrackvr.dev/my_page.

Sub-directories

You can also create sub-directories in the vitepress/docs/src/pages folder. For example, if you create a file called my_page.md in a folder called my_folder, the URL will be https://docs.eyetrackvr.dev/my_folder/my_page.

This is useful for organizing pages into categories.

Adding a Page to the Sidebar

To add a page to the sidebar, you will need to add the page to the vitepress/docs/src/custom/theme/index.js file.

To do this, you will need to add the page to the sidebar object.

For example, if you want to add a page called my_page.md to the sidebar, you will need to add the following to the sidebar object:

js
{
+import{_ as s,o as a,c as o,O as n}from"./chunks/framework.ece1a6f0.js";const y=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/pages.md","filePath":"development/docs/pages.md","lastUpdated":1700510338000}'),l={name:"development/docs/pages.md"};function t(p,e,c,r,i,d){return a(),o("div",null,e[0]||(e[0]=[n(`

Pages

This section will cover how to add or edit pages on the docs website.

Please use the Github Markdown flavour for your Markdown files.

Please look at other pages to see how they are formatted, and for examples of how to use Markdown.

Adding a Page

To add a page, you will need to create a new Markdown file in the vitepress/docs/src/pages folder. The file name will be the URL of the page. For example, if you create a file called my_page.md, the URL will be https://docs.eyetrackvr.dev/my_page.

Sub-directories

You can also create sub-directories in the vitepress/docs/src/pages folder. For example, if you create a file called my_page.md in a folder called my_folder, the URL will be https://docs.eyetrackvr.dev/my_folder/my_page.

This is useful for organizing pages into categories.

Adding a Page to the Sidebar

To add a page to the sidebar, you will need to add the page to the vitepress/docs/src/custom/theme/index.js file.

To do this, you will need to add the page to the sidebar object.

For example, if you want to add a page called my_page.md to the sidebar, you will need to add the following to the sidebar object:

js
{
     text: "Getting Started",
     collapsible: true,
     items: [
diff --git a/assets/development_docs_pages.md.85e22694.lean.js b/assets/development_docs_pages.md.d059df93.lean.js
similarity index 98%
rename from assets/development_docs_pages.md.85e22694.lean.js
rename to assets/development_docs_pages.md.d059df93.lean.js
index 74a38c5..270bcdb 100644
--- a/assets/development_docs_pages.md.85e22694.lean.js
+++ b/assets/development_docs_pages.md.d059df93.lean.js
@@ -1,4 +1,4 @@
-import{_ as s,o as a,c as o,O as n}from"./chunks/framework.47aa8d5b.js";const y=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/pages.md","filePath":"development/docs/pages.md","lastUpdated":1700510338000}'),l={name:"development/docs/pages.md"};function t(p,e,c,r,i,d){return a(),o("div",null,e[0]||(e[0]=[n(`

Pages

This section will cover how to add or edit pages on the docs website.

Please use the Github Markdown flavour for your Markdown files.

Please look at other pages to see how they are formatted, and for examples of how to use Markdown.

Adding a Page

To add a page, you will need to create a new Markdown file in the vitepress/docs/src/pages folder. The file name will be the URL of the page. For example, if you create a file called my_page.md, the URL will be https://docs.eyetrackvr.dev/my_page.

Sub-directories

You can also create sub-directories in the vitepress/docs/src/pages folder. For example, if you create a file called my_page.md in a folder called my_folder, the URL will be https://docs.eyetrackvr.dev/my_folder/my_page.

This is useful for organizing pages into categories.

Adding a Page to the Sidebar

To add a page to the sidebar, you will need to add the page to the vitepress/docs/src/custom/theme/index.js file.

To do this, you will need to add the page to the sidebar object.

For example, if you want to add a page called my_page.md to the sidebar, you will need to add the following to the sidebar object:

js
{
+import{_ as s,o as a,c as o,O as n}from"./chunks/framework.ece1a6f0.js";const y=JSON.parse('{"title":"Pages","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/pages.md","filePath":"development/docs/pages.md","lastUpdated":1700510338000}'),l={name:"development/docs/pages.md"};function t(p,e,c,r,i,d){return a(),o("div",null,e[0]||(e[0]=[n(`

Pages

This section will cover how to add or edit pages on the docs website.

Please use the Github Markdown flavour for your Markdown files.

Please look at other pages to see how they are formatted, and for examples of how to use Markdown.

Adding a Page

To add a page, you will need to create a new Markdown file in the vitepress/docs/src/pages folder. The file name will be the URL of the page. For example, if you create a file called my_page.md, the URL will be https://docs.eyetrackvr.dev/my_page.

Sub-directories

You can also create sub-directories in the vitepress/docs/src/pages folder. For example, if you create a file called my_page.md in a folder called my_folder, the URL will be https://docs.eyetrackvr.dev/my_folder/my_page.

This is useful for organizing pages into categories.

Adding a Page to the Sidebar

To add a page to the sidebar, you will need to add the page to the vitepress/docs/src/custom/theme/index.js file.

To do this, you will need to add the page to the sidebar object.

For example, if you want to add a page called my_page.md to the sidebar, you will need to add the following to the sidebar object:

js
{
     text: "Getting Started",
     collapsible: true,
     items: [
diff --git a/assets/development_docs_standards.md.f9558435.lean.js b/assets/development_docs_standards.md.84a36195.js
similarity index 98%
rename from assets/development_docs_standards.md.f9558435.lean.js
rename to assets/development_docs_standards.md.84a36195.js
index b2096fa..6a80ece 100644
--- a/assets/development_docs_standards.md.f9558435.lean.js
+++ b/assets/development_docs_standards.md.84a36195.js
@@ -1,4 +1,4 @@
-import{_ as s,o as a,c as n,O as t}from"./chunks/framework.47aa8d5b.js";const m=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/standards.md","filePath":"development/docs/standards.md","lastUpdated":1677868200000}'),o={name:"development/docs/standards.md"};function l(i,e,r,p,c,d){return a(),n("div",null,e[0]||(e[0]=[t(`

Standards Guide

Listed here are the standards that are used for the EyeTrackVR project. These standards are used to ensure that the project is consistent and easy to understand.

Code Standards

General

It is by design that we use a static-site framework for the documentation site. This is to ensure that the documentation is easy to maintain and extend. This is also to ensure that the documentation is easy to understand.

We have only a few rules for the documentation site:

  • All code should be written in English.
  • All code should be written in a way that is easy to understand.
  • All code should be written in a way that is easy to maintain.
  • All code should be written in a way that is easy to extend.
  • Our git commit style is to be followed, in english only.

Git Commit Style

We use the Conventional Commits standard for our git commit style. This is to ensure that our git commits are easy to understand and easy to maintain. This is also to ensure that our git commits are easy to extend.

Git commits are used to with the Semantic Release tool to automatically generate the changelog and versioning for the project. As such, it is important that we follow the Conventional Commits standard, with our own rule customizations.

The following is a list of the customizations that we have made to the Conventional Commits standard:

  • We use the BREAKING CHANGE(S) or BREAKING text to indicate a breaking change.

Our git commit style is as follows:

bash
<type>[optional scope]: <description>
+import{_ as s,o as a,c as n,O as t}from"./chunks/framework.ece1a6f0.js";const m=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/standards.md","filePath":"development/docs/standards.md","lastUpdated":1677868200000}'),o={name:"development/docs/standards.md"};function l(i,e,r,p,c,d){return a(),n("div",null,e[0]||(e[0]=[t(`

Standards Guide

Listed here are the standards that are used for the EyeTrackVR project. These standards are used to ensure that the project is consistent and easy to understand.

Code Standards

General

It is by design that we use a static-site framework for the documentation site. This is to ensure that the documentation is easy to maintain and extend. This is also to ensure that the documentation is easy to understand.

We have only a few rules for the documentation site:

  • All code should be written in English.
  • All code should be written in a way that is easy to understand.
  • All code should be written in a way that is easy to maintain.
  • All code should be written in a way that is easy to extend.
  • Our git commit style is to be followed, in english only.

Git Commit Style

We use the Conventional Commits standard for our git commit style. This is to ensure that our git commits are easy to understand and easy to maintain. This is also to ensure that our git commits are easy to extend.

Git commits are used to with the Semantic Release tool to automatically generate the changelog and versioning for the project. As such, it is important that we follow the Conventional Commits standard, with our own rule customizations.

The following is a list of the customizations that we have made to the Conventional Commits standard:

  • We use the BREAKING CHANGE(S) or BREAKING text to indicate a breaking change.

Our git commit style is as follows:

bash
<type>[optional scope]: <description>
 
 [optional body]
 
diff --git a/assets/development_docs_standards.md.f9558435.js b/assets/development_docs_standards.md.84a36195.lean.js
similarity index 98%
rename from assets/development_docs_standards.md.f9558435.js
rename to assets/development_docs_standards.md.84a36195.lean.js
index b2096fa..6a80ece 100644
--- a/assets/development_docs_standards.md.f9558435.js
+++ b/assets/development_docs_standards.md.84a36195.lean.js
@@ -1,4 +1,4 @@
-import{_ as s,o as a,c as n,O as t}from"./chunks/framework.47aa8d5b.js";const m=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/standards.md","filePath":"development/docs/standards.md","lastUpdated":1677868200000}'),o={name:"development/docs/standards.md"};function l(i,e,r,p,c,d){return a(),n("div",null,e[0]||(e[0]=[t(`

Standards Guide

Listed here are the standards that are used for the EyeTrackVR project. These standards are used to ensure that the project is consistent and easy to understand.

Code Standards

General

It is by design that we use a static-site framework for the documentation site. This is to ensure that the documentation is easy to maintain and extend. This is also to ensure that the documentation is easy to understand.

We have only a few rules for the documentation site:

  • All code should be written in English.
  • All code should be written in a way that is easy to understand.
  • All code should be written in a way that is easy to maintain.
  • All code should be written in a way that is easy to extend.
  • Our git commit style is to be followed, in english only.

Git Commit Style

We use the Conventional Commits standard for our git commit style. This is to ensure that our git commits are easy to understand and easy to maintain. This is also to ensure that our git commits are easy to extend.

Git commits are used to with the Semantic Release tool to automatically generate the changelog and versioning for the project. As such, it is important that we follow the Conventional Commits standard, with our own rule customizations.

The following is a list of the customizations that we have made to the Conventional Commits standard:

  • We use the BREAKING CHANGE(S) or BREAKING text to indicate a breaking change.

Our git commit style is as follows:

bash
<type>[optional scope]: <description>
+import{_ as s,o as a,c as n,O as t}from"./chunks/framework.ece1a6f0.js";const m=JSON.parse('{"title":"Standards Guide","description":"","frontmatter":{},"headers":[],"relativePath":"development/docs/standards.md","filePath":"development/docs/standards.md","lastUpdated":1677868200000}'),o={name:"development/docs/standards.md"};function l(i,e,r,p,c,d){return a(),n("div",null,e[0]||(e[0]=[t(`

Standards Guide

Listed here are the standards that are used for the EyeTrackVR project. These standards are used to ensure that the project is consistent and easy to understand.

Code Standards

General

It is by design that we use a static-site framework for the documentation site. This is to ensure that the documentation is easy to maintain and extend. This is also to ensure that the documentation is easy to understand.

We have only a few rules for the documentation site:

  • All code should be written in English.
  • All code should be written in a way that is easy to understand.
  • All code should be written in a way that is easy to maintain.
  • All code should be written in a way that is easy to extend.
  • Our git commit style is to be followed, in english only.

Git Commit Style

We use the Conventional Commits standard for our git commit style. This is to ensure that our git commits are easy to understand and easy to maintain. This is also to ensure that our git commits are easy to extend.

Git commits are used to with the Semantic Release tool to automatically generate the changelog and versioning for the project. As such, it is important that we follow the Conventional Commits standard, with our own rule customizations.

The following is a list of the customizations that we have made to the Conventional Commits standard:

  • We use the BREAKING CHANGE(S) or BREAKING text to indicate a breaking change.

Our git commit style is as follows:

bash
<type>[optional scope]: <description>
 
 [optional body]
 
diff --git a/assets/firmware_guide_configure_firmware.md.4eb536cf.js b/assets/firmware_guide_configure_firmware.md.7944a4ab.js
similarity index 97%
rename from assets/firmware_guide_configure_firmware.md.4eb536cf.js
rename to assets/firmware_guide_configure_firmware.md.7944a4ab.js
index 80019df..58f8400 100644
--- a/assets/firmware_guide_configure_firmware.md.4eb536cf.js
+++ b/assets/firmware_guide_configure_firmware.md.7944a4ab.js
@@ -1 +1 @@
-import{_ as d,a as h}from"./chunks/index.339f98d7.js";import{_ as i,i as r}from"./chunks/index.c1fed1bd.js";import{o as l,c as u,k as o,a as t,E as a,l as n,O as s,w as c}from"./chunks/framework.47aa8d5b.js";const b=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/configure_firmware.md","filePath":"firmware_guide/configure_firmware.md","lastUpdated":1700510338000}'),p={name:"firmware_guide/configure_firmware.md"},P=Object.assign(p,{setup(f){return(m,e)=>(l(),u("div",null,[e[1]||(e[1]=o("h1",{class:"text-[var(--font-accent)]",id:"configuring-the-firmware",tabindex:"-1"},[t("Configuring the firmware "),o("a",{class:"header-anchor",href:"#configuring-the-firmware","aria-label":'Permalink to "Configuring the firmware {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=o("h2",{id:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",tabindex:"-1"},[t("Once you have opened the project, you should see something on the left side like this "),o("a",{class:"header-anchor",href:"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","aria-label":'Permalink to "Once you have opened the project, you should see something on the left side like this"'},"​")],-1)),a(i,{options:n(r).configure_firmware_one},null,8,["options"]),e[3]||(e[3]=o("h2",{id:"open-the-ini-user-config-ini-file",tabindex:"-1"},[t("Open the "),o("code",null,"ini/user_config.ini"),t(" file "),o("a",{class:"header-anchor",href:"#open-the-ini-user-config-ini-file","aria-label":'Permalink to "Open the `ini/user_config.ini` file"'},"​")],-1)),a(i,{options:n(r).configure_firmware_two},null,8,["options"]),e[4]||(e[4]=s('

INFO

These settings are applicable only when using Wi-Fi for communication with your computer. If you are using USB, you can skip to reading about Environments.

Replace the placeholder text with your correct SSID (WiFi access point name), and password respectively.

INFO

Special characters such as ! and @ are not supported. If you have a special character in your password or ssid, you will need to change it.

Similarly, spaces are not supported in the SSID and password. If you have a space in either, you will need to change it.

The firmware supports AP mode, however it is not recommended. If you wish to use AP mode, you will need to set the enableadhoc to 1.

Then, you will need to set the ap_ssid to the name of your AP, and ap_password to the password of your AP.

You can choose to leave the ap_ssid and ap_password as defaults, but you will need to set the enableadhoc to 1.

Note: If you are enabling AP mode for both ESPs, you will need to set the ap_ssid and ap_password to different values for both ESPs. It is best to set AP mode only for one ESP, and leave the other ESP in STA mode. Connect the other ESP to the AP of the ESP in AP mode. Then connect your computer to the AP of the ESP in AP mode. This will allow you to connect to the ESP in AP mode, and the ESP in STA mode.

',3)),a(d,{options:n(h).parts_list_one},{content:c(()=>e[0]||(e[0]=[o("p",null," Make sure your WiFi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required. ",-1)])),_:1},8,["options"]),e[5]||(e[5]=s('

Double check that you have correctly entered your WiFi credentials and that said wifi network has a 2.4GHz band.

Additional configuration

mDNS

If you do not wish to manually keep track of the ESPs IP addresses and ports, you can enable the mDNS feature. This will allow you to connect to the ESPs using the following format: http://<some_name>.local. This feature only works when you are on the same network as the ESPs and have mDNS enabled on your computer. If you are using Windows, you can enable mDNS by following this guide.

OTA

The firmware supports OTA updates. This means that you can update the firmware without having to connect to the ESPs. To enable OTA updates, you will need to set the enableota to 1. Then, you will need to set the otapassword to the password you wish to use to update the firmware. You will need to use this password to update the firmware. If you do not wish to use a password, you can set the otapassword to nothing. This will allow you to update the firmware without a password. However, this is not recommended, as anyone on your network will be able to update the firmware.

You will also need to set the otaserverip to the IP address of the ESP you wish to update. This is the IP address of the ESP you wish to update. If you are using mDNS, you can use the mDNS name of the ESP you wish to update. For example, if you are updating the ESP with the dns set to http://esp32.local, you will need to set the otaserverip to http://esp32.local.

REST API

The firmware also supports a fully featured REST API. This means that you can control the ESPs using a REST API. This feature is enabled by defauly, and can not be turned off.

This feature is used more for advanced users, and is not required for basic operation.

The REST API was developed to be used by our new app (still in development). However, it can be used by any REST API client, you can not send POST requests to the ESPs using a browser though, so some REST API functionality can only be used by tools like Thunder Client or Postman.

The full REST API is documented here.

Environments

The firmware supports multiple environments. This means that we have full support for multiple types of ESPs. Each ESP is configured to be in a different environment. If you are using a different ESP, you will need to change the environment to the correct one.

Please reference the Firmware Enviroments Page for more information.

Now, move on to uploading the firmware

',16))]))}});export{b as __pageData,P as default}; +import{_ as d,a as h}from"./chunks/index.c19b2931.js";import{_ as i,i as r}from"./chunks/index.41b0dfea.js";import{o as l,c as u,k as o,a as t,E as a,l as n,O as s,w as c}from"./chunks/framework.ece1a6f0.js";const b=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/configure_firmware.md","filePath":"firmware_guide/configure_firmware.md","lastUpdated":1700510338000}'),p={name:"firmware_guide/configure_firmware.md"},P=Object.assign(p,{setup(f){return(m,e)=>(l(),u("div",null,[e[1]||(e[1]=o("h1",{class:"text-[var(--font-accent)]",id:"configuring-the-firmware",tabindex:"-1"},[t("Configuring the firmware "),o("a",{class:"header-anchor",href:"#configuring-the-firmware","aria-label":'Permalink to "Configuring the firmware {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=o("h2",{id:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",tabindex:"-1"},[t("Once you have opened the project, you should see something on the left side like this "),o("a",{class:"header-anchor",href:"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","aria-label":'Permalink to "Once you have opened the project, you should see something on the left side like this"'},"​")],-1)),a(i,{options:n(r).configure_firmware_one},null,8,["options"]),e[3]||(e[3]=o("h2",{id:"open-the-ini-user-config-ini-file",tabindex:"-1"},[t("Open the "),o("code",null,"ini/user_config.ini"),t(" file "),o("a",{class:"header-anchor",href:"#open-the-ini-user-config-ini-file","aria-label":'Permalink to "Open the `ini/user_config.ini` file"'},"​")],-1)),a(i,{options:n(r).configure_firmware_two},null,8,["options"]),e[4]||(e[4]=s('

INFO

These settings are applicable only when using Wi-Fi for communication with your computer. If you are using USB, you can skip to reading about Environments.

Replace the placeholder text with your correct SSID (WiFi access point name), and password respectively.

INFO

Special characters such as ! and @ are not supported. If you have a special character in your password or ssid, you will need to change it.

Similarly, spaces are not supported in the SSID and password. If you have a space in either, you will need to change it.

The firmware supports AP mode, however it is not recommended. If you wish to use AP mode, you will need to set the enableadhoc to 1.

Then, you will need to set the ap_ssid to the name of your AP, and ap_password to the password of your AP.

You can choose to leave the ap_ssid and ap_password as defaults, but you will need to set the enableadhoc to 1.

Note: If you are enabling AP mode for both ESPs, you will need to set the ap_ssid and ap_password to different values for both ESPs. It is best to set AP mode only for one ESP, and leave the other ESP in STA mode. Connect the other ESP to the AP of the ESP in AP mode. Then connect your computer to the AP of the ESP in AP mode. This will allow you to connect to the ESP in AP mode, and the ESP in STA mode.

',3)),a(d,{options:n(h).parts_list_one},{content:c(()=>e[0]||(e[0]=[o("p",null," Make sure your WiFi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required. ",-1)])),_:1},8,["options"]),e[5]||(e[5]=s('

Double check that you have correctly entered your WiFi credentials and that said wifi network has a 2.4GHz band.

Additional configuration

mDNS

If you do not wish to manually keep track of the ESPs IP addresses and ports, you can enable the mDNS feature. This will allow you to connect to the ESPs using the following format: http://<some_name>.local. This feature only works when you are on the same network as the ESPs and have mDNS enabled on your computer. If you are using Windows, you can enable mDNS by following this guide.

OTA

The firmware supports OTA updates. This means that you can update the firmware without having to connect to the ESPs. To enable OTA updates, you will need to set the enableota to 1. Then, you will need to set the otapassword to the password you wish to use to update the firmware. You will need to use this password to update the firmware. If you do not wish to use a password, you can set the otapassword to nothing. This will allow you to update the firmware without a password. However, this is not recommended, as anyone on your network will be able to update the firmware.

You will also need to set the otaserverip to the IP address of the ESP you wish to update. This is the IP address of the ESP you wish to update. If you are using mDNS, you can use the mDNS name of the ESP you wish to update. For example, if you are updating the ESP with the dns set to http://esp32.local, you will need to set the otaserverip to http://esp32.local.

REST API

The firmware also supports a fully featured REST API. This means that you can control the ESPs using a REST API. This feature is enabled by defauly, and can not be turned off.

This feature is used more for advanced users, and is not required for basic operation.

The REST API was developed to be used by our new app (still in development). However, it can be used by any REST API client, you can not send POST requests to the ESPs using a browser though, so some REST API functionality can only be used by tools like Thunder Client or Postman.

The full REST API is documented here.

Environments

The firmware supports multiple environments. This means that we have full support for multiple types of ESPs. Each ESP is configured to be in a different environment. If you are using a different ESP, you will need to change the environment to the correct one.

Please reference the Firmware Enviroments Page for more information.

Now, move on to uploading the firmware

',16))]))}});export{b as __pageData,P as default}; diff --git a/assets/firmware_guide_configure_firmware.md.4eb536cf.lean.js b/assets/firmware_guide_configure_firmware.md.7944a4ab.lean.js similarity index 97% rename from assets/firmware_guide_configure_firmware.md.4eb536cf.lean.js rename to assets/firmware_guide_configure_firmware.md.7944a4ab.lean.js index 80019df..58f8400 100644 --- a/assets/firmware_guide_configure_firmware.md.4eb536cf.lean.js +++ b/assets/firmware_guide_configure_firmware.md.7944a4ab.lean.js @@ -1 +1 @@ -import{_ as d,a as h}from"./chunks/index.339f98d7.js";import{_ as i,i as r}from"./chunks/index.c1fed1bd.js";import{o as l,c as u,k as o,a as t,E as a,l as n,O as s,w as c}from"./chunks/framework.47aa8d5b.js";const b=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/configure_firmware.md","filePath":"firmware_guide/configure_firmware.md","lastUpdated":1700510338000}'),p={name:"firmware_guide/configure_firmware.md"},P=Object.assign(p,{setup(f){return(m,e)=>(l(),u("div",null,[e[1]||(e[1]=o("h1",{class:"text-[var(--font-accent)]",id:"configuring-the-firmware",tabindex:"-1"},[t("Configuring the firmware "),o("a",{class:"header-anchor",href:"#configuring-the-firmware","aria-label":'Permalink to "Configuring the firmware {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=o("h2",{id:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",tabindex:"-1"},[t("Once you have opened the project, you should see something on the left side like this "),o("a",{class:"header-anchor",href:"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","aria-label":'Permalink to "Once you have opened the project, you should see something on the left side like this"'},"​")],-1)),a(i,{options:n(r).configure_firmware_one},null,8,["options"]),e[3]||(e[3]=o("h2",{id:"open-the-ini-user-config-ini-file",tabindex:"-1"},[t("Open the "),o("code",null,"ini/user_config.ini"),t(" file "),o("a",{class:"header-anchor",href:"#open-the-ini-user-config-ini-file","aria-label":'Permalink to "Open the `ini/user_config.ini` file"'},"​")],-1)),a(i,{options:n(r).configure_firmware_two},null,8,["options"]),e[4]||(e[4]=s('

INFO

These settings are applicable only when using Wi-Fi for communication with your computer. If you are using USB, you can skip to reading about Environments.

Replace the placeholder text with your correct SSID (WiFi access point name), and password respectively.

INFO

Special characters such as ! and @ are not supported. If you have a special character in your password or ssid, you will need to change it.

Similarly, spaces are not supported in the SSID and password. If you have a space in either, you will need to change it.

The firmware supports AP mode, however it is not recommended. If you wish to use AP mode, you will need to set the enableadhoc to 1.

Then, you will need to set the ap_ssid to the name of your AP, and ap_password to the password of your AP.

You can choose to leave the ap_ssid and ap_password as defaults, but you will need to set the enableadhoc to 1.

Note: If you are enabling AP mode for both ESPs, you will need to set the ap_ssid and ap_password to different values for both ESPs. It is best to set AP mode only for one ESP, and leave the other ESP in STA mode. Connect the other ESP to the AP of the ESP in AP mode. Then connect your computer to the AP of the ESP in AP mode. This will allow you to connect to the ESP in AP mode, and the ESP in STA mode.

',3)),a(d,{options:n(h).parts_list_one},{content:c(()=>e[0]||(e[0]=[o("p",null," Make sure your WiFi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required. ",-1)])),_:1},8,["options"]),e[5]||(e[5]=s('

Double check that you have correctly entered your WiFi credentials and that said wifi network has a 2.4GHz band.

Additional configuration

mDNS

If you do not wish to manually keep track of the ESPs IP addresses and ports, you can enable the mDNS feature. This will allow you to connect to the ESPs using the following format: http://<some_name>.local. This feature only works when you are on the same network as the ESPs and have mDNS enabled on your computer. If you are using Windows, you can enable mDNS by following this guide.

OTA

The firmware supports OTA updates. This means that you can update the firmware without having to connect to the ESPs. To enable OTA updates, you will need to set the enableota to 1. Then, you will need to set the otapassword to the password you wish to use to update the firmware. You will need to use this password to update the firmware. If you do not wish to use a password, you can set the otapassword to nothing. This will allow you to update the firmware without a password. However, this is not recommended, as anyone on your network will be able to update the firmware.

You will also need to set the otaserverip to the IP address of the ESP you wish to update. This is the IP address of the ESP you wish to update. If you are using mDNS, you can use the mDNS name of the ESP you wish to update. For example, if you are updating the ESP with the dns set to http://esp32.local, you will need to set the otaserverip to http://esp32.local.

REST API

The firmware also supports a fully featured REST API. This means that you can control the ESPs using a REST API. This feature is enabled by defauly, and can not be turned off.

This feature is used more for advanced users, and is not required for basic operation.

The REST API was developed to be used by our new app (still in development). However, it can be used by any REST API client, you can not send POST requests to the ESPs using a browser though, so some REST API functionality can only be used by tools like Thunder Client or Postman.

The full REST API is documented here.

Environments

The firmware supports multiple environments. This means that we have full support for multiple types of ESPs. Each ESP is configured to be in a different environment. If you are using a different ESP, you will need to change the environment to the correct one.

Please reference the Firmware Enviroments Page for more information.

Now, move on to uploading the firmware

',16))]))}});export{b as __pageData,P as default}; +import{_ as d,a as h}from"./chunks/index.c19b2931.js";import{_ as i,i as r}from"./chunks/index.41b0dfea.js";import{o as l,c as u,k as o,a as t,E as a,l as n,O as s,w as c}from"./chunks/framework.ece1a6f0.js";const b=JSON.parse('{"title":"Configuring the firmware","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/configure_firmware.md","filePath":"firmware_guide/configure_firmware.md","lastUpdated":1700510338000}'),p={name:"firmware_guide/configure_firmware.md"},P=Object.assign(p,{setup(f){return(m,e)=>(l(),u("div",null,[e[1]||(e[1]=o("h1",{class:"text-[var(--font-accent)]",id:"configuring-the-firmware",tabindex:"-1"},[t("Configuring the firmware "),o("a",{class:"header-anchor",href:"#configuring-the-firmware","aria-label":'Permalink to "Configuring the firmware {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=o("h2",{id:"once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this",tabindex:"-1"},[t("Once you have opened the project, you should see something on the left side like this "),o("a",{class:"header-anchor",href:"#once-you-have-opened-the-project-you-should-see-something-on-the-left-side-like-this","aria-label":'Permalink to "Once you have opened the project, you should see something on the left side like this"'},"​")],-1)),a(i,{options:n(r).configure_firmware_one},null,8,["options"]),e[3]||(e[3]=o("h2",{id:"open-the-ini-user-config-ini-file",tabindex:"-1"},[t("Open the "),o("code",null,"ini/user_config.ini"),t(" file "),o("a",{class:"header-anchor",href:"#open-the-ini-user-config-ini-file","aria-label":'Permalink to "Open the `ini/user_config.ini` file"'},"​")],-1)),a(i,{options:n(r).configure_firmware_two},null,8,["options"]),e[4]||(e[4]=s('

INFO

These settings are applicable only when using Wi-Fi for communication with your computer. If you are using USB, you can skip to reading about Environments.

Replace the placeholder text with your correct SSID (WiFi access point name), and password respectively.

INFO

Special characters such as ! and @ are not supported. If you have a special character in your password or ssid, you will need to change it.

Similarly, spaces are not supported in the SSID and password. If you have a space in either, you will need to change it.

The firmware supports AP mode, however it is not recommended. If you wish to use AP mode, you will need to set the enableadhoc to 1.

Then, you will need to set the ap_ssid to the name of your AP, and ap_password to the password of your AP.

You can choose to leave the ap_ssid and ap_password as defaults, but you will need to set the enableadhoc to 1.

Note: If you are enabling AP mode for both ESPs, you will need to set the ap_ssid and ap_password to different values for both ESPs. It is best to set AP mode only for one ESP, and leave the other ESP in STA mode. Connect the other ESP to the AP of the ESP in AP mode. Then connect your computer to the AP of the ESP in AP mode. This will allow you to connect to the ESP in AP mode, and the ESP in STA mode.

',3)),a(d,{options:n(h).parts_list_one},{content:c(()=>e[0]||(e[0]=[o("p",null," Make sure your WiFi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required. ",-1)])),_:1},8,["options"]),e[5]||(e[5]=s('

Double check that you have correctly entered your WiFi credentials and that said wifi network has a 2.4GHz band.

Additional configuration

mDNS

If you do not wish to manually keep track of the ESPs IP addresses and ports, you can enable the mDNS feature. This will allow you to connect to the ESPs using the following format: http://<some_name>.local. This feature only works when you are on the same network as the ESPs and have mDNS enabled on your computer. If you are using Windows, you can enable mDNS by following this guide.

OTA

The firmware supports OTA updates. This means that you can update the firmware without having to connect to the ESPs. To enable OTA updates, you will need to set the enableota to 1. Then, you will need to set the otapassword to the password you wish to use to update the firmware. You will need to use this password to update the firmware. If you do not wish to use a password, you can set the otapassword to nothing. This will allow you to update the firmware without a password. However, this is not recommended, as anyone on your network will be able to update the firmware.

You will also need to set the otaserverip to the IP address of the ESP you wish to update. This is the IP address of the ESP you wish to update. If you are using mDNS, you can use the mDNS name of the ESP you wish to update. For example, if you are updating the ESP with the dns set to http://esp32.local, you will need to set the otaserverip to http://esp32.local.

REST API

The firmware also supports a fully featured REST API. This means that you can control the ESPs using a REST API. This feature is enabled by defauly, and can not be turned off.

This feature is used more for advanced users, and is not required for basic operation.

The REST API was developed to be used by our new app (still in development). However, it can be used by any REST API client, you can not send POST requests to the ESPs using a browser though, so some REST API functionality can only be used by tools like Thunder Client or Postman.

The full REST API is documented here.

Environments

The firmware supports multiple environments. This means that we have full support for multiple types of ESPs. Each ESP is configured to be in a different environment. If you are using a different ESP, you will need to change the environment to the correct one.

Please reference the Firmware Enviroments Page for more information.

Now, move on to uploading the firmware

',16))]))}});export{b as __pageData,P as default}; diff --git a/assets/firmware_guide_environments.md.6b0604e7.js b/assets/firmware_guide_environments.md.4cf0bd9b.js similarity index 97% rename from assets/firmware_guide_environments.md.6b0604e7.js rename to assets/firmware_guide_environments.md.4cf0bd9b.js index e9e35ec..05f4dbd 100644 --- a/assets/firmware_guide_environments.md.6b0604e7.js +++ b/assets/firmware_guide_environments.md.4cf0bd9b.js @@ -1 +1 @@ -import{_ as o,i}from"./chunks/index.c1fed1bd.js";import{o as t,c as s,O as n,E as r,l as a}from"./chunks/framework.47aa8d5b.js";const p=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/environments.md","filePath":"firmware_guide/environments.md","lastUpdated":1698315393000}'),d={name:"firmware_guide/environments.md"},u=Object.assign(d,{setup(l){return(c,e)=>(t(),s("div",null,[e[0]||(e[0]=n('

Firmware Environments

What is it?

A firmware environment is a way to store the custom firmware config for a specific device. This is useful if you want to have multiple devices with different firmware configs.

We use environments to store the firmware config for each device, so that you can easily switch between them.

Environments are broken up into two distinct parts:

  • The build type (e.g. debug, release)
  • The board type (e.g. espaithinker, esp32cam)

Build Types

We now have a couple of options letting us decide how we want to build the firmware.

  • Debug - The debug environment is the default environment and does not need to be specified. It has a lot of logging so it is useful for getting everything setup for the first time and to see what is going on.

  • _release - Has a lot less debugging, may also be missing some things available only in debug for debug purposes, this should be flashed when everything is working.

Examples:
xiaosenses3 - This is the debug environment.
xiaosenses3_release - This is the release environment for daily use.

Tip

We recommend starting with a debug environment, and then switching to release once everything is working. A debug environnement should not be used permanently.

Board Types

We currently support for several different boards, and we are working on adding more.

Warning

It is important to note that the esp32AIThinker environment is the default environment. Only switch your environment if you have another board or an environment is not working.

Most esp32Cams from Aliexpress will work with the esp32AIThinker environment, but some may require the esp32cam environment. Test the default environment first, and if it does not work, try the esp32cam environment.

Currently supported boards:

  • esp32AIThinker - This is the default environment. This is for the ESP32-AI-THINKER and generic alibaba/aliexpress/amazon esp cam boards.
  • esp32Cam - This is for the special ESP32-CAM, it is unlikely that you will need to use this environment.
  • esp32M5Stack - This is for ESP32M5Stack.
  • esp32WRover - This is for the ESP32WRover.
  • esp-eye - This is for the ESP-EYE (not the S3 variant).
  • wrooms3 - For FREENOVE-ESP32-S3 (wireless mode)
  • wrooms3QIO - For FREENOVE-ESP32-S3 (wireless mode, for boards with octal flash)
  • wrooms3USB - For FREENOVE-ESP32-S3 (wired mode)
  • wrooms3QIOUSB - For FREENOVE-ESP32-S3 (wired mode, for boards with octal flash)
  • xiaosenses3 - For SeedStudio's XAIO ESP32-S3 Sense (wireless mode)
  • xiaosenses3_USB - For SeedStudio's XAIO ESP32-S3 Sense (wired mode)

You can change the board enviroment by changing the default_envs argument in platformio.ini to a supported board like shown:

',17)),r(o,{options:a(i).esp_board_env},null,8,["options"])]))}});export{p as __pageData,u as default}; +import{_ as o,i}from"./chunks/index.41b0dfea.js";import{o as t,c as s,O as n,E as r,l as a}from"./chunks/framework.ece1a6f0.js";const p=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/environments.md","filePath":"firmware_guide/environments.md","lastUpdated":1698315393000}'),d={name:"firmware_guide/environments.md"},u=Object.assign(d,{setup(l){return(c,e)=>(t(),s("div",null,[e[0]||(e[0]=n('

Firmware Environments

What is it?

A firmware environment is a way to store the custom firmware config for a specific device. This is useful if you want to have multiple devices with different firmware configs.

We use environments to store the firmware config for each device, so that you can easily switch between them.

Environments are broken up into two distinct parts:

  • The build type (e.g. debug, release)
  • The board type (e.g. espaithinker, esp32cam)

Build Types

We now have a couple of options letting us decide how we want to build the firmware.

  • Debug - The debug environment is the default environment and does not need to be specified. It has a lot of logging so it is useful for getting everything setup for the first time and to see what is going on.

  • _release - Has a lot less debugging, may also be missing some things available only in debug for debug purposes, this should be flashed when everything is working.

Examples:
xiaosenses3 - This is the debug environment.
xiaosenses3_release - This is the release environment for daily use.

Tip

We recommend starting with a debug environment, and then switching to release once everything is working. A debug environnement should not be used permanently.

Board Types

We currently support for several different boards, and we are working on adding more.

Warning

It is important to note that the esp32AIThinker environment is the default environment. Only switch your environment if you have another board or an environment is not working.

Most esp32Cams from Aliexpress will work with the esp32AIThinker environment, but some may require the esp32cam environment. Test the default environment first, and if it does not work, try the esp32cam environment.

Currently supported boards:

  • esp32AIThinker - This is the default environment. This is for the ESP32-AI-THINKER and generic alibaba/aliexpress/amazon esp cam boards.
  • esp32Cam - This is for the special ESP32-CAM, it is unlikely that you will need to use this environment.
  • esp32M5Stack - This is for ESP32M5Stack.
  • esp32WRover - This is for the ESP32WRover.
  • esp-eye - This is for the ESP-EYE (not the S3 variant).
  • wrooms3 - For FREENOVE-ESP32-S3 (wireless mode)
  • wrooms3QIO - For FREENOVE-ESP32-S3 (wireless mode, for boards with octal flash)
  • wrooms3USB - For FREENOVE-ESP32-S3 (wired mode)
  • wrooms3QIOUSB - For FREENOVE-ESP32-S3 (wired mode, for boards with octal flash)
  • xiaosenses3 - For SeedStudio's XAIO ESP32-S3 Sense (wireless mode)
  • xiaosenses3_USB - For SeedStudio's XAIO ESP32-S3 Sense (wired mode)

You can change the board enviroment by changing the default_envs argument in platformio.ini to a supported board like shown:

',17)),r(o,{options:a(i).esp_board_env},null,8,["options"])]))}});export{p as __pageData,u as default}; diff --git a/assets/firmware_guide_environments.md.6b0604e7.lean.js b/assets/firmware_guide_environments.md.4cf0bd9b.lean.js similarity index 97% rename from assets/firmware_guide_environments.md.6b0604e7.lean.js rename to assets/firmware_guide_environments.md.4cf0bd9b.lean.js index e9e35ec..05f4dbd 100644 --- a/assets/firmware_guide_environments.md.6b0604e7.lean.js +++ b/assets/firmware_guide_environments.md.4cf0bd9b.lean.js @@ -1 +1 @@ -import{_ as o,i}from"./chunks/index.c1fed1bd.js";import{o as t,c as s,O as n,E as r,l as a}from"./chunks/framework.47aa8d5b.js";const p=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/environments.md","filePath":"firmware_guide/environments.md","lastUpdated":1698315393000}'),d={name:"firmware_guide/environments.md"},u=Object.assign(d,{setup(l){return(c,e)=>(t(),s("div",null,[e[0]||(e[0]=n('

Firmware Environments

What is it?

A firmware environment is a way to store the custom firmware config for a specific device. This is useful if you want to have multiple devices with different firmware configs.

We use environments to store the firmware config for each device, so that you can easily switch between them.

Environments are broken up into two distinct parts:

  • The build type (e.g. debug, release)
  • The board type (e.g. espaithinker, esp32cam)

Build Types

We now have a couple of options letting us decide how we want to build the firmware.

  • Debug - The debug environment is the default environment and does not need to be specified. It has a lot of logging so it is useful for getting everything setup for the first time and to see what is going on.

  • _release - Has a lot less debugging, may also be missing some things available only in debug for debug purposes, this should be flashed when everything is working.

Examples:
xiaosenses3 - This is the debug environment.
xiaosenses3_release - This is the release environment for daily use.

Tip

We recommend starting with a debug environment, and then switching to release once everything is working. A debug environnement should not be used permanently.

Board Types

We currently support for several different boards, and we are working on adding more.

Warning

It is important to note that the esp32AIThinker environment is the default environment. Only switch your environment if you have another board or an environment is not working.

Most esp32Cams from Aliexpress will work with the esp32AIThinker environment, but some may require the esp32cam environment. Test the default environment first, and if it does not work, try the esp32cam environment.

Currently supported boards:

  • esp32AIThinker - This is the default environment. This is for the ESP32-AI-THINKER and generic alibaba/aliexpress/amazon esp cam boards.
  • esp32Cam - This is for the special ESP32-CAM, it is unlikely that you will need to use this environment.
  • esp32M5Stack - This is for ESP32M5Stack.
  • esp32WRover - This is for the ESP32WRover.
  • esp-eye - This is for the ESP-EYE (not the S3 variant).
  • wrooms3 - For FREENOVE-ESP32-S3 (wireless mode)
  • wrooms3QIO - For FREENOVE-ESP32-S3 (wireless mode, for boards with octal flash)
  • wrooms3USB - For FREENOVE-ESP32-S3 (wired mode)
  • wrooms3QIOUSB - For FREENOVE-ESP32-S3 (wired mode, for boards with octal flash)
  • xiaosenses3 - For SeedStudio's XAIO ESP32-S3 Sense (wireless mode)
  • xiaosenses3_USB - For SeedStudio's XAIO ESP32-S3 Sense (wired mode)

You can change the board enviroment by changing the default_envs argument in platformio.ini to a supported board like shown:

',17)),r(o,{options:a(i).esp_board_env},null,8,["options"])]))}});export{p as __pageData,u as default}; +import{_ as o,i}from"./chunks/index.41b0dfea.js";import{o as t,c as s,O as n,E as r,l as a}from"./chunks/framework.ece1a6f0.js";const p=JSON.parse('{"title":"Firmware Environments","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/environments.md","filePath":"firmware_guide/environments.md","lastUpdated":1698315393000}'),d={name:"firmware_guide/environments.md"},u=Object.assign(d,{setup(l){return(c,e)=>(t(),s("div",null,[e[0]||(e[0]=n('

Firmware Environments

What is it?

A firmware environment is a way to store the custom firmware config for a specific device. This is useful if you want to have multiple devices with different firmware configs.

We use environments to store the firmware config for each device, so that you can easily switch between them.

Environments are broken up into two distinct parts:

  • The build type (e.g. debug, release)
  • The board type (e.g. espaithinker, esp32cam)

Build Types

We now have a couple of options letting us decide how we want to build the firmware.

  • Debug - The debug environment is the default environment and does not need to be specified. It has a lot of logging so it is useful for getting everything setup for the first time and to see what is going on.

  • _release - Has a lot less debugging, may also be missing some things available only in debug for debug purposes, this should be flashed when everything is working.

Examples:
xiaosenses3 - This is the debug environment.
xiaosenses3_release - This is the release environment for daily use.

Tip

We recommend starting with a debug environment, and then switching to release once everything is working. A debug environnement should not be used permanently.

Board Types

We currently support for several different boards, and we are working on adding more.

Warning

It is important to note that the esp32AIThinker environment is the default environment. Only switch your environment if you have another board or an environment is not working.

Most esp32Cams from Aliexpress will work with the esp32AIThinker environment, but some may require the esp32cam environment. Test the default environment first, and if it does not work, try the esp32cam environment.

Currently supported boards:

  • esp32AIThinker - This is the default environment. This is for the ESP32-AI-THINKER and generic alibaba/aliexpress/amazon esp cam boards.
  • esp32Cam - This is for the special ESP32-CAM, it is unlikely that you will need to use this environment.
  • esp32M5Stack - This is for ESP32M5Stack.
  • esp32WRover - This is for the ESP32WRover.
  • esp-eye - This is for the ESP-EYE (not the S3 variant).
  • wrooms3 - For FREENOVE-ESP32-S3 (wireless mode)
  • wrooms3QIO - For FREENOVE-ESP32-S3 (wireless mode, for boards with octal flash)
  • wrooms3USB - For FREENOVE-ESP32-S3 (wired mode)
  • wrooms3QIOUSB - For FREENOVE-ESP32-S3 (wired mode, for boards with octal flash)
  • xiaosenses3 - For SeedStudio's XAIO ESP32-S3 Sense (wireless mode)
  • xiaosenses3_USB - For SeedStudio's XAIO ESP32-S3 Sense (wired mode)

You can change the board enviroment by changing the default_envs argument in platformio.ini to a supported board like shown:

',17)),r(o,{options:a(i).esp_board_env},null,8,["options"])]))}});export{p as __pageData,u as default}; diff --git a/assets/firmware_guide_firmware.md.6c8e1ae6.js b/assets/firmware_guide_firmware.md.300bf02a.js similarity index 94% rename from assets/firmware_guide_firmware.md.6c8e1ae6.js rename to assets/firmware_guide_firmware.md.300bf02a.js index 417b3d5..ec90739 100644 --- a/assets/firmware_guide_firmware.md.6c8e1ae6.js +++ b/assets/firmware_guide_firmware.md.300bf02a.js @@ -1 +1 @@ -import{_ as a,o as t,c as o,O as r}from"./chunks/framework.47aa8d5b.js";const u=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/firmware.md","filePath":"firmware_guide/firmware.md","lastUpdated":1700510338000}'),s={name:"firmware_guide/firmware.md"};function i(n,e,l,d,h,p){return t(),o("div",null,e[0]||(e[0]=[r('

What is this?

Firmware is the second part of the equation to get your trackers going. It lives on the ESP32 chip, and is responsible for streaming video data from the tracker. We currently fully support wireless streaming over 2.4GHz, and are working on adding support for wired streaming to the main desktop App.

What should I download and where?

You can access the firmware, as well as flash your boards, using our new Firmware Flashing Tool.

Caution

This tool is currently in beta.

We are working on adding support for Over-The-Air (OTA) and configuring network settings. If you have any issues, please let us know by opening an issue on the repository.

This tool relies on our own solution called OpenIris, found here.

Note

You do not need to download OpenIris separately. The flashing tool will download it for you.

To check the status of the project, please visit the Development Road Map

I want to use VSCode - How would I do this?

Follow the steps described here

',10)]))}const f=a(s,[["render",i]]);export{u as __pageData,f as default}; +import{_ as a,o as t,c as o,O as r}from"./chunks/framework.ece1a6f0.js";const u=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/firmware.md","filePath":"firmware_guide/firmware.md","lastUpdated":1700510338000}'),s={name:"firmware_guide/firmware.md"};function i(n,e,l,d,h,p){return t(),o("div",null,e[0]||(e[0]=[r('

What is this?

Firmware is the second part of the equation to get your trackers going. It lives on the ESP32 chip, and is responsible for streaming video data from the tracker. We currently fully support wireless streaming over 2.4GHz, and are working on adding support for wired streaming to the main desktop App.

What should I download and where?

You can access the firmware, as well as flash your boards, using our new Firmware Flashing Tool.

Caution

This tool is currently in beta.

We are working on adding support for Over-The-Air (OTA) and configuring network settings. If you have any issues, please let us know by opening an issue on the repository.

This tool relies on our own solution called OpenIris, found here.

Note

You do not need to download OpenIris separately. The flashing tool will download it for you.

To check the status of the project, please visit the Development Road Map

I want to use VSCode - How would I do this?

Follow the steps described here

',10)]))}const f=a(s,[["render",i]]);export{u as __pageData,f as default}; diff --git a/assets/firmware_guide_firmware.md.6c8e1ae6.lean.js b/assets/firmware_guide_firmware.md.300bf02a.lean.js similarity index 94% rename from assets/firmware_guide_firmware.md.6c8e1ae6.lean.js rename to assets/firmware_guide_firmware.md.300bf02a.lean.js index 417b3d5..ec90739 100644 --- a/assets/firmware_guide_firmware.md.6c8e1ae6.lean.js +++ b/assets/firmware_guide_firmware.md.300bf02a.lean.js @@ -1 +1 @@ -import{_ as a,o as t,c as o,O as r}from"./chunks/framework.47aa8d5b.js";const u=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/firmware.md","filePath":"firmware_guide/firmware.md","lastUpdated":1700510338000}'),s={name:"firmware_guide/firmware.md"};function i(n,e,l,d,h,p){return t(),o("div",null,e[0]||(e[0]=[r('

What is this?

Firmware is the second part of the equation to get your trackers going. It lives on the ESP32 chip, and is responsible for streaming video data from the tracker. We currently fully support wireless streaming over 2.4GHz, and are working on adding support for wired streaming to the main desktop App.

What should I download and where?

You can access the firmware, as well as flash your boards, using our new Firmware Flashing Tool.

Caution

This tool is currently in beta.

We are working on adding support for Over-The-Air (OTA) and configuring network settings. If you have any issues, please let us know by opening an issue on the repository.

This tool relies on our own solution called OpenIris, found here.

Note

You do not need to download OpenIris separately. The flashing tool will download it for you.

To check the status of the project, please visit the Development Road Map

I want to use VSCode - How would I do this?

Follow the steps described here

',10)]))}const f=a(s,[["render",i]]);export{u as __pageData,f as default}; +import{_ as a,o as t,c as o,O as r}from"./chunks/framework.ece1a6f0.js";const u=JSON.parse('{"title":"What is this?","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/firmware.md","filePath":"firmware_guide/firmware.md","lastUpdated":1700510338000}'),s={name:"firmware_guide/firmware.md"};function i(n,e,l,d,h,p){return t(),o("div",null,e[0]||(e[0]=[r('

What is this?

Firmware is the second part of the equation to get your trackers going. It lives on the ESP32 chip, and is responsible for streaming video data from the tracker. We currently fully support wireless streaming over 2.4GHz, and are working on adding support for wired streaming to the main desktop App.

What should I download and where?

You can access the firmware, as well as flash your boards, using our new Firmware Flashing Tool.

Caution

This tool is currently in beta.

We are working on adding support for Over-The-Air (OTA) and configuring network settings. If you have any issues, please let us know by opening an issue on the repository.

This tool relies on our own solution called OpenIris, found here.

Note

You do not need to download OpenIris separately. The flashing tool will download it for you.

To check the status of the project, please visit the Development Road Map

I want to use VSCode - How would I do this?

Follow the steps described here

',10)]))}const f=a(s,[["render",i]]);export{u as __pageData,f as default}; diff --git a/assets/firmware_guide_flashing_tool.md.c180a2ca.js b/assets/firmware_guide_flashing_tool.md.e2b12f74.js similarity index 98% rename from assets/firmware_guide_flashing_tool.md.c180a2ca.js rename to assets/firmware_guide_flashing_tool.md.e2b12f74.js index 9e1f620..f7408d7 100644 --- a/assets/firmware_guide_flashing_tool.md.c180a2ca.js +++ b/assets/firmware_guide_flashing_tool.md.e2b12f74.js @@ -1 +1 @@ -import{_ as a,i as r}from"./chunks/index.c1fed1bd.js";import{o as s,c as d,O as n,E as l,l as i,k as o,a as t}from"./chunks/framework.47aa8d5b.js";const b=JSON.parse('{"title":"Firmware Flashing Tool","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/flashing_tool.md","filePath":"firmware_guide/flashing_tool.md","lastUpdated":1727045974000}'),h={name:"firmware_guide/flashing_tool.md"},g=Object.assign(h,{setup(p){return(u,e)=>(s(),d("div",null,[e[0]||(e[0]=n('

Firmware Flashing Tool

Before we proceed

Note

Step 1: Download and Install the Firmware Flashing Tool

  • Download the Firmware Flashing Tool Installer from the latest GitHub release.
  • Run the installer and follow the on-screen instructions to complete the installation of the Firmware Flashing Tool app.

Step 2: Run the Firmware Flashing Tool app

After the installation is complete, you should see an icon on your desktop. To open the application, double-click the icon.

You then should be greeted with a GUI that looks like this:

',10)),l(a,{options:i(r).flashing_tool_1},null,8,["options"]),e[1]||(e[1]=n('

Step 3: Select board.

We now have a couple of options letting us decide how we want to build the firmware.

  • Debug
    This is the default environment and does not need to be explicitly chosen. It includes extensive logging, making it ideal for initial setup and troubleshooting, as it provides comprehensive visibility into the system’s operation.

  • _release
    Has a lot less debugging, may also be missing some things available only in debug for debug purposes, this should be flashed when everything is working.

Press left click on the Select Board dropdown, then choose your desired board from the list. Once you've selected your board, click Confirm to move on to the next step.

',5)),l(a,{options:i(r).flashing_tool_select_board},null,8,["options"]),e[2]||(e[2]=o("h2",{id:"-3",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-3","aria-label":'Permalink to ""'},"​")],-1)),e[3]||(e[3]=o("h3",{id:"step-4-flash-firmware",tabindex:"-1"},[t("Step 4: Flash firmware. "),o("a",{class:"header-anchor",href:"#step-4-flash-firmware","aria-label":'Permalink to "Step 4: Flash firmware."'},"​")],-1)),e[4]||(e[4]=o("p",null,[t("Once you're ready, hold down the "),o("strong",null,"B"),t(" or "),o("strong",null,"IO0"),t(" button on your board and connect it to your PC. (The button may be small, but it's there). Next, click "),o("strong",null,"Install OpenIris"),t(" and select the port corresponding to your board to complete the installation.")],-1)),l(a,{options:i(r).flashing_tool_flash_firmware},null,8,["options"]),e[5]||(e[5]=o("h2",{id:"-4",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-4","aria-label":'Permalink to ""'},"​")],-1)),e[6]||(e[6]=o("h3",{id:"step-5-that-s-it",tabindex:"-1"},[t("Step 5: That's it!. "),o("a",{class:"header-anchor",href:"#step-5-that-s-it","aria-label":`Permalink to "Step 5: That's it!."`},"​")],-1)),e[7]||(e[7]=o("p",null,[t("Installation complete! Everything is set up and ready to go."),o("br"),t(" Click "),o("strong",null,"Show Logs"),t(" to view the results.")],-1)),l(a,{options:i(r).flashing_tool_flash_firmware_success},null,8,["options"]),e[8]||(e[8]=o("h2",{id:"-5",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-5","aria-label":'Permalink to ""'},"​")],-1)),e[9]||(e[9]=o("h3",{id:"step-6-logs",tabindex:"-1"},[t("Step 6: Logs. "),o("a",{class:"header-anchor",href:"#step-6-logs","aria-label":'Permalink to "Step 6: Logs."'},"​")],-1)),e[10]||(e[10]=o("p",null,[t("If you choose the wired option, the correct logs should appear as follows. "),o("br"),t(" If the logs don't look right, ensure that your camera is properly connected to the board.")],-1)),l(a,{options:i(r).flashing_tool_logs},null,8,["options"]),e[11]||(e[11]=n('

How to configure wifi.

Note

  • Please note that 5GHz networks are not supported by the hardware, so you will need to use a 2.4GHz network.

Step 1: Select board

Ensure that the selected board has a wireless mode checkmark below it.

',5)),l(a,{options:i(r).flashing_tool_select_board},null,8,["options"]),e[12]||(e[12]=n('

Step 2: Configure wifi network

You'll need to provide information about the network you're planning to connect to.

SSID
The SSID is your Wi-Fi name, make sure it doesn't contain any special characters.

Password
You'll need to provide the password used to connect to the selected Wi-Fi network.

',5)),l(a,{options:i(r).configure_wifi_network},null,8,["options"]),e[13]||(e[13]=o("h2",{id:"-8",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-8","aria-label":'Permalink to ""'},"​")],-1)),e[14]||(e[14]=o("h3",{id:"step-3-send-wifi-credentials",tabindex:"-1"},[t("Step 3: Send wifi credentials. "),o("a",{class:"header-anchor",href:"#step-3-send-wifi-credentials","aria-label":'Permalink to "Step 3: Send wifi credentials."'},"​")],-1)),e[15]||(e[15]=o("p",null,[t("Once the installation is complete, unplug your board, then reconnect it to the PC without pressing any buttons and press "),o("strong",null,"Send credentials"),t(".")],-1)),l(a,{options:i(r).send_wifi_credentials},null,8,["options"]),e[16]||(e[16]=o("h2",{id:"-9",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-9","aria-label":'Permalink to ""'},"​")],-1)),e[17]||(e[17]=o("h3",{id:"step-4-get-working-stream",tabindex:"-1"},[t("Step 4: Get working stream. "),o("a",{class:"header-anchor",href:"#step-4-get-working-stream","aria-label":'Permalink to "Step 4: Get working stream."'},"​")],-1)),e[18]||(e[18]=o("p",null,[t("After sending is complete, disconnect your board, then reconnect it to the PC without pressing any buttons, and click "),o("strong",null,"Show logs"),t(". "),o("br"),t(" Scroll down to find the text labeled "),o("strong",null,[o("code",null,"IP: 192.168.XXX.XXX")]),t(".")],-1)),l(a,{options:i(r).flasher_camera_preview},null,8,["options"]),e[19]||(e[19]=o("p",null,[t("This IP can then be entered into the app or a web browser like: "),o("code",null,"http://192.168.XXX.XXX")],-1))]))}});export{b as __pageData,g as default}; +import{_ as a,i as r}from"./chunks/index.41b0dfea.js";import{o as s,c as d,O as n,E as l,l as i,k as o,a as t}from"./chunks/framework.ece1a6f0.js";const b=JSON.parse('{"title":"Firmware Flashing Tool","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/flashing_tool.md","filePath":"firmware_guide/flashing_tool.md","lastUpdated":1727045974000}'),h={name:"firmware_guide/flashing_tool.md"},g=Object.assign(h,{setup(p){return(u,e)=>(s(),d("div",null,[e[0]||(e[0]=n('

Firmware Flashing Tool

Before we proceed

Note

Step 1: Download and Install the Firmware Flashing Tool

  • Download the Firmware Flashing Tool Installer from the latest GitHub release.
  • Run the installer and follow the on-screen instructions to complete the installation of the Firmware Flashing Tool app.

Step 2: Run the Firmware Flashing Tool app

After the installation is complete, you should see an icon on your desktop. To open the application, double-click the icon.

You then should be greeted with a GUI that looks like this:

',10)),l(a,{options:i(r).flashing_tool_1},null,8,["options"]),e[1]||(e[1]=n('

Step 3: Select board.

We now have a couple of options letting us decide how we want to build the firmware.

  • Debug
    This is the default environment and does not need to be explicitly chosen. It includes extensive logging, making it ideal for initial setup and troubleshooting, as it provides comprehensive visibility into the system’s operation.

  • _release
    Has a lot less debugging, may also be missing some things available only in debug for debug purposes, this should be flashed when everything is working.

Press left click on the Select Board dropdown, then choose your desired board from the list. Once you've selected your board, click Confirm to move on to the next step.

',5)),l(a,{options:i(r).flashing_tool_select_board},null,8,["options"]),e[2]||(e[2]=o("h2",{id:"-3",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-3","aria-label":'Permalink to ""'},"​")],-1)),e[3]||(e[3]=o("h3",{id:"step-4-flash-firmware",tabindex:"-1"},[t("Step 4: Flash firmware. "),o("a",{class:"header-anchor",href:"#step-4-flash-firmware","aria-label":'Permalink to "Step 4: Flash firmware."'},"​")],-1)),e[4]||(e[4]=o("p",null,[t("Once you're ready, hold down the "),o("strong",null,"B"),t(" or "),o("strong",null,"IO0"),t(" button on your board and connect it to your PC. (The button may be small, but it's there). Next, click "),o("strong",null,"Install OpenIris"),t(" and select the port corresponding to your board to complete the installation.")],-1)),l(a,{options:i(r).flashing_tool_flash_firmware},null,8,["options"]),e[5]||(e[5]=o("h2",{id:"-4",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-4","aria-label":'Permalink to ""'},"​")],-1)),e[6]||(e[6]=o("h3",{id:"step-5-that-s-it",tabindex:"-1"},[t("Step 5: That's it!. "),o("a",{class:"header-anchor",href:"#step-5-that-s-it","aria-label":`Permalink to "Step 5: That's it!."`},"​")],-1)),e[7]||(e[7]=o("p",null,[t("Installation complete! Everything is set up and ready to go."),o("br"),t(" Click "),o("strong",null,"Show Logs"),t(" to view the results.")],-1)),l(a,{options:i(r).flashing_tool_flash_firmware_success},null,8,["options"]),e[8]||(e[8]=o("h2",{id:"-5",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-5","aria-label":'Permalink to ""'},"​")],-1)),e[9]||(e[9]=o("h3",{id:"step-6-logs",tabindex:"-1"},[t("Step 6: Logs. "),o("a",{class:"header-anchor",href:"#step-6-logs","aria-label":'Permalink to "Step 6: Logs."'},"​")],-1)),e[10]||(e[10]=o("p",null,[t("If you choose the wired option, the correct logs should appear as follows. "),o("br"),t(" If the logs don't look right, ensure that your camera is properly connected to the board.")],-1)),l(a,{options:i(r).flashing_tool_logs},null,8,["options"]),e[11]||(e[11]=n('

How to configure wifi.

Note

  • Please note that 5GHz networks are not supported by the hardware, so you will need to use a 2.4GHz network.

Step 1: Select board

Ensure that the selected board has a wireless mode checkmark below it.

',5)),l(a,{options:i(r).flashing_tool_select_board},null,8,["options"]),e[12]||(e[12]=n('

Step 2: Configure wifi network

You'll need to provide information about the network you're planning to connect to.

SSID
The SSID is your Wi-Fi name, make sure it doesn't contain any special characters.

Password
You'll need to provide the password used to connect to the selected Wi-Fi network.

',5)),l(a,{options:i(r).configure_wifi_network},null,8,["options"]),e[13]||(e[13]=o("h2",{id:"-8",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-8","aria-label":'Permalink to ""'},"​")],-1)),e[14]||(e[14]=o("h3",{id:"step-3-send-wifi-credentials",tabindex:"-1"},[t("Step 3: Send wifi credentials. "),o("a",{class:"header-anchor",href:"#step-3-send-wifi-credentials","aria-label":'Permalink to "Step 3: Send wifi credentials."'},"​")],-1)),e[15]||(e[15]=o("p",null,[t("Once the installation is complete, unplug your board, then reconnect it to the PC without pressing any buttons and press "),o("strong",null,"Send credentials"),t(".")],-1)),l(a,{options:i(r).send_wifi_credentials},null,8,["options"]),e[16]||(e[16]=o("h2",{id:"-9",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-9","aria-label":'Permalink to ""'},"​")],-1)),e[17]||(e[17]=o("h3",{id:"step-4-get-working-stream",tabindex:"-1"},[t("Step 4: Get working stream. "),o("a",{class:"header-anchor",href:"#step-4-get-working-stream","aria-label":'Permalink to "Step 4: Get working stream."'},"​")],-1)),e[18]||(e[18]=o("p",null,[t("After sending is complete, disconnect your board, then reconnect it to the PC without pressing any buttons, and click "),o("strong",null,"Show logs"),t(". "),o("br"),t(" Scroll down to find the text labeled "),o("strong",null,[o("code",null,"IP: 192.168.XXX.XXX")]),t(".")],-1)),l(a,{options:i(r).flasher_camera_preview},null,8,["options"]),e[19]||(e[19]=o("p",null,[t("This IP can then be entered into the app or a web browser like: "),o("code",null,"http://192.168.XXX.XXX")],-1))]))}});export{b as __pageData,g as default}; diff --git a/assets/firmware_guide_flashing_tool.md.c180a2ca.lean.js b/assets/firmware_guide_flashing_tool.md.e2b12f74.lean.js similarity index 98% rename from assets/firmware_guide_flashing_tool.md.c180a2ca.lean.js rename to assets/firmware_guide_flashing_tool.md.e2b12f74.lean.js index 9e1f620..f7408d7 100644 --- a/assets/firmware_guide_flashing_tool.md.c180a2ca.lean.js +++ b/assets/firmware_guide_flashing_tool.md.e2b12f74.lean.js @@ -1 +1 @@ -import{_ as a,i as r}from"./chunks/index.c1fed1bd.js";import{o as s,c as d,O as n,E as l,l as i,k as o,a as t}from"./chunks/framework.47aa8d5b.js";const b=JSON.parse('{"title":"Firmware Flashing Tool","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/flashing_tool.md","filePath":"firmware_guide/flashing_tool.md","lastUpdated":1727045974000}'),h={name:"firmware_guide/flashing_tool.md"},g=Object.assign(h,{setup(p){return(u,e)=>(s(),d("div",null,[e[0]||(e[0]=n('

Firmware Flashing Tool

Before we proceed

Note

Step 1: Download and Install the Firmware Flashing Tool

  • Download the Firmware Flashing Tool Installer from the latest GitHub release.
  • Run the installer and follow the on-screen instructions to complete the installation of the Firmware Flashing Tool app.

Step 2: Run the Firmware Flashing Tool app

After the installation is complete, you should see an icon on your desktop. To open the application, double-click the icon.

You then should be greeted with a GUI that looks like this:

',10)),l(a,{options:i(r).flashing_tool_1},null,8,["options"]),e[1]||(e[1]=n('

Step 3: Select board.

We now have a couple of options letting us decide how we want to build the firmware.

  • Debug
    This is the default environment and does not need to be explicitly chosen. It includes extensive logging, making it ideal for initial setup and troubleshooting, as it provides comprehensive visibility into the system’s operation.

  • _release
    Has a lot less debugging, may also be missing some things available only in debug for debug purposes, this should be flashed when everything is working.

Press left click on the Select Board dropdown, then choose your desired board from the list. Once you've selected your board, click Confirm to move on to the next step.

',5)),l(a,{options:i(r).flashing_tool_select_board},null,8,["options"]),e[2]||(e[2]=o("h2",{id:"-3",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-3","aria-label":'Permalink to ""'},"​")],-1)),e[3]||(e[3]=o("h3",{id:"step-4-flash-firmware",tabindex:"-1"},[t("Step 4: Flash firmware. "),o("a",{class:"header-anchor",href:"#step-4-flash-firmware","aria-label":'Permalink to "Step 4: Flash firmware."'},"​")],-1)),e[4]||(e[4]=o("p",null,[t("Once you're ready, hold down the "),o("strong",null,"B"),t(" or "),o("strong",null,"IO0"),t(" button on your board and connect it to your PC. (The button may be small, but it's there). Next, click "),o("strong",null,"Install OpenIris"),t(" and select the port corresponding to your board to complete the installation.")],-1)),l(a,{options:i(r).flashing_tool_flash_firmware},null,8,["options"]),e[5]||(e[5]=o("h2",{id:"-4",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-4","aria-label":'Permalink to ""'},"​")],-1)),e[6]||(e[6]=o("h3",{id:"step-5-that-s-it",tabindex:"-1"},[t("Step 5: That's it!. "),o("a",{class:"header-anchor",href:"#step-5-that-s-it","aria-label":`Permalink to "Step 5: That's it!."`},"​")],-1)),e[7]||(e[7]=o("p",null,[t("Installation complete! Everything is set up and ready to go."),o("br"),t(" Click "),o("strong",null,"Show Logs"),t(" to view the results.")],-1)),l(a,{options:i(r).flashing_tool_flash_firmware_success},null,8,["options"]),e[8]||(e[8]=o("h2",{id:"-5",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-5","aria-label":'Permalink to ""'},"​")],-1)),e[9]||(e[9]=o("h3",{id:"step-6-logs",tabindex:"-1"},[t("Step 6: Logs. "),o("a",{class:"header-anchor",href:"#step-6-logs","aria-label":'Permalink to "Step 6: Logs."'},"​")],-1)),e[10]||(e[10]=o("p",null,[t("If you choose the wired option, the correct logs should appear as follows. "),o("br"),t(" If the logs don't look right, ensure that your camera is properly connected to the board.")],-1)),l(a,{options:i(r).flashing_tool_logs},null,8,["options"]),e[11]||(e[11]=n('

How to configure wifi.

Note

  • Please note that 5GHz networks are not supported by the hardware, so you will need to use a 2.4GHz network.

Step 1: Select board

Ensure that the selected board has a wireless mode checkmark below it.

',5)),l(a,{options:i(r).flashing_tool_select_board},null,8,["options"]),e[12]||(e[12]=n('

Step 2: Configure wifi network

You'll need to provide information about the network you're planning to connect to.

SSID
The SSID is your Wi-Fi name, make sure it doesn't contain any special characters.

Password
You'll need to provide the password used to connect to the selected Wi-Fi network.

',5)),l(a,{options:i(r).configure_wifi_network},null,8,["options"]),e[13]||(e[13]=o("h2",{id:"-8",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-8","aria-label":'Permalink to ""'},"​")],-1)),e[14]||(e[14]=o("h3",{id:"step-3-send-wifi-credentials",tabindex:"-1"},[t("Step 3: Send wifi credentials. "),o("a",{class:"header-anchor",href:"#step-3-send-wifi-credentials","aria-label":'Permalink to "Step 3: Send wifi credentials."'},"​")],-1)),e[15]||(e[15]=o("p",null,[t("Once the installation is complete, unplug your board, then reconnect it to the PC without pressing any buttons and press "),o("strong",null,"Send credentials"),t(".")],-1)),l(a,{options:i(r).send_wifi_credentials},null,8,["options"]),e[16]||(e[16]=o("h2",{id:"-9",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-9","aria-label":'Permalink to ""'},"​")],-1)),e[17]||(e[17]=o("h3",{id:"step-4-get-working-stream",tabindex:"-1"},[t("Step 4: Get working stream. "),o("a",{class:"header-anchor",href:"#step-4-get-working-stream","aria-label":'Permalink to "Step 4: Get working stream."'},"​")],-1)),e[18]||(e[18]=o("p",null,[t("After sending is complete, disconnect your board, then reconnect it to the PC without pressing any buttons, and click "),o("strong",null,"Show logs"),t(". "),o("br"),t(" Scroll down to find the text labeled "),o("strong",null,[o("code",null,"IP: 192.168.XXX.XXX")]),t(".")],-1)),l(a,{options:i(r).flasher_camera_preview},null,8,["options"]),e[19]||(e[19]=o("p",null,[t("This IP can then be entered into the app or a web browser like: "),o("code",null,"http://192.168.XXX.XXX")],-1))]))}});export{b as __pageData,g as default}; +import{_ as a,i as r}from"./chunks/index.41b0dfea.js";import{o as s,c as d,O as n,E as l,l as i,k as o,a as t}from"./chunks/framework.ece1a6f0.js";const b=JSON.parse('{"title":"Firmware Flashing Tool","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/flashing_tool.md","filePath":"firmware_guide/flashing_tool.md","lastUpdated":1727045974000}'),h={name:"firmware_guide/flashing_tool.md"},g=Object.assign(h,{setup(p){return(u,e)=>(s(),d("div",null,[e[0]||(e[0]=n('

Firmware Flashing Tool

Before we proceed

Note

Step 1: Download and Install the Firmware Flashing Tool

  • Download the Firmware Flashing Tool Installer from the latest GitHub release.
  • Run the installer and follow the on-screen instructions to complete the installation of the Firmware Flashing Tool app.

Step 2: Run the Firmware Flashing Tool app

After the installation is complete, you should see an icon on your desktop. To open the application, double-click the icon.

You then should be greeted with a GUI that looks like this:

',10)),l(a,{options:i(r).flashing_tool_1},null,8,["options"]),e[1]||(e[1]=n('

Step 3: Select board.

We now have a couple of options letting us decide how we want to build the firmware.

  • Debug
    This is the default environment and does not need to be explicitly chosen. It includes extensive logging, making it ideal for initial setup and troubleshooting, as it provides comprehensive visibility into the system’s operation.

  • _release
    Has a lot less debugging, may also be missing some things available only in debug for debug purposes, this should be flashed when everything is working.

Press left click on the Select Board dropdown, then choose your desired board from the list. Once you've selected your board, click Confirm to move on to the next step.

',5)),l(a,{options:i(r).flashing_tool_select_board},null,8,["options"]),e[2]||(e[2]=o("h2",{id:"-3",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-3","aria-label":'Permalink to ""'},"​")],-1)),e[3]||(e[3]=o("h3",{id:"step-4-flash-firmware",tabindex:"-1"},[t("Step 4: Flash firmware. "),o("a",{class:"header-anchor",href:"#step-4-flash-firmware","aria-label":'Permalink to "Step 4: Flash firmware."'},"​")],-1)),e[4]||(e[4]=o("p",null,[t("Once you're ready, hold down the "),o("strong",null,"B"),t(" or "),o("strong",null,"IO0"),t(" button on your board and connect it to your PC. (The button may be small, but it's there). Next, click "),o("strong",null,"Install OpenIris"),t(" and select the port corresponding to your board to complete the installation.")],-1)),l(a,{options:i(r).flashing_tool_flash_firmware},null,8,["options"]),e[5]||(e[5]=o("h2",{id:"-4",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-4","aria-label":'Permalink to ""'},"​")],-1)),e[6]||(e[6]=o("h3",{id:"step-5-that-s-it",tabindex:"-1"},[t("Step 5: That's it!. "),o("a",{class:"header-anchor",href:"#step-5-that-s-it","aria-label":`Permalink to "Step 5: That's it!."`},"​")],-1)),e[7]||(e[7]=o("p",null,[t("Installation complete! Everything is set up and ready to go."),o("br"),t(" Click "),o("strong",null,"Show Logs"),t(" to view the results.")],-1)),l(a,{options:i(r).flashing_tool_flash_firmware_success},null,8,["options"]),e[8]||(e[8]=o("h2",{id:"-5",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-5","aria-label":'Permalink to ""'},"​")],-1)),e[9]||(e[9]=o("h3",{id:"step-6-logs",tabindex:"-1"},[t("Step 6: Logs. "),o("a",{class:"header-anchor",href:"#step-6-logs","aria-label":'Permalink to "Step 6: Logs."'},"​")],-1)),e[10]||(e[10]=o("p",null,[t("If you choose the wired option, the correct logs should appear as follows. "),o("br"),t(" If the logs don't look right, ensure that your camera is properly connected to the board.")],-1)),l(a,{options:i(r).flashing_tool_logs},null,8,["options"]),e[11]||(e[11]=n('

How to configure wifi.

Note

  • Please note that 5GHz networks are not supported by the hardware, so you will need to use a 2.4GHz network.

Step 1: Select board

Ensure that the selected board has a wireless mode checkmark below it.

',5)),l(a,{options:i(r).flashing_tool_select_board},null,8,["options"]),e[12]||(e[12]=n('

Step 2: Configure wifi network

You'll need to provide information about the network you're planning to connect to.

SSID
The SSID is your Wi-Fi name, make sure it doesn't contain any special characters.

Password
You'll need to provide the password used to connect to the selected Wi-Fi network.

',5)),l(a,{options:i(r).configure_wifi_network},null,8,["options"]),e[13]||(e[13]=o("h2",{id:"-8",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-8","aria-label":'Permalink to ""'},"​")],-1)),e[14]||(e[14]=o("h3",{id:"step-3-send-wifi-credentials",tabindex:"-1"},[t("Step 3: Send wifi credentials. "),o("a",{class:"header-anchor",href:"#step-3-send-wifi-credentials","aria-label":'Permalink to "Step 3: Send wifi credentials."'},"​")],-1)),e[15]||(e[15]=o("p",null,[t("Once the installation is complete, unplug your board, then reconnect it to the PC without pressing any buttons and press "),o("strong",null,"Send credentials"),t(".")],-1)),l(a,{options:i(r).send_wifi_credentials},null,8,["options"]),e[16]||(e[16]=o("h2",{id:"-9",tabindex:"-1"},[o("a",{class:"header-anchor",href:"#-9","aria-label":'Permalink to ""'},"​")],-1)),e[17]||(e[17]=o("h3",{id:"step-4-get-working-stream",tabindex:"-1"},[t("Step 4: Get working stream. "),o("a",{class:"header-anchor",href:"#step-4-get-working-stream","aria-label":'Permalink to "Step 4: Get working stream."'},"​")],-1)),e[18]||(e[18]=o("p",null,[t("After sending is complete, disconnect your board, then reconnect it to the PC without pressing any buttons, and click "),o("strong",null,"Show logs"),t(". "),o("br"),t(" Scroll down to find the text labeled "),o("strong",null,[o("code",null,"IP: 192.168.XXX.XXX")]),t(".")],-1)),l(a,{options:i(r).flasher_camera_preview},null,8,["options"]),e[19]||(e[19]=o("p",null,[t("This IP can then be entered into the app or a web browser like: "),o("code",null,"http://192.168.XXX.XXX")],-1))]))}});export{b as __pageData,g as default}; diff --git a/assets/firmware_guide_mdns.md.8a95e855.js b/assets/firmware_guide_mdns.md.046e48da.js similarity index 98% rename from assets/firmware_guide_mdns.md.8a95e855.js rename to assets/firmware_guide_mdns.md.046e48da.js index 56562f4..ab3ea3e 100644 --- a/assets/firmware_guide_mdns.md.8a95e855.js +++ b/assets/firmware_guide_mdns.md.046e48da.js @@ -1 +1 @@ -import{_ as t,o,c as a,O as n}from"./chunks/framework.47aa8d5b.js";const p=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/mdns.md","filePath":"firmware_guide/mdns.md","lastUpdated":1689147044000}'),s={name:"firmware_guide/mdns.md"};function i(c,e,r,d,h,l){return o(),a("div",null,e[0]||(e[0]=[n('

MDNS

What is it?

mDNS is a protocol that allows you to connect to a device using a name instead of an IP address. This is useful if you do not know the IP address of the device, or if you do not want to keep track of the IP address of the device. This is also useful if you are using a device that does not have a static IP address.

In the mDNS protocol the IP address of the device can change, but the name of the device will always be the same. This means that you can connect to the device using the name of the device, even if the IP address of the device changes.

How to use it

Enable mDNS

The mDNS is enabled by default on the new firmware, and can not be disabled.

To use it, all you need to do is set the name of the device in the firmware config file.

This setting can be located under the [wifi] section of the ini/user_config.ini file.

ini
mdnsname = "openiristracker" # do not add .local

By default, the name of the device is openiristracker, however you can change it to whatever you want.

Change the name

Since you have two ESP32 devices, you need to make sure that the name of the device is different for each device. If you do not change the name of the device, you will not be able to connect to both devices at the same time.

Connect to the device

To connect to the device, you need to use the name of the device followed by .local. For example, if the name of the device is esp32, you can connect to the device using http://esp32.local.

Prerequisites Bonjour

Bonjour is required to use the mDNS protocol for windows and mac only. If you are using Windows, you can download Bonjour from here. If you are using macOS, Bonjour is already installed.

You can also get the fully tested Bonjour package from us here (for Windows only).

Troubleshooting

Can not connect to the device

If you can not connect to the device, make sure that the name of the device is correct. If the name of the device is correct, make sure that the device is connected to the network.

If the device is connected to the network, try to restart the device. If the device is still not connected, try to restart the router.

',21)]))}const f=t(s,[["render",i]]);export{p as __pageData,f as default}; +import{_ as t,o,c as a,O as n}from"./chunks/framework.ece1a6f0.js";const p=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/mdns.md","filePath":"firmware_guide/mdns.md","lastUpdated":1689147044000}'),s={name:"firmware_guide/mdns.md"};function i(c,e,r,d,h,l){return o(),a("div",null,e[0]||(e[0]=[n('

MDNS

What is it?

mDNS is a protocol that allows you to connect to a device using a name instead of an IP address. This is useful if you do not know the IP address of the device, or if you do not want to keep track of the IP address of the device. This is also useful if you are using a device that does not have a static IP address.

In the mDNS protocol the IP address of the device can change, but the name of the device will always be the same. This means that you can connect to the device using the name of the device, even if the IP address of the device changes.

How to use it

Enable mDNS

The mDNS is enabled by default on the new firmware, and can not be disabled.

To use it, all you need to do is set the name of the device in the firmware config file.

This setting can be located under the [wifi] section of the ini/user_config.ini file.

ini
mdnsname = "openiristracker" # do not add .local

By default, the name of the device is openiristracker, however you can change it to whatever you want.

Change the name

Since you have two ESP32 devices, you need to make sure that the name of the device is different for each device. If you do not change the name of the device, you will not be able to connect to both devices at the same time.

Connect to the device

To connect to the device, you need to use the name of the device followed by .local. For example, if the name of the device is esp32, you can connect to the device using http://esp32.local.

Prerequisites Bonjour

Bonjour is required to use the mDNS protocol for windows and mac only. If you are using Windows, you can download Bonjour from here. If you are using macOS, Bonjour is already installed.

You can also get the fully tested Bonjour package from us here (for Windows only).

Troubleshooting

Can not connect to the device

If you can not connect to the device, make sure that the name of the device is correct. If the name of the device is correct, make sure that the device is connected to the network.

If the device is connected to the network, try to restart the device. If the device is still not connected, try to restart the router.

',21)]))}const f=t(s,[["render",i]]);export{p as __pageData,f as default}; diff --git a/assets/firmware_guide_mdns.md.8a95e855.lean.js b/assets/firmware_guide_mdns.md.046e48da.lean.js similarity index 98% rename from assets/firmware_guide_mdns.md.8a95e855.lean.js rename to assets/firmware_guide_mdns.md.046e48da.lean.js index 56562f4..ab3ea3e 100644 --- a/assets/firmware_guide_mdns.md.8a95e855.lean.js +++ b/assets/firmware_guide_mdns.md.046e48da.lean.js @@ -1 +1 @@ -import{_ as t,o,c as a,O as n}from"./chunks/framework.47aa8d5b.js";const p=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/mdns.md","filePath":"firmware_guide/mdns.md","lastUpdated":1689147044000}'),s={name:"firmware_guide/mdns.md"};function i(c,e,r,d,h,l){return o(),a("div",null,e[0]||(e[0]=[n('

MDNS

What is it?

mDNS is a protocol that allows you to connect to a device using a name instead of an IP address. This is useful if you do not know the IP address of the device, or if you do not want to keep track of the IP address of the device. This is also useful if you are using a device that does not have a static IP address.

In the mDNS protocol the IP address of the device can change, but the name of the device will always be the same. This means that you can connect to the device using the name of the device, even if the IP address of the device changes.

How to use it

Enable mDNS

The mDNS is enabled by default on the new firmware, and can not be disabled.

To use it, all you need to do is set the name of the device in the firmware config file.

This setting can be located under the [wifi] section of the ini/user_config.ini file.

ini
mdnsname = "openiristracker" # do not add .local

By default, the name of the device is openiristracker, however you can change it to whatever you want.

Change the name

Since you have two ESP32 devices, you need to make sure that the name of the device is different for each device. If you do not change the name of the device, you will not be able to connect to both devices at the same time.

Connect to the device

To connect to the device, you need to use the name of the device followed by .local. For example, if the name of the device is esp32, you can connect to the device using http://esp32.local.

Prerequisites Bonjour

Bonjour is required to use the mDNS protocol for windows and mac only. If you are using Windows, you can download Bonjour from here. If you are using macOS, Bonjour is already installed.

You can also get the fully tested Bonjour package from us here (for Windows only).

Troubleshooting

Can not connect to the device

If you can not connect to the device, make sure that the name of the device is correct. If the name of the device is correct, make sure that the device is connected to the network.

If the device is connected to the network, try to restart the device. If the device is still not connected, try to restart the router.

',21)]))}const f=t(s,[["render",i]]);export{p as __pageData,f as default}; +import{_ as t,o,c as a,O as n}from"./chunks/framework.ece1a6f0.js";const p=JSON.parse('{"title":"MDNS","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/mdns.md","filePath":"firmware_guide/mdns.md","lastUpdated":1689147044000}'),s={name:"firmware_guide/mdns.md"};function i(c,e,r,d,h,l){return o(),a("div",null,e[0]||(e[0]=[n('

MDNS

What is it?

mDNS is a protocol that allows you to connect to a device using a name instead of an IP address. This is useful if you do not know the IP address of the device, or if you do not want to keep track of the IP address of the device. This is also useful if you are using a device that does not have a static IP address.

In the mDNS protocol the IP address of the device can change, but the name of the device will always be the same. This means that you can connect to the device using the name of the device, even if the IP address of the device changes.

How to use it

Enable mDNS

The mDNS is enabled by default on the new firmware, and can not be disabled.

To use it, all you need to do is set the name of the device in the firmware config file.

This setting can be located under the [wifi] section of the ini/user_config.ini file.

ini
mdnsname = "openiristracker" # do not add .local

By default, the name of the device is openiristracker, however you can change it to whatever you want.

Change the name

Since you have two ESP32 devices, you need to make sure that the name of the device is different for each device. If you do not change the name of the device, you will not be able to connect to both devices at the same time.

Connect to the device

To connect to the device, you need to use the name of the device followed by .local. For example, if the name of the device is esp32, you can connect to the device using http://esp32.local.

Prerequisites Bonjour

Bonjour is required to use the mDNS protocol for windows and mac only. If you are using Windows, you can download Bonjour from here. If you are using macOS, Bonjour is already installed.

You can also get the fully tested Bonjour package from us here (for Windows only).

Troubleshooting

Can not connect to the device

If you can not connect to the device, make sure that the name of the device is correct. If the name of the device is correct, make sure that the device is connected to the network.

If the device is connected to the network, try to restart the device. If the device is still not connected, try to restart the router.

',21)]))}const f=t(s,[["render",i]]);export{p as __pageData,f as default}; diff --git a/assets/firmware_guide_rest_api.md.8a0ea54a.js b/assets/firmware_guide_rest_api.md.302dda8a.js similarity index 99% rename from assets/firmware_guide_rest_api.md.8a0ea54a.js rename to assets/firmware_guide_rest_api.md.302dda8a.js index fbaff4e..701639d 100644 --- a/assets/firmware_guide_rest_api.md.8a0ea54a.js +++ b/assets/firmware_guide_rest_api.md.302dda8a.js @@ -1,4 +1,4 @@ -import{_ as t,o as s,c as a,O as n}from"./chunks/framework.47aa8d5b.js";const h=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/rest_api.md","filePath":"firmware_guide/rest_api.md","lastUpdated":1718649805000}'),l={name:"firmware_guide/rest_api.md"};function o(r,e,p,c,i,d){return s(),a("div",null,e[0]||(e[0]=[n(`

REST API

What is it?

A REST API is a way to communicate with the ESP devices using HTTP requests. This is useful if you want to control the device from a computer or a mobile device.

We developed a REST API for this project so that we can control the devices more easily from our new app.

How to use it

REST API Client

Any REST API client can be used to communicate with the ESP devices. We recommend using Thunder Client to test the REST API, as it's free and is a vscode extension.

For basic GET requests, you can use your browser of choice.

Standard

The REST API follows the following standard:

txt
http://{device_name}.local:81/control/builtin/command/{endpoint}?{param}={value}&{param}={value}

For example, if the name of the device is esp32, you can connect to the device using http://esp32.local:81/control/builtin/command/<endpoint>.

Endpoints

Note

Any endpoint marked with ** is currently not implemented, and will be implemented in the future.

If you would like to help us implement these endpoints, please contact us.

We are also open to suggestions for new endpoints.

Note: Any endpoint that makes changes to the config will require a call to /save to write the changes to the flash. This is to prevent the flash from being written to too often, which can cause the flash to wear out. The device will write the changes to the flash and then restart itself after a call to /save.

The REST API has the following endpoints:

EndpointMethodDescription
/pingGETReturns the status of the device.
/saveGETWrites any changes to the flash.
/restartDeviceGETRestarts the ESP itself.
/restartCameraGETRestarts the camera.
/resetConfigGETClears the current config in memory and RAM
/getStoredConfigGETReturns a JSON object of the devices current config.
/setTxPowerPOSTSets the Transmission Power of the ESPs
/setDevicePOSTSets the OTA and mDNS settings
/setCameraPOSTSets all of the camera settings
/wifiPOSTAdds a new wifi network, or writes over an existing one
/wifiDELETEDeletes a wifi network **

Note

/wifi uses the POST method to add a new wifi network, and the DELETE method to delete a wifi network.

Params

The REST API has the following params:

Feature not a bug

All params for a given URL are required, even if you are not changing that params value.

If you do not supply a param, that param will be set to default settings.

URL params are passed in the URL as a query string, using the following format:

http://<device_name>.local:81/control/builtin/command/<endpoint>?<param>=<value>&<param>=<value>

/wifi

Note

We allow you to store up to 3 wifi networks in memory. If you try to add more than 3, the oldest network will be overwritten.

ParamDescription
ssidThe ssid of the network.
passwordThe password of the network.
networkNameThe unique name (given by you) to refer to that network in memory.
channelThe channel for the wifi network to broadcast on
only 1 - 14 are allowed.
powerThe Transmittion power of the ESP for that network config.
adhocWhether to enable AP mode or not.

Note - Transmission Power

You must follow the following format for the power param:

Using the following enum, you pass the number to the right of the = sign that corresponds with the power in dBm that you wish to use.

cpp
typedef enum {
+import{_ as t,o as s,c as a,O as n}from"./chunks/framework.ece1a6f0.js";const h=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/rest_api.md","filePath":"firmware_guide/rest_api.md","lastUpdated":1718649805000}'),l={name:"firmware_guide/rest_api.md"};function o(r,e,p,c,i,d){return s(),a("div",null,e[0]||(e[0]=[n(`

REST API

What is it?

A REST API is a way to communicate with the ESP devices using HTTP requests. This is useful if you want to control the device from a computer or a mobile device.

We developed a REST API for this project so that we can control the devices more easily from our new app.

How to use it

REST API Client

Any REST API client can be used to communicate with the ESP devices. We recommend using Thunder Client to test the REST API, as it's free and is a vscode extension.

For basic GET requests, you can use your browser of choice.

Standard

The REST API follows the following standard:

txt
http://{device_name}.local:81/control/builtin/command/{endpoint}?{param}={value}&{param}={value}

For example, if the name of the device is esp32, you can connect to the device using http://esp32.local:81/control/builtin/command/<endpoint>.

Endpoints

Note

Any endpoint marked with ** is currently not implemented, and will be implemented in the future.

If you would like to help us implement these endpoints, please contact us.

We are also open to suggestions for new endpoints.

Note: Any endpoint that makes changes to the config will require a call to /save to write the changes to the flash. This is to prevent the flash from being written to too often, which can cause the flash to wear out. The device will write the changes to the flash and then restart itself after a call to /save.

The REST API has the following endpoints:

EndpointMethodDescription
/pingGETReturns the status of the device.
/saveGETWrites any changes to the flash.
/restartDeviceGETRestarts the ESP itself.
/restartCameraGETRestarts the camera.
/resetConfigGETClears the current config in memory and RAM
/getStoredConfigGETReturns a JSON object of the devices current config.
/setTxPowerPOSTSets the Transmission Power of the ESPs
/setDevicePOSTSets the OTA and mDNS settings
/setCameraPOSTSets all of the camera settings
/wifiPOSTAdds a new wifi network, or writes over an existing one
/wifiDELETEDeletes a wifi network **

Note

/wifi uses the POST method to add a new wifi network, and the DELETE method to delete a wifi network.

Params

The REST API has the following params:

Feature not a bug

All params for a given URL are required, even if you are not changing that params value.

If you do not supply a param, that param will be set to default settings.

URL params are passed in the URL as a query string, using the following format:

http://<device_name>.local:81/control/builtin/command/<endpoint>?<param>=<value>&<param>=<value>

/wifi

Note

We allow you to store up to 3 wifi networks in memory. If you try to add more than 3, the oldest network will be overwritten.

ParamDescription
ssidThe ssid of the network.
passwordThe password of the network.
networkNameThe unique name (given by you) to refer to that network in memory.
channelThe channel for the wifi network to broadcast on
only 1 - 14 are allowed.
powerThe Transmittion power of the ESP for that network config.
adhocWhether to enable AP mode or not.

Note - Transmission Power

You must follow the following format for the power param:

Using the following enum, you pass the number to the right of the = sign that corresponds with the power in dBm that you wish to use.

cpp
typedef enum {
     WIFI_POWER_19_5dBm = 78,// 19.5dBm
     WIFI_POWER_19dBm = 76,// 19dBm
     WIFI_POWER_18_5dBm = 74,// 18.5dBm
diff --git a/assets/firmware_guide_rest_api.md.8a0ea54a.lean.js b/assets/firmware_guide_rest_api.md.302dda8a.lean.js
similarity index 99%
rename from assets/firmware_guide_rest_api.md.8a0ea54a.lean.js
rename to assets/firmware_guide_rest_api.md.302dda8a.lean.js
index fbaff4e..701639d 100644
--- a/assets/firmware_guide_rest_api.md.8a0ea54a.lean.js
+++ b/assets/firmware_guide_rest_api.md.302dda8a.lean.js
@@ -1,4 +1,4 @@
-import{_ as t,o as s,c as a,O as n}from"./chunks/framework.47aa8d5b.js";const h=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/rest_api.md","filePath":"firmware_guide/rest_api.md","lastUpdated":1718649805000}'),l={name:"firmware_guide/rest_api.md"};function o(r,e,p,c,i,d){return s(),a("div",null,e[0]||(e[0]=[n(`

REST API

What is it?

A REST API is a way to communicate with the ESP devices using HTTP requests. This is useful if you want to control the device from a computer or a mobile device.

We developed a REST API for this project so that we can control the devices more easily from our new app.

How to use it

REST API Client

Any REST API client can be used to communicate with the ESP devices. We recommend using Thunder Client to test the REST API, as it's free and is a vscode extension.

For basic GET requests, you can use your browser of choice.

Standard

The REST API follows the following standard:

txt
http://{device_name}.local:81/control/builtin/command/{endpoint}?{param}={value}&{param}={value}

For example, if the name of the device is esp32, you can connect to the device using http://esp32.local:81/control/builtin/command/<endpoint>.

Endpoints

Note

Any endpoint marked with ** is currently not implemented, and will be implemented in the future.

If you would like to help us implement these endpoints, please contact us.

We are also open to suggestions for new endpoints.

Note: Any endpoint that makes changes to the config will require a call to /save to write the changes to the flash. This is to prevent the flash from being written to too often, which can cause the flash to wear out. The device will write the changes to the flash and then restart itself after a call to /save.

The REST API has the following endpoints:

EndpointMethodDescription
/pingGETReturns the status of the device.
/saveGETWrites any changes to the flash.
/restartDeviceGETRestarts the ESP itself.
/restartCameraGETRestarts the camera.
/resetConfigGETClears the current config in memory and RAM
/getStoredConfigGETReturns a JSON object of the devices current config.
/setTxPowerPOSTSets the Transmission Power of the ESPs
/setDevicePOSTSets the OTA and mDNS settings
/setCameraPOSTSets all of the camera settings
/wifiPOSTAdds a new wifi network, or writes over an existing one
/wifiDELETEDeletes a wifi network **

Note

/wifi uses the POST method to add a new wifi network, and the DELETE method to delete a wifi network.

Params

The REST API has the following params:

Feature not a bug

All params for a given URL are required, even if you are not changing that params value.

If you do not supply a param, that param will be set to default settings.

URL params are passed in the URL as a query string, using the following format:

http://<device_name>.local:81/control/builtin/command/<endpoint>?<param>=<value>&<param>=<value>

/wifi

Note

We allow you to store up to 3 wifi networks in memory. If you try to add more than 3, the oldest network will be overwritten.

ParamDescription
ssidThe ssid of the network.
passwordThe password of the network.
networkNameThe unique name (given by you) to refer to that network in memory.
channelThe channel for the wifi network to broadcast on
only 1 - 14 are allowed.
powerThe Transmittion power of the ESP for that network config.
adhocWhether to enable AP mode or not.

Note - Transmission Power

You must follow the following format for the power param:

Using the following enum, you pass the number to the right of the = sign that corresponds with the power in dBm that you wish to use.

cpp
typedef enum {
+import{_ as t,o as s,c as a,O as n}from"./chunks/framework.ece1a6f0.js";const h=JSON.parse('{"title":"REST API","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/rest_api.md","filePath":"firmware_guide/rest_api.md","lastUpdated":1718649805000}'),l={name:"firmware_guide/rest_api.md"};function o(r,e,p,c,i,d){return s(),a("div",null,e[0]||(e[0]=[n(`

REST API

What is it?

A REST API is a way to communicate with the ESP devices using HTTP requests. This is useful if you want to control the device from a computer or a mobile device.

We developed a REST API for this project so that we can control the devices more easily from our new app.

How to use it

REST API Client

Any REST API client can be used to communicate with the ESP devices. We recommend using Thunder Client to test the REST API, as it's free and is a vscode extension.

For basic GET requests, you can use your browser of choice.

Standard

The REST API follows the following standard:

txt
http://{device_name}.local:81/control/builtin/command/{endpoint}?{param}={value}&{param}={value}

For example, if the name of the device is esp32, you can connect to the device using http://esp32.local:81/control/builtin/command/<endpoint>.

Endpoints

Note

Any endpoint marked with ** is currently not implemented, and will be implemented in the future.

If you would like to help us implement these endpoints, please contact us.

We are also open to suggestions for new endpoints.

Note: Any endpoint that makes changes to the config will require a call to /save to write the changes to the flash. This is to prevent the flash from being written to too often, which can cause the flash to wear out. The device will write the changes to the flash and then restart itself after a call to /save.

The REST API has the following endpoints:

EndpointMethodDescription
/pingGETReturns the status of the device.
/saveGETWrites any changes to the flash.
/restartDeviceGETRestarts the ESP itself.
/restartCameraGETRestarts the camera.
/resetConfigGETClears the current config in memory and RAM
/getStoredConfigGETReturns a JSON object of the devices current config.
/setTxPowerPOSTSets the Transmission Power of the ESPs
/setDevicePOSTSets the OTA and mDNS settings
/setCameraPOSTSets all of the camera settings
/wifiPOSTAdds a new wifi network, or writes over an existing one
/wifiDELETEDeletes a wifi network **

Note

/wifi uses the POST method to add a new wifi network, and the DELETE method to delete a wifi network.

Params

The REST API has the following params:

Feature not a bug

All params for a given URL are required, even if you are not changing that params value.

If you do not supply a param, that param will be set to default settings.

URL params are passed in the URL as a query string, using the following format:

http://<device_name>.local:81/control/builtin/command/<endpoint>?<param>=<value>&<param>=<value>

/wifi

Note

We allow you to store up to 3 wifi networks in memory. If you try to add more than 3, the oldest network will be overwritten.

ParamDescription
ssidThe ssid of the network.
passwordThe password of the network.
networkNameThe unique name (given by you) to refer to that network in memory.
channelThe channel for the wifi network to broadcast on
only 1 - 14 are allowed.
powerThe Transmittion power of the ESP for that network config.
adhocWhether to enable AP mode or not.

Note - Transmission Power

You must follow the following format for the power param:

Using the following enum, you pass the number to the right of the = sign that corresponds with the power in dBm that you wish to use.

cpp
typedef enum {
     WIFI_POWER_19_5dBm = 78,// 19.5dBm
     WIFI_POWER_19dBm = 76,// 19dBm
     WIFI_POWER_18_5dBm = 74,// 18.5dBm
diff --git a/assets/firmware_guide_setup_vscode.md.fefbbc55.js b/assets/firmware_guide_setup_vscode.md.b24c20ae.js
similarity index 97%
rename from assets/firmware_guide_setup_vscode.md.fefbbc55.js
rename to assets/firmware_guide_setup_vscode.md.b24c20ae.js
index 2660035..07a8ffe 100644
--- a/assets/firmware_guide_setup_vscode.md.fefbbc55.js
+++ b/assets/firmware_guide_setup_vscode.md.b24c20ae.js
@@ -1 +1 @@
-import{_ as a,i as l}from"./chunks/index.c1fed1bd.js";import{o as s,c as d,O as i,E as r,l as n,k as t,a as o}from"./chunks/framework.47aa8d5b.js";const c=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/setup_vscode.md","filePath":"firmware_guide/setup_vscode.md","lastUpdated":1689532703000}'),p={name:"firmware_guide/setup_vscode.md"},g=Object.assign(p,{setup(u){return(h,e)=>(s(),d("div",null,[e[0]||(e[0]=i('

Setting up the environment

This procedure will show how to prepare your system for uploading the firmware to your tracker.

1. Install Visual Studio Code

Download the latest Visual Studio Code and install it.

Download


',6)),r(a,{options:n(l).setup_vscode_image_one},null,8,["options"]),e[1]||(e[1]=t("h3",{id:"install",tabindex:"-1"},[o("Install "),t("a",{class:"header-anchor",href:"#install","aria-label":'Permalink to "Install"'},"​")],-1)),e[2]||(e[2]=t("br",null,null,-1)),r(a,{options:n(l).setup_vscode_image_two},null,8,["options"]),e[3]||(e[3]=i('

2. Install the drivers

In order to flash the firmware, you'll need some drivers, mainly the CH340 drivers, here's where to get them from:

https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers/all

3. Install PlatformIO IDE

Once Visual Studio Code is installed, open it and install PlatformIO IDE for VSCode, an extension that will allow you to connect to the tracker, build and upload the firmware.

',5)),r(a,{options:n(l).setup_vscode_image_three},null,8,["options"]),e[4]||(e[4]=i('

4. Clone the firmware project

Make sure you close any current projects you have open or open a new window before moving forward with these steps.

  1. Go to https://github.com/EyeTrackVR/OpenIris and clone the latest version from the main branch.
    1. If you do not have git installed please install it from here.

    2. Open Git Bash.

',3)),r(a,{options:n(l).setup_vscode_image_four},null,8,["options"]),e[5]||(e[5]=t("ol",null,[t("li",null,[o("Change the directory to the directory that you want the firmware to be cloned. Ex: "),t("code",null,"cd C:/")])],-1)),r(a,{options:n(l).setup_vscode_image_five},null,8,["options"]),e[6]||(e[6]=t("ol",null,[t("li",null,[o("Clone the repository by entering the command: "),t("code",null,"git clone https://github.com/EyeTrackVR/OpenIris.git")])],-1)),r(a,{options:n(l).setup_vscode_image_six},null,8,["options"]),e[7]||(e[7]=t("p",null,[o("For more info about cloning please refer to "),t("a",{href:"https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository",target:"_blank",rel:"noreferrer"},"this documentation")],-1)),e[8]||(e[8]=t("p",null,[t("em",null,[t("strong",null,"Do not download as a zip")]),o(" - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.")],-1)),e[9]||(e[9]=t("ol",null,[t("li",null,[o("Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to "),t("code",null,"OpenIris/ESP"),o(" folder and opening it.")])],-1)),r(a,{options:n(l).setup_vscode_image_seven},null,8,["options"]),e[10]||(e[10]=t("p",null,[t("em",null,[o("This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team "),t("a",{href:"https://docs.slimevr.dev/firmware/setup-and-install.html",target:"_blank",rel:"noreferrer"},"adapted from here")])],-1))]))}});export{c as __pageData,g as default}; +import{_ as a,i as l}from"./chunks/index.41b0dfea.js";import{o as s,c as d,O as i,E as r,l as n,k as t,a as o}from"./chunks/framework.ece1a6f0.js";const c=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/setup_vscode.md","filePath":"firmware_guide/setup_vscode.md","lastUpdated":1689532703000}'),p={name:"firmware_guide/setup_vscode.md"},g=Object.assign(p,{setup(u){return(h,e)=>(s(),d("div",null,[e[0]||(e[0]=i('

Setting up the environment

This procedure will show how to prepare your system for uploading the firmware to your tracker.

1. Install Visual Studio Code

Download the latest Visual Studio Code and install it.

Download


',6)),r(a,{options:n(l).setup_vscode_image_one},null,8,["options"]),e[1]||(e[1]=t("h3",{id:"install",tabindex:"-1"},[o("Install "),t("a",{class:"header-anchor",href:"#install","aria-label":'Permalink to "Install"'},"​")],-1)),e[2]||(e[2]=t("br",null,null,-1)),r(a,{options:n(l).setup_vscode_image_two},null,8,["options"]),e[3]||(e[3]=i('

2. Install the drivers

In order to flash the firmware, you'll need some drivers, mainly the CH340 drivers, here's where to get them from:

https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers/all

3. Install PlatformIO IDE

Once Visual Studio Code is installed, open it and install PlatformIO IDE for VSCode, an extension that will allow you to connect to the tracker, build and upload the firmware.

',5)),r(a,{options:n(l).setup_vscode_image_three},null,8,["options"]),e[4]||(e[4]=i('

4. Clone the firmware project

Make sure you close any current projects you have open or open a new window before moving forward with these steps.

  1. Go to https://github.com/EyeTrackVR/OpenIris and clone the latest version from the main branch.
    1. If you do not have git installed please install it from here.

    2. Open Git Bash.

',3)),r(a,{options:n(l).setup_vscode_image_four},null,8,["options"]),e[5]||(e[5]=t("ol",null,[t("li",null,[o("Change the directory to the directory that you want the firmware to be cloned. Ex: "),t("code",null,"cd C:/")])],-1)),r(a,{options:n(l).setup_vscode_image_five},null,8,["options"]),e[6]||(e[6]=t("ol",null,[t("li",null,[o("Clone the repository by entering the command: "),t("code",null,"git clone https://github.com/EyeTrackVR/OpenIris.git")])],-1)),r(a,{options:n(l).setup_vscode_image_six},null,8,["options"]),e[7]||(e[7]=t("p",null,[o("For more info about cloning please refer to "),t("a",{href:"https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository",target:"_blank",rel:"noreferrer"},"this documentation")],-1)),e[8]||(e[8]=t("p",null,[t("em",null,[t("strong",null,"Do not download as a zip")]),o(" - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.")],-1)),e[9]||(e[9]=t("ol",null,[t("li",null,[o("Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to "),t("code",null,"OpenIris/ESP"),o(" folder and opening it.")])],-1)),r(a,{options:n(l).setup_vscode_image_seven},null,8,["options"]),e[10]||(e[10]=t("p",null,[t("em",null,[o("This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team "),t("a",{href:"https://docs.slimevr.dev/firmware/setup-and-install.html",target:"_blank",rel:"noreferrer"},"adapted from here")])],-1))]))}});export{c as __pageData,g as default}; diff --git a/assets/firmware_guide_setup_vscode.md.fefbbc55.lean.js b/assets/firmware_guide_setup_vscode.md.b24c20ae.lean.js similarity index 97% rename from assets/firmware_guide_setup_vscode.md.fefbbc55.lean.js rename to assets/firmware_guide_setup_vscode.md.b24c20ae.lean.js index 2660035..07a8ffe 100644 --- a/assets/firmware_guide_setup_vscode.md.fefbbc55.lean.js +++ b/assets/firmware_guide_setup_vscode.md.b24c20ae.lean.js @@ -1 +1 @@ -import{_ as a,i as l}from"./chunks/index.c1fed1bd.js";import{o as s,c as d,O as i,E as r,l as n,k as t,a as o}from"./chunks/framework.47aa8d5b.js";const c=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/setup_vscode.md","filePath":"firmware_guide/setup_vscode.md","lastUpdated":1689532703000}'),p={name:"firmware_guide/setup_vscode.md"},g=Object.assign(p,{setup(u){return(h,e)=>(s(),d("div",null,[e[0]||(e[0]=i('

Setting up the environment

This procedure will show how to prepare your system for uploading the firmware to your tracker.

1. Install Visual Studio Code

Download the latest Visual Studio Code and install it.

Download


',6)),r(a,{options:n(l).setup_vscode_image_one},null,8,["options"]),e[1]||(e[1]=t("h3",{id:"install",tabindex:"-1"},[o("Install "),t("a",{class:"header-anchor",href:"#install","aria-label":'Permalink to "Install"'},"​")],-1)),e[2]||(e[2]=t("br",null,null,-1)),r(a,{options:n(l).setup_vscode_image_two},null,8,["options"]),e[3]||(e[3]=i('

2. Install the drivers

In order to flash the firmware, you'll need some drivers, mainly the CH340 drivers, here's where to get them from:

https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers/all

3. Install PlatformIO IDE

Once Visual Studio Code is installed, open it and install PlatformIO IDE for VSCode, an extension that will allow you to connect to the tracker, build and upload the firmware.

',5)),r(a,{options:n(l).setup_vscode_image_three},null,8,["options"]),e[4]||(e[4]=i('

4. Clone the firmware project

Make sure you close any current projects you have open or open a new window before moving forward with these steps.

  1. Go to https://github.com/EyeTrackVR/OpenIris and clone the latest version from the main branch.
    1. If you do not have git installed please install it from here.

    2. Open Git Bash.

',3)),r(a,{options:n(l).setup_vscode_image_four},null,8,["options"]),e[5]||(e[5]=t("ol",null,[t("li",null,[o("Change the directory to the directory that you want the firmware to be cloned. Ex: "),t("code",null,"cd C:/")])],-1)),r(a,{options:n(l).setup_vscode_image_five},null,8,["options"]),e[6]||(e[6]=t("ol",null,[t("li",null,[o("Clone the repository by entering the command: "),t("code",null,"git clone https://github.com/EyeTrackVR/OpenIris.git")])],-1)),r(a,{options:n(l).setup_vscode_image_six},null,8,["options"]),e[7]||(e[7]=t("p",null,[o("For more info about cloning please refer to "),t("a",{href:"https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository",target:"_blank",rel:"noreferrer"},"this documentation")],-1)),e[8]||(e[8]=t("p",null,[t("em",null,[t("strong",null,"Do not download as a zip")]),o(" - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.")],-1)),e[9]||(e[9]=t("ol",null,[t("li",null,[o("Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to "),t("code",null,"OpenIris/ESP"),o(" folder and opening it.")])],-1)),r(a,{options:n(l).setup_vscode_image_seven},null,8,["options"]),e[10]||(e[10]=t("p",null,[t("em",null,[o("This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team "),t("a",{href:"https://docs.slimevr.dev/firmware/setup-and-install.html",target:"_blank",rel:"noreferrer"},"adapted from here")])],-1))]))}});export{c as __pageData,g as default}; +import{_ as a,i as l}from"./chunks/index.41b0dfea.js";import{o as s,c as d,O as i,E as r,l as n,k as t,a as o}from"./chunks/framework.ece1a6f0.js";const c=JSON.parse('{"title":"Setting up the environment","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/setup_vscode.md","filePath":"firmware_guide/setup_vscode.md","lastUpdated":1689532703000}'),p={name:"firmware_guide/setup_vscode.md"},g=Object.assign(p,{setup(u){return(h,e)=>(s(),d("div",null,[e[0]||(e[0]=i('

Setting up the environment

This procedure will show how to prepare your system for uploading the firmware to your tracker.

1. Install Visual Studio Code

Download the latest Visual Studio Code and install it.

Download


',6)),r(a,{options:n(l).setup_vscode_image_one},null,8,["options"]),e[1]||(e[1]=t("h3",{id:"install",tabindex:"-1"},[o("Install "),t("a",{class:"header-anchor",href:"#install","aria-label":'Permalink to "Install"'},"​")],-1)),e[2]||(e[2]=t("br",null,null,-1)),r(a,{options:n(l).setup_vscode_image_two},null,8,["options"]),e[3]||(e[3]=i('

2. Install the drivers

In order to flash the firmware, you'll need some drivers, mainly the CH340 drivers, here's where to get them from:

https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers/all

3. Install PlatformIO IDE

Once Visual Studio Code is installed, open it and install PlatformIO IDE for VSCode, an extension that will allow you to connect to the tracker, build and upload the firmware.

',5)),r(a,{options:n(l).setup_vscode_image_three},null,8,["options"]),e[4]||(e[4]=i('

4. Clone the firmware project

Make sure you close any current projects you have open or open a new window before moving forward with these steps.

  1. Go to https://github.com/EyeTrackVR/OpenIris and clone the latest version from the main branch.
    1. If you do not have git installed please install it from here.

    2. Open Git Bash.

',3)),r(a,{options:n(l).setup_vscode_image_four},null,8,["options"]),e[5]||(e[5]=t("ol",null,[t("li",null,[o("Change the directory to the directory that you want the firmware to be cloned. Ex: "),t("code",null,"cd C:/")])],-1)),r(a,{options:n(l).setup_vscode_image_five},null,8,["options"]),e[6]||(e[6]=t("ol",null,[t("li",null,[o("Clone the repository by entering the command: "),t("code",null,"git clone https://github.com/EyeTrackVR/OpenIris.git")])],-1)),r(a,{options:n(l).setup_vscode_image_six},null,8,["options"]),e[7]||(e[7]=t("p",null,[o("For more info about cloning please refer to "),t("a",{href:"https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository",target:"_blank",rel:"noreferrer"},"this documentation")],-1)),e[8]||(e[8]=t("p",null,[t("em",null,[t("strong",null,"Do not download as a zip")]),o(" - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.")],-1)),e[9]||(e[9]=t("ol",null,[t("li",null,[o("Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to "),t("code",null,"OpenIris/ESP"),o(" folder and opening it.")])],-1)),r(a,{options:n(l).setup_vscode_image_seven},null,8,["options"]),e[10]||(e[10]=t("p",null,[t("em",null,[o("This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team "),t("a",{href:"https://docs.slimevr.dev/firmware/setup-and-install.html",target:"_blank",rel:"noreferrer"},"adapted from here")])],-1))]))}});export{c as __pageData,g as default}; diff --git a/assets/firmware_guide_update_platformio.md.d52a99e0.js b/assets/firmware_guide_update_platformio.md.02ea0fb7.js similarity index 97% rename from assets/firmware_guide_update_platformio.md.d52a99e0.js rename to assets/firmware_guide_update_platformio.md.02ea0fb7.js index 6fdf775..5b4cb1f 100644 --- a/assets/firmware_guide_update_platformio.md.d52a99e0.js +++ b/assets/firmware_guide_update_platformio.md.02ea0fb7.js @@ -1 +1 @@ -import{_ as a,i as e}from"./chunks/index.c1fed1bd.js";import{o as s,c as d,O as r,E as l,l as n,k as o,a as i}from"./chunks/framework.47aa8d5b.js";const h=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/update_platformio.md","filePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),p={name:"firmware_guide/update_platformio.md"},g=Object.assign(p,{setup(u){return(m,t)=>(s(),d("div",null,[t[0]||(t[0]=r('

Updating Platformio

Sometimes, when building and uploading the firmware, you may run into bizarre, even-though the code is correct - platformio will refuse to build and instead will complain with some weird error.

It usually means that either PlatformIO, or ArduinoSDK got and update and that's the moment when this guide may come in handy.

Updating PlatformIO itself

There are two ways to update your platformio installation

Via CLI

You can update it easily by simply typing in one command into your terminal.

',7)),l(a,{options:n(e).pio_upgrade_command},null,8,["options"]),t[1]||(t[1]=r('
  1. Open a terminal / command prompt
  2. Type pio upgrade and press enter
  3. Wait for it to finish
  4. Done

Via PlatformIO in Visual Studio Code

You can also update it using the platformio tab in your Visual Studio Code.

  1. Open VSC
  2. Click on that little and icon on the sidebar
',4)),l(a,{options:n(e).ant_logo_platformio},null,8,["options"]),t[2]||(t[2]=o("ol",{start:"3"},[o("li",null,[i("A side panel will open, there will be a couple of sections, one of them called "),o("code",null,"Quick Access"),i(", open it.")])],-1)),l(a,{options:n(e).platformio_quick_access},null,8,["options"]),t[3]||(t[3]=o("ol",{start:"4"},[o("li",null,[i("In "),o("code",null,"Quick Access"),i(" section, click on the "),o("code",null,"Miscelleneous"),i(" tab")])],-1)),l(a,{options:n(e).platformio_quick_access_miscellaneous},null,8,["options"]),t[4]||(t[4]=o("ol",{start:"5"},[o("li",null,[i("Then, click on the "),o("code",null,"Upgrade PlatformIO Core")])],-1)),l(a,{options:n(e).platformio_quick_access_upgrade_core},null,8,["options"]),t[5]||(t[5]=r('
  1. Wait for it to finnish and done!

Upgrading the SDK

You'll also need to upgrade the SDK from timem to do this

Upgrading the SDK via VSC

  1. Follow the guide above up until clicking on the Quick Access section.
  2. Instead, open the PIO Home and select Open
',5)),l(a,{options:n(e).platformio_pio_home},null,8,["options"]),t[6]||(t[6]=o("ol",{start:"3"},[o("li",null,[i("This will open a window for PlatformIO dashboard, in there, click on a "),o("code",null,"Platforms"),i(" button on the sidebar")])],-1)),l(a,{options:n(e).platformio_pio_sidebar_platforms},null,8,["options"]),t[7]||(t[7]=o("ol",{start:"4"},[o("li",null,[i("Once there, you should see a couple of tabs next to the side bard, things like "),o("code",null,"Installed"),i(" or "),o("code",null,"Embedded"),i(". Click on "),o("code",null,"Updates")])],-1)),l(a,{options:n(e).platformio_pio_sidebar_platforms_updates},null,8,["options"]),t[8]||(t[8]=o("ol",{start:"5"},[o("li",null,[i("Locate a platform called "),o("code",null,"Espressif 32"),i(" and click on "),o("code",null,"Update to ")])],-1)),l(a,{options:n(e).platformio_pio_espressif32},null,8,["options"]),t[9]||(t[9]=o("ol",{start:"6"},[o("li",null,"Wait until it is done and that's it!")],-1))]))}});export{h as __pageData,g as default}; +import{_ as a,i as e}from"./chunks/index.41b0dfea.js";import{o as s,c as d,O as r,E as l,l as n,k as o,a as i}from"./chunks/framework.ece1a6f0.js";const h=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/update_platformio.md","filePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),p={name:"firmware_guide/update_platformio.md"},g=Object.assign(p,{setup(u){return(m,t)=>(s(),d("div",null,[t[0]||(t[0]=r('

Updating Platformio

Sometimes, when building and uploading the firmware, you may run into bizarre, even-though the code is correct - platformio will refuse to build and instead will complain with some weird error.

It usually means that either PlatformIO, or ArduinoSDK got and update and that's the moment when this guide may come in handy.

Updating PlatformIO itself

There are two ways to update your platformio installation

Via CLI

You can update it easily by simply typing in one command into your terminal.

',7)),l(a,{options:n(e).pio_upgrade_command},null,8,["options"]),t[1]||(t[1]=r('
  1. Open a terminal / command prompt
  2. Type pio upgrade and press enter
  3. Wait for it to finish
  4. Done

Via PlatformIO in Visual Studio Code

You can also update it using the platformio tab in your Visual Studio Code.

  1. Open VSC
  2. Click on that little and icon on the sidebar
',4)),l(a,{options:n(e).ant_logo_platformio},null,8,["options"]),t[2]||(t[2]=o("ol",{start:"3"},[o("li",null,[i("A side panel will open, there will be a couple of sections, one of them called "),o("code",null,"Quick Access"),i(", open it.")])],-1)),l(a,{options:n(e).platformio_quick_access},null,8,["options"]),t[3]||(t[3]=o("ol",{start:"4"},[o("li",null,[i("In "),o("code",null,"Quick Access"),i(" section, click on the "),o("code",null,"Miscelleneous"),i(" tab")])],-1)),l(a,{options:n(e).platformio_quick_access_miscellaneous},null,8,["options"]),t[4]||(t[4]=o("ol",{start:"5"},[o("li",null,[i("Then, click on the "),o("code",null,"Upgrade PlatformIO Core")])],-1)),l(a,{options:n(e).platformio_quick_access_upgrade_core},null,8,["options"]),t[5]||(t[5]=r('
  1. Wait for it to finnish and done!

Upgrading the SDK

You'll also need to upgrade the SDK from timem to do this

Upgrading the SDK via VSC

  1. Follow the guide above up until clicking on the Quick Access section.
  2. Instead, open the PIO Home and select Open
',5)),l(a,{options:n(e).platformio_pio_home},null,8,["options"]),t[6]||(t[6]=o("ol",{start:"3"},[o("li",null,[i("This will open a window for PlatformIO dashboard, in there, click on a "),o("code",null,"Platforms"),i(" button on the sidebar")])],-1)),l(a,{options:n(e).platformio_pio_sidebar_platforms},null,8,["options"]),t[7]||(t[7]=o("ol",{start:"4"},[o("li",null,[i("Once there, you should see a couple of tabs next to the side bard, things like "),o("code",null,"Installed"),i(" or "),o("code",null,"Embedded"),i(". Click on "),o("code",null,"Updates")])],-1)),l(a,{options:n(e).platformio_pio_sidebar_platforms_updates},null,8,["options"]),t[8]||(t[8]=o("ol",{start:"5"},[o("li",null,[i("Locate a platform called "),o("code",null,"Espressif 32"),i(" and click on "),o("code",null,"Update to ")])],-1)),l(a,{options:n(e).platformio_pio_espressif32},null,8,["options"]),t[9]||(t[9]=o("ol",{start:"6"},[o("li",null,"Wait until it is done and that's it!")],-1))]))}});export{h as __pageData,g as default}; diff --git a/assets/firmware_guide_update_platformio.md.d52a99e0.lean.js b/assets/firmware_guide_update_platformio.md.02ea0fb7.lean.js similarity index 97% rename from assets/firmware_guide_update_platformio.md.d52a99e0.lean.js rename to assets/firmware_guide_update_platformio.md.02ea0fb7.lean.js index 6fdf775..5b4cb1f 100644 --- a/assets/firmware_guide_update_platformio.md.d52a99e0.lean.js +++ b/assets/firmware_guide_update_platformio.md.02ea0fb7.lean.js @@ -1 +1 @@ -import{_ as a,i as e}from"./chunks/index.c1fed1bd.js";import{o as s,c as d,O as r,E as l,l as n,k as o,a as i}from"./chunks/framework.47aa8d5b.js";const h=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/update_platformio.md","filePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),p={name:"firmware_guide/update_platformio.md"},g=Object.assign(p,{setup(u){return(m,t)=>(s(),d("div",null,[t[0]||(t[0]=r('

Updating Platformio

Sometimes, when building and uploading the firmware, you may run into bizarre, even-though the code is correct - platformio will refuse to build and instead will complain with some weird error.

It usually means that either PlatformIO, or ArduinoSDK got and update and that's the moment when this guide may come in handy.

Updating PlatformIO itself

There are two ways to update your platformio installation

Via CLI

You can update it easily by simply typing in one command into your terminal.

',7)),l(a,{options:n(e).pio_upgrade_command},null,8,["options"]),t[1]||(t[1]=r('
  1. Open a terminal / command prompt
  2. Type pio upgrade and press enter
  3. Wait for it to finish
  4. Done

Via PlatformIO in Visual Studio Code

You can also update it using the platformio tab in your Visual Studio Code.

  1. Open VSC
  2. Click on that little and icon on the sidebar
',4)),l(a,{options:n(e).ant_logo_platformio},null,8,["options"]),t[2]||(t[2]=o("ol",{start:"3"},[o("li",null,[i("A side panel will open, there will be a couple of sections, one of them called "),o("code",null,"Quick Access"),i(", open it.")])],-1)),l(a,{options:n(e).platformio_quick_access},null,8,["options"]),t[3]||(t[3]=o("ol",{start:"4"},[o("li",null,[i("In "),o("code",null,"Quick Access"),i(" section, click on the "),o("code",null,"Miscelleneous"),i(" tab")])],-1)),l(a,{options:n(e).platformio_quick_access_miscellaneous},null,8,["options"]),t[4]||(t[4]=o("ol",{start:"5"},[o("li",null,[i("Then, click on the "),o("code",null,"Upgrade PlatformIO Core")])],-1)),l(a,{options:n(e).platformio_quick_access_upgrade_core},null,8,["options"]),t[5]||(t[5]=r('
  1. Wait for it to finnish and done!

Upgrading the SDK

You'll also need to upgrade the SDK from timem to do this

Upgrading the SDK via VSC

  1. Follow the guide above up until clicking on the Quick Access section.
  2. Instead, open the PIO Home and select Open
',5)),l(a,{options:n(e).platformio_pio_home},null,8,["options"]),t[6]||(t[6]=o("ol",{start:"3"},[o("li",null,[i("This will open a window for PlatformIO dashboard, in there, click on a "),o("code",null,"Platforms"),i(" button on the sidebar")])],-1)),l(a,{options:n(e).platformio_pio_sidebar_platforms},null,8,["options"]),t[7]||(t[7]=o("ol",{start:"4"},[o("li",null,[i("Once there, you should see a couple of tabs next to the side bard, things like "),o("code",null,"Installed"),i(" or "),o("code",null,"Embedded"),i(". Click on "),o("code",null,"Updates")])],-1)),l(a,{options:n(e).platformio_pio_sidebar_platforms_updates},null,8,["options"]),t[8]||(t[8]=o("ol",{start:"5"},[o("li",null,[i("Locate a platform called "),o("code",null,"Espressif 32"),i(" and click on "),o("code",null,"Update to ")])],-1)),l(a,{options:n(e).platformio_pio_espressif32},null,8,["options"]),t[9]||(t[9]=o("ol",{start:"6"},[o("li",null,"Wait until it is done and that's it!")],-1))]))}});export{h as __pageData,g as default}; +import{_ as a,i as e}from"./chunks/index.41b0dfea.js";import{o as s,c as d,O as r,E as l,l as n,k as o,a as i}from"./chunks/framework.ece1a6f0.js";const h=JSON.parse('{"title":"Updating Platformio","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/update_platformio.md","filePath":"firmware_guide/update_platformio.md","lastUpdated":1678402493000}'),p={name:"firmware_guide/update_platformio.md"},g=Object.assign(p,{setup(u){return(m,t)=>(s(),d("div",null,[t[0]||(t[0]=r('

Updating Platformio

Sometimes, when building and uploading the firmware, you may run into bizarre, even-though the code is correct - platformio will refuse to build and instead will complain with some weird error.

It usually means that either PlatformIO, or ArduinoSDK got and update and that's the moment when this guide may come in handy.

Updating PlatformIO itself

There are two ways to update your platformio installation

Via CLI

You can update it easily by simply typing in one command into your terminal.

',7)),l(a,{options:n(e).pio_upgrade_command},null,8,["options"]),t[1]||(t[1]=r('
  1. Open a terminal / command prompt
  2. Type pio upgrade and press enter
  3. Wait for it to finish
  4. Done

Via PlatformIO in Visual Studio Code

You can also update it using the platformio tab in your Visual Studio Code.

  1. Open VSC
  2. Click on that little and icon on the sidebar
',4)),l(a,{options:n(e).ant_logo_platformio},null,8,["options"]),t[2]||(t[2]=o("ol",{start:"3"},[o("li",null,[i("A side panel will open, there will be a couple of sections, one of them called "),o("code",null,"Quick Access"),i(", open it.")])],-1)),l(a,{options:n(e).platformio_quick_access},null,8,["options"]),t[3]||(t[3]=o("ol",{start:"4"},[o("li",null,[i("In "),o("code",null,"Quick Access"),i(" section, click on the "),o("code",null,"Miscelleneous"),i(" tab")])],-1)),l(a,{options:n(e).platformio_quick_access_miscellaneous},null,8,["options"]),t[4]||(t[4]=o("ol",{start:"5"},[o("li",null,[i("Then, click on the "),o("code",null,"Upgrade PlatformIO Core")])],-1)),l(a,{options:n(e).platformio_quick_access_upgrade_core},null,8,["options"]),t[5]||(t[5]=r('
  1. Wait for it to finnish and done!

Upgrading the SDK

You'll also need to upgrade the SDK from timem to do this

Upgrading the SDK via VSC

  1. Follow the guide above up until clicking on the Quick Access section.
  2. Instead, open the PIO Home and select Open
',5)),l(a,{options:n(e).platformio_pio_home},null,8,["options"]),t[6]||(t[6]=o("ol",{start:"3"},[o("li",null,[i("This will open a window for PlatformIO dashboard, in there, click on a "),o("code",null,"Platforms"),i(" button on the sidebar")])],-1)),l(a,{options:n(e).platformio_pio_sidebar_platforms},null,8,["options"]),t[7]||(t[7]=o("ol",{start:"4"},[o("li",null,[i("Once there, you should see a couple of tabs next to the side bard, things like "),o("code",null,"Installed"),i(" or "),o("code",null,"Embedded"),i(". Click on "),o("code",null,"Updates")])],-1)),l(a,{options:n(e).platformio_pio_sidebar_platforms_updates},null,8,["options"]),t[8]||(t[8]=o("ol",{start:"5"},[o("li",null,[i("Locate a platform called "),o("code",null,"Espressif 32"),i(" and click on "),o("code",null,"Update to ")])],-1)),l(a,{options:n(e).platformio_pio_espressif32},null,8,["options"]),t[9]||(t[9]=o("ol",{start:"6"},[o("li",null,"Wait until it is done and that's it!")],-1))]))}});export{h as __pageData,g as default}; diff --git a/assets/firmware_guide_upload_and_update_firmware.md.0806ea0f.lean.js b/assets/firmware_guide_upload_and_update_firmware.md.c675cc09.js similarity index 98% rename from assets/firmware_guide_upload_and_update_firmware.md.0806ea0f.lean.js rename to assets/firmware_guide_upload_and_update_firmware.md.c675cc09.js index d99d571..893b34a 100644 --- a/assets/firmware_guide_upload_and_update_firmware.md.0806ea0f.lean.js +++ b/assets/firmware_guide_upload_and_update_firmware.md.c675cc09.js @@ -1,4 +1,4 @@ -import{_ as l,a as p}from"./chunks/index.339f98d7.js";import{_ as r,i as n}from"./chunks/index.c1fed1bd.js";import{o as d,c as h,O as s,E as t,w as u,l as a,k as o,a as i}from"./chunks/framework.47aa8d5b.js";const b=JSON.parse('{"title":"Building and uploading the firmware manually","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/upload_and_update_firmware.md","filePath":"firmware_guide/upload_and_update_firmware.md","lastUpdated":1682366995000}'),c={name:"firmware_guide/upload_and_update_firmware.md"},v=Object.assign(c,{setup(m){return(f,e)=>(d(),h("div",null,[e[3]||(e[3]=s('

Building and uploading the firmware manually

Uploading your firmware must initially be done over cable. Once you have the tracker connected to your WiFi after your first firmware update, you can opt to use OTA in the future.

1. Connect your tracker to your PC

Option 1: Connect ESP32-CAM via the programmer

First, connect your ESP32-Cam to your programmer. In the case of the ESP32-Cam-MB board, it's as simple as sticking it into the socket the way it came in the package and then connecting it to your PC with a micro-USB cable.

In some cases, there is a button labeled IOO on the programmer. If that button exists make sure to hold it in while you plug the programmer into your PC, once plugged in you can release the button.

In the case of an FTDI programmer, the steps aren't as easy, so grab this guide for how to set it up.

Option 2: Connect ESP32-S3 via USB-C directly

To begin, connect your ESP32-S3 board directly to your PC.

On the initial attempt, you may have to adjust the USB mode by pressing the BOOT button and holding it down, then pressing the RESET button while still holding down BOOT, and finally releasing the BOOT button. This will produce a sound indicating the connection of a new device.

Once completed, you should be all set to proceed.

2. Build your firmware

  1. Press the build button at the bottom of Visual Studio Code.

This builds the firmware, but does not send it to the ESP yet.

img

3. Upload your firmware

  • If you are using the OTA method, skip to the OTA section below.

  • Once the firmware has been built, press the upload button to upload the firmware.

    This sends the firmware to the ESP. img

',17)),t(l,{options:a(p).upload_firmware_one},{content:u(()=>e[0]||(e[0]=[o("p",null," The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials) ",-1)])),_:1},8,["options"]),e[4]||(e[4]=s('
  • If the upload is successful, you should get an output that looks like this:

    img

Congratulations! You have now successfully uploaded the firmware to your EyeTrackVR Tracker!

If you have trouble with uploading your firmware over cable check the following:

  1. Make sure your USB cable from the tracker is plugged firmly into your PC.
  2. Make sure that your USB cable is a data and charging cable (it is suggested you try other cables or devices with the cable).
  3. Make sure that your drivers are up-to-date.
  4. Some ports might not work, try other ones.

Additionally, this can be caused by software hogging COM ports (VSCode and Cura can be the cause of this).

Uploading via OTA

What is it?

OTA stands for Over The Air, and it is a way to update your firmware without having to connect your device to your computer.

How do I use it?

To use OTA, you need to have working firmware on your ESPs first. Follow the manual building guide

Once you have manually flashed the firmware at least once, you can use the OTA environment to upate your ESPs.

Coming Soon

Currently, we only support OTA using the provided web interface, but we are working on a new app, where you will be able to upload your firmware to your ESPs over WiFi straight from the app.

For firmware versions 1.1.0 and up:

Since version 1.1.0 we've switched from using OTA via platformio to a more user-friendly approach.

',14)),t(l,{options:a(p).upload_firmware_one},{content:u(()=>e[1]||(e[1]=[o("p",null," You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi. ",-1)])),_:1},8,["options"]),e[5]||(e[5]=o("ol",null,[o("li",null,[i("Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the "),o("code",null,"_OTA"),i(" suffix. Next, press the checkmark button to build it without uploading.")])],-1)),t(r,{options:a(n).upload_firmware_build_button},null,8,["options"]),e[6]||(e[6]=s('
  1. Turn on your trackers and wait for them to connect to Wi-Fi

  2. Locate their ip or mDNS name. For mDNS, the default is: http://openiristracker.local/

  3. Having done that, open http://<your-up-or-mdns-name>:81/update in your browser

for example: http://openiristracker.local/

This should open a page similar to this:

',3)),t(r,{options:a(n).upload_firmware_webpage},null,8,["options"]),e[7]||(e[7]=o("p",null,[i("Click on the select file button, and navigate to where you cloned the project and then to the "),o("code",null,"ESP/"),i(" directory.")],-1)),e[8]||(e[8]=o("p",null,[i("Once there, open "),o("code",null,".pio\\build\\your-environment"),i(" like so:")],-1)),e[9]||(e[9]=o("blockquote",null,[o("p",null,[i("By default, windows treats files and directories with a dot in front of their name as hidden. To change that - "),o("a",{href:"https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5",target:"_blank",rel:"noreferrer"},"see here")])],-1)),t(r,{options:a(n).upload_firmware_webpage_directory},null,8,["options"]),e[10]||(e[10]=o("p",null,[i("You'll find a couple files in there, select the one named "),o("code",null,"your-environment-vVersion-feature"),i(".")],-1)),e[11]||(e[11]=o("p",null,"like this one:",-1)),t(r,{options:a(n).upload_firmware_webpage_directory_file},null,8,["options"]),e[12]||(e[12]=o("ol",{start:"5"},[o("li",null,"Press upload and wait for it to finish. Done!")],-1)),t(r,{options:a(n).upload_firmware_webpage_upload_finished},null,8,["options"]),e[13]||(e[13]=s(`

For firmware versions of 1.0.0 and under:

  1. Retrieve the IP or mDNS name of the tracker you wish to flash. The IP can be found through network monitoring applications, or by viewing tracker output in a serial monitor.
  2. In the ini/user_config.ini file:
    • Put IP or hostname of device into config file

Like so:

ini
[ota]
+import{_ as l,a as p}from"./chunks/index.c19b2931.js";import{_ as r,i as n}from"./chunks/index.41b0dfea.js";import{o as d,c as h,O as s,E as t,w as u,l as a,k as o,a as i}from"./chunks/framework.ece1a6f0.js";const b=JSON.parse('{"title":"Building and uploading the firmware manually","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/upload_and_update_firmware.md","filePath":"firmware_guide/upload_and_update_firmware.md","lastUpdated":1682366995000}'),c={name:"firmware_guide/upload_and_update_firmware.md"},v=Object.assign(c,{setup(m){return(f,e)=>(d(),h("div",null,[e[3]||(e[3]=s('

Building and uploading the firmware manually

Uploading your firmware must initially be done over cable. Once you have the tracker connected to your WiFi after your first firmware update, you can opt to use OTA in the future.

1. Connect your tracker to your PC

Option 1: Connect ESP32-CAM via the programmer

First, connect your ESP32-Cam to your programmer. In the case of the ESP32-Cam-MB board, it's as simple as sticking it into the socket the way it came in the package and then connecting it to your PC with a micro-USB cable.

In some cases, there is a button labeled IOO on the programmer. If that button exists make sure to hold it in while you plug the programmer into your PC, once plugged in you can release the button.

In the case of an FTDI programmer, the steps aren't as easy, so grab this guide for how to set it up.

Option 2: Connect ESP32-S3 via USB-C directly

To begin, connect your ESP32-S3 board directly to your PC.

On the initial attempt, you may have to adjust the USB mode by pressing the BOOT button and holding it down, then pressing the RESET button while still holding down BOOT, and finally releasing the BOOT button. This will produce a sound indicating the connection of a new device.

Once completed, you should be all set to proceed.

2. Build your firmware

  1. Press the build button at the bottom of Visual Studio Code.

This builds the firmware, but does not send it to the ESP yet.

img

3. Upload your firmware

  • If you are using the OTA method, skip to the OTA section below.

  • Once the firmware has been built, press the upload button to upload the firmware.

    This sends the firmware to the ESP. img

',17)),t(l,{options:a(p).upload_firmware_one},{content:u(()=>e[0]||(e[0]=[o("p",null," The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials) ",-1)])),_:1},8,["options"]),e[4]||(e[4]=s('
  • If the upload is successful, you should get an output that looks like this:

    img

Congratulations! You have now successfully uploaded the firmware to your EyeTrackVR Tracker!

If you have trouble with uploading your firmware over cable check the following:

  1. Make sure your USB cable from the tracker is plugged firmly into your PC.
  2. Make sure that your USB cable is a data and charging cable (it is suggested you try other cables or devices with the cable).
  3. Make sure that your drivers are up-to-date.
  4. Some ports might not work, try other ones.

Additionally, this can be caused by software hogging COM ports (VSCode and Cura can be the cause of this).

Uploading via OTA

What is it?

OTA stands for Over The Air, and it is a way to update your firmware without having to connect your device to your computer.

How do I use it?

To use OTA, you need to have working firmware on your ESPs first. Follow the manual building guide

Once you have manually flashed the firmware at least once, you can use the OTA environment to upate your ESPs.

Coming Soon

Currently, we only support OTA using the provided web interface, but we are working on a new app, where you will be able to upload your firmware to your ESPs over WiFi straight from the app.

For firmware versions 1.1.0 and up:

Since version 1.1.0 we've switched from using OTA via platformio to a more user-friendly approach.

',14)),t(l,{options:a(p).upload_firmware_one},{content:u(()=>e[1]||(e[1]=[o("p",null," You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi. ",-1)])),_:1},8,["options"]),e[5]||(e[5]=o("ol",null,[o("li",null,[i("Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the "),o("code",null,"_OTA"),i(" suffix. Next, press the checkmark button to build it without uploading.")])],-1)),t(r,{options:a(n).upload_firmware_build_button},null,8,["options"]),e[6]||(e[6]=s('
  1. Turn on your trackers and wait for them to connect to Wi-Fi

  2. Locate their ip or mDNS name. For mDNS, the default is: http://openiristracker.local/

  3. Having done that, open http://<your-up-or-mdns-name>:81/update in your browser

for example: http://openiristracker.local/

This should open a page similar to this:

',3)),t(r,{options:a(n).upload_firmware_webpage},null,8,["options"]),e[7]||(e[7]=o("p",null,[i("Click on the select file button, and navigate to where you cloned the project and then to the "),o("code",null,"ESP/"),i(" directory.")],-1)),e[8]||(e[8]=o("p",null,[i("Once there, open "),o("code",null,".pio\\build\\your-environment"),i(" like so:")],-1)),e[9]||(e[9]=o("blockquote",null,[o("p",null,[i("By default, windows treats files and directories with a dot in front of their name as hidden. To change that - "),o("a",{href:"https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5",target:"_blank",rel:"noreferrer"},"see here")])],-1)),t(r,{options:a(n).upload_firmware_webpage_directory},null,8,["options"]),e[10]||(e[10]=o("p",null,[i("You'll find a couple files in there, select the one named "),o("code",null,"your-environment-vVersion-feature"),i(".")],-1)),e[11]||(e[11]=o("p",null,"like this one:",-1)),t(r,{options:a(n).upload_firmware_webpage_directory_file},null,8,["options"]),e[12]||(e[12]=o("ol",{start:"5"},[o("li",null,"Press upload and wait for it to finish. Done!")],-1)),t(r,{options:a(n).upload_firmware_webpage_upload_finished},null,8,["options"]),e[13]||(e[13]=s(`

For firmware versions of 1.0.0 and under:

  1. Retrieve the IP or mDNS name of the tracker you wish to flash. The IP can be found through network monitoring applications, or by viewing tracker output in a serial monitor.
  2. In the ini/user_config.ini file:
    • Put IP or hostname of device into config file

Like so:

ini
[ota]
 enableota = 1
 otaserverip = "openiristrackerL.local" # here we use a custom mDNS name
 otapassword = "12345678"
diff --git a/assets/firmware_guide_upload_and_update_firmware.md.0806ea0f.js b/assets/firmware_guide_upload_and_update_firmware.md.c675cc09.lean.js
similarity index 98%
rename from assets/firmware_guide_upload_and_update_firmware.md.0806ea0f.js
rename to assets/firmware_guide_upload_and_update_firmware.md.c675cc09.lean.js
index d99d571..893b34a 100644
--- a/assets/firmware_guide_upload_and_update_firmware.md.0806ea0f.js
+++ b/assets/firmware_guide_upload_and_update_firmware.md.c675cc09.lean.js
@@ -1,4 +1,4 @@
-import{_ as l,a as p}from"./chunks/index.339f98d7.js";import{_ as r,i as n}from"./chunks/index.c1fed1bd.js";import{o as d,c as h,O as s,E as t,w as u,l as a,k as o,a as i}from"./chunks/framework.47aa8d5b.js";const b=JSON.parse('{"title":"Building and uploading the firmware manually","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/upload_and_update_firmware.md","filePath":"firmware_guide/upload_and_update_firmware.md","lastUpdated":1682366995000}'),c={name:"firmware_guide/upload_and_update_firmware.md"},v=Object.assign(c,{setup(m){return(f,e)=>(d(),h("div",null,[e[3]||(e[3]=s('

Building and uploading the firmware manually

Uploading your firmware must initially be done over cable. Once you have the tracker connected to your WiFi after your first firmware update, you can opt to use OTA in the future.

1. Connect your tracker to your PC

Option 1: Connect ESP32-CAM via the programmer

First, connect your ESP32-Cam to your programmer. In the case of the ESP32-Cam-MB board, it's as simple as sticking it into the socket the way it came in the package and then connecting it to your PC with a micro-USB cable.

In some cases, there is a button labeled IOO on the programmer. If that button exists make sure to hold it in while you plug the programmer into your PC, once plugged in you can release the button.

In the case of an FTDI programmer, the steps aren't as easy, so grab this guide for how to set it up.

Option 2: Connect ESP32-S3 via USB-C directly

To begin, connect your ESP32-S3 board directly to your PC.

On the initial attempt, you may have to adjust the USB mode by pressing the BOOT button and holding it down, then pressing the RESET button while still holding down BOOT, and finally releasing the BOOT button. This will produce a sound indicating the connection of a new device.

Once completed, you should be all set to proceed.

2. Build your firmware

  1. Press the build button at the bottom of Visual Studio Code.

This builds the firmware, but does not send it to the ESP yet.

img

3. Upload your firmware

  • If you are using the OTA method, skip to the OTA section below.

  • Once the firmware has been built, press the upload button to upload the firmware.

    This sends the firmware to the ESP. img

',17)),t(l,{options:a(p).upload_firmware_one},{content:u(()=>e[0]||(e[0]=[o("p",null," The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials) ",-1)])),_:1},8,["options"]),e[4]||(e[4]=s('
  • If the upload is successful, you should get an output that looks like this:

    img

Congratulations! You have now successfully uploaded the firmware to your EyeTrackVR Tracker!

If you have trouble with uploading your firmware over cable check the following:

  1. Make sure your USB cable from the tracker is plugged firmly into your PC.
  2. Make sure that your USB cable is a data and charging cable (it is suggested you try other cables or devices with the cable).
  3. Make sure that your drivers are up-to-date.
  4. Some ports might not work, try other ones.

Additionally, this can be caused by software hogging COM ports (VSCode and Cura can be the cause of this).

Uploading via OTA

What is it?

OTA stands for Over The Air, and it is a way to update your firmware without having to connect your device to your computer.

How do I use it?

To use OTA, you need to have working firmware on your ESPs first. Follow the manual building guide

Once you have manually flashed the firmware at least once, you can use the OTA environment to upate your ESPs.

Coming Soon

Currently, we only support OTA using the provided web interface, but we are working on a new app, where you will be able to upload your firmware to your ESPs over WiFi straight from the app.

For firmware versions 1.1.0 and up:

Since version 1.1.0 we've switched from using OTA via platformio to a more user-friendly approach.

',14)),t(l,{options:a(p).upload_firmware_one},{content:u(()=>e[1]||(e[1]=[o("p",null," You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi. ",-1)])),_:1},8,["options"]),e[5]||(e[5]=o("ol",null,[o("li",null,[i("Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the "),o("code",null,"_OTA"),i(" suffix. Next, press the checkmark button to build it without uploading.")])],-1)),t(r,{options:a(n).upload_firmware_build_button},null,8,["options"]),e[6]||(e[6]=s('
  1. Turn on your trackers and wait for them to connect to Wi-Fi

  2. Locate their ip or mDNS name. For mDNS, the default is: http://openiristracker.local/

  3. Having done that, open http://<your-up-or-mdns-name>:81/update in your browser

for example: http://openiristracker.local/

This should open a page similar to this:

',3)),t(r,{options:a(n).upload_firmware_webpage},null,8,["options"]),e[7]||(e[7]=o("p",null,[i("Click on the select file button, and navigate to where you cloned the project and then to the "),o("code",null,"ESP/"),i(" directory.")],-1)),e[8]||(e[8]=o("p",null,[i("Once there, open "),o("code",null,".pio\\build\\your-environment"),i(" like so:")],-1)),e[9]||(e[9]=o("blockquote",null,[o("p",null,[i("By default, windows treats files and directories with a dot in front of their name as hidden. To change that - "),o("a",{href:"https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5",target:"_blank",rel:"noreferrer"},"see here")])],-1)),t(r,{options:a(n).upload_firmware_webpage_directory},null,8,["options"]),e[10]||(e[10]=o("p",null,[i("You'll find a couple files in there, select the one named "),o("code",null,"your-environment-vVersion-feature"),i(".")],-1)),e[11]||(e[11]=o("p",null,"like this one:",-1)),t(r,{options:a(n).upload_firmware_webpage_directory_file},null,8,["options"]),e[12]||(e[12]=o("ol",{start:"5"},[o("li",null,"Press upload and wait for it to finish. Done!")],-1)),t(r,{options:a(n).upload_firmware_webpage_upload_finished},null,8,["options"]),e[13]||(e[13]=s(`

For firmware versions of 1.0.0 and under:

  1. Retrieve the IP or mDNS name of the tracker you wish to flash. The IP can be found through network monitoring applications, or by viewing tracker output in a serial monitor.
  2. In the ini/user_config.ini file:
    • Put IP or hostname of device into config file

Like so:

ini
[ota]
+import{_ as l,a as p}from"./chunks/index.c19b2931.js";import{_ as r,i as n}from"./chunks/index.41b0dfea.js";import{o as d,c as h,O as s,E as t,w as u,l as a,k as o,a as i}from"./chunks/framework.ece1a6f0.js";const b=JSON.parse('{"title":"Building and uploading the firmware manually","description":"","frontmatter":{},"headers":[],"relativePath":"firmware_guide/upload_and_update_firmware.md","filePath":"firmware_guide/upload_and_update_firmware.md","lastUpdated":1682366995000}'),c={name:"firmware_guide/upload_and_update_firmware.md"},v=Object.assign(c,{setup(m){return(f,e)=>(d(),h("div",null,[e[3]||(e[3]=s('

Building and uploading the firmware manually

Uploading your firmware must initially be done over cable. Once you have the tracker connected to your WiFi after your first firmware update, you can opt to use OTA in the future.

1. Connect your tracker to your PC

Option 1: Connect ESP32-CAM via the programmer

First, connect your ESP32-Cam to your programmer. In the case of the ESP32-Cam-MB board, it's as simple as sticking it into the socket the way it came in the package and then connecting it to your PC with a micro-USB cable.

In some cases, there is a button labeled IOO on the programmer. If that button exists make sure to hold it in while you plug the programmer into your PC, once plugged in you can release the button.

In the case of an FTDI programmer, the steps aren't as easy, so grab this guide for how to set it up.

Option 2: Connect ESP32-S3 via USB-C directly

To begin, connect your ESP32-S3 board directly to your PC.

On the initial attempt, you may have to adjust the USB mode by pressing the BOOT button and holding it down, then pressing the RESET button while still holding down BOOT, and finally releasing the BOOT button. This will produce a sound indicating the connection of a new device.

Once completed, you should be all set to proceed.

2. Build your firmware

  1. Press the build button at the bottom of Visual Studio Code.

This builds the firmware, but does not send it to the ESP yet.

img

3. Upload your firmware

  • If you are using the OTA method, skip to the OTA section below.

  • Once the firmware has been built, press the upload button to upload the firmware.

    This sends the firmware to the ESP. img

',17)),t(l,{options:a(p).upload_firmware_one},{content:u(()=>e[0]||(e[0]=[o("p",null," The MB board does the resetting for you. If you're using the FTDI programmer, follow the guide linked above (the one from randomnerdtutorials) ",-1)])),_:1},8,["options"]),e[4]||(e[4]=s('
  • If the upload is successful, you should get an output that looks like this:

    img

Congratulations! You have now successfully uploaded the firmware to your EyeTrackVR Tracker!

If you have trouble with uploading your firmware over cable check the following:

  1. Make sure your USB cable from the tracker is plugged firmly into your PC.
  2. Make sure that your USB cable is a data and charging cable (it is suggested you try other cables or devices with the cable).
  3. Make sure that your drivers are up-to-date.
  4. Some ports might not work, try other ones.

Additionally, this can be caused by software hogging COM ports (VSCode and Cura can be the cause of this).

Uploading via OTA

What is it?

OTA stands for Over The Air, and it is a way to update your firmware without having to connect your device to your computer.

How do I use it?

To use OTA, you need to have working firmware on your ESPs first. Follow the manual building guide

Once you have manually flashed the firmware at least once, you can use the OTA environment to upate your ESPs.

Coming Soon

Currently, we only support OTA using the provided web interface, but we are working on a new app, where you will be able to upload your firmware to your ESPs over WiFi straight from the app.

For firmware versions 1.1.0 and up:

Since version 1.1.0 we've switched from using OTA via platformio to a more user-friendly approach.

',14)),t(l,{options:a(p).upload_firmware_one},{content:u(()=>e[1]||(e[1]=[o("p",null," You don't have to have the trackers connected to your pc for any of these steps, just powered on and connected to the Wi-Fi. ",-1)])),_:1},8,["options"]),e[5]||(e[5]=o("ol",null,[o("li",null,[i("Build the firmware using your current environment, if you've switched to an OTA env in the past - repeat those steps but select the environment without the "),o("code",null,"_OTA"),i(" suffix. Next, press the checkmark button to build it without uploading.")])],-1)),t(r,{options:a(n).upload_firmware_build_button},null,8,["options"]),e[6]||(e[6]=s('
  1. Turn on your trackers and wait for them to connect to Wi-Fi

  2. Locate their ip or mDNS name. For mDNS, the default is: http://openiristracker.local/

  3. Having done that, open http://<your-up-or-mdns-name>:81/update in your browser

for example: http://openiristracker.local/

This should open a page similar to this:

',3)),t(r,{options:a(n).upload_firmware_webpage},null,8,["options"]),e[7]||(e[7]=o("p",null,[i("Click on the select file button, and navigate to where you cloned the project and then to the "),o("code",null,"ESP/"),i(" directory.")],-1)),e[8]||(e[8]=o("p",null,[i("Once there, open "),o("code",null,".pio\\build\\your-environment"),i(" like so:")],-1)),e[9]||(e[9]=o("blockquote",null,[o("p",null,[i("By default, windows treats files and directories with a dot in front of their name as hidden. To change that - "),o("a",{href:"https://support.microsoft.com/en-us/windows/view-hidden-files-and-folders-in-windows-97fbc472-c603-9d90-91d0-1166d1d9f4b5",target:"_blank",rel:"noreferrer"},"see here")])],-1)),t(r,{options:a(n).upload_firmware_webpage_directory},null,8,["options"]),e[10]||(e[10]=o("p",null,[i("You'll find a couple files in there, select the one named "),o("code",null,"your-environment-vVersion-feature"),i(".")],-1)),e[11]||(e[11]=o("p",null,"like this one:",-1)),t(r,{options:a(n).upload_firmware_webpage_directory_file},null,8,["options"]),e[12]||(e[12]=o("ol",{start:"5"},[o("li",null,"Press upload and wait for it to finish. Done!")],-1)),t(r,{options:a(n).upload_firmware_webpage_upload_finished},null,8,["options"]),e[13]||(e[13]=s(`

For firmware versions of 1.0.0 and under:

  1. Retrieve the IP or mDNS name of the tracker you wish to flash. The IP can be found through network monitoring applications, or by viewing tracker output in a serial monitor.
  2. In the ini/user_config.ini file:
    • Put IP or hostname of device into config file

Like so:

ini
[ota]
 enableota = 1
 otaserverip = "openiristrackerL.local" # here we use a custom mDNS name
 otapassword = "12345678"
diff --git a/assets/getting_started_intro.md.d6d8f855.js b/assets/getting_started_intro.md.1f5b1337.js
similarity index 95%
rename from assets/getting_started_intro.md.d6d8f855.js
rename to assets/getting_started_intro.md.1f5b1337.js
index bac396d..c6880e5 100644
--- a/assets/getting_started_intro.md.d6d8f855.js
+++ b/assets/getting_started_intro.md.1f5b1337.js
@@ -1 +1 @@
-import{_ as s,a as n}from"./chunks/index.339f98d7.js";import{_ as d,i as p}from"./chunks/index.c1fed1bd.js";import{o as u,c,O as r,E as a,w as l,l as o,k as t,a as i}from"./chunks/framework.47aa8d5b.js";const _=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/intro.md","filePath":"getting_started/intro.md","lastUpdated":1745116122000}'),h={name:"getting_started/intro.md"},w=Object.assign(h,{setup(f){return(m,e)=>(u(),c("div",null,[e[2]||(e[2]=r('

EyeTrackVR

EyeTrackVR is a Source First, affordable eye-tracking platform designed specifically for Virtual Reality—especially for Social VR experiences like VRChat. It works by sending real-time eye tracking data over OSC or UDP, making it compatible with many existing VR applications.

Whether you're here to build your own tracker, contribute to development, or explore how it works, you're in the right place.


Get Started

This documentation covers everything from assembly and firmware setup to headset mounting and safety. If you're new to the project, we recommend starting with the following pages:

',7)),a(s,{options:o(n).user_warning},{content:l(()=>e[0]||(e[0]=[t("p",null," This project is under active development, but it's already working reliably for many users. Your feedback helps us improve! ",-1)])),_:1},8,["options"]),e[3]||(e[3]=r('

Eye Safety Notice

Eye safety is a top priority. Infrared (IR) light is invisible but not harmless—especially at close distances and high intensities. EyeTrackVR has built-in safety measures, but users must also follow proper precautions.

Always use the recommended LEDs, wiring, and firmware settings.

DANGER

Never bypass safety features or swap out IR components without understanding the risks. Doing so could result in permanent eye damage.

Our default configuration stays well below international safety thresholds (see ICNIRP guidelines), but it's your responsibility to:

  • Use non-focused emitters
  • Keep total radiant intensity below 5 mW/sr
  • Verify LED brightness with an IR camera
  • Stop using the device if you feel warmth or discomfort in your eyes
',7)),a(s,{options:o(n).led_power_warning},{content:l(()=>e[1]||(e[1]=[t("p",null,[i(" Use only "),t("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),i(" LEDs, and ensure total output is "),t("strong",null,"4 mW/sr or less"),i(". ")],-1)])),_:1},8,["options"]),e[4]||(e[4]=r('
Safety References

Effect of infrared radiation on the lens
Photobiological safety of LED light sources
ICNIRP Guidelines (0.38 to 3 µm)
Training Library – NIR Standards


Hardware Overview

See our Parts List and Hardware Repository to source components, print mounts, and prepare your setup.

Firmware

The firmware powering EyeTrackVR's ESP32 cameras is called OpenIris, developed by lorow.
You can find it here on GitHub.


Headset Compatibility

EyeTrackVR can work with any VR headset—but not every model has a 3D-printed mount available yet.

Check our mount list to see if your headset is supported.
If not, you’re welcome to design your own or wait for a community-sourced version.


Community & Support

Join our Discord server for updates, and community projects. We’re excited to have you on board!

',13)),a(d,{options:o(p).discord_content},null,8,["options"])]))}});export{_ as __pageData,w as default}; +import{_ as s,a as n}from"./chunks/index.c19b2931.js";import{_ as d,i as p}from"./chunks/index.41b0dfea.js";import{o as u,c,O as r,E as a,w as l,l as o,k as t,a as i}from"./chunks/framework.ece1a6f0.js";const _=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/intro.md","filePath":"getting_started/intro.md","lastUpdated":1745116122000}'),h={name:"getting_started/intro.md"},w=Object.assign(h,{setup(f){return(m,e)=>(u(),c("div",null,[e[2]||(e[2]=r('

EyeTrackVR

EyeTrackVR is a Source First, affordable eye-tracking platform designed specifically for Virtual Reality—especially for Social VR experiences like VRChat. It works by sending real-time eye tracking data over OSC or UDP, making it compatible with many existing VR applications.

Whether you're here to build your own tracker, contribute to development, or explore how it works, you're in the right place.


Get Started

This documentation covers everything from assembly and firmware setup to headset mounting and safety. If you're new to the project, we recommend starting with the following pages:

',7)),a(s,{options:o(n).user_warning},{content:l(()=>e[0]||(e[0]=[t("p",null," This project is under active development, but it's already working reliably for many users. Your feedback helps us improve! ",-1)])),_:1},8,["options"]),e[3]||(e[3]=r('

Eye Safety Notice

Eye safety is a top priority. Infrared (IR) light is invisible but not harmless—especially at close distances and high intensities. EyeTrackVR has built-in safety measures, but users must also follow proper precautions.

Always use the recommended LEDs, wiring, and firmware settings.

DANGER

Never bypass safety features or swap out IR components without understanding the risks. Doing so could result in permanent eye damage.

Our default configuration stays well below international safety thresholds (see ICNIRP guidelines), but it's your responsibility to:

  • Use non-focused emitters
  • Keep total radiant intensity below 5 mW/sr
  • Verify LED brightness with an IR camera
  • Stop using the device if you feel warmth or discomfort in your eyes
',7)),a(s,{options:o(n).led_power_warning},{content:l(()=>e[1]||(e[1]=[t("p",null,[i(" Use only "),t("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),i(" LEDs, and ensure total output is "),t("strong",null,"4 mW/sr or less"),i(". ")],-1)])),_:1},8,["options"]),e[4]||(e[4]=r('
Safety References

Effect of infrared radiation on the lens
Photobiological safety of LED light sources
ICNIRP Guidelines (0.38 to 3 µm)
Training Library – NIR Standards


Hardware Overview

See our Parts List and Hardware Repository to source components, print mounts, and prepare your setup.

Firmware

The firmware powering EyeTrackVR's ESP32 cameras is called OpenIris, developed by lorow.
You can find it here on GitHub.


Headset Compatibility

EyeTrackVR can work with any VR headset—but not every model has a 3D-printed mount available yet.

Check our mount list to see if your headset is supported.
If not, you’re welcome to design your own or wait for a community-sourced version.


Community & Support

Join our Discord server for updates, and community projects. We’re excited to have you on board!

',13)),a(d,{options:o(p).discord_content},null,8,["options"])]))}});export{_ as __pageData,w as default}; diff --git a/assets/getting_started_intro.md.d6d8f855.lean.js b/assets/getting_started_intro.md.1f5b1337.lean.js similarity index 95% rename from assets/getting_started_intro.md.d6d8f855.lean.js rename to assets/getting_started_intro.md.1f5b1337.lean.js index bac396d..c6880e5 100644 --- a/assets/getting_started_intro.md.d6d8f855.lean.js +++ b/assets/getting_started_intro.md.1f5b1337.lean.js @@ -1 +1 @@ -import{_ as s,a as n}from"./chunks/index.339f98d7.js";import{_ as d,i as p}from"./chunks/index.c1fed1bd.js";import{o as u,c,O as r,E as a,w as l,l as o,k as t,a as i}from"./chunks/framework.47aa8d5b.js";const _=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/intro.md","filePath":"getting_started/intro.md","lastUpdated":1745116122000}'),h={name:"getting_started/intro.md"},w=Object.assign(h,{setup(f){return(m,e)=>(u(),c("div",null,[e[2]||(e[2]=r('

EyeTrackVR

EyeTrackVR is a Source First, affordable eye-tracking platform designed specifically for Virtual Reality—especially for Social VR experiences like VRChat. It works by sending real-time eye tracking data over OSC or UDP, making it compatible with many existing VR applications.

Whether you're here to build your own tracker, contribute to development, or explore how it works, you're in the right place.


Get Started

This documentation covers everything from assembly and firmware setup to headset mounting and safety. If you're new to the project, we recommend starting with the following pages:

',7)),a(s,{options:o(n).user_warning},{content:l(()=>e[0]||(e[0]=[t("p",null," This project is under active development, but it's already working reliably for many users. Your feedback helps us improve! ",-1)])),_:1},8,["options"]),e[3]||(e[3]=r('

Eye Safety Notice

Eye safety is a top priority. Infrared (IR) light is invisible but not harmless—especially at close distances and high intensities. EyeTrackVR has built-in safety measures, but users must also follow proper precautions.

Always use the recommended LEDs, wiring, and firmware settings.

DANGER

Never bypass safety features or swap out IR components without understanding the risks. Doing so could result in permanent eye damage.

Our default configuration stays well below international safety thresholds (see ICNIRP guidelines), but it's your responsibility to:

  • Use non-focused emitters
  • Keep total radiant intensity below 5 mW/sr
  • Verify LED brightness with an IR camera
  • Stop using the device if you feel warmth or discomfort in your eyes
',7)),a(s,{options:o(n).led_power_warning},{content:l(()=>e[1]||(e[1]=[t("p",null,[i(" Use only "),t("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),i(" LEDs, and ensure total output is "),t("strong",null,"4 mW/sr or less"),i(". ")],-1)])),_:1},8,["options"]),e[4]||(e[4]=r('
Safety References

Effect of infrared radiation on the lens
Photobiological safety of LED light sources
ICNIRP Guidelines (0.38 to 3 µm)
Training Library – NIR Standards


Hardware Overview

See our Parts List and Hardware Repository to source components, print mounts, and prepare your setup.

Firmware

The firmware powering EyeTrackVR's ESP32 cameras is called OpenIris, developed by lorow.
You can find it here on GitHub.


Headset Compatibility

EyeTrackVR can work with any VR headset—but not every model has a 3D-printed mount available yet.

Check our mount list to see if your headset is supported.
If not, you’re welcome to design your own or wait for a community-sourced version.


Community & Support

Join our Discord server for updates, and community projects. We’re excited to have you on board!

',13)),a(d,{options:o(p).discord_content},null,8,["options"])]))}});export{_ as __pageData,w as default}; +import{_ as s,a as n}from"./chunks/index.c19b2931.js";import{_ as d,i as p}from"./chunks/index.41b0dfea.js";import{o as u,c,O as r,E as a,w as l,l as o,k as t,a as i}from"./chunks/framework.ece1a6f0.js";const _=JSON.parse('{"title":"EyeTrackVR","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/intro.md","filePath":"getting_started/intro.md","lastUpdated":1745116122000}'),h={name:"getting_started/intro.md"},w=Object.assign(h,{setup(f){return(m,e)=>(u(),c("div",null,[e[2]||(e[2]=r('

EyeTrackVR

EyeTrackVR is a Source First, affordable eye-tracking platform designed specifically for Virtual Reality—especially for Social VR experiences like VRChat. It works by sending real-time eye tracking data over OSC or UDP, making it compatible with many existing VR applications.

Whether you're here to build your own tracker, contribute to development, or explore how it works, you're in the right place.


Get Started

This documentation covers everything from assembly and firmware setup to headset mounting and safety. If you're new to the project, we recommend starting with the following pages:

',7)),a(s,{options:o(n).user_warning},{content:l(()=>e[0]||(e[0]=[t("p",null," This project is under active development, but it's already working reliably for many users. Your feedback helps us improve! ",-1)])),_:1},8,["options"]),e[3]||(e[3]=r('

Eye Safety Notice

Eye safety is a top priority. Infrared (IR) light is invisible but not harmless—especially at close distances and high intensities. EyeTrackVR has built-in safety measures, but users must also follow proper precautions.

Always use the recommended LEDs, wiring, and firmware settings.

DANGER

Never bypass safety features or swap out IR components without understanding the risks. Doing so could result in permanent eye damage.

Our default configuration stays well below international safety thresholds (see ICNIRP guidelines), but it's your responsibility to:

  • Use non-focused emitters
  • Keep total radiant intensity below 5 mW/sr
  • Verify LED brightness with an IR camera
  • Stop using the device if you feel warmth or discomfort in your eyes
',7)),a(s,{options:o(n).led_power_warning},{content:l(()=>e[1]||(e[1]=[t("p",null,[i(" Use only "),t("ins",{class:"text-red-400 dark:text-red-500"},"non-focused"),i(" LEDs, and ensure total output is "),t("strong",null,"4 mW/sr or less"),i(". ")],-1)])),_:1},8,["options"]),e[4]||(e[4]=r('
Safety References

Effect of infrared radiation on the lens
Photobiological safety of LED light sources
ICNIRP Guidelines (0.38 to 3 µm)
Training Library – NIR Standards


Hardware Overview

See our Parts List and Hardware Repository to source components, print mounts, and prepare your setup.

Firmware

The firmware powering EyeTrackVR's ESP32 cameras is called OpenIris, developed by lorow.
You can find it here on GitHub.


Headset Compatibility

EyeTrackVR can work with any VR headset—but not every model has a 3D-printed mount available yet.

Check our mount list to see if your headset is supported.
If not, you’re welcome to design your own or wait for a community-sourced version.


Community & Support

Join our Discord server for updates, and community projects. We’re excited to have you on board!

',13)),a(d,{options:o(p).discord_content},null,8,["options"])]))}});export{_ as __pageData,w as default}; diff --git a/assets/getting_started_led_safety.md.78277ff3.js b/assets/getting_started_led_safety.md.910fc2df.js similarity index 99% rename from assets/getting_started_led_safety.md.78277ff3.js rename to assets/getting_started_led_safety.md.910fc2df.js index 30301b4..a3dbc69 100644 --- a/assets/getting_started_led_safety.md.78277ff3.js +++ b/assets/getting_started_led_safety.md.910fc2df.js @@ -1,4 +1,4 @@ -import{o as a,c as s,O as n}from"./chunks/framework.47aa8d5b.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/led_safety.md","filePath":"getting_started/led_safety.md","lastUpdated":1746112988000}'),t={name:"getting_started/led_safety.md"},p=Object.assign(t,{setup(r){return(l,e)=>(a(),s("div",null,e[0]||(e[0]=[n(`

Near‑Eye Infrared (IR) Emitter Safety

Please exercise caution when messing around with IR emitters.

IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself or do not understand something, just do exactly what we do. Don't use different emitters, don't use different means of power, etc.

DANGER

It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.

The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth, excessive eye-strain or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we have designed EyeTrackVR to be as safe as possible, we do not hold any responsibility for damage done.

Our official kits are made with known safe parts, undergo design testing to ensure failures are safe, and have calculated exposure nummbers below.


Relevant Safety Limits

We design for compliance with these key international safety standards:

  • ICNIRP 2013: For exposures >1000 seconds, the anterior eye (cornea and lens) irradiance limit is
    10 mW/cm² (equivalent to 100 W/m²).
  • IEC 62471 and IEC 60825-1: For sources in the retinal hazard region (400–1400 nm), and a worst-case exposure of ≥10 s, the irradiance limit is
    4 mW/cm² (averaged over a 7 mm pupil projected cone of 11 mrad).

EyeTrackVR emitters operate at 850 nm, within the retinal hazard region.
Our calculated output is well below both thresholds:
≤ 0.8 mW/cm² at 1 cm — below the retinal limit, 13× below the corneal limit.


Why Current (mA) Isn’t Enough

LED current (mA) is not a direct measure of safety. Irradiance (power per unit area) determines actual eye exposure:

Irradiance E = Radiant Intensity Ie / Illuminated Area A
+import{o as a,c as s,O as n}from"./chunks/framework.ece1a6f0.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/led_safety.md","filePath":"getting_started/led_safety.md","lastUpdated":1746112988000}'),t={name:"getting_started/led_safety.md"},p=Object.assign(t,{setup(r){return(l,e)=>(a(),s("div",null,e[0]||(e[0]=[n(`

Near‑Eye Infrared (IR) Emitter Safety

Please exercise caution when messing around with IR emitters.

IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself or do not understand something, just do exactly what we do. Don't use different emitters, don't use different means of power, etc.

DANGER

It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.

The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth, excessive eye-strain or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we have designed EyeTrackVR to be as safe as possible, we do not hold any responsibility for damage done.

Our official kits are made with known safe parts, undergo design testing to ensure failures are safe, and have calculated exposure nummbers below.


Relevant Safety Limits

We design for compliance with these key international safety standards:

  • ICNIRP 2013: For exposures >1000 seconds, the anterior eye (cornea and lens) irradiance limit is
    10 mW/cm² (equivalent to 100 W/m²).
  • IEC 62471 and IEC 60825-1: For sources in the retinal hazard region (400–1400 nm), and a worst-case exposure of ≥10 s, the irradiance limit is
    4 mW/cm² (averaged over a 7 mm pupil projected cone of 11 mrad).

EyeTrackVR emitters operate at 850 nm, within the retinal hazard region.
Our calculated output is well below both thresholds:
≤ 0.8 mW/cm² at 1 cm — below the retinal limit, 13× below the corneal limit.


Why Current (mA) Isn’t Enough

LED current (mA) is not a direct measure of safety. Irradiance (power per unit area) determines actual eye exposure:

Irradiance E = Radiant Intensity Ie / Illuminated Area A
 A            = r² · Ω          where Ω = 2π(1−cosθ)
  • Ie = radiant intensity (in mW/sr, from datasheet)
  • r = distance from LED to cornea (worst-case 1 cm)
  • θ = half-angle of LED emission cone (datasheet: 60°, full angle 120°)
  • Ω = solid angle in steradians
    (for θ = 60° → Ω ≈ π sr)
    → A = π cm² at 1 cm

Hardware Exposure Calculations

LED: XL‑3216HIRC‑850

Datasheet ValueSymbolNotes
Radiant intensity @ 20 mAIe₍20ₘₐ₎ = 5 mW/srTypical max value, 60° half-angle
Full emission angle120°⇒ θ = 60°, Ω ≈ π sr

Radiant intensity scales roughly linearly with current:

Ie = Ie₍20ₘₐ₎ × (I_drive / 20 mA)

V3 Module (2 LEDs @ 3.2 mA each)

Ie_single  = 5 × (3.2 / 20) = 0.80 mW/sr
 E_single   = 0.80 / π = 0.25 mW/cm²
 E_total    = 0.25 × 2 = 0.51 mW/cm²
diff --git a/assets/getting_started_led_safety.md.78277ff3.lean.js b/assets/getting_started_led_safety.md.910fc2df.lean.js
similarity index 99%
rename from assets/getting_started_led_safety.md.78277ff3.lean.js
rename to assets/getting_started_led_safety.md.910fc2df.lean.js
index 30301b4..a3dbc69 100644
--- a/assets/getting_started_led_safety.md.78277ff3.lean.js
+++ b/assets/getting_started_led_safety.md.910fc2df.lean.js
@@ -1,4 +1,4 @@
-import{o as a,c as s,O as n}from"./chunks/framework.47aa8d5b.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/led_safety.md","filePath":"getting_started/led_safety.md","lastUpdated":1746112988000}'),t={name:"getting_started/led_safety.md"},p=Object.assign(t,{setup(r){return(l,e)=>(a(),s("div",null,e[0]||(e[0]=[n(`

Near‑Eye Infrared (IR) Emitter Safety

Please exercise caution when messing around with IR emitters.

IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself or do not understand something, just do exactly what we do. Don't use different emitters, don't use different means of power, etc.

DANGER

It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.

The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth, excessive eye-strain or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we have designed EyeTrackVR to be as safe as possible, we do not hold any responsibility for damage done.

Our official kits are made with known safe parts, undergo design testing to ensure failures are safe, and have calculated exposure nummbers below.


Relevant Safety Limits

We design for compliance with these key international safety standards:

  • ICNIRP 2013: For exposures >1000 seconds, the anterior eye (cornea and lens) irradiance limit is
    10 mW/cm² (equivalent to 100 W/m²).
  • IEC 62471 and IEC 60825-1: For sources in the retinal hazard region (400–1400 nm), and a worst-case exposure of ≥10 s, the irradiance limit is
    4 mW/cm² (averaged over a 7 mm pupil projected cone of 11 mrad).

EyeTrackVR emitters operate at 850 nm, within the retinal hazard region.
Our calculated output is well below both thresholds:
≤ 0.8 mW/cm² at 1 cm — below the retinal limit, 13× below the corneal limit.


Why Current (mA) Isn’t Enough

LED current (mA) is not a direct measure of safety. Irradiance (power per unit area) determines actual eye exposure:

Irradiance E = Radiant Intensity Ie / Illuminated Area A
+import{o as a,c as s,O as n}from"./chunks/framework.ece1a6f0.js";const o=JSON.parse('{"title":"","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/led_safety.md","filePath":"getting_started/led_safety.md","lastUpdated":1746112988000}'),t={name:"getting_started/led_safety.md"},p=Object.assign(t,{setup(r){return(l,e)=>(a(),s("div",null,e[0]||(e[0]=[n(`

Near‑Eye Infrared (IR) Emitter Safety

Please exercise caution when messing around with IR emitters.

IR can be dangerous to your eyes once at a certain power level. It is not recommended to use different emitters unless you know exactly what you are doing as it could result in harm to your eyes. If you doubt yourself or do not understand something, just do exactly what we do. Don't use different emitters, don't use different means of power, etc.

DANGER

It is important that you DO NOT BYPASS (OR NOT DO) ANY SAFETY FEATURES PUT IN PLACE. This can result in irreversible bodily harm.

The safety measures were put in place to REDUCE the potential failure risk. All further safety responsibilities are on the user. This includes visually checking with an IR camera that the brightness is correct and that you do not feel warmth, excessive eye-strain or experience short-term effects after being exposed to the IR light (symptoms such as dark spots or dry/warm feeling eyes while actively using). While we have designed EyeTrackVR to be as safe as possible, we do not hold any responsibility for damage done.

Our official kits are made with known safe parts, undergo design testing to ensure failures are safe, and have calculated exposure nummbers below.


Relevant Safety Limits

We design for compliance with these key international safety standards:

  • ICNIRP 2013: For exposures >1000 seconds, the anterior eye (cornea and lens) irradiance limit is
    10 mW/cm² (equivalent to 100 W/m²).
  • IEC 62471 and IEC 60825-1: For sources in the retinal hazard region (400–1400 nm), and a worst-case exposure of ≥10 s, the irradiance limit is
    4 mW/cm² (averaged over a 7 mm pupil projected cone of 11 mrad).

EyeTrackVR emitters operate at 850 nm, within the retinal hazard region.
Our calculated output is well below both thresholds:
≤ 0.8 mW/cm² at 1 cm — below the retinal limit, 13× below the corneal limit.


Why Current (mA) Isn’t Enough

LED current (mA) is not a direct measure of safety. Irradiance (power per unit area) determines actual eye exposure:

Irradiance E = Radiant Intensity Ie / Illuminated Area A
 A            = r² · Ω          where Ω = 2π(1−cosθ)
  • Ie = radiant intensity (in mW/sr, from datasheet)
  • r = distance from LED to cornea (worst-case 1 cm)
  • θ = half-angle of LED emission cone (datasheet: 60°, full angle 120°)
  • Ω = solid angle in steradians
    (for θ = 60° → Ω ≈ π sr)
    → A = π cm² at 1 cm

Hardware Exposure Calculations

LED: XL‑3216HIRC‑850

Datasheet ValueSymbolNotes
Radiant intensity @ 20 mAIe₍20ₘₐ₎ = 5 mW/srTypical max value, 60° half-angle
Full emission angle120°⇒ θ = 60°, Ω ≈ π sr

Radiant intensity scales roughly linearly with current:

Ie = Ie₍20ₘₐ₎ × (I_drive / 20 mA)

V3 Module (2 LEDs @ 3.2 mA each)

Ie_single  = 5 × (3.2 / 20) = 0.80 mW/sr
 E_single   = 0.80 / π = 0.25 mW/cm²
 E_total    = 0.25 × 2 = 0.51 mW/cm²
diff --git a/assets/getting_started_things_to_know.md.4cd89e47.js b/assets/getting_started_things_to_know.md.99db9ad8.js
similarity index 96%
rename from assets/getting_started_things_to_know.md.4cd89e47.js
rename to assets/getting_started_things_to_know.md.99db9ad8.js
index d7e655e..fbc2681 100644
--- a/assets/getting_started_things_to_know.md.4cd89e47.js
+++ b/assets/getting_started_things_to_know.md.99db9ad8.js
@@ -1 +1 @@
-import{_ as t,o as a,c as o,O as i}from"./chunks/framework.47aa8d5b.js";const f=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/things_to_know.md","filePath":"getting_started/things_to_know.md","lastUpdated":1745114204000}'),n={name:"getting_started/things_to_know.md"};function r(s,e,l,d,u,h){return a(),o("div",null,e[0]||(e[0]=[i('

Things To Know Before You Start

This page is an overview of things to know and understand before you start this project

Software is not final

Bugs can and will occur which may hinder the experience or usability at times. Do not expect 100% reliable and perfect function. Not all features are fully developed yet.

Firmware may have user difficulties

As our firmware matures, bugs may creep up that make the process not flawless.

IR emitters can be dangerous

If handled wrong or precautions are ignored you can and will cause damage to your eyes. Please make sure to only buy linked emitters at calculated power or ones with specs that match exactly. We will not be responsible for damage caused if you go your own route. Our official kits are designed to be well within safety limits when used as designed.

Documentation may be incomplete

Important steps may be missing or unclear. We are working to bring documentation to completeness but it is a large undertaking and takes time. Feel free to ask questions in our Discord if things are unclear.

Once you have acknowledged the items above, move on to the Full Build Guide

',11)]))}const m=t(n,[["render",r]]);export{f as __pageData,m as default}; +import{_ as t,o as a,c as o,O as i}from"./chunks/framework.ece1a6f0.js";const f=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/things_to_know.md","filePath":"getting_started/things_to_know.md","lastUpdated":1745114204000}'),n={name:"getting_started/things_to_know.md"};function r(s,e,l,d,u,h){return a(),o("div",null,e[0]||(e[0]=[i('

Things To Know Before You Start

This page is an overview of things to know and understand before you start this project

Software is not final

Bugs can and will occur which may hinder the experience or usability at times. Do not expect 100% reliable and perfect function. Not all features are fully developed yet.

Firmware may have user difficulties

As our firmware matures, bugs may creep up that make the process not flawless.

IR emitters can be dangerous

If handled wrong or precautions are ignored you can and will cause damage to your eyes. Please make sure to only buy linked emitters at calculated power or ones with specs that match exactly. We will not be responsible for damage caused if you go your own route. Our official kits are designed to be well within safety limits when used as designed.

Documentation may be incomplete

Important steps may be missing or unclear. We are working to bring documentation to completeness but it is a large undertaking and takes time. Feel free to ask questions in our Discord if things are unclear.

Once you have acknowledged the items above, move on to the Full Build Guide

',11)]))}const m=t(n,[["render",r]]);export{f as __pageData,m as default}; diff --git a/assets/getting_started_things_to_know.md.4cd89e47.lean.js b/assets/getting_started_things_to_know.md.99db9ad8.lean.js similarity index 96% rename from assets/getting_started_things_to_know.md.4cd89e47.lean.js rename to assets/getting_started_things_to_know.md.99db9ad8.lean.js index d7e655e..fbc2681 100644 --- a/assets/getting_started_things_to_know.md.4cd89e47.lean.js +++ b/assets/getting_started_things_to_know.md.99db9ad8.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,O as i}from"./chunks/framework.47aa8d5b.js";const f=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/things_to_know.md","filePath":"getting_started/things_to_know.md","lastUpdated":1745114204000}'),n={name:"getting_started/things_to_know.md"};function r(s,e,l,d,u,h){return a(),o("div",null,e[0]||(e[0]=[i('

Things To Know Before You Start

This page is an overview of things to know and understand before you start this project

Software is not final

Bugs can and will occur which may hinder the experience or usability at times. Do not expect 100% reliable and perfect function. Not all features are fully developed yet.

Firmware may have user difficulties

As our firmware matures, bugs may creep up that make the process not flawless.

IR emitters can be dangerous

If handled wrong or precautions are ignored you can and will cause damage to your eyes. Please make sure to only buy linked emitters at calculated power or ones with specs that match exactly. We will not be responsible for damage caused if you go your own route. Our official kits are designed to be well within safety limits when used as designed.

Documentation may be incomplete

Important steps may be missing or unclear. We are working to bring documentation to completeness but it is a large undertaking and takes time. Feel free to ask questions in our Discord if things are unclear.

Once you have acknowledged the items above, move on to the Full Build Guide

',11)]))}const m=t(n,[["render",r]]);export{f as __pageData,m as default}; +import{_ as t,o as a,c as o,O as i}from"./chunks/framework.ece1a6f0.js";const f=JSON.parse('{"title":"Things To Know Before You Start","description":"","frontmatter":{},"headers":[],"relativePath":"getting_started/things_to_know.md","filePath":"getting_started/things_to_know.md","lastUpdated":1745114204000}'),n={name:"getting_started/things_to_know.md"};function r(s,e,l,d,u,h){return a(),o("div",null,e[0]||(e[0]=[i('

Things To Know Before You Start

This page is an overview of things to know and understand before you start this project

Software is not final

Bugs can and will occur which may hinder the experience or usability at times. Do not expect 100% reliable and perfect function. Not all features are fully developed yet.

Firmware may have user difficulties

As our firmware matures, bugs may creep up that make the process not flawless.

IR emitters can be dangerous

If handled wrong or precautions are ignored you can and will cause damage to your eyes. Please make sure to only buy linked emitters at calculated power or ones with specs that match exactly. We will not be responsible for damage caused if you go your own route. Our official kits are designed to be well within safety limits when used as designed.

Documentation may be incomplete

Important steps may be missing or unclear. We are working to bring documentation to completeness but it is a large undertaking and takes time. Feel free to ask questions in our Discord if things are unclear.

Once you have acknowledged the items above, move on to the Full Build Guide

',11)]))}const m=t(n,[["render",r]]);export{f as __pageData,m as default}; diff --git a/assets/headset_guides_valve_index.md.891da17f.js b/assets/headset_guides_valve_index.md.2a84f8ad.js similarity index 98% rename from assets/headset_guides_valve_index.md.891da17f.js rename to assets/headset_guides_valve_index.md.2a84f8ad.js index a52917d..1f4b58a 100644 --- a/assets/headset_guides_valve_index.md.891da17f.js +++ b/assets/headset_guides_valve_index.md.2a84f8ad.js @@ -1 +1 @@ -import{_ as t,o as r,c as a,O as i}from"./chunks/framework.47aa8d5b.js";const p=JSON.parse('{"title":"Valve Index","description":"","frontmatter":{},"headers":[],"relativePath":"headset_guides/valve_index.md","filePath":"headset_guides/valve_index.md","lastUpdated":1727916239000}'),o={name:"headset_guides/valve_index.md"};function n(l,e,s,h,d,u){return r(),a("div",null,e[0]||(e[0]=[i('

Valve Index

These are two proven/tested ways to do a clean ETVR build on the Valve Index. Don't treat this as a must follow, but a setup to go for if you don't have other plans.

Physics-Dude's 160° V18 (mirror the STL for left)

Foow17's 130 / 160°

Foow17's 130 / 160° VROPTICIAN

Frosty704's 160/120° WidmoVR Mount

Please note due to the LED positioning, these will require you to use the included 110mm extensions included in the V4 Kit

V4 LED Kit Assembly

MUTEtheCyberwolf's DEV Frunk Mod:

DevFrunk1HMD

Mod Details

The DEV Frunk is a popular choice for ETVR on the Index. Replacing the original index frunk entirely, it has multiple mounting points for both the XIAO's, a Vive Facial Tracker (or project babble!), and cutouts for 30x30x7mm fans.

It also provides excellent ventilation simply due to the design being much more open, as well as a flip up design for the face tracker mount.

Combined, it creates a clean setup with no need for hot glue or alternatives to mount your hardware.

Extra Parts Needed:

I recommend a screw kit like this one

  • 1x T5 Torx Screwdriver
  • 1x H3.0 Screwdriver
  • 1x Soldering Iron for heat inserts
  • 8x M4x8.1 Heat Inserts AliExpress Choose Size: M4 (OD 6mm)50pcs | Color: Length 8mm
  • 6x M4x10 Screws AliExpress Choose Size: M4 20pcs | Length: 10mm
  • 1x M4x30 Screws AliExpress Choose Size: M4 20pcs | Length: 30mm

3D Printed Mounts

Found at MUTEtheCyberwolf's GitHub Repo

You will need to print:

  • 1x Coverplate for XIAO Retention Clip (Logo or no Logo)
  • 1x XIAO Retention Clip (Letters or no Letters)
  • 1x Eyetrack VR Prototype XIAO Mount.stl
  • 1x FacialTrackerBeerHingeVIDEVFrunk1.stl
  • 1x FacialTrackerBridgeVIDEVFrunk1.stl
  • 1x ValveIndexDEVFrunk1.stl
    • Alternatively, if you are interested in routing the ribbon cables internally, this modified DEV Frunk has holes at the top for sliding through ribbon cables and power cables. Example

Drawing1

Assembly Details:

1. Heat Inserts

  1. Start with inserting your heat inserts to the designated holes on the frunk. Place the heat inserts so the side with the smaller radius sits in the hole
  • When heating up the inserts, let the weight of the soldering iron do the work, they make take a few seconds to start moving on their own.
    • Do not push down, and remove the iron when they are level with the print. It doesn't need to be perfect, so take your time!

FRUNK

Bottom picture courtesy of amoistman

  1. Next, place a heat insert into the bigger hole of the facial tracker bridge

BRIDGE

  1. Lastly, place another heat insert into the thick side of the beer hinge

HINGE

  1. Your finished heat inserts should look like this

INSERTSEXAMPLE

Picture courtesy of amoistman

2. Screws

Now you're done with the hardest part! We can move onto screwing in the XIAO Mount and Facial tracker bridge onto the frunk, into the heat inserts we just inserted.

  • The XIAO mount should be placed so the longer side is not blocking the fan holes
  • If you have trouble screwing them in, try screwing them equally to distribute the pressure more evenly.
    • Screw one a little, screw the opposite the same amount, repeat.

M4SCREWGUIDE

Two last things to screw in will be the beer hinge and vive facial tracker or babble case if you have it

  1. Place the smaller hole of the beer hinge inbetween the bridge's screw holes.
    • Screwing in opposite of where the heat insert is. You should be screwing into the heat insert

M4SCREWGUIDE2

  1. For the last screw, repeat the same steps, but line up your face tracker or babble case. Screw from the same direction, into the heat insert of the beer hinge. Use either an M4x10 or an M4x30. I find the M4x10 sometimes loses tension, while the M4x30 doesnt.

  2. Your final result should look like this FINAL

3. Mounting components

  1. You can now push the XIAO's into the mount, making sure they are down snug, if you haven't already.

XIAO

  1. Place your V4 LED kit PCB into the middle of the XIAO Retention Clip. Ensure the hole in the PCB alligns with the small bump on the retention clip. You will have to slide it in and push it under the overhangs until they snap over the PCB.

XIAO-V4

  1. Route your V4 LED connectors through the coverplate holes prior to putting it on

V4POWER

  1. Place the coverplate ontop of the LED PCB until the front of it snaps down and locks it over the retention clip.

  2. Then you can slide the retention clip over your XIAO mount to keep them in place.

4. Replacing frunk

PLEASE UNPLUG YOUR INDEX FROM POWER BEFORE CONTINUING

You must have a T5 Torx screwdriver to remove the original index frunk screws, we will use the same screws to hold the dev frunk in place.

Picture courtesy of iFixit

T5SCREWS

  1. If you do not have fans, and are mounting a USB Hub infront, I recommend now plugging in the USB hub through the fan holes, as you won't be able to after dev frunk is screwed on.

Alternatively, you can use the USB C port below the middle bottom screw, and passthrough a hub with a FEMALE USB-C/A to MALE USB A cable

  1. Once the frunk is removed, line up your DEV Frunk and screw it back in the same way. Support it in a way you can screw in without it falling.

T5SCREWS2

Physics-Dude's Gumstick USB Hub Dongle

newnewnewnwe

Mod Details

Physics-Dude's Gumstick Dongle provides a way to cleanly install EyeTrackVR, all fitting into the frunk. It will require significantly more tinkering and ability to solder.

Installation instructions and BOM available on Physics-Dude's Repo

',66)]))}const m=t(o,[["render",n]]);export{p as __pageData,m as default}; +import{_ as t,o as r,c as a,O as i}from"./chunks/framework.ece1a6f0.js";const p=JSON.parse('{"title":"Valve Index","description":"","frontmatter":{},"headers":[],"relativePath":"headset_guides/valve_index.md","filePath":"headset_guides/valve_index.md","lastUpdated":1727916239000}'),o={name:"headset_guides/valve_index.md"};function n(l,e,s,h,d,u){return r(),a("div",null,e[0]||(e[0]=[i('

Valve Index

These are two proven/tested ways to do a clean ETVR build on the Valve Index. Don't treat this as a must follow, but a setup to go for if you don't have other plans.

Physics-Dude's 160° V18 (mirror the STL for left)

Foow17's 130 / 160°

Foow17's 130 / 160° VROPTICIAN

Frosty704's 160/120° WidmoVR Mount

Please note due to the LED positioning, these will require you to use the included 110mm extensions included in the V4 Kit

V4 LED Kit Assembly

MUTEtheCyberwolf's DEV Frunk Mod:

DevFrunk1HMD

Mod Details

The DEV Frunk is a popular choice for ETVR on the Index. Replacing the original index frunk entirely, it has multiple mounting points for both the XIAO's, a Vive Facial Tracker (or project babble!), and cutouts for 30x30x7mm fans.

It also provides excellent ventilation simply due to the design being much more open, as well as a flip up design for the face tracker mount.

Combined, it creates a clean setup with no need for hot glue or alternatives to mount your hardware.

Extra Parts Needed:

I recommend a screw kit like this one

  • 1x T5 Torx Screwdriver
  • 1x H3.0 Screwdriver
  • 1x Soldering Iron for heat inserts
  • 8x M4x8.1 Heat Inserts AliExpress Choose Size: M4 (OD 6mm)50pcs | Color: Length 8mm
  • 6x M4x10 Screws AliExpress Choose Size: M4 20pcs | Length: 10mm
  • 1x M4x30 Screws AliExpress Choose Size: M4 20pcs | Length: 30mm

3D Printed Mounts

Found at MUTEtheCyberwolf's GitHub Repo

You will need to print:

  • 1x Coverplate for XIAO Retention Clip (Logo or no Logo)
  • 1x XIAO Retention Clip (Letters or no Letters)
  • 1x Eyetrack VR Prototype XIAO Mount.stl
  • 1x FacialTrackerBeerHingeVIDEVFrunk1.stl
  • 1x FacialTrackerBridgeVIDEVFrunk1.stl
  • 1x ValveIndexDEVFrunk1.stl
    • Alternatively, if you are interested in routing the ribbon cables internally, this modified DEV Frunk has holes at the top for sliding through ribbon cables and power cables. Example

Drawing1

Assembly Details:

1. Heat Inserts

  1. Start with inserting your heat inserts to the designated holes on the frunk. Place the heat inserts so the side with the smaller radius sits in the hole
  • When heating up the inserts, let the weight of the soldering iron do the work, they make take a few seconds to start moving on their own.
    • Do not push down, and remove the iron when they are level with the print. It doesn't need to be perfect, so take your time!

FRUNK

Bottom picture courtesy of amoistman

  1. Next, place a heat insert into the bigger hole of the facial tracker bridge

BRIDGE

  1. Lastly, place another heat insert into the thick side of the beer hinge

HINGE

  1. Your finished heat inserts should look like this

INSERTSEXAMPLE

Picture courtesy of amoistman

2. Screws

Now you're done with the hardest part! We can move onto screwing in the XIAO Mount and Facial tracker bridge onto the frunk, into the heat inserts we just inserted.

  • The XIAO mount should be placed so the longer side is not blocking the fan holes
  • If you have trouble screwing them in, try screwing them equally to distribute the pressure more evenly.
    • Screw one a little, screw the opposite the same amount, repeat.

M4SCREWGUIDE

Two last things to screw in will be the beer hinge and vive facial tracker or babble case if you have it

  1. Place the smaller hole of the beer hinge inbetween the bridge's screw holes.
    • Screwing in opposite of where the heat insert is. You should be screwing into the heat insert

M4SCREWGUIDE2

  1. For the last screw, repeat the same steps, but line up your face tracker or babble case. Screw from the same direction, into the heat insert of the beer hinge. Use either an M4x10 or an M4x30. I find the M4x10 sometimes loses tension, while the M4x30 doesnt.

  2. Your final result should look like this FINAL

3. Mounting components

  1. You can now push the XIAO's into the mount, making sure they are down snug, if you haven't already.

XIAO

  1. Place your V4 LED kit PCB into the middle of the XIAO Retention Clip. Ensure the hole in the PCB alligns with the small bump on the retention clip. You will have to slide it in and push it under the overhangs until they snap over the PCB.

XIAO-V4

  1. Route your V4 LED connectors through the coverplate holes prior to putting it on

V4POWER

  1. Place the coverplate ontop of the LED PCB until the front of it snaps down and locks it over the retention clip.

  2. Then you can slide the retention clip over your XIAO mount to keep them in place.

4. Replacing frunk

PLEASE UNPLUG YOUR INDEX FROM POWER BEFORE CONTINUING

You must have a T5 Torx screwdriver to remove the original index frunk screws, we will use the same screws to hold the dev frunk in place.

Picture courtesy of iFixit

T5SCREWS

  1. If you do not have fans, and are mounting a USB Hub infront, I recommend now plugging in the USB hub through the fan holes, as you won't be able to after dev frunk is screwed on.

Alternatively, you can use the USB C port below the middle bottom screw, and passthrough a hub with a FEMALE USB-C/A to MALE USB A cable

  1. Once the frunk is removed, line up your DEV Frunk and screw it back in the same way. Support it in a way you can screw in without it falling.

T5SCREWS2

Physics-Dude's Gumstick USB Hub Dongle

newnewnewnwe

Mod Details

Physics-Dude's Gumstick Dongle provides a way to cleanly install EyeTrackVR, all fitting into the frunk. It will require significantly more tinkering and ability to solder.

Installation instructions and BOM available on Physics-Dude's Repo

',66)]))}const m=t(o,[["render",n]]);export{p as __pageData,m as default}; diff --git a/assets/headset_guides_valve_index.md.891da17f.lean.js b/assets/headset_guides_valve_index.md.2a84f8ad.lean.js similarity index 98% rename from assets/headset_guides_valve_index.md.891da17f.lean.js rename to assets/headset_guides_valve_index.md.2a84f8ad.lean.js index a52917d..1f4b58a 100644 --- a/assets/headset_guides_valve_index.md.891da17f.lean.js +++ b/assets/headset_guides_valve_index.md.2a84f8ad.lean.js @@ -1 +1 @@ -import{_ as t,o as r,c as a,O as i}from"./chunks/framework.47aa8d5b.js";const p=JSON.parse('{"title":"Valve Index","description":"","frontmatter":{},"headers":[],"relativePath":"headset_guides/valve_index.md","filePath":"headset_guides/valve_index.md","lastUpdated":1727916239000}'),o={name:"headset_guides/valve_index.md"};function n(l,e,s,h,d,u){return r(),a("div",null,e[0]||(e[0]=[i('

Valve Index

These are two proven/tested ways to do a clean ETVR build on the Valve Index. Don't treat this as a must follow, but a setup to go for if you don't have other plans.

Physics-Dude's 160° V18 (mirror the STL for left)

Foow17's 130 / 160°

Foow17's 130 / 160° VROPTICIAN

Frosty704's 160/120° WidmoVR Mount

Please note due to the LED positioning, these will require you to use the included 110mm extensions included in the V4 Kit

V4 LED Kit Assembly

MUTEtheCyberwolf's DEV Frunk Mod:

DevFrunk1HMD

Mod Details

The DEV Frunk is a popular choice for ETVR on the Index. Replacing the original index frunk entirely, it has multiple mounting points for both the XIAO's, a Vive Facial Tracker (or project babble!), and cutouts for 30x30x7mm fans.

It also provides excellent ventilation simply due to the design being much more open, as well as a flip up design for the face tracker mount.

Combined, it creates a clean setup with no need for hot glue or alternatives to mount your hardware.

Extra Parts Needed:

I recommend a screw kit like this one

  • 1x T5 Torx Screwdriver
  • 1x H3.0 Screwdriver
  • 1x Soldering Iron for heat inserts
  • 8x M4x8.1 Heat Inserts AliExpress Choose Size: M4 (OD 6mm)50pcs | Color: Length 8mm
  • 6x M4x10 Screws AliExpress Choose Size: M4 20pcs | Length: 10mm
  • 1x M4x30 Screws AliExpress Choose Size: M4 20pcs | Length: 30mm

3D Printed Mounts

Found at MUTEtheCyberwolf's GitHub Repo

You will need to print:

  • 1x Coverplate for XIAO Retention Clip (Logo or no Logo)
  • 1x XIAO Retention Clip (Letters or no Letters)
  • 1x Eyetrack VR Prototype XIAO Mount.stl
  • 1x FacialTrackerBeerHingeVIDEVFrunk1.stl
  • 1x FacialTrackerBridgeVIDEVFrunk1.stl
  • 1x ValveIndexDEVFrunk1.stl
    • Alternatively, if you are interested in routing the ribbon cables internally, this modified DEV Frunk has holes at the top for sliding through ribbon cables and power cables. Example

Drawing1

Assembly Details:

1. Heat Inserts

  1. Start with inserting your heat inserts to the designated holes on the frunk. Place the heat inserts so the side with the smaller radius sits in the hole
  • When heating up the inserts, let the weight of the soldering iron do the work, they make take a few seconds to start moving on their own.
    • Do not push down, and remove the iron when they are level with the print. It doesn't need to be perfect, so take your time!

FRUNK

Bottom picture courtesy of amoistman

  1. Next, place a heat insert into the bigger hole of the facial tracker bridge

BRIDGE

  1. Lastly, place another heat insert into the thick side of the beer hinge

HINGE

  1. Your finished heat inserts should look like this

INSERTSEXAMPLE

Picture courtesy of amoistman

2. Screws

Now you're done with the hardest part! We can move onto screwing in the XIAO Mount and Facial tracker bridge onto the frunk, into the heat inserts we just inserted.

  • The XIAO mount should be placed so the longer side is not blocking the fan holes
  • If you have trouble screwing them in, try screwing them equally to distribute the pressure more evenly.
    • Screw one a little, screw the opposite the same amount, repeat.

M4SCREWGUIDE

Two last things to screw in will be the beer hinge and vive facial tracker or babble case if you have it

  1. Place the smaller hole of the beer hinge inbetween the bridge's screw holes.
    • Screwing in opposite of where the heat insert is. You should be screwing into the heat insert

M4SCREWGUIDE2

  1. For the last screw, repeat the same steps, but line up your face tracker or babble case. Screw from the same direction, into the heat insert of the beer hinge. Use either an M4x10 or an M4x30. I find the M4x10 sometimes loses tension, while the M4x30 doesnt.

  2. Your final result should look like this FINAL

3. Mounting components

  1. You can now push the XIAO's into the mount, making sure they are down snug, if you haven't already.

XIAO

  1. Place your V4 LED kit PCB into the middle of the XIAO Retention Clip. Ensure the hole in the PCB alligns with the small bump on the retention clip. You will have to slide it in and push it under the overhangs until they snap over the PCB.

XIAO-V4

  1. Route your V4 LED connectors through the coverplate holes prior to putting it on

V4POWER

  1. Place the coverplate ontop of the LED PCB until the front of it snaps down and locks it over the retention clip.

  2. Then you can slide the retention clip over your XIAO mount to keep them in place.

4. Replacing frunk

PLEASE UNPLUG YOUR INDEX FROM POWER BEFORE CONTINUING

You must have a T5 Torx screwdriver to remove the original index frunk screws, we will use the same screws to hold the dev frunk in place.

Picture courtesy of iFixit

T5SCREWS

  1. If you do not have fans, and are mounting a USB Hub infront, I recommend now plugging in the USB hub through the fan holes, as you won't be able to after dev frunk is screwed on.

Alternatively, you can use the USB C port below the middle bottom screw, and passthrough a hub with a FEMALE USB-C/A to MALE USB A cable

  1. Once the frunk is removed, line up your DEV Frunk and screw it back in the same way. Support it in a way you can screw in without it falling.

T5SCREWS2

Physics-Dude's Gumstick USB Hub Dongle

newnewnewnwe

Mod Details

Physics-Dude's Gumstick Dongle provides a way to cleanly install EyeTrackVR, all fitting into the frunk. It will require significantly more tinkering and ability to solder.

Installation instructions and BOM available on Physics-Dude's Repo

',66)]))}const m=t(o,[["render",n]]);export{p as __pageData,m as default}; +import{_ as t,o as r,c as a,O as i}from"./chunks/framework.ece1a6f0.js";const p=JSON.parse('{"title":"Valve Index","description":"","frontmatter":{},"headers":[],"relativePath":"headset_guides/valve_index.md","filePath":"headset_guides/valve_index.md","lastUpdated":1727916239000}'),o={name:"headset_guides/valve_index.md"};function n(l,e,s,h,d,u){return r(),a("div",null,e[0]||(e[0]=[i('

Valve Index

These are two proven/tested ways to do a clean ETVR build on the Valve Index. Don't treat this as a must follow, but a setup to go for if you don't have other plans.

Physics-Dude's 160° V18 (mirror the STL for left)

Foow17's 130 / 160°

Foow17's 130 / 160° VROPTICIAN

Frosty704's 160/120° WidmoVR Mount

Please note due to the LED positioning, these will require you to use the included 110mm extensions included in the V4 Kit

V4 LED Kit Assembly

MUTEtheCyberwolf's DEV Frunk Mod:

DevFrunk1HMD

Mod Details

The DEV Frunk is a popular choice for ETVR on the Index. Replacing the original index frunk entirely, it has multiple mounting points for both the XIAO's, a Vive Facial Tracker (or project babble!), and cutouts for 30x30x7mm fans.

It also provides excellent ventilation simply due to the design being much more open, as well as a flip up design for the face tracker mount.

Combined, it creates a clean setup with no need for hot glue or alternatives to mount your hardware.

Extra Parts Needed:

I recommend a screw kit like this one

  • 1x T5 Torx Screwdriver
  • 1x H3.0 Screwdriver
  • 1x Soldering Iron for heat inserts
  • 8x M4x8.1 Heat Inserts AliExpress Choose Size: M4 (OD 6mm)50pcs | Color: Length 8mm
  • 6x M4x10 Screws AliExpress Choose Size: M4 20pcs | Length: 10mm
  • 1x M4x30 Screws AliExpress Choose Size: M4 20pcs | Length: 30mm

3D Printed Mounts

Found at MUTEtheCyberwolf's GitHub Repo

You will need to print:

  • 1x Coverplate for XIAO Retention Clip (Logo or no Logo)
  • 1x XIAO Retention Clip (Letters or no Letters)
  • 1x Eyetrack VR Prototype XIAO Mount.stl
  • 1x FacialTrackerBeerHingeVIDEVFrunk1.stl
  • 1x FacialTrackerBridgeVIDEVFrunk1.stl
  • 1x ValveIndexDEVFrunk1.stl
    • Alternatively, if you are interested in routing the ribbon cables internally, this modified DEV Frunk has holes at the top for sliding through ribbon cables and power cables. Example

Drawing1

Assembly Details:

1. Heat Inserts

  1. Start with inserting your heat inserts to the designated holes on the frunk. Place the heat inserts so the side with the smaller radius sits in the hole
  • When heating up the inserts, let the weight of the soldering iron do the work, they make take a few seconds to start moving on their own.
    • Do not push down, and remove the iron when they are level with the print. It doesn't need to be perfect, so take your time!

FRUNK

Bottom picture courtesy of amoistman

  1. Next, place a heat insert into the bigger hole of the facial tracker bridge

BRIDGE

  1. Lastly, place another heat insert into the thick side of the beer hinge

HINGE

  1. Your finished heat inserts should look like this

INSERTSEXAMPLE

Picture courtesy of amoistman

2. Screws

Now you're done with the hardest part! We can move onto screwing in the XIAO Mount and Facial tracker bridge onto the frunk, into the heat inserts we just inserted.

  • The XIAO mount should be placed so the longer side is not blocking the fan holes
  • If you have trouble screwing them in, try screwing them equally to distribute the pressure more evenly.
    • Screw one a little, screw the opposite the same amount, repeat.

M4SCREWGUIDE

Two last things to screw in will be the beer hinge and vive facial tracker or babble case if you have it

  1. Place the smaller hole of the beer hinge inbetween the bridge's screw holes.
    • Screwing in opposite of where the heat insert is. You should be screwing into the heat insert

M4SCREWGUIDE2

  1. For the last screw, repeat the same steps, but line up your face tracker or babble case. Screw from the same direction, into the heat insert of the beer hinge. Use either an M4x10 or an M4x30. I find the M4x10 sometimes loses tension, while the M4x30 doesnt.

  2. Your final result should look like this FINAL

3. Mounting components

  1. You can now push the XIAO's into the mount, making sure they are down snug, if you haven't already.

XIAO

  1. Place your V4 LED kit PCB into the middle of the XIAO Retention Clip. Ensure the hole in the PCB alligns with the small bump on the retention clip. You will have to slide it in and push it under the overhangs until they snap over the PCB.

XIAO-V4

  1. Route your V4 LED connectors through the coverplate holes prior to putting it on

V4POWER

  1. Place the coverplate ontop of the LED PCB until the front of it snaps down and locks it over the retention clip.

  2. Then you can slide the retention clip over your XIAO mount to keep them in place.

4. Replacing frunk

PLEASE UNPLUG YOUR INDEX FROM POWER BEFORE CONTINUING

You must have a T5 Torx screwdriver to remove the original index frunk screws, we will use the same screws to hold the dev frunk in place.

Picture courtesy of iFixit

T5SCREWS

  1. If you do not have fans, and are mounting a USB Hub infront, I recommend now plugging in the USB hub through the fan holes, as you won't be able to after dev frunk is screwed on.

Alternatively, you can use the USB C port below the middle bottom screw, and passthrough a hub with a FEMALE USB-C/A to MALE USB A cable

  1. Once the frunk is removed, line up your DEV Frunk and screw it back in the same way. Support it in a way you can screw in without it falling.

T5SCREWS2

Physics-Dude's Gumstick USB Hub Dongle

newnewnewnwe

Mod Details

Physics-Dude's Gumstick Dongle provides a way to cleanly install EyeTrackVR, all fitting into the frunk. It will require significantly more tinkering and ability to solder.

Installation instructions and BOM available on Physics-Dude's Repo

',66)]))}const m=t(o,[["render",n]]);export{p as __pageData,m as default}; diff --git a/assets/headset_guides_what_is_this.md.60052a7d.js b/assets/headset_guides_what_is_this.md.7430c224.js similarity index 97% rename from assets/headset_guides_what_is_this.md.60052a7d.js rename to assets/headset_guides_what_is_this.md.7430c224.js index 7cab04e..da8b829 100644 --- a/assets/headset_guides_what_is_this.md.60052a7d.js +++ b/assets/headset_guides_what_is_this.md.7430c224.js @@ -1 +1 @@ -import{_ as a,o as t,c as o,O as i}from"./chunks/framework.47aa8d5b.js";const u=JSON.parse('{"title":"What are \\"Headset Specific Guides\\"?","description":"","frontmatter":{},"headers":[],"relativePath":"headset_guides/what_is_this.md","filePath":"headset_guides/what_is_this.md","lastUpdated":1728244499000}'),s={name:"headset_guides/what_is_this.md"};function r(n,e,d,l,p,c){return t(),o("div",null,e[0]||(e[0]=[i('

What are "Headset Specific Guides"?

This is an initiative to provide specific information on specific headsets. Any weird quirks, recommended 3d printed mounts and different setup types are to be included on a page.

Complete submissions will receive a 50% off coupon for the ETVR store. Partial completions (one specific mount) will receive 15% off coupons to show our appreciation and provide an incentive. (reach out to me in dms to receive the code @prohurtz)

Thank you for working to improve EyeTrackVR's accessibility!

Guidelines

Please keep it as concise as possible, and spell check before submitting. You can submit by making a PR on github, or sending the .md file to #documentation in the ETVR Discord pinging @prohurtz . Take a look at the Valve Index guide for inspiration.

file name: headset_name.md ex. HTC_Vive_Pro_2.md, Bigscreen_Beyond.md

Page formatting and template:

Headset Name

Xyz's mod:

[image(s) of mod (limit ~2)]

Mod Details

This mod supports lens inserts and is very compact and easy to use. It provides good frunk ventilation and wide hardware support.

Extra Parts Needed:

  • 2x Camera extensions
  • 2x Camera extension connectors

Parts Link (If the parts needed are not on the additional parts page, let me know. You can also just directly link to them.)

3D Printed Mounts

Found at Xyz's GitHub

You will need to print:

  • 2x camera mount
  • 2x frunk mount

Lens insert support Yes/No: Yes Compatable mount

Note

There are 160 and 130-degree variants for camera mounts; pick which one corresponds with your cameras.

Assembly Details:

(make sure to include quirks of setup not covered in other parts of documentation)

First, screw an M2 screw into the hole on part A:

[image showing "part A" and screw]

You must have a Torx screwdriver set to remove the frunk screw, do so now.

[image]

Then attach part b and tighten:

[image]

Now clip on [image]

Abc's mod:

[image(s) of mod (limit ~2)]

Mod Details

This mod supports lens inserts and is very compact and easy to use. It provides good frunk ventilation and wide hardware support.

Extra Parts Needed:

  • 2x Camera extensions
  • 2x Camera extension connectors
  • 50 M3 screws Parts Link (If the parts needed are not on the additional parts page, let me know. You can also just directly link to them.)

3D Printed Mounts

Found at Abc's GitHub

You will need to print:

  • 2x camera mount
  • 2x frunk mount

Lens insert support Yes/No: Yes Compatable mount

Note

There are 160 and 130-degree variants for camera mounts; pick which one corresponds with your cameras.

Assembly Details:

(make sure to include quirks of setup not covered in other parts of documentation)

First, screw an M2 screw into the hole on part A:

[image showing "part A" and screw]

You must have a Torx screwdriver set to remove the frunk screw, do so now.

[image]

Then attach part b and tighten:

[image]

Now clip on [image]

',52)]))}const m=a(s,[["render",r]]);export{u as __pageData,m as default}; +import{_ as a,o as t,c as o,O as i}from"./chunks/framework.ece1a6f0.js";const u=JSON.parse('{"title":"What are \\"Headset Specific Guides\\"?","description":"","frontmatter":{},"headers":[],"relativePath":"headset_guides/what_is_this.md","filePath":"headset_guides/what_is_this.md","lastUpdated":1728244499000}'),s={name:"headset_guides/what_is_this.md"};function r(n,e,d,l,p,c){return t(),o("div",null,e[0]||(e[0]=[i('

What are "Headset Specific Guides"?

This is an initiative to provide specific information on specific headsets. Any weird quirks, recommended 3d printed mounts and different setup types are to be included on a page.

Complete submissions will receive a 50% off coupon for the ETVR store. Partial completions (one specific mount) will receive 15% off coupons to show our appreciation and provide an incentive. (reach out to me in dms to receive the code @prohurtz)

Thank you for working to improve EyeTrackVR's accessibility!

Guidelines

Please keep it as concise as possible, and spell check before submitting. You can submit by making a PR on github, or sending the .md file to #documentation in the ETVR Discord pinging @prohurtz . Take a look at the Valve Index guide for inspiration.

file name: headset_name.md ex. HTC_Vive_Pro_2.md, Bigscreen_Beyond.md

Page formatting and template:

Headset Name

Xyz's mod:

[image(s) of mod (limit ~2)]

Mod Details

This mod supports lens inserts and is very compact and easy to use. It provides good frunk ventilation and wide hardware support.

Extra Parts Needed:

  • 2x Camera extensions
  • 2x Camera extension connectors

Parts Link (If the parts needed are not on the additional parts page, let me know. You can also just directly link to them.)

3D Printed Mounts

Found at Xyz's GitHub

You will need to print:

  • 2x camera mount
  • 2x frunk mount

Lens insert support Yes/No: Yes Compatable mount

Note

There are 160 and 130-degree variants for camera mounts; pick which one corresponds with your cameras.

Assembly Details:

(make sure to include quirks of setup not covered in other parts of documentation)

First, screw an M2 screw into the hole on part A:

[image showing "part A" and screw]

You must have a Torx screwdriver set to remove the frunk screw, do so now.

[image]

Then attach part b and tighten:

[image]

Now clip on [image]

Abc's mod:

[image(s) of mod (limit ~2)]

Mod Details

This mod supports lens inserts and is very compact and easy to use. It provides good frunk ventilation and wide hardware support.

Extra Parts Needed:

  • 2x Camera extensions
  • 2x Camera extension connectors
  • 50 M3 screws Parts Link (If the parts needed are not on the additional parts page, let me know. You can also just directly link to them.)

3D Printed Mounts

Found at Abc's GitHub

You will need to print:

  • 2x camera mount
  • 2x frunk mount

Lens insert support Yes/No: Yes Compatable mount

Note

There are 160 and 130-degree variants for camera mounts; pick which one corresponds with your cameras.

Assembly Details:

(make sure to include quirks of setup not covered in other parts of documentation)

First, screw an M2 screw into the hole on part A:

[image showing "part A" and screw]

You must have a Torx screwdriver set to remove the frunk screw, do so now.

[image]

Then attach part b and tighten:

[image]

Now clip on [image]

',52)]))}const m=a(s,[["render",r]]);export{u as __pageData,m as default}; diff --git a/assets/headset_guides_what_is_this.md.60052a7d.lean.js b/assets/headset_guides_what_is_this.md.7430c224.lean.js similarity index 97% rename from assets/headset_guides_what_is_this.md.60052a7d.lean.js rename to assets/headset_guides_what_is_this.md.7430c224.lean.js index 7cab04e..da8b829 100644 --- a/assets/headset_guides_what_is_this.md.60052a7d.lean.js +++ b/assets/headset_guides_what_is_this.md.7430c224.lean.js @@ -1 +1 @@ -import{_ as a,o as t,c as o,O as i}from"./chunks/framework.47aa8d5b.js";const u=JSON.parse('{"title":"What are \\"Headset Specific Guides\\"?","description":"","frontmatter":{},"headers":[],"relativePath":"headset_guides/what_is_this.md","filePath":"headset_guides/what_is_this.md","lastUpdated":1728244499000}'),s={name:"headset_guides/what_is_this.md"};function r(n,e,d,l,p,c){return t(),o("div",null,e[0]||(e[0]=[i('

What are "Headset Specific Guides"?

This is an initiative to provide specific information on specific headsets. Any weird quirks, recommended 3d printed mounts and different setup types are to be included on a page.

Complete submissions will receive a 50% off coupon for the ETVR store. Partial completions (one specific mount) will receive 15% off coupons to show our appreciation and provide an incentive. (reach out to me in dms to receive the code @prohurtz)

Thank you for working to improve EyeTrackVR's accessibility!

Guidelines

Please keep it as concise as possible, and spell check before submitting. You can submit by making a PR on github, or sending the .md file to #documentation in the ETVR Discord pinging @prohurtz . Take a look at the Valve Index guide for inspiration.

file name: headset_name.md ex. HTC_Vive_Pro_2.md, Bigscreen_Beyond.md

Page formatting and template:

Headset Name

Xyz's mod:

[image(s) of mod (limit ~2)]

Mod Details

This mod supports lens inserts and is very compact and easy to use. It provides good frunk ventilation and wide hardware support.

Extra Parts Needed:

  • 2x Camera extensions
  • 2x Camera extension connectors

Parts Link (If the parts needed are not on the additional parts page, let me know. You can also just directly link to them.)

3D Printed Mounts

Found at Xyz's GitHub

You will need to print:

  • 2x camera mount
  • 2x frunk mount

Lens insert support Yes/No: Yes Compatable mount

Note

There are 160 and 130-degree variants for camera mounts; pick which one corresponds with your cameras.

Assembly Details:

(make sure to include quirks of setup not covered in other parts of documentation)

First, screw an M2 screw into the hole on part A:

[image showing "part A" and screw]

You must have a Torx screwdriver set to remove the frunk screw, do so now.

[image]

Then attach part b and tighten:

[image]

Now clip on [image]

Abc's mod:

[image(s) of mod (limit ~2)]

Mod Details

This mod supports lens inserts and is very compact and easy to use. It provides good frunk ventilation and wide hardware support.

Extra Parts Needed:

  • 2x Camera extensions
  • 2x Camera extension connectors
  • 50 M3 screws Parts Link (If the parts needed are not on the additional parts page, let me know. You can also just directly link to them.)

3D Printed Mounts

Found at Abc's GitHub

You will need to print:

  • 2x camera mount
  • 2x frunk mount

Lens insert support Yes/No: Yes Compatable mount

Note

There are 160 and 130-degree variants for camera mounts; pick which one corresponds with your cameras.

Assembly Details:

(make sure to include quirks of setup not covered in other parts of documentation)

First, screw an M2 screw into the hole on part A:

[image showing "part A" and screw]

You must have a Torx screwdriver set to remove the frunk screw, do so now.

[image]

Then attach part b and tighten:

[image]

Now clip on [image]

',52)]))}const m=a(s,[["render",r]]);export{u as __pageData,m as default}; +import{_ as a,o as t,c as o,O as i}from"./chunks/framework.ece1a6f0.js";const u=JSON.parse('{"title":"What are \\"Headset Specific Guides\\"?","description":"","frontmatter":{},"headers":[],"relativePath":"headset_guides/what_is_this.md","filePath":"headset_guides/what_is_this.md","lastUpdated":1728244499000}'),s={name:"headset_guides/what_is_this.md"};function r(n,e,d,l,p,c){return t(),o("div",null,e[0]||(e[0]=[i('

What are "Headset Specific Guides"?

This is an initiative to provide specific information on specific headsets. Any weird quirks, recommended 3d printed mounts and different setup types are to be included on a page.

Complete submissions will receive a 50% off coupon for the ETVR store. Partial completions (one specific mount) will receive 15% off coupons to show our appreciation and provide an incentive. (reach out to me in dms to receive the code @prohurtz)

Thank you for working to improve EyeTrackVR's accessibility!

Guidelines

Please keep it as concise as possible, and spell check before submitting. You can submit by making a PR on github, or sending the .md file to #documentation in the ETVR Discord pinging @prohurtz . Take a look at the Valve Index guide for inspiration.

file name: headset_name.md ex. HTC_Vive_Pro_2.md, Bigscreen_Beyond.md

Page formatting and template:

Headset Name

Xyz's mod:

[image(s) of mod (limit ~2)]

Mod Details

This mod supports lens inserts and is very compact and easy to use. It provides good frunk ventilation and wide hardware support.

Extra Parts Needed:

  • 2x Camera extensions
  • 2x Camera extension connectors

Parts Link (If the parts needed are not on the additional parts page, let me know. You can also just directly link to them.)

3D Printed Mounts

Found at Xyz's GitHub

You will need to print:

  • 2x camera mount
  • 2x frunk mount

Lens insert support Yes/No: Yes Compatable mount

Note

There are 160 and 130-degree variants for camera mounts; pick which one corresponds with your cameras.

Assembly Details:

(make sure to include quirks of setup not covered in other parts of documentation)

First, screw an M2 screw into the hole on part A:

[image showing "part A" and screw]

You must have a Torx screwdriver set to remove the frunk screw, do so now.

[image]

Then attach part b and tighten:

[image]

Now clip on [image]

Abc's mod:

[image(s) of mod (limit ~2)]

Mod Details

This mod supports lens inserts and is very compact and easy to use. It provides good frunk ventilation and wide hardware support.

Extra Parts Needed:

  • 2x Camera extensions
  • 2x Camera extension connectors
  • 50 M3 screws Parts Link (If the parts needed are not on the additional parts page, let me know. You can also just directly link to them.)

3D Printed Mounts

Found at Abc's GitHub

You will need to print:

  • 2x camera mount
  • 2x frunk mount

Lens insert support Yes/No: Yes Compatable mount

Note

There are 160 and 130-degree variants for camera mounts; pick which one corresponds with your cameras.

Assembly Details:

(make sure to include quirks of setup not covered in other parts of documentation)

First, screw an M2 screw into the hole on part A:

[image showing "part A" and screw]

You must have a Torx screwdriver set to remove the frunk screw, do so now.

[image]

Then attach part b and tighten:

[image]

Now clip on [image]

',52)]))}const m=a(s,[["render",r]]);export{u as __pageData,m as default}; diff --git a/assets/how_to_build_3d_printed_mounts.md.5d2aa5cb.js b/assets/how_to_build_3d_printed_mounts.md.26a27ef1.js similarity index 86% rename from assets/how_to_build_3d_printed_mounts.md.5d2aa5cb.js rename to assets/how_to_build_3d_printed_mounts.md.26a27ef1.js index 4eb34a0..24f9f51 100644 --- a/assets/how_to_build_3d_printed_mounts.md.5d2aa5cb.js +++ b/assets/how_to_build_3d_printed_mounts.md.26a27ef1.js @@ -1 +1 @@ -import{_ as n,a}from"./chunks/index.339f98d7.js";import{_ as s}from"./chunks/PartsList.b49df916.js";import{o as d,c as i,k as t,a as o,E as r,w as l,l as m}from"./chunks/framework.47aa8d5b.js";import"./chunks/Accordion.aff4964d.js";const x=JSON.parse('{"title":"3D Printed Mounts","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/3d_printed_mounts.md","filePath":"how_to_build/3d_printed_mounts.md","lastUpdated":1728244210000}'),u={name:"how_to_build/3d_printed_mounts.md"},k=Object.assign(u,{setup(h){return(p,e)=>(d(),i("div",null,[e[1]||(e[1]=t("h1",{class:"text-[var(--font-accent)]",id:"_3d-printed-mounts",tabindex:"-1"},[o("3D Printed Mounts "),t("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=t("p",null,[o("Mounts with a "),t("code",null,"★"),o(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1)),r(n,{options:m(a).parts_list_three},{content:l(()=>e[0]||(e[0]=[t("p",null," Keep in mind, some mounts only have the right(or left) version available. You may need to use blender or a slicer to mirror the STL for the other side. ",-1)])),_:1},8,["options"]),r(s),e[3]||(e[3]=t("h2",{id:"dont-see-your-headset",tabindex:"-1"},[o("Dont see your headset? "),t("a",{class:"header-anchor",href:"#dont-see-your-headset","aria-label":'Permalink to "Dont see your headset?"'},"​")],-1)),e[4]||(e[4]=t("p",null,[o("There may be mounts in the Discord that have not been added here. Check out the "),t("code",null,"#community-mounts"),o(" fourm for additional mounts "),t("a",{href:"https://discord.gg/wqZnPxdQxf",target:"_blank",rel:"noreferrer"},"here"),o(".")],-1))]))}});export{x as __pageData,k as default}; +import{_ as n,a}from"./chunks/index.c19b2931.js";import{_ as s}from"./chunks/PartsList.a520a26d.js";import{o as d,c as i,k as t,a as o,E as r,w as l,l as m}from"./chunks/framework.ece1a6f0.js";import"./chunks/Accordion.44247159.js";const x=JSON.parse('{"title":"3D Printed Mounts","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/3d_printed_mounts.md","filePath":"how_to_build/3d_printed_mounts.md","lastUpdated":1728244210000}'),u={name:"how_to_build/3d_printed_mounts.md"},k=Object.assign(u,{setup(h){return(p,e)=>(d(),i("div",null,[e[1]||(e[1]=t("h1",{class:"text-[var(--font-accent)]",id:"_3d-printed-mounts",tabindex:"-1"},[o("3D Printed Mounts "),t("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=t("p",null,[o("Mounts with a "),t("code",null,"★"),o(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1)),r(n,{options:m(a).parts_list_three},{content:l(()=>e[0]||(e[0]=[t("p",null," Keep in mind, some mounts only have the right(or left) version available. You may need to use blender or a slicer to mirror the STL for the other side. ",-1)])),_:1},8,["options"]),r(s),e[3]||(e[3]=t("h2",{id:"dont-see-your-headset",tabindex:"-1"},[o("Dont see your headset? "),t("a",{class:"header-anchor",href:"#dont-see-your-headset","aria-label":'Permalink to "Dont see your headset?"'},"​")],-1)),e[4]||(e[4]=t("p",null,[o("There may be mounts in the Discord that have not been added here. Check out the "),t("code",null,"#community-mounts"),o(" fourm for additional mounts "),t("a",{href:"https://discord.gg/wqZnPxdQxf",target:"_blank",rel:"noreferrer"},"here"),o(".")],-1))]))}});export{x as __pageData,k as default}; diff --git a/assets/how_to_build_3d_printed_mounts.md.5d2aa5cb.lean.js b/assets/how_to_build_3d_printed_mounts.md.26a27ef1.lean.js similarity index 86% rename from assets/how_to_build_3d_printed_mounts.md.5d2aa5cb.lean.js rename to assets/how_to_build_3d_printed_mounts.md.26a27ef1.lean.js index 4eb34a0..24f9f51 100644 --- a/assets/how_to_build_3d_printed_mounts.md.5d2aa5cb.lean.js +++ b/assets/how_to_build_3d_printed_mounts.md.26a27ef1.lean.js @@ -1 +1 @@ -import{_ as n,a}from"./chunks/index.339f98d7.js";import{_ as s}from"./chunks/PartsList.b49df916.js";import{o as d,c as i,k as t,a as o,E as r,w as l,l as m}from"./chunks/framework.47aa8d5b.js";import"./chunks/Accordion.aff4964d.js";const x=JSON.parse('{"title":"3D Printed Mounts","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/3d_printed_mounts.md","filePath":"how_to_build/3d_printed_mounts.md","lastUpdated":1728244210000}'),u={name:"how_to_build/3d_printed_mounts.md"},k=Object.assign(u,{setup(h){return(p,e)=>(d(),i("div",null,[e[1]||(e[1]=t("h1",{class:"text-[var(--font-accent)]",id:"_3d-printed-mounts",tabindex:"-1"},[o("3D Printed Mounts "),t("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=t("p",null,[o("Mounts with a "),t("code",null,"★"),o(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1)),r(n,{options:m(a).parts_list_three},{content:l(()=>e[0]||(e[0]=[t("p",null," Keep in mind, some mounts only have the right(or left) version available. You may need to use blender or a slicer to mirror the STL for the other side. ",-1)])),_:1},8,["options"]),r(s),e[3]||(e[3]=t("h2",{id:"dont-see-your-headset",tabindex:"-1"},[o("Dont see your headset? "),t("a",{class:"header-anchor",href:"#dont-see-your-headset","aria-label":'Permalink to "Dont see your headset?"'},"​")],-1)),e[4]||(e[4]=t("p",null,[o("There may be mounts in the Discord that have not been added here. Check out the "),t("code",null,"#community-mounts"),o(" fourm for additional mounts "),t("a",{href:"https://discord.gg/wqZnPxdQxf",target:"_blank",rel:"noreferrer"},"here"),o(".")],-1))]))}});export{x as __pageData,k as default}; +import{_ as n,a}from"./chunks/index.c19b2931.js";import{_ as s}from"./chunks/PartsList.a520a26d.js";import{o as d,c as i,k as t,a as o,E as r,w as l,l as m}from"./chunks/framework.ece1a6f0.js";import"./chunks/Accordion.44247159.js";const x=JSON.parse('{"title":"3D Printed Mounts","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/3d_printed_mounts.md","filePath":"how_to_build/3d_printed_mounts.md","lastUpdated":1728244210000}'),u={name:"how_to_build/3d_printed_mounts.md"},k=Object.assign(u,{setup(h){return(p,e)=>(d(),i("div",null,[e[1]||(e[1]=t("h1",{class:"text-[var(--font-accent)]",id:"_3d-printed-mounts",tabindex:"-1"},[o("3D Printed Mounts "),t("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=t("p",null,[o("Mounts with a "),t("code",null,"★"),o(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1)),r(n,{options:m(a).parts_list_three},{content:l(()=>e[0]||(e[0]=[t("p",null," Keep in mind, some mounts only have the right(or left) version available. You may need to use blender or a slicer to mirror the STL for the other side. ",-1)])),_:1},8,["options"]),r(s),e[3]||(e[3]=t("h2",{id:"dont-see-your-headset",tabindex:"-1"},[o("Dont see your headset? "),t("a",{class:"header-anchor",href:"#dont-see-your-headset","aria-label":'Permalink to "Dont see your headset?"'},"​")],-1)),e[4]||(e[4]=t("p",null,[o("There may be mounts in the Discord that have not been added here. Check out the "),t("code",null,"#community-mounts"),o(" fourm for additional mounts "),t("a",{href:"https://discord.gg/wqZnPxdQxf",target:"_blank",rel:"noreferrer"},"here"),o(".")],-1))]))}});export{x as __pageData,k as default}; diff --git a/assets/how_to_build_creating_your_own_mount.md.70ac1088.js b/assets/how_to_build_creating_your_own_mount.md.5b60d788.js similarity index 97% rename from assets/how_to_build_creating_your_own_mount.md.70ac1088.js rename to assets/how_to_build_creating_your_own_mount.md.5b60d788.js index 8d4520c..b43ff21 100644 --- a/assets/how_to_build_creating_your_own_mount.md.70ac1088.js +++ b/assets/how_to_build_creating_your_own_mount.md.5b60d788.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,O as r}from"./chunks/framework.47aa8d5b.js";const m=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/creating_your_own_mount.md","filePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1700510338000}'),n={name:"how_to_build/creating_your_own_mount.md"};function i(s,e,h,u,l,d){return a(),o("div",null,e[0]||(e[0]=[r('

Creating Your Own Mount

This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts

So, you have a headset that does not have any mounts or none that work well for you. Here I will show some simple steps to get some form of a mount working.

Step 1: Find a way to mount to your headset's lens

The easiest way to get started is to find a lens protector for your headset. You can visit a website like Thingiverse or do a search for "3d printed lens protector for {your headset here}"

Example: Here is a lens protector for the Quest 1/2 and Rift S https://www.thingiverse.com/thing:3653631

Step 2: Find a camera mount

Now, you need a way to attach the camera. We have a basic design created by qdot, based on his mount on the hardware GitHub here

Alternatively, you can create your own mount if you have the skills.

Step 3: Place the camera mount where it will give a good camera angle

The "Ideal" location is a place that gives a good view of the pupil when looking to all extremes, the lower corners do a good job at getting there, or nearly there.

It is recommended to place the camera as close as possible to the headset's lens to maximize the view of the eye. I recommend looking at other headset mounts for inspiration.

Step 4: Mount your LEDs

You can either add parts to your mount for holding the LED boards or just glue them on. It's up to you and what works best for you, experiment!

Step 5: Test everything

It is unlikely you will get a perfect mount on the first try. Print, test, adjust, and repeat until you have a satisfactory mount. Good luck!

Step 6: Get your mounts listed

Send me the mount to be added to the docs here! You can upload it to Thingiverse or similar services, or just send me the .STLs via discord (Prohurtz#0001)

',18)]))}const p=t(n,[["render",i]]);export{m as __pageData,p as default}; +import{_ as t,o as a,c as o,O as r}from"./chunks/framework.ece1a6f0.js";const m=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/creating_your_own_mount.md","filePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1700510338000}'),n={name:"how_to_build/creating_your_own_mount.md"};function i(s,e,h,u,l,d){return a(),o("div",null,e[0]||(e[0]=[r('

Creating Your Own Mount

This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts

So, you have a headset that does not have any mounts or none that work well for you. Here I will show some simple steps to get some form of a mount working.

Step 1: Find a way to mount to your headset's lens

The easiest way to get started is to find a lens protector for your headset. You can visit a website like Thingiverse or do a search for "3d printed lens protector for {your headset here}"

Example: Here is a lens protector for the Quest 1/2 and Rift S https://www.thingiverse.com/thing:3653631

Step 2: Find a camera mount

Now, you need a way to attach the camera. We have a basic design created by qdot, based on his mount on the hardware GitHub here

Alternatively, you can create your own mount if you have the skills.

Step 3: Place the camera mount where it will give a good camera angle

The "Ideal" location is a place that gives a good view of the pupil when looking to all extremes, the lower corners do a good job at getting there, or nearly there.

It is recommended to place the camera as close as possible to the headset's lens to maximize the view of the eye. I recommend looking at other headset mounts for inspiration.

Step 4: Mount your LEDs

You can either add parts to your mount for holding the LED boards or just glue them on. It's up to you and what works best for you, experiment!

Step 5: Test everything

It is unlikely you will get a perfect mount on the first try. Print, test, adjust, and repeat until you have a satisfactory mount. Good luck!

Step 6: Get your mounts listed

Send me the mount to be added to the docs here! You can upload it to Thingiverse or similar services, or just send me the .STLs via discord (Prohurtz#0001)

',18)]))}const p=t(n,[["render",i]]);export{m as __pageData,p as default}; diff --git a/assets/how_to_build_creating_your_own_mount.md.70ac1088.lean.js b/assets/how_to_build_creating_your_own_mount.md.5b60d788.lean.js similarity index 97% rename from assets/how_to_build_creating_your_own_mount.md.70ac1088.lean.js rename to assets/how_to_build_creating_your_own_mount.md.5b60d788.lean.js index 8d4520c..b43ff21 100644 --- a/assets/how_to_build_creating_your_own_mount.md.70ac1088.lean.js +++ b/assets/how_to_build_creating_your_own_mount.md.5b60d788.lean.js @@ -1 +1 @@ -import{_ as t,o as a,c as o,O as r}from"./chunks/framework.47aa8d5b.js";const m=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/creating_your_own_mount.md","filePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1700510338000}'),n={name:"how_to_build/creating_your_own_mount.md"};function i(s,e,h,u,l,d){return a(),o("div",null,e[0]||(e[0]=[r('

Creating Your Own Mount

This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts

So, you have a headset that does not have any mounts or none that work well for you. Here I will show some simple steps to get some form of a mount working.

Step 1: Find a way to mount to your headset's lens

The easiest way to get started is to find a lens protector for your headset. You can visit a website like Thingiverse or do a search for "3d printed lens protector for {your headset here}"

Example: Here is a lens protector for the Quest 1/2 and Rift S https://www.thingiverse.com/thing:3653631

Step 2: Find a camera mount

Now, you need a way to attach the camera. We have a basic design created by qdot, based on his mount on the hardware GitHub here

Alternatively, you can create your own mount if you have the skills.

Step 3: Place the camera mount where it will give a good camera angle

The "Ideal" location is a place that gives a good view of the pupil when looking to all extremes, the lower corners do a good job at getting there, or nearly there.

It is recommended to place the camera as close as possible to the headset's lens to maximize the view of the eye. I recommend looking at other headset mounts for inspiration.

Step 4: Mount your LEDs

You can either add parts to your mount for holding the LED boards or just glue them on. It's up to you and what works best for you, experiment!

Step 5: Test everything

It is unlikely you will get a perfect mount on the first try. Print, test, adjust, and repeat until you have a satisfactory mount. Good luck!

Step 6: Get your mounts listed

Send me the mount to be added to the docs here! You can upload it to Thingiverse or similar services, or just send me the .STLs via discord (Prohurtz#0001)

',18)]))}const p=t(n,[["render",i]]);export{m as __pageData,p as default}; +import{_ as t,o as a,c as o,O as r}from"./chunks/framework.ece1a6f0.js";const m=JSON.parse('{"title":"Creating Your Own Mount","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/creating_your_own_mount.md","filePath":"how_to_build/creating_your_own_mount.md","lastUpdated":1700510338000}'),n={name:"how_to_build/creating_your_own_mount.md"};function i(s,e,h,u,l,d){return a(),o("div",null,e[0]||(e[0]=[r('

Creating Your Own Mount

This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts

So, you have a headset that does not have any mounts or none that work well for you. Here I will show some simple steps to get some form of a mount working.

Step 1: Find a way to mount to your headset's lens

The easiest way to get started is to find a lens protector for your headset. You can visit a website like Thingiverse or do a search for "3d printed lens protector for {your headset here}"

Example: Here is a lens protector for the Quest 1/2 and Rift S https://www.thingiverse.com/thing:3653631

Step 2: Find a camera mount

Now, you need a way to attach the camera. We have a basic design created by qdot, based on his mount on the hardware GitHub here

Alternatively, you can create your own mount if you have the skills.

Step 3: Place the camera mount where it will give a good camera angle

The "Ideal" location is a place that gives a good view of the pupil when looking to all extremes, the lower corners do a good job at getting there, or nearly there.

It is recommended to place the camera as close as possible to the headset's lens to maximize the view of the eye. I recommend looking at other headset mounts for inspiration.

Step 4: Mount your LEDs

You can either add parts to your mount for holding the LED boards or just glue them on. It's up to you and what works best for you, experiment!

Step 5: Test everything

It is unlikely you will get a perfect mount on the first try. Print, test, adjust, and repeat until you have a satisfactory mount. Good luck!

Step 6: Get your mounts listed

Send me the mount to be added to the docs here! You can upload it to Thingiverse or similar services, or just send me the .STLs via discord (Prohurtz#0001)

',18)]))}const p=t(n,[["render",i]]);export{m as __pageData,p as default}; diff --git a/assets/how_to_build_full_build.md.f324b1f6.js b/assets/how_to_build_full_build.md.6f33011b.js similarity index 98% rename from assets/how_to_build_full_build.md.f324b1f6.js rename to assets/how_to_build_full_build.md.6f33011b.js index 5c96033..c75f5c7 100644 --- a/assets/how_to_build_full_build.md.f324b1f6.js +++ b/assets/how_to_build_full_build.md.6f33011b.js @@ -1 +1 @@ -import{_ as l,a as p}from"./chunks/index.339f98d7.js";import{_ as d}from"./chunks/CheckBoxList.80273cd9.js";import{_ as n,i}from"./chunks/index.c1fed1bd.js";import{o as h,c as u,O as s,k as t,E as o,l as r,a,w as m}from"./chunks/framework.47aa8d5b.js";const f={state:!0,object:[{label:"2 ESP 32 CAM boards"},{label:"2 160 degree cameras"},{label:"1 USB board to power your ESPs"},{label:"1 Programmer board(buying an extra is reccomended)"},{label:"IR emitters, resistors, and preferably PCBs"},{label:"Lower gauge wire to power ESPs"},{label:"Higher gauge wire to power IR LEDs"},{label:"3d printer to print mounts. (Buying them from some place like JLCPCB is also an option)"},{label:"Glue of some form, hot glue highly recommended."}]},w={align:"center"},P=JSON.parse('{"title":"V3 Build Guide","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/full_build.md","filePath":"how_to_build/full_build.md","lastUpdated":1728240063000}'),g={name:"how_to_build/full_build.md"},E=Object.assign(g,{setup(b){return(y,e)=>(h(),u("div",null,[e[1]||(e[1]=s('

V3 Build Guide

This page will contain a step-by-step assembly guide.

Updated documentation for V4 is still in progress and not updated here, please be patient.

This guide provides a walkthrough on the assembly of a wireless V3 eye tracking. V4 specific final docs are Work In Progress: V4 LED Solderless assemblly rough edit:

',4)),e[2]||(e[2]=t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/AVUbDNe7uNU",title:"EyeTrackVR V4 Solder-less Assembly ROUGH EDIT",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""},null,-1)),e[3]||(e[3]=t("p",null,"Sketch of V4 solderless wiring:",-1)),o(n,{options:r(i).V4_wire_sketch},null,8,["options"]),e[4]||(e[4]=t("p",null,[a("Credit: @balty via "),t("a",{href:"https://discord.gg/kkXYbVykZX",target:"_blank",rel:"noreferrer"},"Discord")],-1)),e[5]||(e[5]=t("p",null,"Sketch of solder assembly of V4:",-1)),o(n,{options:r(i).V4_solder_wire},null,8,["options"]),e[6]||(e[6]=s('

Nevertheless, it's worth noting that these instructions are also mostly applicable to those who are using wired or V4 trackers.

Step 1: Make sure your have read the Things to know before you start guide

This will give you a basic overview of the project's status and what to expect currently.

Step 2: Order all the parts listed on our Parts list

Please take note of the fact that hardware still may change, although with more developments it seems like we are going to stick with current hardware.

Step 3: Wait for things to arrive

Long shipping times from China are f u n. Please allow anywhere from 2 weeks to 2 months for everything to arrive.

Step 4: Gather up all of your hardware

Make sure you have at least the following:

',9)),o(d,{options:{...r(f)}},null,8,["options"]),o(n,{options:r(i).image_one},null,8,["options"]),e[7]||(e[7]=t("h2",{id:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",tabindex:"-1"},[a("Step 5: Install external antennas or shield ESP antenna with an antistatic bag "),t("a",{class:"header-anchor",href:"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","aria-label":'Permalink to "Step 5: Install external antennas or shield ESP antenna with an antistatic bag"'},"​")],-1)),e[8]||(e[8]=t("p",null,"Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.",-1)),e[9]||(e[9]=t("p",null,"The first option is to use an external antenna.",-1)),e[10]||(e[10]=t("p",null,[a("This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a "),t("strong",null,"REQUIRED"),a(" step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The attached image below shows the orientation of the pads that need to be connected, depending on the mode You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.")],-1)),o(n,{options:r(i).external_antenna},null,8,["options"]),e[11]||(e[11]=t("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1)),o(n,{options:r(i).external_antenna_resistors},null,8,["options"]),e[12]||(e[12]=t("div",{align:"center"},[t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/aBTZuvg5sM8",title:"How to add an external antenna to an ESP32-CAM (2 methods)",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""})],-1)),e[13]||(e[13]=t("p",null,"The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.",-1)),e[14]||(e[14]=t("div",{align:"center"},[t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/wS4PS3Mw250",title:"Covering an ESP32-CAM's antenna with anti-static bag",frameborder:"0",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1)),e[15]||(e[15]=t("h2",{id:"step-6-attach-cameras-to-esps",tabindex:"-1"},[a("Step 6: Attach cameras to ESPs "),t("a",{class:"header-anchor",href:"#step-6-attach-cameras-to-esps","aria-label":'Permalink to "Step 6: Attach cameras to ESPs"'},"​")],-1)),e[16]||(e[16]=t("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1)),o(n,{options:r(i).camera_socket},null,8,["options"]),e[17]||(e[17]=t("p",null,"Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.",-1)),o(n,{options:r(i).camera_socket_clip},null,8,["options"]),e[18]||(e[18]=t("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1)),o(n,{options:r(i).camera_cable},null,8,["options"]),e[19]||(e[19]=t("p",null,"Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.",-1)),o(n,{options:r(i).camera_clip_close},null,8,["options"]),e[20]||(e[20]=t("h2",{id:"step-7-connect-esp-to-the-programmer-to-flash",tabindex:"-1"},[a("Step 7: Connect ESP to the programmer to flash "),t("a",{class:"header-anchor",href:"#step-7-connect-esp-to-the-programmer-to-flash","aria-label":'Permalink to "Step 7: Connect ESP to the programmer to flash"'},"​")],-1)),e[21]||(e[21]=t("p",null,"Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.",-1)),e[22]||(e[22]=t("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1)),o(n,{options:r(i)._7_12_one},null,8,["options"]),e[23]||(e[23]=s('

Step 8: Configure Visual Studio Code and prepare to flash the firmware

Check out our guide on Setting up VS Code

Once VS Code is set up, move on to the next step.

Step 9: Plug in your ESP and flash the firmware

Our guide, Building and uploading the firmware manually has steps on how to do this. After it has flashed, make sure you get a video stream in your browser, then power it down and flash your next ESP.

Step 10: Connect your power wires to a USB Type-A board

WARNING

Powering from the programmer board will not work correctly. This delivers a lower voltage which results in dim LEDs and video artifacts. These are highly likely to mess up tracking.

Get two pairs of wire, preferably two different colors, Cut them to length (56mm in my case) and twist together two for ground and two for 5V. Here I used speaker wire where the copper denotes positive and silver negative. Then, strip the wires to about 3mm of exposed wire.

',8)),o(n,{options:r(i)._7_12_two},null,8,["options"]),e[24]||(e[24]=t("h2",{id:"step-11-cut-wires-for-ir-leds",tabindex:"-1"},[a("Step 11: Cut wires for IR LEDs "),t("a",{class:"header-anchor",href:"#step-11-cut-wires-for-ir-leds","aria-label":'Permalink to "Step 11: Cut wires for IR LEDs"'},"​")],-1)),e[25]||(e[25]=t("p",null,"To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.",-1)),e[26]||(e[26]=t("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1)),e[27]||(e[27]=t("h2",{id:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",tabindex:"-1"},[a("Step 12: Twist the positive USB wire and positive IR LED wires together and tin them "),t("a",{class:"header-anchor",href:"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","aria-label":'Permalink to "Step 12: Twist the positive USB wire and positive IR LED wires together and tin them"'},"​")],-1)),e[28]||(e[28]=t("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1)),o(n,{options:r(i)._7_12_three},null,8,["options"]),e[29]||(e[29]=t("h2",{id:"step-13-solder-the-positive-wire-to-esp",tabindex:"-1"},[a("Step 13: Solder the positive wire to ESP "),t("a",{class:"header-anchor",href:"#step-13-solder-the-positive-wire-to-esp","aria-label":'Permalink to "Step 13: Solder the positive wire to ESP"'},"​")],-1)),e[30]||(e[30]=t("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1)),o(n,{options:r(i)._13_18_one},null,8,["options"]),e[31]||(e[31]=s('

Step 14: Solder the negative wire to ESP

Repeat Step 12 but with the negative wires.

INFO

As a user in our discord has learned, you can short the IO12 pin with the ground pin (GND) without issues.

In the below example I put it on the top of the pin, It will be a weak-ish joint but that's where glue comes in handy.

',4)),o(n,{options:r(i)._13_18_two},null,8,["options"]),e[32]||(e[32]=s('

Step 15: Wire up the 2nd ESP

Repeat steps 12-14 with the 2nd ESP.

Step 16: Prepare to solder IR LED PCBs

Get your magnifying glass out, it's time to solder very smol things.

Gather 4 PCBs, 4 IR LEDs, and either 4 ~350ohm.

',5)),o(n,{options:r(i)._13_18_three},null,8,["options"]),e[33]||(e[33]=t("p",null,"Here are the PCB pin-out labels:",-1)),o(n,{options:r(i)._13_18_four},null,8,["options"]),e[34]||(e[34]=t("p",null,"LED labels:",-1)),o(n,{options:r(i)._13_18_five},null,8,["options"]),e[35]||(e[35]=s('

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 18: Solder resistors on PCB V3

You only need 1 PCB to have resistors per eye.

Tin the resistor pads. Note: in this example, I use too much solder, it should only be enough to lightly cover the pad.

',11)),o(n,{options:r(i)._13_18_six},null,8,["options"]),e[36]||(e[36]=t("p",null,"Next, grab a resistor and hold it on the pads.",-1)),o(n,{options:r(i)._13_18_seven},null,8,["options"]),e[37]||(e[37]=t("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1)),e[38]||(e[38]=t("p",null,"I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.",-1)),o(n,{options:r(i)._13_18_eight},null,8,["options"]),e[39]||(e[39]=t("p",null,"Flip the PCB and solder the other end.",-1)),o(n,{options:r(i)._13_18_nine},null,8,["options"]),e[40]||(e[40]=t("p",null,"Now repeat for the other one.",-1)),o(n,{options:r(i)._13_18_ten},null,8,["options"]),e[41]||(e[41]=t("h2",{id:"solder-leds-on-pcb-v3",tabindex:"-1"},[a("Solder LEDs on PCB V3 "),t("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v3","aria-label":'Permalink to "Solder LEDs on PCB V3"'},"​")],-1)),e[42]||(e[42]=t("p",null,"Tin the LED pads.",-1)),o(n,{options:r(i).end_one},null,8,["options"]),e[43]||(e[43]=t("p",null,"Orientate the LED and hold it in place.",-1)),o(n,{options:r(i).end_two},null,8,["options"]),e[44]||(e[44]=t("p",null,"Solder one end.",-1)),o(n,{options:r(i).end_three},null,8,["options"]),e[45]||(e[45]=t("p",null,"Flip around and solder the other end.",-1)),o(n,{options:r(i).end_four},null,8,["options"]),e[46]||(e[46]=t("h2",{id:"wire-up-the-pcbs-v3",tabindex:"-1"},[a("Wire up the PCBs V3 "),t("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v3","aria-label":'Permalink to "Wire up the PCBs V3"'},"​")],-1)),e[47]||(e[47]=t("div",{class:"warning custom-block"},[t("p",{class:"custom-block-title"},"WARNING"),t("p",null,"Pay attention to the direction of the LEDs on the PCBs.")],-1)),e[48]||(e[48]=t("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1)),o(n,{options:r(i).end_five},null,8,["options"]),e[49]||(e[49]=t("p",null,"Use the following diagram:",-1)),o(n,{options:r(i).end_six},null,8,["options"]),e[50]||(e[50]=t("p",null,"If the green dot is facing away from the text like the picture below:",-1)),o(n,{options:r(i).end_seven},null,8,["options"]),e[51]||(e[51]=t("p",null,"Use the following diagram:",-1)),o(n,{options:r(i).end_eight},null,8,["options"]),e[52]||(e[52]=s('

Step 19: 3D print mounts

Head to the 3D printed parts section of the parts list here.

Find which parts are for your headset and print them. Some may work better or worse, it is recommended to test all of them if there are multiple, print one of each kind. If none work, try making an edit yourself if you have the skills. If you have made a mount make sure to ping me, Prohurtz#0001, so I can add them to the list.

Having trouble getting them to fit? Try resizing the mounts up, or down a little to ensure a good fit.

There are 2 different types of mounts, how to secure the camera to each type will be documented below.

Type 1

',6)),o(n,{options:r(i).end_nine},null,8,["options"]),e[53]||(e[53]=t("p",null,"This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.",-1)),e[54]||(e[54]=t("p",null,"Place the camera into the mount",-1)),o(n,{options:r(i).end_ten},null,8,["options"]),e[55]||(e[55]=t("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1)),o(n,{options:r(i).end_eleven},null,8,["options"]),t("div",w,[o(l,{options:r(p).end_one},{content:m(()=>e[0]||(e[0]=[t("p",null," There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed. ",-1)])),_:1},8,["options"])]),e[56]||(e[56]=t("h3",{id:"type-2",tabindex:"-1"},[a("Type 2 "),t("a",{class:"header-anchor",href:"#type-2","aria-label":'Permalink to "Type 2"'},"​")],-1)),o(n,{options:r(i).end_twelve},null,8,["options"]),e[57]||(e[57]=t("p",null,"This method involves gluing the camera in place.",-1)),e[58]||(e[58]=t("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1)),o(n,{options:r(i).end_thirteen},null,8,["options"]),e[59]||(e[59]=t("p",null,"Place the camera on the mount.",-1)),o(n,{options:r(i).end_fourteen},null,8,["options"]),e[60]||(e[60]=t("h2",{id:"ir-led-mounting",tabindex:"-1"},[a("IR LED mounting "),t("a",{class:"header-anchor",href:"#ir-led-mounting","aria-label":'Permalink to "IR LED mounting"'},"​")],-1)),e[61]||(e[61]=t("p",null,"This again differs from mount to mount.",-1)),e[62]||(e[62]=t("p",null,"In some cases, there are designated spots for the LEDs to go.",-1)),o(n,{options:r(i).end_fifteen},null,8,["options"]),e[63]||(e[63]=t("p",null,"In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.",-1)),o(n,{options:r(i).end_sixteen},null,8,["options"]),e[64]||(e[64]=t("div",{class:"tip custom-block"},[t("p",{class:"custom-block-title"},"TIP"),t("p",null,"Use rubbing alcohol to easily remove hot glue.")],-1))]))}});export{P as __pageData,E as default}; +import{_ as l,a as p}from"./chunks/index.c19b2931.js";import{_ as d}from"./chunks/CheckBoxList.1747249a.js";import{_ as n,i}from"./chunks/index.41b0dfea.js";import{o as h,c as u,O as s,k as t,E as o,l as r,a,w as m}from"./chunks/framework.ece1a6f0.js";const f={state:!0,object:[{label:"2 ESP 32 CAM boards"},{label:"2 160 degree cameras"},{label:"1 USB board to power your ESPs"},{label:"1 Programmer board(buying an extra is reccomended)"},{label:"IR emitters, resistors, and preferably PCBs"},{label:"Lower gauge wire to power ESPs"},{label:"Higher gauge wire to power IR LEDs"},{label:"3d printer to print mounts. (Buying them from some place like JLCPCB is also an option)"},{label:"Glue of some form, hot glue highly recommended."}]},w={align:"center"},P=JSON.parse('{"title":"V3 Build Guide","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/full_build.md","filePath":"how_to_build/full_build.md","lastUpdated":1728240063000}'),g={name:"how_to_build/full_build.md"},E=Object.assign(g,{setup(b){return(y,e)=>(h(),u("div",null,[e[1]||(e[1]=s('

V3 Build Guide

This page will contain a step-by-step assembly guide.

Updated documentation for V4 is still in progress and not updated here, please be patient.

This guide provides a walkthrough on the assembly of a wireless V3 eye tracking. V4 specific final docs are Work In Progress: V4 LED Solderless assemblly rough edit:

',4)),e[2]||(e[2]=t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/AVUbDNe7uNU",title:"EyeTrackVR V4 Solder-less Assembly ROUGH EDIT",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""},null,-1)),e[3]||(e[3]=t("p",null,"Sketch of V4 solderless wiring:",-1)),o(n,{options:r(i).V4_wire_sketch},null,8,["options"]),e[4]||(e[4]=t("p",null,[a("Credit: @balty via "),t("a",{href:"https://discord.gg/kkXYbVykZX",target:"_blank",rel:"noreferrer"},"Discord")],-1)),e[5]||(e[5]=t("p",null,"Sketch of solder assembly of V4:",-1)),o(n,{options:r(i).V4_solder_wire},null,8,["options"]),e[6]||(e[6]=s('

Nevertheless, it's worth noting that these instructions are also mostly applicable to those who are using wired or V4 trackers.

Step 1: Make sure your have read the Things to know before you start guide

This will give you a basic overview of the project's status and what to expect currently.

Step 2: Order all the parts listed on our Parts list

Please take note of the fact that hardware still may change, although with more developments it seems like we are going to stick with current hardware.

Step 3: Wait for things to arrive

Long shipping times from China are f u n. Please allow anywhere from 2 weeks to 2 months for everything to arrive.

Step 4: Gather up all of your hardware

Make sure you have at least the following:

',9)),o(d,{options:{...r(f)}},null,8,["options"]),o(n,{options:r(i).image_one},null,8,["options"]),e[7]||(e[7]=t("h2",{id:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",tabindex:"-1"},[a("Step 5: Install external antennas or shield ESP antenna with an antistatic bag "),t("a",{class:"header-anchor",href:"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","aria-label":'Permalink to "Step 5: Install external antennas or shield ESP antenna with an antistatic bag"'},"​")],-1)),e[8]||(e[8]=t("p",null,"Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.",-1)),e[9]||(e[9]=t("p",null,"The first option is to use an external antenna.",-1)),e[10]||(e[10]=t("p",null,[a("This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a "),t("strong",null,"REQUIRED"),a(" step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The attached image below shows the orientation of the pads that need to be connected, depending on the mode You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.")],-1)),o(n,{options:r(i).external_antenna},null,8,["options"]),e[11]||(e[11]=t("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1)),o(n,{options:r(i).external_antenna_resistors},null,8,["options"]),e[12]||(e[12]=t("div",{align:"center"},[t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/aBTZuvg5sM8",title:"How to add an external antenna to an ESP32-CAM (2 methods)",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""})],-1)),e[13]||(e[13]=t("p",null,"The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.",-1)),e[14]||(e[14]=t("div",{align:"center"},[t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/wS4PS3Mw250",title:"Covering an ESP32-CAM's antenna with anti-static bag",frameborder:"0",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1)),e[15]||(e[15]=t("h2",{id:"step-6-attach-cameras-to-esps",tabindex:"-1"},[a("Step 6: Attach cameras to ESPs "),t("a",{class:"header-anchor",href:"#step-6-attach-cameras-to-esps","aria-label":'Permalink to "Step 6: Attach cameras to ESPs"'},"​")],-1)),e[16]||(e[16]=t("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1)),o(n,{options:r(i).camera_socket},null,8,["options"]),e[17]||(e[17]=t("p",null,"Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.",-1)),o(n,{options:r(i).camera_socket_clip},null,8,["options"]),e[18]||(e[18]=t("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1)),o(n,{options:r(i).camera_cable},null,8,["options"]),e[19]||(e[19]=t("p",null,"Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.",-1)),o(n,{options:r(i).camera_clip_close},null,8,["options"]),e[20]||(e[20]=t("h2",{id:"step-7-connect-esp-to-the-programmer-to-flash",tabindex:"-1"},[a("Step 7: Connect ESP to the programmer to flash "),t("a",{class:"header-anchor",href:"#step-7-connect-esp-to-the-programmer-to-flash","aria-label":'Permalink to "Step 7: Connect ESP to the programmer to flash"'},"​")],-1)),e[21]||(e[21]=t("p",null,"Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.",-1)),e[22]||(e[22]=t("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1)),o(n,{options:r(i)._7_12_one},null,8,["options"]),e[23]||(e[23]=s('

Step 8: Configure Visual Studio Code and prepare to flash the firmware

Check out our guide on Setting up VS Code

Once VS Code is set up, move on to the next step.

Step 9: Plug in your ESP and flash the firmware

Our guide, Building and uploading the firmware manually has steps on how to do this. After it has flashed, make sure you get a video stream in your browser, then power it down and flash your next ESP.

Step 10: Connect your power wires to a USB Type-A board

WARNING

Powering from the programmer board will not work correctly. This delivers a lower voltage which results in dim LEDs and video artifacts. These are highly likely to mess up tracking.

Get two pairs of wire, preferably two different colors, Cut them to length (56mm in my case) and twist together two for ground and two for 5V. Here I used speaker wire where the copper denotes positive and silver negative. Then, strip the wires to about 3mm of exposed wire.

',8)),o(n,{options:r(i)._7_12_two},null,8,["options"]),e[24]||(e[24]=t("h2",{id:"step-11-cut-wires-for-ir-leds",tabindex:"-1"},[a("Step 11: Cut wires for IR LEDs "),t("a",{class:"header-anchor",href:"#step-11-cut-wires-for-ir-leds","aria-label":'Permalink to "Step 11: Cut wires for IR LEDs"'},"​")],-1)),e[25]||(e[25]=t("p",null,"To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.",-1)),e[26]||(e[26]=t("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1)),e[27]||(e[27]=t("h2",{id:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",tabindex:"-1"},[a("Step 12: Twist the positive USB wire and positive IR LED wires together and tin them "),t("a",{class:"header-anchor",href:"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","aria-label":'Permalink to "Step 12: Twist the positive USB wire and positive IR LED wires together and tin them"'},"​")],-1)),e[28]||(e[28]=t("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1)),o(n,{options:r(i)._7_12_three},null,8,["options"]),e[29]||(e[29]=t("h2",{id:"step-13-solder-the-positive-wire-to-esp",tabindex:"-1"},[a("Step 13: Solder the positive wire to ESP "),t("a",{class:"header-anchor",href:"#step-13-solder-the-positive-wire-to-esp","aria-label":'Permalink to "Step 13: Solder the positive wire to ESP"'},"​")],-1)),e[30]||(e[30]=t("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1)),o(n,{options:r(i)._13_18_one},null,8,["options"]),e[31]||(e[31]=s('

Step 14: Solder the negative wire to ESP

Repeat Step 12 but with the negative wires.

INFO

As a user in our discord has learned, you can short the IO12 pin with the ground pin (GND) without issues.

In the below example I put it on the top of the pin, It will be a weak-ish joint but that's where glue comes in handy.

',4)),o(n,{options:r(i)._13_18_two},null,8,["options"]),e[32]||(e[32]=s('

Step 15: Wire up the 2nd ESP

Repeat steps 12-14 with the 2nd ESP.

Step 16: Prepare to solder IR LED PCBs

Get your magnifying glass out, it's time to solder very smol things.

Gather 4 PCBs, 4 IR LEDs, and either 4 ~350ohm.

',5)),o(n,{options:r(i)._13_18_three},null,8,["options"]),e[33]||(e[33]=t("p",null,"Here are the PCB pin-out labels:",-1)),o(n,{options:r(i)._13_18_four},null,8,["options"]),e[34]||(e[34]=t("p",null,"LED labels:",-1)),o(n,{options:r(i)._13_18_five},null,8,["options"]),e[35]||(e[35]=s('

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 18: Solder resistors on PCB V3

You only need 1 PCB to have resistors per eye.

Tin the resistor pads. Note: in this example, I use too much solder, it should only be enough to lightly cover the pad.

',11)),o(n,{options:r(i)._13_18_six},null,8,["options"]),e[36]||(e[36]=t("p",null,"Next, grab a resistor and hold it on the pads.",-1)),o(n,{options:r(i)._13_18_seven},null,8,["options"]),e[37]||(e[37]=t("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1)),e[38]||(e[38]=t("p",null,"I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.",-1)),o(n,{options:r(i)._13_18_eight},null,8,["options"]),e[39]||(e[39]=t("p",null,"Flip the PCB and solder the other end.",-1)),o(n,{options:r(i)._13_18_nine},null,8,["options"]),e[40]||(e[40]=t("p",null,"Now repeat for the other one.",-1)),o(n,{options:r(i)._13_18_ten},null,8,["options"]),e[41]||(e[41]=t("h2",{id:"solder-leds-on-pcb-v3",tabindex:"-1"},[a("Solder LEDs on PCB V3 "),t("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v3","aria-label":'Permalink to "Solder LEDs on PCB V3"'},"​")],-1)),e[42]||(e[42]=t("p",null,"Tin the LED pads.",-1)),o(n,{options:r(i).end_one},null,8,["options"]),e[43]||(e[43]=t("p",null,"Orientate the LED and hold it in place.",-1)),o(n,{options:r(i).end_two},null,8,["options"]),e[44]||(e[44]=t("p",null,"Solder one end.",-1)),o(n,{options:r(i).end_three},null,8,["options"]),e[45]||(e[45]=t("p",null,"Flip around and solder the other end.",-1)),o(n,{options:r(i).end_four},null,8,["options"]),e[46]||(e[46]=t("h2",{id:"wire-up-the-pcbs-v3",tabindex:"-1"},[a("Wire up the PCBs V3 "),t("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v3","aria-label":'Permalink to "Wire up the PCBs V3"'},"​")],-1)),e[47]||(e[47]=t("div",{class:"warning custom-block"},[t("p",{class:"custom-block-title"},"WARNING"),t("p",null,"Pay attention to the direction of the LEDs on the PCBs.")],-1)),e[48]||(e[48]=t("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1)),o(n,{options:r(i).end_five},null,8,["options"]),e[49]||(e[49]=t("p",null,"Use the following diagram:",-1)),o(n,{options:r(i).end_six},null,8,["options"]),e[50]||(e[50]=t("p",null,"If the green dot is facing away from the text like the picture below:",-1)),o(n,{options:r(i).end_seven},null,8,["options"]),e[51]||(e[51]=t("p",null,"Use the following diagram:",-1)),o(n,{options:r(i).end_eight},null,8,["options"]),e[52]||(e[52]=s('

Step 19: 3D print mounts

Head to the 3D printed parts section of the parts list here.

Find which parts are for your headset and print them. Some may work better or worse, it is recommended to test all of them if there are multiple, print one of each kind. If none work, try making an edit yourself if you have the skills. If you have made a mount make sure to ping me, Prohurtz#0001, so I can add them to the list.

Having trouble getting them to fit? Try resizing the mounts up, or down a little to ensure a good fit.

There are 2 different types of mounts, how to secure the camera to each type will be documented below.

Type 1

',6)),o(n,{options:r(i).end_nine},null,8,["options"]),e[53]||(e[53]=t("p",null,"This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.",-1)),e[54]||(e[54]=t("p",null,"Place the camera into the mount",-1)),o(n,{options:r(i).end_ten},null,8,["options"]),e[55]||(e[55]=t("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1)),o(n,{options:r(i).end_eleven},null,8,["options"]),t("div",w,[o(l,{options:r(p).end_one},{content:m(()=>e[0]||(e[0]=[t("p",null," There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed. ",-1)])),_:1},8,["options"])]),e[56]||(e[56]=t("h3",{id:"type-2",tabindex:"-1"},[a("Type 2 "),t("a",{class:"header-anchor",href:"#type-2","aria-label":'Permalink to "Type 2"'},"​")],-1)),o(n,{options:r(i).end_twelve},null,8,["options"]),e[57]||(e[57]=t("p",null,"This method involves gluing the camera in place.",-1)),e[58]||(e[58]=t("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1)),o(n,{options:r(i).end_thirteen},null,8,["options"]),e[59]||(e[59]=t("p",null,"Place the camera on the mount.",-1)),o(n,{options:r(i).end_fourteen},null,8,["options"]),e[60]||(e[60]=t("h2",{id:"ir-led-mounting",tabindex:"-1"},[a("IR LED mounting "),t("a",{class:"header-anchor",href:"#ir-led-mounting","aria-label":'Permalink to "IR LED mounting"'},"​")],-1)),e[61]||(e[61]=t("p",null,"This again differs from mount to mount.",-1)),e[62]||(e[62]=t("p",null,"In some cases, there are designated spots for the LEDs to go.",-1)),o(n,{options:r(i).end_fifteen},null,8,["options"]),e[63]||(e[63]=t("p",null,"In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.",-1)),o(n,{options:r(i).end_sixteen},null,8,["options"]),e[64]||(e[64]=t("div",{class:"tip custom-block"},[t("p",{class:"custom-block-title"},"TIP"),t("p",null,"Use rubbing alcohol to easily remove hot glue.")],-1))]))}});export{P as __pageData,E as default}; diff --git a/assets/how_to_build_full_build.md.f324b1f6.lean.js b/assets/how_to_build_full_build.md.6f33011b.lean.js similarity index 98% rename from assets/how_to_build_full_build.md.f324b1f6.lean.js rename to assets/how_to_build_full_build.md.6f33011b.lean.js index 5c96033..c75f5c7 100644 --- a/assets/how_to_build_full_build.md.f324b1f6.lean.js +++ b/assets/how_to_build_full_build.md.6f33011b.lean.js @@ -1 +1 @@ -import{_ as l,a as p}from"./chunks/index.339f98d7.js";import{_ as d}from"./chunks/CheckBoxList.80273cd9.js";import{_ as n,i}from"./chunks/index.c1fed1bd.js";import{o as h,c as u,O as s,k as t,E as o,l as r,a,w as m}from"./chunks/framework.47aa8d5b.js";const f={state:!0,object:[{label:"2 ESP 32 CAM boards"},{label:"2 160 degree cameras"},{label:"1 USB board to power your ESPs"},{label:"1 Programmer board(buying an extra is reccomended)"},{label:"IR emitters, resistors, and preferably PCBs"},{label:"Lower gauge wire to power ESPs"},{label:"Higher gauge wire to power IR LEDs"},{label:"3d printer to print mounts. (Buying them from some place like JLCPCB is also an option)"},{label:"Glue of some form, hot glue highly recommended."}]},w={align:"center"},P=JSON.parse('{"title":"V3 Build Guide","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/full_build.md","filePath":"how_to_build/full_build.md","lastUpdated":1728240063000}'),g={name:"how_to_build/full_build.md"},E=Object.assign(g,{setup(b){return(y,e)=>(h(),u("div",null,[e[1]||(e[1]=s('

V3 Build Guide

This page will contain a step-by-step assembly guide.

Updated documentation for V4 is still in progress and not updated here, please be patient.

This guide provides a walkthrough on the assembly of a wireless V3 eye tracking. V4 specific final docs are Work In Progress: V4 LED Solderless assemblly rough edit:

',4)),e[2]||(e[2]=t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/AVUbDNe7uNU",title:"EyeTrackVR V4 Solder-less Assembly ROUGH EDIT",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""},null,-1)),e[3]||(e[3]=t("p",null,"Sketch of V4 solderless wiring:",-1)),o(n,{options:r(i).V4_wire_sketch},null,8,["options"]),e[4]||(e[4]=t("p",null,[a("Credit: @balty via "),t("a",{href:"https://discord.gg/kkXYbVykZX",target:"_blank",rel:"noreferrer"},"Discord")],-1)),e[5]||(e[5]=t("p",null,"Sketch of solder assembly of V4:",-1)),o(n,{options:r(i).V4_solder_wire},null,8,["options"]),e[6]||(e[6]=s('

Nevertheless, it's worth noting that these instructions are also mostly applicable to those who are using wired or V4 trackers.

Step 1: Make sure your have read the Things to know before you start guide

This will give you a basic overview of the project's status and what to expect currently.

Step 2: Order all the parts listed on our Parts list

Please take note of the fact that hardware still may change, although with more developments it seems like we are going to stick with current hardware.

Step 3: Wait for things to arrive

Long shipping times from China are f u n. Please allow anywhere from 2 weeks to 2 months for everything to arrive.

Step 4: Gather up all of your hardware

Make sure you have at least the following:

',9)),o(d,{options:{...r(f)}},null,8,["options"]),o(n,{options:r(i).image_one},null,8,["options"]),e[7]||(e[7]=t("h2",{id:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",tabindex:"-1"},[a("Step 5: Install external antennas or shield ESP antenna with an antistatic bag "),t("a",{class:"header-anchor",href:"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","aria-label":'Permalink to "Step 5: Install external antennas or shield ESP antenna with an antistatic bag"'},"​")],-1)),e[8]||(e[8]=t("p",null,"Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.",-1)),e[9]||(e[9]=t("p",null,"The first option is to use an external antenna.",-1)),e[10]||(e[10]=t("p",null,[a("This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a "),t("strong",null,"REQUIRED"),a(" step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The attached image below shows the orientation of the pads that need to be connected, depending on the mode You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.")],-1)),o(n,{options:r(i).external_antenna},null,8,["options"]),e[11]||(e[11]=t("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1)),o(n,{options:r(i).external_antenna_resistors},null,8,["options"]),e[12]||(e[12]=t("div",{align:"center"},[t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/aBTZuvg5sM8",title:"How to add an external antenna to an ESP32-CAM (2 methods)",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""})],-1)),e[13]||(e[13]=t("p",null,"The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.",-1)),e[14]||(e[14]=t("div",{align:"center"},[t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/wS4PS3Mw250",title:"Covering an ESP32-CAM's antenna with anti-static bag",frameborder:"0",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1)),e[15]||(e[15]=t("h2",{id:"step-6-attach-cameras-to-esps",tabindex:"-1"},[a("Step 6: Attach cameras to ESPs "),t("a",{class:"header-anchor",href:"#step-6-attach-cameras-to-esps","aria-label":'Permalink to "Step 6: Attach cameras to ESPs"'},"​")],-1)),e[16]||(e[16]=t("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1)),o(n,{options:r(i).camera_socket},null,8,["options"]),e[17]||(e[17]=t("p",null,"Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.",-1)),o(n,{options:r(i).camera_socket_clip},null,8,["options"]),e[18]||(e[18]=t("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1)),o(n,{options:r(i).camera_cable},null,8,["options"]),e[19]||(e[19]=t("p",null,"Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.",-1)),o(n,{options:r(i).camera_clip_close},null,8,["options"]),e[20]||(e[20]=t("h2",{id:"step-7-connect-esp-to-the-programmer-to-flash",tabindex:"-1"},[a("Step 7: Connect ESP to the programmer to flash "),t("a",{class:"header-anchor",href:"#step-7-connect-esp-to-the-programmer-to-flash","aria-label":'Permalink to "Step 7: Connect ESP to the programmer to flash"'},"​")],-1)),e[21]||(e[21]=t("p",null,"Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.",-1)),e[22]||(e[22]=t("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1)),o(n,{options:r(i)._7_12_one},null,8,["options"]),e[23]||(e[23]=s('

Step 8: Configure Visual Studio Code and prepare to flash the firmware

Check out our guide on Setting up VS Code

Once VS Code is set up, move on to the next step.

Step 9: Plug in your ESP and flash the firmware

Our guide, Building and uploading the firmware manually has steps on how to do this. After it has flashed, make sure you get a video stream in your browser, then power it down and flash your next ESP.

Step 10: Connect your power wires to a USB Type-A board

WARNING

Powering from the programmer board will not work correctly. This delivers a lower voltage which results in dim LEDs and video artifacts. These are highly likely to mess up tracking.

Get two pairs of wire, preferably two different colors, Cut them to length (56mm in my case) and twist together two for ground and two for 5V. Here I used speaker wire where the copper denotes positive and silver negative. Then, strip the wires to about 3mm of exposed wire.

',8)),o(n,{options:r(i)._7_12_two},null,8,["options"]),e[24]||(e[24]=t("h2",{id:"step-11-cut-wires-for-ir-leds",tabindex:"-1"},[a("Step 11: Cut wires for IR LEDs "),t("a",{class:"header-anchor",href:"#step-11-cut-wires-for-ir-leds","aria-label":'Permalink to "Step 11: Cut wires for IR LEDs"'},"​")],-1)),e[25]||(e[25]=t("p",null,"To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.",-1)),e[26]||(e[26]=t("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1)),e[27]||(e[27]=t("h2",{id:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",tabindex:"-1"},[a("Step 12: Twist the positive USB wire and positive IR LED wires together and tin them "),t("a",{class:"header-anchor",href:"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","aria-label":'Permalink to "Step 12: Twist the positive USB wire and positive IR LED wires together and tin them"'},"​")],-1)),e[28]||(e[28]=t("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1)),o(n,{options:r(i)._7_12_three},null,8,["options"]),e[29]||(e[29]=t("h2",{id:"step-13-solder-the-positive-wire-to-esp",tabindex:"-1"},[a("Step 13: Solder the positive wire to ESP "),t("a",{class:"header-anchor",href:"#step-13-solder-the-positive-wire-to-esp","aria-label":'Permalink to "Step 13: Solder the positive wire to ESP"'},"​")],-1)),e[30]||(e[30]=t("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1)),o(n,{options:r(i)._13_18_one},null,8,["options"]),e[31]||(e[31]=s('

Step 14: Solder the negative wire to ESP

Repeat Step 12 but with the negative wires.

INFO

As a user in our discord has learned, you can short the IO12 pin with the ground pin (GND) without issues.

In the below example I put it on the top of the pin, It will be a weak-ish joint but that's where glue comes in handy.

',4)),o(n,{options:r(i)._13_18_two},null,8,["options"]),e[32]||(e[32]=s('

Step 15: Wire up the 2nd ESP

Repeat steps 12-14 with the 2nd ESP.

Step 16: Prepare to solder IR LED PCBs

Get your magnifying glass out, it's time to solder very smol things.

Gather 4 PCBs, 4 IR LEDs, and either 4 ~350ohm.

',5)),o(n,{options:r(i)._13_18_three},null,8,["options"]),e[33]||(e[33]=t("p",null,"Here are the PCB pin-out labels:",-1)),o(n,{options:r(i)._13_18_four},null,8,["options"]),e[34]||(e[34]=t("p",null,"LED labels:",-1)),o(n,{options:r(i)._13_18_five},null,8,["options"]),e[35]||(e[35]=s('

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 18: Solder resistors on PCB V3

You only need 1 PCB to have resistors per eye.

Tin the resistor pads. Note: in this example, I use too much solder, it should only be enough to lightly cover the pad.

',11)),o(n,{options:r(i)._13_18_six},null,8,["options"]),e[36]||(e[36]=t("p",null,"Next, grab a resistor and hold it on the pads.",-1)),o(n,{options:r(i)._13_18_seven},null,8,["options"]),e[37]||(e[37]=t("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1)),e[38]||(e[38]=t("p",null,"I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.",-1)),o(n,{options:r(i)._13_18_eight},null,8,["options"]),e[39]||(e[39]=t("p",null,"Flip the PCB and solder the other end.",-1)),o(n,{options:r(i)._13_18_nine},null,8,["options"]),e[40]||(e[40]=t("p",null,"Now repeat for the other one.",-1)),o(n,{options:r(i)._13_18_ten},null,8,["options"]),e[41]||(e[41]=t("h2",{id:"solder-leds-on-pcb-v3",tabindex:"-1"},[a("Solder LEDs on PCB V3 "),t("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v3","aria-label":'Permalink to "Solder LEDs on PCB V3"'},"​")],-1)),e[42]||(e[42]=t("p",null,"Tin the LED pads.",-1)),o(n,{options:r(i).end_one},null,8,["options"]),e[43]||(e[43]=t("p",null,"Orientate the LED and hold it in place.",-1)),o(n,{options:r(i).end_two},null,8,["options"]),e[44]||(e[44]=t("p",null,"Solder one end.",-1)),o(n,{options:r(i).end_three},null,8,["options"]),e[45]||(e[45]=t("p",null,"Flip around and solder the other end.",-1)),o(n,{options:r(i).end_four},null,8,["options"]),e[46]||(e[46]=t("h2",{id:"wire-up-the-pcbs-v3",tabindex:"-1"},[a("Wire up the PCBs V3 "),t("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v3","aria-label":'Permalink to "Wire up the PCBs V3"'},"​")],-1)),e[47]||(e[47]=t("div",{class:"warning custom-block"},[t("p",{class:"custom-block-title"},"WARNING"),t("p",null,"Pay attention to the direction of the LEDs on the PCBs.")],-1)),e[48]||(e[48]=t("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1)),o(n,{options:r(i).end_five},null,8,["options"]),e[49]||(e[49]=t("p",null,"Use the following diagram:",-1)),o(n,{options:r(i).end_six},null,8,["options"]),e[50]||(e[50]=t("p",null,"If the green dot is facing away from the text like the picture below:",-1)),o(n,{options:r(i).end_seven},null,8,["options"]),e[51]||(e[51]=t("p",null,"Use the following diagram:",-1)),o(n,{options:r(i).end_eight},null,8,["options"]),e[52]||(e[52]=s('

Step 19: 3D print mounts

Head to the 3D printed parts section of the parts list here.

Find which parts are for your headset and print them. Some may work better or worse, it is recommended to test all of them if there are multiple, print one of each kind. If none work, try making an edit yourself if you have the skills. If you have made a mount make sure to ping me, Prohurtz#0001, so I can add them to the list.

Having trouble getting them to fit? Try resizing the mounts up, or down a little to ensure a good fit.

There are 2 different types of mounts, how to secure the camera to each type will be documented below.

Type 1

',6)),o(n,{options:r(i).end_nine},null,8,["options"]),e[53]||(e[53]=t("p",null,"This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.",-1)),e[54]||(e[54]=t("p",null,"Place the camera into the mount",-1)),o(n,{options:r(i).end_ten},null,8,["options"]),e[55]||(e[55]=t("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1)),o(n,{options:r(i).end_eleven},null,8,["options"]),t("div",w,[o(l,{options:r(p).end_one},{content:m(()=>e[0]||(e[0]=[t("p",null," There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed. ",-1)])),_:1},8,["options"])]),e[56]||(e[56]=t("h3",{id:"type-2",tabindex:"-1"},[a("Type 2 "),t("a",{class:"header-anchor",href:"#type-2","aria-label":'Permalink to "Type 2"'},"​")],-1)),o(n,{options:r(i).end_twelve},null,8,["options"]),e[57]||(e[57]=t("p",null,"This method involves gluing the camera in place.",-1)),e[58]||(e[58]=t("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1)),o(n,{options:r(i).end_thirteen},null,8,["options"]),e[59]||(e[59]=t("p",null,"Place the camera on the mount.",-1)),o(n,{options:r(i).end_fourteen},null,8,["options"]),e[60]||(e[60]=t("h2",{id:"ir-led-mounting",tabindex:"-1"},[a("IR LED mounting "),t("a",{class:"header-anchor",href:"#ir-led-mounting","aria-label":'Permalink to "IR LED mounting"'},"​")],-1)),e[61]||(e[61]=t("p",null,"This again differs from mount to mount.",-1)),e[62]||(e[62]=t("p",null,"In some cases, there are designated spots for the LEDs to go.",-1)),o(n,{options:r(i).end_fifteen},null,8,["options"]),e[63]||(e[63]=t("p",null,"In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.",-1)),o(n,{options:r(i).end_sixteen},null,8,["options"]),e[64]||(e[64]=t("div",{class:"tip custom-block"},[t("p",{class:"custom-block-title"},"TIP"),t("p",null,"Use rubbing alcohol to easily remove hot glue.")],-1))]))}});export{P as __pageData,E as default}; +import{_ as l,a as p}from"./chunks/index.c19b2931.js";import{_ as d}from"./chunks/CheckBoxList.1747249a.js";import{_ as n,i}from"./chunks/index.41b0dfea.js";import{o as h,c as u,O as s,k as t,E as o,l as r,a,w as m}from"./chunks/framework.ece1a6f0.js";const f={state:!0,object:[{label:"2 ESP 32 CAM boards"},{label:"2 160 degree cameras"},{label:"1 USB board to power your ESPs"},{label:"1 Programmer board(buying an extra is reccomended)"},{label:"IR emitters, resistors, and preferably PCBs"},{label:"Lower gauge wire to power ESPs"},{label:"Higher gauge wire to power IR LEDs"},{label:"3d printer to print mounts. (Buying them from some place like JLCPCB is also an option)"},{label:"Glue of some form, hot glue highly recommended."}]},w={align:"center"},P=JSON.parse('{"title":"V3 Build Guide","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/full_build.md","filePath":"how_to_build/full_build.md","lastUpdated":1728240063000}'),g={name:"how_to_build/full_build.md"},E=Object.assign(g,{setup(b){return(y,e)=>(h(),u("div",null,[e[1]||(e[1]=s('

V3 Build Guide

This page will contain a step-by-step assembly guide.

Updated documentation for V4 is still in progress and not updated here, please be patient.

This guide provides a walkthrough on the assembly of a wireless V3 eye tracking. V4 specific final docs are Work In Progress: V4 LED Solderless assemblly rough edit:

',4)),e[2]||(e[2]=t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/AVUbDNe7uNU",title:"EyeTrackVR V4 Solder-less Assembly ROUGH EDIT",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""},null,-1)),e[3]||(e[3]=t("p",null,"Sketch of V4 solderless wiring:",-1)),o(n,{options:r(i).V4_wire_sketch},null,8,["options"]),e[4]||(e[4]=t("p",null,[a("Credit: @balty via "),t("a",{href:"https://discord.gg/kkXYbVykZX",target:"_blank",rel:"noreferrer"},"Discord")],-1)),e[5]||(e[5]=t("p",null,"Sketch of solder assembly of V4:",-1)),o(n,{options:r(i).V4_solder_wire},null,8,["options"]),e[6]||(e[6]=s('

Nevertheless, it's worth noting that these instructions are also mostly applicable to those who are using wired or V4 trackers.

Step 1: Make sure your have read the Things to know before you start guide

This will give you a basic overview of the project's status and what to expect currently.

Step 2: Order all the parts listed on our Parts list

Please take note of the fact that hardware still may change, although with more developments it seems like we are going to stick with current hardware.

Step 3: Wait for things to arrive

Long shipping times from China are f u n. Please allow anywhere from 2 weeks to 2 months for everything to arrive.

Step 4: Gather up all of your hardware

Make sure you have at least the following:

',9)),o(d,{options:{...r(f)}},null,8,["options"]),o(n,{options:r(i).image_one},null,8,["options"]),e[7]||(e[7]=t("h2",{id:"step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag",tabindex:"-1"},[a("Step 5: Install external antennas or shield ESP antenna with an antistatic bag "),t("a",{class:"header-anchor",href:"#step-5-install-external-antennas-or-shield-esp-antenna-with-an-antistatic-bag","aria-label":'Permalink to "Step 5: Install external antennas or shield ESP antenna with an antistatic bag"'},"​")],-1)),e[8]||(e[8]=t("p",null,"Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.",-1)),e[9]||(e[9]=t("p",null,"The first option is to use an external antenna.",-1)),e[10]||(e[10]=t("p",null,[a("This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a "),t("strong",null,"REQUIRED"),a(" step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The attached image below shows the orientation of the pads that need to be connected, depending on the mode You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.")],-1)),o(n,{options:r(i).external_antenna},null,8,["options"]),e[11]||(e[11]=t("p",null,"Below is an example of bridging the connections and attaching an antenna.",-1)),o(n,{options:r(i).external_antenna_resistors},null,8,["options"]),e[12]||(e[12]=t("div",{align:"center"},[t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/aBTZuvg5sM8",title:"How to add an external antenna to an ESP32-CAM (2 methods)",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",allowfullscreen:""})],-1)),e[13]||(e[13]=t("p",null,"The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.",-1)),e[14]||(e[14]=t("div",{align:"center"},[t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/wS4PS3Mw250",title:"Covering an ESP32-CAM's antenna with anti-static bag",frameborder:"0",allow:"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture",allowfullscreen:""})],-1)),e[15]||(e[15]=t("h2",{id:"step-6-attach-cameras-to-esps",tabindex:"-1"},[a("Step 6: Attach cameras to ESPs "),t("a",{class:"header-anchor",href:"#step-6-attach-cameras-to-esps","aria-label":'Permalink to "Step 6: Attach cameras to ESPs"'},"​")],-1)),e[16]||(e[16]=t("p",null,"Look at your ESP and locate the camera ribbon cable connector as circled below.",-1)),o(n,{options:r(i).camera_socket},null,8,["options"]),e[17]||(e[17]=t("p",null,"Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.",-1)),o(n,{options:r(i).camera_socket_clip},null,8,["options"]),e[18]||(e[18]=t("p",null,"Now slide in a camera, please note that the pins are facing down, you should only see the black part.",-1)),o(n,{options:r(i).camera_cable},null,8,["options"]),e[19]||(e[19]=t("p",null,"Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.",-1)),o(n,{options:r(i).camera_clip_close},null,8,["options"]),e[20]||(e[20]=t("h2",{id:"step-7-connect-esp-to-the-programmer-to-flash",tabindex:"-1"},[a("Step 7: Connect ESP to the programmer to flash "),t("a",{class:"header-anchor",href:"#step-7-connect-esp-to-the-programmer-to-flash","aria-label":'Permalink to "Step 7: Connect ESP to the programmer to flash"'},"​")],-1)),e[21]||(e[21]=t("p",null,"Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.",-1)),e[22]||(e[22]=t("p",null,"Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.",-1)),o(n,{options:r(i)._7_12_one},null,8,["options"]),e[23]||(e[23]=s('

Step 8: Configure Visual Studio Code and prepare to flash the firmware

Check out our guide on Setting up VS Code

Once VS Code is set up, move on to the next step.

Step 9: Plug in your ESP and flash the firmware

Our guide, Building and uploading the firmware manually has steps on how to do this. After it has flashed, make sure you get a video stream in your browser, then power it down and flash your next ESP.

Step 10: Connect your power wires to a USB Type-A board

WARNING

Powering from the programmer board will not work correctly. This delivers a lower voltage which results in dim LEDs and video artifacts. These are highly likely to mess up tracking.

Get two pairs of wire, preferably two different colors, Cut them to length (56mm in my case) and twist together two for ground and two for 5V. Here I used speaker wire where the copper denotes positive and silver negative. Then, strip the wires to about 3mm of exposed wire.

',8)),o(n,{options:r(i)._7_12_two},null,8,["options"]),e[24]||(e[24]=t("h2",{id:"step-11-cut-wires-for-ir-leds",tabindex:"-1"},[a("Step 11: Cut wires for IR LEDs "),t("a",{class:"header-anchor",href:"#step-11-cut-wires-for-ir-leds","aria-label":'Permalink to "Step 11: Cut wires for IR LEDs"'},"​")],-1)),e[25]||(e[25]=t("p",null,"To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.",-1)),e[26]||(e[26]=t("p",null,"Once cut, strip them to around 4mm of exposed wire.",-1)),e[27]||(e[27]=t("h2",{id:"step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them",tabindex:"-1"},[a("Step 12: Twist the positive USB wire and positive IR LED wires together and tin them "),t("a",{class:"header-anchor",href:"#step-12-twist-the-positive-usb-wire-and-positive-ir-led-wires-together-and-tin-them","aria-label":'Permalink to "Step 12: Twist the positive USB wire and positive IR LED wires together and tin them"'},"​")],-1)),e[28]||(e[28]=t("p",null,"Once twisted together add solder to keep them together. This makes the connection much easier.",-1)),o(n,{options:r(i)._7_12_three},null,8,["options"]),e[29]||(e[29]=t("h2",{id:"step-13-solder-the-positive-wire-to-esp",tabindex:"-1"},[a("Step 13: Solder the positive wire to ESP "),t("a",{class:"header-anchor",href:"#step-13-solder-the-positive-wire-to-esp","aria-label":'Permalink to "Step 13: Solder the positive wire to ESP"'},"​")],-1)),e[30]||(e[30]=t("p",null,"Lay the wire on the outside of the 5V pin and apply solder.",-1)),o(n,{options:r(i)._13_18_one},null,8,["options"]),e[31]||(e[31]=s('

Step 14: Solder the negative wire to ESP

Repeat Step 12 but with the negative wires.

INFO

As a user in our discord has learned, you can short the IO12 pin with the ground pin (GND) without issues.

In the below example I put it on the top of the pin, It will be a weak-ish joint but that's where glue comes in handy.

',4)),o(n,{options:r(i)._13_18_two},null,8,["options"]),e[32]||(e[32]=s('

Step 15: Wire up the 2nd ESP

Repeat steps 12-14 with the 2nd ESP.

Step 16: Prepare to solder IR LED PCBs

Get your magnifying glass out, it's time to solder very smol things.

Gather 4 PCBs, 4 IR LEDs, and either 4 ~350ohm.

',5)),o(n,{options:r(i)._13_18_three},null,8,["options"]),e[33]||(e[33]=t("p",null,"Here are the PCB pin-out labels:",-1)),o(n,{options:r(i)._13_18_four},null,8,["options"]),e[34]||(e[34]=t("p",null,"LED labels:",-1)),o(n,{options:r(i)._13_18_five},null,8,["options"]),e[35]||(e[35]=s('

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 18: Solder resistors on PCB V3

You only need 1 PCB to have resistors per eye.

Tin the resistor pads. Note: in this example, I use too much solder, it should only be enough to lightly cover the pad.

',11)),o(n,{options:r(i)._13_18_six},null,8,["options"]),e[36]||(e[36]=t("p",null,"Next, grab a resistor and hold it on the pads.",-1)),o(n,{options:r(i)._13_18_seven},null,8,["options"]),e[37]||(e[37]=t("p",null,"While holding the resistor add solder to your soldering iron and apply it to the resistor.",-1)),e[38]||(e[38]=t("p",null,"I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.",-1)),o(n,{options:r(i)._13_18_eight},null,8,["options"]),e[39]||(e[39]=t("p",null,"Flip the PCB and solder the other end.",-1)),o(n,{options:r(i)._13_18_nine},null,8,["options"]),e[40]||(e[40]=t("p",null,"Now repeat for the other one.",-1)),o(n,{options:r(i)._13_18_ten},null,8,["options"]),e[41]||(e[41]=t("h2",{id:"solder-leds-on-pcb-v3",tabindex:"-1"},[a("Solder LEDs on PCB V3 "),t("a",{class:"header-anchor",href:"#solder-leds-on-pcb-v3","aria-label":'Permalink to "Solder LEDs on PCB V3"'},"​")],-1)),e[42]||(e[42]=t("p",null,"Tin the LED pads.",-1)),o(n,{options:r(i).end_one},null,8,["options"]),e[43]||(e[43]=t("p",null,"Orientate the LED and hold it in place.",-1)),o(n,{options:r(i).end_two},null,8,["options"]),e[44]||(e[44]=t("p",null,"Solder one end.",-1)),o(n,{options:r(i).end_three},null,8,["options"]),e[45]||(e[45]=t("p",null,"Flip around and solder the other end.",-1)),o(n,{options:r(i).end_four},null,8,["options"]),e[46]||(e[46]=t("h2",{id:"wire-up-the-pcbs-v3",tabindex:"-1"},[a("Wire up the PCBs V3 "),t("a",{class:"header-anchor",href:"#wire-up-the-pcbs-v3","aria-label":'Permalink to "Wire up the PCBs V3"'},"​")],-1)),e[47]||(e[47]=t("div",{class:"warning custom-block"},[t("p",{class:"custom-block-title"},"WARNING"),t("p",null,"Pay attention to the direction of the LEDs on the PCBs.")],-1)),e[48]||(e[48]=t("p",null,"If the green dot is facing inwards toward the text like in the picture below:",-1)),o(n,{options:r(i).end_five},null,8,["options"]),e[49]||(e[49]=t("p",null,"Use the following diagram:",-1)),o(n,{options:r(i).end_six},null,8,["options"]),e[50]||(e[50]=t("p",null,"If the green dot is facing away from the text like the picture below:",-1)),o(n,{options:r(i).end_seven},null,8,["options"]),e[51]||(e[51]=t("p",null,"Use the following diagram:",-1)),o(n,{options:r(i).end_eight},null,8,["options"]),e[52]||(e[52]=s('

Step 19: 3D print mounts

Head to the 3D printed parts section of the parts list here.

Find which parts are for your headset and print them. Some may work better or worse, it is recommended to test all of them if there are multiple, print one of each kind. If none work, try making an edit yourself if you have the skills. If you have made a mount make sure to ping me, Prohurtz#0001, so I can add them to the list.

Having trouble getting them to fit? Try resizing the mounts up, or down a little to ensure a good fit.

There are 2 different types of mounts, how to secure the camera to each type will be documented below.

Type 1

',6)),o(n,{options:r(i).end_nine},null,8,["options"]),e[53]||(e[53]=t("p",null,"This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.",-1)),e[54]||(e[54]=t("p",null,"Place the camera into the mount",-1)),o(n,{options:r(i).end_ten},null,8,["options"]),e[55]||(e[55]=t("p",null,"Slowly apply pressure inwards until the camera snaps into place.",-1)),o(n,{options:r(i).end_eleven},null,8,["options"]),t("div",w,[o(l,{options:r(p).end_one},{content:m(()=>e[0]||(e[0]=[t("p",null," There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed. ",-1)])),_:1},8,["options"])]),e[56]||(e[56]=t("h3",{id:"type-2",tabindex:"-1"},[a("Type 2 "),t("a",{class:"header-anchor",href:"#type-2","aria-label":'Permalink to "Type 2"'},"​")],-1)),o(n,{options:r(i).end_twelve},null,8,["options"]),e[57]||(e[57]=t("p",null,"This method involves gluing the camera in place.",-1)),e[58]||(e[58]=t("p",null,"Apply a bit of glue to the bottom of the camera mount.",-1)),o(n,{options:r(i).end_thirteen},null,8,["options"]),e[59]||(e[59]=t("p",null,"Place the camera on the mount.",-1)),o(n,{options:r(i).end_fourteen},null,8,["options"]),e[60]||(e[60]=t("h2",{id:"ir-led-mounting",tabindex:"-1"},[a("IR LED mounting "),t("a",{class:"header-anchor",href:"#ir-led-mounting","aria-label":'Permalink to "IR LED mounting"'},"​")],-1)),e[61]||(e[61]=t("p",null,"This again differs from mount to mount.",-1)),e[62]||(e[62]=t("p",null,"In some cases, there are designated spots for the LEDs to go.",-1)),o(n,{options:r(i).end_fifteen},null,8,["options"]),e[63]||(e[63]=t("p",null,"In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.",-1)),o(n,{options:r(i).end_sixteen},null,8,["options"]),e[64]||(e[64]=t("div",{class:"tip custom-block"},[t("p",{class:"custom-block-title"},"TIP"),t("p",null,"Use rubbing alcohol to easily remove hot glue.")],-1))]))}});export{P as __pageData,E as default}; diff --git a/assets/how_to_build_led_setup.md.6d99addb.js b/assets/how_to_build_led_setup.md.5f02b3d6.js similarity index 97% rename from assets/how_to_build_led_setup.md.6d99addb.js rename to assets/how_to_build_led_setup.md.5f02b3d6.js index 448ad24..22a8bd7 100644 --- a/assets/how_to_build_led_setup.md.6d99addb.js +++ b/assets/how_to_build_led_setup.md.5f02b3d6.js @@ -1 +1 @@ -import{_ as t,o as i,c as a,O as r}from"./chunks/framework.47aa8d5b.js";const g=JSON.parse('{"title":"How to assemble a V4 mini LED hardware kit:","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/led_setup.md","filePath":"how_to_build/led_setup.md","lastUpdated":1723839694000}'),o={name:"how_to_build/led_setup.md"};function s(n,e,l,h,p,d){return i(),a("div",null,e[0]||(e[0]=[r('

Pardon the mess, this page is WIP more docs for other configurations and assemblly are in the works.

How to assemble a V4 mini LED hardware kit:

Getting to know your hardware

There are 3 main components of an IR LED kit; the mainboard, LEDs and wires.

Mainboard

Below is the V4 mini mainboard with major features labled. V4mini
V4mini_back

LEDs

There are 2 different types of LED boards. The one you should have more of are the "N" LEDs. N stands for Normal, these make up 3 of the leds per eye. nLED
NLEDback

The second type is the "E" LEDs. E stands for End as these are put at the end of the LED strand.

eLED
eLEDback

In future orders the "E" LEDs will be purple for easier distinction. eLEDpurple

Wires

The included wires are a bit special, they have 3 pins on the connectors but only 2 wires are attached. v4wire

This distinction is crutial in assembling a kit as the wires need to go in a specific orientation outlined in the assembly picture which shows the pins without wires as dashes - - -.

Wiring up V4 mini

Start by pluggin in the long wires to the main board like shown.

notpluggedr
pluggedinr

Then connect the wires to leds in the sequence:

Mainboard -> N LED -> N LED -> N LED - > E LED

You need to pay very close attention to the orientation of the wires so that the missing wire is facing the correct way. The following image shows a kit fully assembled:

v4minifull

Here is an example of the right eye's LED strand.

v4minireye

How to assemble V4 Lite LED kit:

Getting to know V4 lite

V4 lite is a soldering-required approach to LEDs. There are a few specific caveats to know before assembling and using this hardware.

  1. The board must be supplied with 5v.

    • Other voltages may result in darker/non functioning LEDs.
  2. You must change resistors if you change from a single or dual eye setup to the other.

    • Not doing so will result in too dim of LEDs or extremely bright LEDs. Ensure you are always using the correct one for your application.
  3. Shorts on the main board can result in damaged hardware, dangerously bright LEDs, or nonfunctioning hardware.

    • Please ensure there are no shorts (even very small stray solder strands) between any pins or solder joints on the main board or LEDs.

Wiring up V4 Lite

First, decide if you want dual eye or single eye operation and pick the appropiate resistor.

Single Eye:
Use the 130ohm resistor marked with Black, Black, and Gold middle rings:

v4litesingleeye

Dual Eye:
Use the 65ohm resistor marked with Yellow, White and Gold middle rings:

v4litedualeye

Now, solder the resistor on the board (any orientation), and then the black 3 pin voltage regulator (orientation matters, solder on the side with the white outline and have it fit in the outline's shape)

v4litemainboardassem

Now, wire up the LEDs like shown.

v4litefullassmb

',37)]))}const u=t(o,[["render",s]]);export{g as __pageData,u as default}; +import{_ as t,o as i,c as a,O as r}from"./chunks/framework.ece1a6f0.js";const g=JSON.parse('{"title":"How to assemble a V4 mini LED hardware kit:","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/led_setup.md","filePath":"how_to_build/led_setup.md","lastUpdated":1723839694000}'),o={name:"how_to_build/led_setup.md"};function s(n,e,l,h,p,d){return i(),a("div",null,e[0]||(e[0]=[r('

Pardon the mess, this page is WIP more docs for other configurations and assemblly are in the works.

How to assemble a V4 mini LED hardware kit:

Getting to know your hardware

There are 3 main components of an IR LED kit; the mainboard, LEDs and wires.

Mainboard

Below is the V4 mini mainboard with major features labled. V4mini
V4mini_back

LEDs

There are 2 different types of LED boards. The one you should have more of are the "N" LEDs. N stands for Normal, these make up 3 of the leds per eye. nLED
NLEDback

The second type is the "E" LEDs. E stands for End as these are put at the end of the LED strand.

eLED
eLEDback

In future orders the "E" LEDs will be purple for easier distinction. eLEDpurple

Wires

The included wires are a bit special, they have 3 pins on the connectors but only 2 wires are attached. v4wire

This distinction is crutial in assembling a kit as the wires need to go in a specific orientation outlined in the assembly picture which shows the pins without wires as dashes - - -.

Wiring up V4 mini

Start by pluggin in the long wires to the main board like shown.

notpluggedr
pluggedinr

Then connect the wires to leds in the sequence:

Mainboard -> N LED -> N LED -> N LED - > E LED

You need to pay very close attention to the orientation of the wires so that the missing wire is facing the correct way. The following image shows a kit fully assembled:

v4minifull

Here is an example of the right eye's LED strand.

v4minireye

How to assemble V4 Lite LED kit:

Getting to know V4 lite

V4 lite is a soldering-required approach to LEDs. There are a few specific caveats to know before assembling and using this hardware.

  1. The board must be supplied with 5v.

    • Other voltages may result in darker/non functioning LEDs.
  2. You must change resistors if you change from a single or dual eye setup to the other.

    • Not doing so will result in too dim of LEDs or extremely bright LEDs. Ensure you are always using the correct one for your application.
  3. Shorts on the main board can result in damaged hardware, dangerously bright LEDs, or nonfunctioning hardware.

    • Please ensure there are no shorts (even very small stray solder strands) between any pins or solder joints on the main board or LEDs.

Wiring up V4 Lite

First, decide if you want dual eye or single eye operation and pick the appropiate resistor.

Single Eye:
Use the 130ohm resistor marked with Black, Black, and Gold middle rings:

v4litesingleeye

Dual Eye:
Use the 65ohm resistor marked with Yellow, White and Gold middle rings:

v4litedualeye

Now, solder the resistor on the board (any orientation), and then the black 3 pin voltage regulator (orientation matters, solder on the side with the white outline and have it fit in the outline's shape)

v4litemainboardassem

Now, wire up the LEDs like shown.

v4litefullassmb

',37)]))}const u=t(o,[["render",s]]);export{g as __pageData,u as default}; diff --git a/assets/how_to_build_led_setup.md.6d99addb.lean.js b/assets/how_to_build_led_setup.md.5f02b3d6.lean.js similarity index 97% rename from assets/how_to_build_led_setup.md.6d99addb.lean.js rename to assets/how_to_build_led_setup.md.5f02b3d6.lean.js index 448ad24..22a8bd7 100644 --- a/assets/how_to_build_led_setup.md.6d99addb.lean.js +++ b/assets/how_to_build_led_setup.md.5f02b3d6.lean.js @@ -1 +1 @@ -import{_ as t,o as i,c as a,O as r}from"./chunks/framework.47aa8d5b.js";const g=JSON.parse('{"title":"How to assemble a V4 mini LED hardware kit:","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/led_setup.md","filePath":"how_to_build/led_setup.md","lastUpdated":1723839694000}'),o={name:"how_to_build/led_setup.md"};function s(n,e,l,h,p,d){return i(),a("div",null,e[0]||(e[0]=[r('

Pardon the mess, this page is WIP more docs for other configurations and assemblly are in the works.

How to assemble a V4 mini LED hardware kit:

Getting to know your hardware

There are 3 main components of an IR LED kit; the mainboard, LEDs and wires.

Mainboard

Below is the V4 mini mainboard with major features labled. V4mini
V4mini_back

LEDs

There are 2 different types of LED boards. The one you should have more of are the "N" LEDs. N stands for Normal, these make up 3 of the leds per eye. nLED
NLEDback

The second type is the "E" LEDs. E stands for End as these are put at the end of the LED strand.

eLED
eLEDback

In future orders the "E" LEDs will be purple for easier distinction. eLEDpurple

Wires

The included wires are a bit special, they have 3 pins on the connectors but only 2 wires are attached. v4wire

This distinction is crutial in assembling a kit as the wires need to go in a specific orientation outlined in the assembly picture which shows the pins without wires as dashes - - -.

Wiring up V4 mini

Start by pluggin in the long wires to the main board like shown.

notpluggedr
pluggedinr

Then connect the wires to leds in the sequence:

Mainboard -> N LED -> N LED -> N LED - > E LED

You need to pay very close attention to the orientation of the wires so that the missing wire is facing the correct way. The following image shows a kit fully assembled:

v4minifull

Here is an example of the right eye's LED strand.

v4minireye

How to assemble V4 Lite LED kit:

Getting to know V4 lite

V4 lite is a soldering-required approach to LEDs. There are a few specific caveats to know before assembling and using this hardware.

  1. The board must be supplied with 5v.

    • Other voltages may result in darker/non functioning LEDs.
  2. You must change resistors if you change from a single or dual eye setup to the other.

    • Not doing so will result in too dim of LEDs or extremely bright LEDs. Ensure you are always using the correct one for your application.
  3. Shorts on the main board can result in damaged hardware, dangerously bright LEDs, or nonfunctioning hardware.

    • Please ensure there are no shorts (even very small stray solder strands) between any pins or solder joints on the main board or LEDs.

Wiring up V4 Lite

First, decide if you want dual eye or single eye operation and pick the appropiate resistor.

Single Eye:
Use the 130ohm resistor marked with Black, Black, and Gold middle rings:

v4litesingleeye

Dual Eye:
Use the 65ohm resistor marked with Yellow, White and Gold middle rings:

v4litedualeye

Now, solder the resistor on the board (any orientation), and then the black 3 pin voltage regulator (orientation matters, solder on the side with the white outline and have it fit in the outline's shape)

v4litemainboardassem

Now, wire up the LEDs like shown.

v4litefullassmb

',37)]))}const u=t(o,[["render",s]]);export{g as __pageData,u as default}; +import{_ as t,o as i,c as a,O as r}from"./chunks/framework.ece1a6f0.js";const g=JSON.parse('{"title":"How to assemble a V4 mini LED hardware kit:","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/led_setup.md","filePath":"how_to_build/led_setup.md","lastUpdated":1723839694000}'),o={name:"how_to_build/led_setup.md"};function s(n,e,l,h,p,d){return i(),a("div",null,e[0]||(e[0]=[r('

Pardon the mess, this page is WIP more docs for other configurations and assemblly are in the works.

How to assemble a V4 mini LED hardware kit:

Getting to know your hardware

There are 3 main components of an IR LED kit; the mainboard, LEDs and wires.

Mainboard

Below is the V4 mini mainboard with major features labled. V4mini
V4mini_back

LEDs

There are 2 different types of LED boards. The one you should have more of are the "N" LEDs. N stands for Normal, these make up 3 of the leds per eye. nLED
NLEDback

The second type is the "E" LEDs. E stands for End as these are put at the end of the LED strand.

eLED
eLEDback

In future orders the "E" LEDs will be purple for easier distinction. eLEDpurple

Wires

The included wires are a bit special, they have 3 pins on the connectors but only 2 wires are attached. v4wire

This distinction is crutial in assembling a kit as the wires need to go in a specific orientation outlined in the assembly picture which shows the pins without wires as dashes - - -.

Wiring up V4 mini

Start by pluggin in the long wires to the main board like shown.

notpluggedr
pluggedinr

Then connect the wires to leds in the sequence:

Mainboard -> N LED -> N LED -> N LED - > E LED

You need to pay very close attention to the orientation of the wires so that the missing wire is facing the correct way. The following image shows a kit fully assembled:

v4minifull

Here is an example of the right eye's LED strand.

v4minireye

How to assemble V4 Lite LED kit:

Getting to know V4 lite

V4 lite is a soldering-required approach to LEDs. There are a few specific caveats to know before assembling and using this hardware.

  1. The board must be supplied with 5v.

    • Other voltages may result in darker/non functioning LEDs.
  2. You must change resistors if you change from a single or dual eye setup to the other.

    • Not doing so will result in too dim of LEDs or extremely bright LEDs. Ensure you are always using the correct one for your application.
  3. Shorts on the main board can result in damaged hardware, dangerously bright LEDs, or nonfunctioning hardware.

    • Please ensure there are no shorts (even very small stray solder strands) between any pins or solder joints on the main board or LEDs.

Wiring up V4 Lite

First, decide if you want dual eye or single eye operation and pick the appropiate resistor.

Single Eye:
Use the 130ohm resistor marked with Black, Black, and Gold middle rings:

v4litesingleeye

Dual Eye:
Use the 65ohm resistor marked with Yellow, White and Gold middle rings:

v4litedualeye

Now, solder the resistor on the board (any orientation), and then the black 3 pin voltage regulator (orientation matters, solder on the side with the white outline and have it fit in the outline's shape)

v4litemainboardassem

Now, wire up the LEDs like shown.

v4litefullassmb

',37)]))}const u=t(o,[["render",s]]);export{g as __pageData,u as default}; diff --git a/assets/how_to_build_part_list.md.3640f4dd.js b/assets/how_to_build_part_list.md.69b5aa87.js similarity index 99% rename from assets/how_to_build_part_list.md.3640f4dd.js rename to assets/how_to_build_part_list.md.69b5aa87.js index 219396e..524f248 100644 --- a/assets/how_to_build_part_list.md.3640f4dd.js +++ b/assets/how_to_build_part_list.md.69b5aa87.js @@ -1 +1 @@ -import{_ as A,o as i,c as o,k as t,F as p,B as k,t as l,a as h,n as w,e as C,E as f,O as y}from"./chunks/framework.47aa8d5b.js";const b={data(){return{tracker:2,components:[{name:"ESP Microcontroller",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:1.85,costAll:()=>this.tracker*0,links:"If you already have a supported camera capable ESP32 or sourced elsewhere."},{name:"★ Seeed Studio XIAO Sense ESP32-S3",amount:()=>this.tracker,cost:12.87,costAll:()=>this.tracker*12.87+3.18,links:'AliExpress XIAO Sense Recommended'},{name:"ESP32-CAM",amount:()=>this.tracker,cost:12.87,costAll:()=>this.tracker*4.69+3.18,links:'AliExpress ESP32 CAM Requires additional programmer'},{name:"FREENOVE ESP32-S3-WROOM",amount:()=>this.tracker,cost:19.95,costAll:()=>this.tracker*19.95,links:'Amazon Large, more expensive than XIAO'}],selectedChoice:1,isOpen:!1},{name:"Camera",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you already have a supported camera or sourced elsewhere."},{name:"★ 130 Degree NO-IR",amount:()=>this.tracker,cost:5.41,costAll:()=>this.tracker*5.41,links:'AliExpress Select "Color: 75MM-130 Degree" Must manually remove IR filter'},{name:"160 Degree IR",amount:()=>this.tracker,cost:4.26,costAll:()=>this.tracker*4.26,links:'AliExpress Select "Color: 75MM-160 850nm"'}],selectedChoice:1,isOpen:!1},{name:"IR LEDs",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:'IR LED Safety If you already have safe IR LED hardware and know what you are doing.'},{name:"★ Official V4 mini No-Solder",amount:()=>1,cost:30,costAll:()=>this.tracker+30+5,links:'ETVR Store Length depending on HMD'},{name:"Official V4 mini Solder-Required",amount:()=>1,cost:25,costAll:()=>this.tracker+25+3,links:'ETVR Store Must solder up your own wires'},{name:"Official V4 lite Assemble Yourself",amount:()=>1,cost:7,costAll:()=>this.tracker+7+3,links:'ETVR Store Must assemble yourself'}],selectedChoice:1,isOpen:!1},{name:"USB Hub",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you already have safe IR LED hardware and know what you are doing."},{name:"★ 4 port USB 3.2 LDLrui (MTT Usually) (Best for Cost)",amount:()=>1,cost:17.99,costAll:()=>this.tracker+17.99,links:'Amazon Usually these are MTT, but sometimes not'},{name:"4 port USB 3.2 Sitecom CN-385 Hub (MTT)",amount:()=>1,cost:40.53,costAll:()=>this.tracker+17.99,links:'Amazon Known good MTT hub, but expensive'},{name:"4 port USB 2.0 Breakout (Not MTT)",amount:()=>1,cost:1.41,costAll:()=>this.tracker+1.41+1.99,links:'AliExpress Small but non MTT hub breakout'},{name:"★ 4 port Adafruit CH334F USB Hub Breakout (MTT) (Best for Size)",amount:()=>1,cost:4.99,costAll:()=>this.tracker+8,links:'Adafruit Small, high quality MTT hub breakout'},{name:"★ 3 port USB 3.0 Hub With Power Passthrough (MTT) (Best for Quest)",amount:()=>1,cost:17.99,costAll:()=>this.tracker+1.41,links:'Amazon Great for Quest due to power passthrough'}],selectedChoice:1,isOpen:!1},{name:"3D Printed Mounts",choices:[{name:"Print Yourself",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you have a 3d printer or have access to one somewhere such as a library, friend, or school."},{name:"JLCPCB Print Service, JLC3DP",amount:()=>this.tracker,cost:2,costAll:()=>this.tracker*2+5,links:'JLC3DP Printing Service'}],selectedChoice:0,isOpen:!1}],total:0}},methods:{updatePrices(){let s=0;this.components.forEach(a=>{if(a.choices.length>1){const r=a.choices[a.selectedChoice];s+=r.costAll(this.tracker)}else a.choices.length===1&&(s+=a.choices[0].costAll(this.tracker))}),this.total=s},toggleDropdown(s,a){this.components.forEach(r=>{r!==s&&(r.isOpen=!1)}),s.isOpen=!s.isOpen},isOptionsAbove(s){return s>=this.components.length-2},selectOption(s,a){s.selectedChoice=a,s.isOpen=!1,this.updatePrices()},closeAllDropdowns(){this.components.forEach(s=>{s.isOpen=!1})},handleOutsideClick(s){s.target.closest(".custom-select")||this.closeAllDropdowns()}},mounted(){this.updatePrices(),document.addEventListener("click",this.handleOutsideClick)},beforeUnmount(){document.removeEventListener("click",this.handleOutsideClick)}},S={class:"table-container"},E={class:"component-col"},O={class:"choice-col"},_=["onClick"],x={class:"selected-option"},B=["onClick"],P={key:1},T=["innerHTML"];function D(s,a,r,v,n,c){return i(),o("div",S,[t("table",null,[a[1]||(a[1]=t("thead",null,[t("tr",null,[t("th",{class:"component-col"},"Component"),t("th",{class:"choice-col"},"Choice"),t("th",{class:"amount-col"},"Amount"),t("th",{class:"cost-col"},"Cost"),t("th",{class:"cost-all-col"},"Cost All"),t("th",{class:"links-col"},"Links")])],-1)),t("tbody",null,[(i(!0),o(p,null,k(n.components,(e,d)=>(i(),o("tr",{key:e.name},[t("th",E,l(e.name),1),t("td",O,[e.choices.length>1?(i(),o("div",{key:0,class:"custom-select",onClick:u=>c.toggleDropdown(e,d),ref_for:!0,ref:`select-${e.name}`},[t("div",x,[h(l(e.choices[e.selectedChoice].name)+" ",1),(i(),o("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:w(["dropdown-arrow",{rotate:e.isOpen}])},a[0]||(a[0]=[t("polyline",{points:"6 9 12 15 18 9"},null,-1)]),2))]),e.isOpen?(i(),o("div",{key:0,class:w(["options",{"options-above":c.isOptionsAbove(d)}])},[(i(!0),o(p,null,k(e.choices,(u,m)=>(i(),o("div",{key:m,onClick:g=>c.selectOption(e,m),class:"option"},l(u.name),9,B))),128))],2)):C("",!0)],8,_)):(i(),o("span",P,l(e.choices[0].name),1))]),t("td",null,l(e.selectedChoice?e.choices[e.selectedChoice].amount(n.tracker):0),1),t("td",null,l(e.selectedChoice?"$"+e.choices[e.selectedChoice].cost.toFixed(2):0),1),t("td",null,l(e.selectedChoice?"~$"+e.choices[e.selectedChoice].costAll().toFixed(2):0),1),t("td",{innerHTML:e.selectedChoice?e.choices[e.selectedChoice].links:""},null,8,T)]))),128))])]),t("p",null,"Total: $"+l(n.total.toFixed(2)),1)])}const M=A(b,[["render",D],["__scopeId","data-v-dcf0858f"]]);const R={data(){return{tracker:2,components:[{name:"Type A USB Breakout",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:1.85,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"Type A USB Breakout Bare (AliExpress)",amount:()=>1,cost:1.18,costAll:()=>this.tracker+1.18,links:'AliExpress'},{name:"Type A USB Breakout Bare (Amazon)",amount:()=>1,cost:6.49,costAll:()=>this.tracker+5.49,links:'Amazon'},{name:"Type A USB Breakout With Cover (AliExpress)",amount:()=>1,cost:2.2,costAll:()=>this.tracker+1.2+1.99,links:'AliExpress'},{name:"Type A USB Breakout With Wire and Cover (Amazon)",amount:()=>1,cost:9.6,costAll:()=>this.tracker+8.6,links:'Amazon'}],selectedChoice:0,isOpen:!1},{name:"USB-C Breakout",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress Male & Female",amount:()=>1,cost:1.19,costAll:()=>this.tracker+1.19+1.37,links:'AliExpress Choose: "Color: 5Set".'},{name:"AliExpress Vertical Male",amount:()=>1,cost:2.37,costAll:()=>this.tracker+.37+1.99,links:'AliExpress'}],selectedChoice:0,isOpen:!1},{name:"Wire for ESPs",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need wire or already have."},{name:"Silicone Wire Kit",amount:()=>1,cost:5.96,costAll:()=>this.tracker+5.96+.99,links:'AliExpress 30 AWG or lower'},{name:"Generic Wire",amount:()=>1,cost:.7,costAll:()=>this.tracker+.7+1.24,links:'AliExpress Select "Specification: 30 AWG or lower"'}],selectedChoice:0,isOpen:!1},{name:"Wire for LEDs",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need wire or already have."},{name:"Silicone Wire Kit",amount:()=>1,cost:5.96,costAll:()=>this.tracker+5.96+.99,links:'AliExpress 30 AWG or higher'},{name:"Generic Wire",amount:()=>1,cost:.7,costAll:()=>this.tracker+.7+1.24,links:'AliExpress Select "Specification: 30 AWG or higher"'}],selectedChoice:0,isOpen:!1},{name:"Camera Extension Cables",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress 24pin 0.5mm Pitch",amount:()=>1,cost:1.33,costAll:()=>this.tracker+.33+1.99,links:'AliExpress Choose: "Insert Type: 24p 0.5mm pitch" and Type A. Length depends on HMD, usually 150mm or 200mm.'},{name:"Adafruit 24 pin 0.5mm pitch",amount:()=>this.tracker,cost:1.35,costAll:()=>this.tracker*1.35+6,links:'Adafruit 250mm'}],selectedChoice:0,isOpen:!1},{name:"Camera Extension Connectors",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress 24 pin",amount:()=>1,cost:1.32,costAll:()=>this.tracker+.32+1.99,links:'AliExpress Choose: "Pins: 24P".'},{name:"Adafruit 24 pin",amount:()=>this.tracker,cost:.86,costAll:()=>this.tracker*.865+6,links:'Adafruit'}],selectedChoice:0,isOpen:!1},{name:"External Antennas",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress Small",amount:()=>1,cost:.16,costAll:()=>this.tracker*.16+3.48,links:'AliExpress Choose: "Color: 2.4G Antenna".'},{name:"Amazon Large",amount:()=>1,cost:9.99,costAll:()=>this.tracker+7.99,links:'Amazon'}],selectedChoice:0,isOpen:!1},{name:"USB-C Cables",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"Short USB-C to USB-C Amazon",amount:()=>1,cost:6.29,costAll:()=>this.tracker+5.29,links:'Amazon'},{name:"Short USB-A to USB-C Amazon",amount:()=>1,cost:7.99,costAll:()=>this.tracker+5.99,links:'Amazon'}],selectedChoice:0,isOpen:!1},{name:"V4 LED Wire Extensions/Replacements",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"110mm Extension/Replacement",amount:()=>1,cost:1.5,costAll:()=>this.tracker+1.5+5,links:'ETVR Store'},{name:"200mm Extension/Replacement",amount:()=>1,cost:1.5,costAll:()=>this.tracker+1.5+5,links:'ETVR Store'}],selectedChoice:0,isOpen:!1}],total:0}},methods:{updatePrices(){let s=0;this.components.forEach(a=>{if(a.choices.length>1){const r=a.choices[a.selectedChoice];s+=r.costAll(this.tracker)}else a.choices.length===1&&(s+=a.choices[0].costAll(this.tracker))}),this.total=s},toggleDropdown(s,a){this.components.forEach(r=>{r!==s&&(r.isOpen=!1)}),s.isOpen=!s.isOpen},isOptionsAbove(s){return s>=this.components.length-2},selectOption(s,a){s.selectedChoice=a,s.isOpen=!1,this.updatePrices()},closeAllDropdowns(){this.components.forEach(s=>{s.isOpen=!1})},handleOutsideClick(s){s.target.closest(".custom-select")||this.closeAllDropdowns()}},mounted(){this.updatePrices(),document.addEventListener("click",this.handleOutsideClick)},beforeUnmount(){document.removeEventListener("click",this.handleOutsideClick)}},W={class:"table-container"},I={class:"component-col"},L={class:"choice-col"},z=["onClick"],U={class:"selected-option"},F=["onClick"],q={key:1},V=["innerHTML"];function N(s,a,r,v,n,c){return i(),o("div",W,[t("table",null,[a[1]||(a[1]=t("thead",null,[t("tr",null,[t("th",{class:"component-col"},"Component"),t("th",{class:"choice-col"},"Choice"),t("th",{class:"amount-col"},"Amount"),t("th",{class:"cost-col"},"Cost"),t("th",{class:"cost-all-col"},"Cost All"),t("th",{class:"links-col"},"Links")])],-1)),t("tbody",null,[(i(!0),o(p,null,k(n.components,(e,d)=>(i(),o("tr",{key:e.name},[t("th",I,l(e.name),1),t("td",L,[e.choices.length>1?(i(),o("div",{key:0,class:"custom-select",onClick:u=>c.toggleDropdown(e,d),ref_for:!0,ref:`select-${e.name}`},[t("div",U,[h(l(e.choices[e.selectedChoice].name)+" ",1),(i(),o("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:w(["dropdown-arrow",{rotate:e.isOpen}])},a[0]||(a[0]=[t("polyline",{points:"6 9 12 15 18 9"},null,-1)]),2))]),e.isOpen?(i(),o("div",{key:0,class:w(["options",{"options-above":c.isOptionsAbove(d)}])},[(i(!0),o(p,null,k(e.choices,(u,m)=>(i(),o("div",{key:m,onClick:g=>c.selectOption(e,m),class:"option"},l(u.name),9,F))),128))],2)):C("",!0)],8,z)):(i(),o("span",q,l(e.choices[0].name),1))]),t("td",null,l(e.selectedChoice?e.choices[e.selectedChoice].amount(n.tracker):0),1),t("td",null,l(e.selectedChoice?"$"+e.choices[e.selectedChoice].cost.toFixed(2):0),1),t("td",null,l(e.selectedChoice?"~$"+e.choices[e.selectedChoice].costAll().toFixed(2):0),1),t("td",{innerHTML:e.selectedChoice?e.choices[e.selectedChoice].links:""},null,8,V)]))),128))])]),t("p",null,"Total: $"+l(n.total.toFixed(2)),1)])}const $=A(R,[["render",N],["__scopeId","data-v-3e89084e"]]),G=JSON.parse('{"title":"Required Parts:","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/part_list.md","filePath":"how_to_build/part_list.md","lastUpdated":1730845983000}'),H={name:"how_to_build/part_list.md"},Q=Object.assign(H,{setup(s){return(a,r)=>(i(),o("div",null,[r[0]||(r[0]=t("p",null,"WIP new parts list. 3D printed parts will live on their own page.",-1)),r[1]||(r[1]=t("p",null,[h("Use the "),t("strong",null,"interactive"),h(" tables below to select parts!")],-1)),r[2]||(r[2]=t("h1",{id:"required-parts",tabindex:"-1"},[h("Required Parts: "),t("a",{class:"header-anchor",href:"#required-parts","aria-label":'Permalink to "Required Parts:"'},"​")],-1)),f(M),r[3]||(r[3]=t("h1",{id:"additional-parts",tabindex:"-1"},[h("Additional Parts: "),t("a",{class:"header-anchor",href:"#additional-parts","aria-label":'Permalink to "Additional Parts:"'},"​")],-1)),f($),r[4]||(r[4]=y('

Table modified greatly from the table on SlimeVR's Docs which was created by Carl

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wired over USB Serial

Wired Capable ESPs:

  • Seeed Studio XIAO Sense
  • FREENOVE ESP32-S3-WROOM CAM Board

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerate up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required compared to ESP32-CAM boards

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be slightly more costly
  • When in use with a Vive Facial Tracker or other bandwidth sensitive components, a MTT USB hub is required or the devices will be unusable (low FPS).
  • Requires beta app versions until the v2.0 app is released

Option 2: Wireless over WiFi 2.4 GHz

Wireless Capable ESPs:

  • Seeed Studio XIAO Sense
  • ESP32-CAM
  • FREENOVE ESP32-S3-WROOM CAM Board

This offers a good starting point as the ESP32-CAM boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they don't really make sense.

Pros:

  • Less cables (power only)
  • No issues with USB hubs
  • Easier to flash

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • High risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • Uses more power and heats up due to radio power needs
',19))]))}});export{G as __pageData,Q as default}; +import{_ as A,o as i,c as o,k as t,F as p,B as k,t as l,a as h,n as w,e as C,E as f,O as y}from"./chunks/framework.ece1a6f0.js";const b={data(){return{tracker:2,components:[{name:"ESP Microcontroller",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:1.85,costAll:()=>this.tracker*0,links:"If you already have a supported camera capable ESP32 or sourced elsewhere."},{name:"★ Seeed Studio XIAO Sense ESP32-S3",amount:()=>this.tracker,cost:12.87,costAll:()=>this.tracker*12.87+3.18,links:'AliExpress XIAO Sense Recommended'},{name:"ESP32-CAM",amount:()=>this.tracker,cost:12.87,costAll:()=>this.tracker*4.69+3.18,links:'AliExpress ESP32 CAM Requires additional programmer'},{name:"FREENOVE ESP32-S3-WROOM",amount:()=>this.tracker,cost:19.95,costAll:()=>this.tracker*19.95,links:'Amazon Large, more expensive than XIAO'}],selectedChoice:1,isOpen:!1},{name:"Camera",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you already have a supported camera or sourced elsewhere."},{name:"★ 130 Degree NO-IR",amount:()=>this.tracker,cost:5.41,costAll:()=>this.tracker*5.41,links:'AliExpress Select "Color: 75MM-130 Degree" Must manually remove IR filter'},{name:"160 Degree IR",amount:()=>this.tracker,cost:4.26,costAll:()=>this.tracker*4.26,links:'AliExpress Select "Color: 75MM-160 850nm"'}],selectedChoice:1,isOpen:!1},{name:"IR LEDs",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:'IR LED Safety If you already have safe IR LED hardware and know what you are doing.'},{name:"★ Official V4 mini No-Solder",amount:()=>1,cost:30,costAll:()=>this.tracker+30+5,links:'ETVR Store Length depending on HMD'},{name:"Official V4 mini Solder-Required",amount:()=>1,cost:25,costAll:()=>this.tracker+25+3,links:'ETVR Store Must solder up your own wires'},{name:"Official V4 lite Assemble Yourself",amount:()=>1,cost:7,costAll:()=>this.tracker+7+3,links:'ETVR Store Must assemble yourself'}],selectedChoice:1,isOpen:!1},{name:"USB Hub",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you already have safe IR LED hardware and know what you are doing."},{name:"★ 4 port USB 3.2 LDLrui (MTT Usually) (Best for Cost)",amount:()=>1,cost:17.99,costAll:()=>this.tracker+17.99,links:'Amazon Usually these are MTT, but sometimes not'},{name:"4 port USB 3.2 Sitecom CN-385 Hub (MTT)",amount:()=>1,cost:40.53,costAll:()=>this.tracker+17.99,links:'Amazon Known good MTT hub, but expensive'},{name:"4 port USB 2.0 Breakout (Not MTT)",amount:()=>1,cost:1.41,costAll:()=>this.tracker+1.41+1.99,links:'AliExpress Small but non MTT hub breakout'},{name:"★ 4 port Adafruit CH334F USB Hub Breakout (MTT) (Best for Size)",amount:()=>1,cost:4.99,costAll:()=>this.tracker+8,links:'Adafruit Small, high quality MTT hub breakout'},{name:"★ 3 port USB 3.0 Hub With Power Passthrough (MTT) (Best for Quest)",amount:()=>1,cost:17.99,costAll:()=>this.tracker+1.41,links:'Amazon Great for Quest due to power passthrough'}],selectedChoice:1,isOpen:!1},{name:"3D Printed Mounts",choices:[{name:"Print Yourself",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you have a 3d printer or have access to one somewhere such as a library, friend, or school."},{name:"JLCPCB Print Service, JLC3DP",amount:()=>this.tracker,cost:2,costAll:()=>this.tracker*2+5,links:'JLC3DP Printing Service'}],selectedChoice:0,isOpen:!1}],total:0}},methods:{updatePrices(){let s=0;this.components.forEach(a=>{if(a.choices.length>1){const r=a.choices[a.selectedChoice];s+=r.costAll(this.tracker)}else a.choices.length===1&&(s+=a.choices[0].costAll(this.tracker))}),this.total=s},toggleDropdown(s,a){this.components.forEach(r=>{r!==s&&(r.isOpen=!1)}),s.isOpen=!s.isOpen},isOptionsAbove(s){return s>=this.components.length-2},selectOption(s,a){s.selectedChoice=a,s.isOpen=!1,this.updatePrices()},closeAllDropdowns(){this.components.forEach(s=>{s.isOpen=!1})},handleOutsideClick(s){s.target.closest(".custom-select")||this.closeAllDropdowns()}},mounted(){this.updatePrices(),document.addEventListener("click",this.handleOutsideClick)},beforeUnmount(){document.removeEventListener("click",this.handleOutsideClick)}},S={class:"table-container"},E={class:"component-col"},O={class:"choice-col"},_=["onClick"],x={class:"selected-option"},B=["onClick"],P={key:1},T=["innerHTML"];function D(s,a,r,v,n,c){return i(),o("div",S,[t("table",null,[a[1]||(a[1]=t("thead",null,[t("tr",null,[t("th",{class:"component-col"},"Component"),t("th",{class:"choice-col"},"Choice"),t("th",{class:"amount-col"},"Amount"),t("th",{class:"cost-col"},"Cost"),t("th",{class:"cost-all-col"},"Cost All"),t("th",{class:"links-col"},"Links")])],-1)),t("tbody",null,[(i(!0),o(p,null,k(n.components,(e,d)=>(i(),o("tr",{key:e.name},[t("th",E,l(e.name),1),t("td",O,[e.choices.length>1?(i(),o("div",{key:0,class:"custom-select",onClick:u=>c.toggleDropdown(e,d),ref_for:!0,ref:`select-${e.name}`},[t("div",x,[h(l(e.choices[e.selectedChoice].name)+" ",1),(i(),o("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:w(["dropdown-arrow",{rotate:e.isOpen}])},a[0]||(a[0]=[t("polyline",{points:"6 9 12 15 18 9"},null,-1)]),2))]),e.isOpen?(i(),o("div",{key:0,class:w(["options",{"options-above":c.isOptionsAbove(d)}])},[(i(!0),o(p,null,k(e.choices,(u,m)=>(i(),o("div",{key:m,onClick:g=>c.selectOption(e,m),class:"option"},l(u.name),9,B))),128))],2)):C("",!0)],8,_)):(i(),o("span",P,l(e.choices[0].name),1))]),t("td",null,l(e.selectedChoice?e.choices[e.selectedChoice].amount(n.tracker):0),1),t("td",null,l(e.selectedChoice?"$"+e.choices[e.selectedChoice].cost.toFixed(2):0),1),t("td",null,l(e.selectedChoice?"~$"+e.choices[e.selectedChoice].costAll().toFixed(2):0),1),t("td",{innerHTML:e.selectedChoice?e.choices[e.selectedChoice].links:""},null,8,T)]))),128))])]),t("p",null,"Total: $"+l(n.total.toFixed(2)),1)])}const M=A(b,[["render",D],["__scopeId","data-v-dcf0858f"]]);const R={data(){return{tracker:2,components:[{name:"Type A USB Breakout",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:1.85,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"Type A USB Breakout Bare (AliExpress)",amount:()=>1,cost:1.18,costAll:()=>this.tracker+1.18,links:'AliExpress'},{name:"Type A USB Breakout Bare (Amazon)",amount:()=>1,cost:6.49,costAll:()=>this.tracker+5.49,links:'Amazon'},{name:"Type A USB Breakout With Cover (AliExpress)",amount:()=>1,cost:2.2,costAll:()=>this.tracker+1.2+1.99,links:'AliExpress'},{name:"Type A USB Breakout With Wire and Cover (Amazon)",amount:()=>1,cost:9.6,costAll:()=>this.tracker+8.6,links:'Amazon'}],selectedChoice:0,isOpen:!1},{name:"USB-C Breakout",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress Male & Female",amount:()=>1,cost:1.19,costAll:()=>this.tracker+1.19+1.37,links:'AliExpress Choose: "Color: 5Set".'},{name:"AliExpress Vertical Male",amount:()=>1,cost:2.37,costAll:()=>this.tracker+.37+1.99,links:'AliExpress'}],selectedChoice:0,isOpen:!1},{name:"Wire for ESPs",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need wire or already have."},{name:"Silicone Wire Kit",amount:()=>1,cost:5.96,costAll:()=>this.tracker+5.96+.99,links:'AliExpress 30 AWG or lower'},{name:"Generic Wire",amount:()=>1,cost:.7,costAll:()=>this.tracker+.7+1.24,links:'AliExpress Select "Specification: 30 AWG or lower"'}],selectedChoice:0,isOpen:!1},{name:"Wire for LEDs",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need wire or already have."},{name:"Silicone Wire Kit",amount:()=>1,cost:5.96,costAll:()=>this.tracker+5.96+.99,links:'AliExpress 30 AWG or higher'},{name:"Generic Wire",amount:()=>1,cost:.7,costAll:()=>this.tracker+.7+1.24,links:'AliExpress Select "Specification: 30 AWG or higher"'}],selectedChoice:0,isOpen:!1},{name:"Camera Extension Cables",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress 24pin 0.5mm Pitch",amount:()=>1,cost:1.33,costAll:()=>this.tracker+.33+1.99,links:'AliExpress Choose: "Insert Type: 24p 0.5mm pitch" and Type A. Length depends on HMD, usually 150mm or 200mm.'},{name:"Adafruit 24 pin 0.5mm pitch",amount:()=>this.tracker,cost:1.35,costAll:()=>this.tracker*1.35+6,links:'Adafruit 250mm'}],selectedChoice:0,isOpen:!1},{name:"Camera Extension Connectors",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress 24 pin",amount:()=>1,cost:1.32,costAll:()=>this.tracker+.32+1.99,links:'AliExpress Choose: "Pins: 24P".'},{name:"Adafruit 24 pin",amount:()=>this.tracker,cost:.86,costAll:()=>this.tracker*.865+6,links:'Adafruit'}],selectedChoice:0,isOpen:!1},{name:"External Antennas",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress Small",amount:()=>1,cost:.16,costAll:()=>this.tracker*.16+3.48,links:'AliExpress Choose: "Color: 2.4G Antenna".'},{name:"Amazon Large",amount:()=>1,cost:9.99,costAll:()=>this.tracker+7.99,links:'Amazon'}],selectedChoice:0,isOpen:!1},{name:"USB-C Cables",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"Short USB-C to USB-C Amazon",amount:()=>1,cost:6.29,costAll:()=>this.tracker+5.29,links:'Amazon'},{name:"Short USB-A to USB-C Amazon",amount:()=>1,cost:7.99,costAll:()=>this.tracker+5.99,links:'Amazon'}],selectedChoice:0,isOpen:!1},{name:"V4 LED Wire Extensions/Replacements",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"110mm Extension/Replacement",amount:()=>1,cost:1.5,costAll:()=>this.tracker+1.5+5,links:'ETVR Store'},{name:"200mm Extension/Replacement",amount:()=>1,cost:1.5,costAll:()=>this.tracker+1.5+5,links:'ETVR Store'}],selectedChoice:0,isOpen:!1}],total:0}},methods:{updatePrices(){let s=0;this.components.forEach(a=>{if(a.choices.length>1){const r=a.choices[a.selectedChoice];s+=r.costAll(this.tracker)}else a.choices.length===1&&(s+=a.choices[0].costAll(this.tracker))}),this.total=s},toggleDropdown(s,a){this.components.forEach(r=>{r!==s&&(r.isOpen=!1)}),s.isOpen=!s.isOpen},isOptionsAbove(s){return s>=this.components.length-2},selectOption(s,a){s.selectedChoice=a,s.isOpen=!1,this.updatePrices()},closeAllDropdowns(){this.components.forEach(s=>{s.isOpen=!1})},handleOutsideClick(s){s.target.closest(".custom-select")||this.closeAllDropdowns()}},mounted(){this.updatePrices(),document.addEventListener("click",this.handleOutsideClick)},beforeUnmount(){document.removeEventListener("click",this.handleOutsideClick)}},W={class:"table-container"},I={class:"component-col"},L={class:"choice-col"},z=["onClick"],U={class:"selected-option"},F=["onClick"],q={key:1},V=["innerHTML"];function N(s,a,r,v,n,c){return i(),o("div",W,[t("table",null,[a[1]||(a[1]=t("thead",null,[t("tr",null,[t("th",{class:"component-col"},"Component"),t("th",{class:"choice-col"},"Choice"),t("th",{class:"amount-col"},"Amount"),t("th",{class:"cost-col"},"Cost"),t("th",{class:"cost-all-col"},"Cost All"),t("th",{class:"links-col"},"Links")])],-1)),t("tbody",null,[(i(!0),o(p,null,k(n.components,(e,d)=>(i(),o("tr",{key:e.name},[t("th",I,l(e.name),1),t("td",L,[e.choices.length>1?(i(),o("div",{key:0,class:"custom-select",onClick:u=>c.toggleDropdown(e,d),ref_for:!0,ref:`select-${e.name}`},[t("div",U,[h(l(e.choices[e.selectedChoice].name)+" ",1),(i(),o("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:w(["dropdown-arrow",{rotate:e.isOpen}])},a[0]||(a[0]=[t("polyline",{points:"6 9 12 15 18 9"},null,-1)]),2))]),e.isOpen?(i(),o("div",{key:0,class:w(["options",{"options-above":c.isOptionsAbove(d)}])},[(i(!0),o(p,null,k(e.choices,(u,m)=>(i(),o("div",{key:m,onClick:g=>c.selectOption(e,m),class:"option"},l(u.name),9,F))),128))],2)):C("",!0)],8,z)):(i(),o("span",q,l(e.choices[0].name),1))]),t("td",null,l(e.selectedChoice?e.choices[e.selectedChoice].amount(n.tracker):0),1),t("td",null,l(e.selectedChoice?"$"+e.choices[e.selectedChoice].cost.toFixed(2):0),1),t("td",null,l(e.selectedChoice?"~$"+e.choices[e.selectedChoice].costAll().toFixed(2):0),1),t("td",{innerHTML:e.selectedChoice?e.choices[e.selectedChoice].links:""},null,8,V)]))),128))])]),t("p",null,"Total: $"+l(n.total.toFixed(2)),1)])}const $=A(R,[["render",N],["__scopeId","data-v-3e89084e"]]),G=JSON.parse('{"title":"Required Parts:","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/part_list.md","filePath":"how_to_build/part_list.md","lastUpdated":1730845983000}'),H={name:"how_to_build/part_list.md"},Q=Object.assign(H,{setup(s){return(a,r)=>(i(),o("div",null,[r[0]||(r[0]=t("p",null,"WIP new parts list. 3D printed parts will live on their own page.",-1)),r[1]||(r[1]=t("p",null,[h("Use the "),t("strong",null,"interactive"),h(" tables below to select parts!")],-1)),r[2]||(r[2]=t("h1",{id:"required-parts",tabindex:"-1"},[h("Required Parts: "),t("a",{class:"header-anchor",href:"#required-parts","aria-label":'Permalink to "Required Parts:"'},"​")],-1)),f(M),r[3]||(r[3]=t("h1",{id:"additional-parts",tabindex:"-1"},[h("Additional Parts: "),t("a",{class:"header-anchor",href:"#additional-parts","aria-label":'Permalink to "Additional Parts:"'},"​")],-1)),f($),r[4]||(r[4]=y('

Table modified greatly from the table on SlimeVR's Docs which was created by Carl

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wired over USB Serial

Wired Capable ESPs:

  • Seeed Studio XIAO Sense
  • FREENOVE ESP32-S3-WROOM CAM Board

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerate up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required compared to ESP32-CAM boards

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be slightly more costly
  • When in use with a Vive Facial Tracker or other bandwidth sensitive components, a MTT USB hub is required or the devices will be unusable (low FPS).
  • Requires beta app versions until the v2.0 app is released

Option 2: Wireless over WiFi 2.4 GHz

Wireless Capable ESPs:

  • Seeed Studio XIAO Sense
  • ESP32-CAM
  • FREENOVE ESP32-S3-WROOM CAM Board

This offers a good starting point as the ESP32-CAM boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they don't really make sense.

Pros:

  • Less cables (power only)
  • No issues with USB hubs
  • Easier to flash

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • High risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • Uses more power and heats up due to radio power needs
',19))]))}});export{G as __pageData,Q as default}; diff --git a/assets/how_to_build_part_list.md.3640f4dd.lean.js b/assets/how_to_build_part_list.md.69b5aa87.lean.js similarity index 99% rename from assets/how_to_build_part_list.md.3640f4dd.lean.js rename to assets/how_to_build_part_list.md.69b5aa87.lean.js index 219396e..524f248 100644 --- a/assets/how_to_build_part_list.md.3640f4dd.lean.js +++ b/assets/how_to_build_part_list.md.69b5aa87.lean.js @@ -1 +1 @@ -import{_ as A,o as i,c as o,k as t,F as p,B as k,t as l,a as h,n as w,e as C,E as f,O as y}from"./chunks/framework.47aa8d5b.js";const b={data(){return{tracker:2,components:[{name:"ESP Microcontroller",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:1.85,costAll:()=>this.tracker*0,links:"If you already have a supported camera capable ESP32 or sourced elsewhere."},{name:"★ Seeed Studio XIAO Sense ESP32-S3",amount:()=>this.tracker,cost:12.87,costAll:()=>this.tracker*12.87+3.18,links:'AliExpress XIAO Sense Recommended'},{name:"ESP32-CAM",amount:()=>this.tracker,cost:12.87,costAll:()=>this.tracker*4.69+3.18,links:'AliExpress ESP32 CAM Requires additional programmer'},{name:"FREENOVE ESP32-S3-WROOM",amount:()=>this.tracker,cost:19.95,costAll:()=>this.tracker*19.95,links:'Amazon Large, more expensive than XIAO'}],selectedChoice:1,isOpen:!1},{name:"Camera",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you already have a supported camera or sourced elsewhere."},{name:"★ 130 Degree NO-IR",amount:()=>this.tracker,cost:5.41,costAll:()=>this.tracker*5.41,links:'AliExpress Select "Color: 75MM-130 Degree" Must manually remove IR filter'},{name:"160 Degree IR",amount:()=>this.tracker,cost:4.26,costAll:()=>this.tracker*4.26,links:'AliExpress Select "Color: 75MM-160 850nm"'}],selectedChoice:1,isOpen:!1},{name:"IR LEDs",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:'IR LED Safety If you already have safe IR LED hardware and know what you are doing.'},{name:"★ Official V4 mini No-Solder",amount:()=>1,cost:30,costAll:()=>this.tracker+30+5,links:'ETVR Store Length depending on HMD'},{name:"Official V4 mini Solder-Required",amount:()=>1,cost:25,costAll:()=>this.tracker+25+3,links:'ETVR Store Must solder up your own wires'},{name:"Official V4 lite Assemble Yourself",amount:()=>1,cost:7,costAll:()=>this.tracker+7+3,links:'ETVR Store Must assemble yourself'}],selectedChoice:1,isOpen:!1},{name:"USB Hub",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you already have safe IR LED hardware and know what you are doing."},{name:"★ 4 port USB 3.2 LDLrui (MTT Usually) (Best for Cost)",amount:()=>1,cost:17.99,costAll:()=>this.tracker+17.99,links:'Amazon Usually these are MTT, but sometimes not'},{name:"4 port USB 3.2 Sitecom CN-385 Hub (MTT)",amount:()=>1,cost:40.53,costAll:()=>this.tracker+17.99,links:'Amazon Known good MTT hub, but expensive'},{name:"4 port USB 2.0 Breakout (Not MTT)",amount:()=>1,cost:1.41,costAll:()=>this.tracker+1.41+1.99,links:'AliExpress Small but non MTT hub breakout'},{name:"★ 4 port Adafruit CH334F USB Hub Breakout (MTT) (Best for Size)",amount:()=>1,cost:4.99,costAll:()=>this.tracker+8,links:'Adafruit Small, high quality MTT hub breakout'},{name:"★ 3 port USB 3.0 Hub With Power Passthrough (MTT) (Best for Quest)",amount:()=>1,cost:17.99,costAll:()=>this.tracker+1.41,links:'Amazon Great for Quest due to power passthrough'}],selectedChoice:1,isOpen:!1},{name:"3D Printed Mounts",choices:[{name:"Print Yourself",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you have a 3d printer or have access to one somewhere such as a library, friend, or school."},{name:"JLCPCB Print Service, JLC3DP",amount:()=>this.tracker,cost:2,costAll:()=>this.tracker*2+5,links:'JLC3DP Printing Service'}],selectedChoice:0,isOpen:!1}],total:0}},methods:{updatePrices(){let s=0;this.components.forEach(a=>{if(a.choices.length>1){const r=a.choices[a.selectedChoice];s+=r.costAll(this.tracker)}else a.choices.length===1&&(s+=a.choices[0].costAll(this.tracker))}),this.total=s},toggleDropdown(s,a){this.components.forEach(r=>{r!==s&&(r.isOpen=!1)}),s.isOpen=!s.isOpen},isOptionsAbove(s){return s>=this.components.length-2},selectOption(s,a){s.selectedChoice=a,s.isOpen=!1,this.updatePrices()},closeAllDropdowns(){this.components.forEach(s=>{s.isOpen=!1})},handleOutsideClick(s){s.target.closest(".custom-select")||this.closeAllDropdowns()}},mounted(){this.updatePrices(),document.addEventListener("click",this.handleOutsideClick)},beforeUnmount(){document.removeEventListener("click",this.handleOutsideClick)}},S={class:"table-container"},E={class:"component-col"},O={class:"choice-col"},_=["onClick"],x={class:"selected-option"},B=["onClick"],P={key:1},T=["innerHTML"];function D(s,a,r,v,n,c){return i(),o("div",S,[t("table",null,[a[1]||(a[1]=t("thead",null,[t("tr",null,[t("th",{class:"component-col"},"Component"),t("th",{class:"choice-col"},"Choice"),t("th",{class:"amount-col"},"Amount"),t("th",{class:"cost-col"},"Cost"),t("th",{class:"cost-all-col"},"Cost All"),t("th",{class:"links-col"},"Links")])],-1)),t("tbody",null,[(i(!0),o(p,null,k(n.components,(e,d)=>(i(),o("tr",{key:e.name},[t("th",E,l(e.name),1),t("td",O,[e.choices.length>1?(i(),o("div",{key:0,class:"custom-select",onClick:u=>c.toggleDropdown(e,d),ref_for:!0,ref:`select-${e.name}`},[t("div",x,[h(l(e.choices[e.selectedChoice].name)+" ",1),(i(),o("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:w(["dropdown-arrow",{rotate:e.isOpen}])},a[0]||(a[0]=[t("polyline",{points:"6 9 12 15 18 9"},null,-1)]),2))]),e.isOpen?(i(),o("div",{key:0,class:w(["options",{"options-above":c.isOptionsAbove(d)}])},[(i(!0),o(p,null,k(e.choices,(u,m)=>(i(),o("div",{key:m,onClick:g=>c.selectOption(e,m),class:"option"},l(u.name),9,B))),128))],2)):C("",!0)],8,_)):(i(),o("span",P,l(e.choices[0].name),1))]),t("td",null,l(e.selectedChoice?e.choices[e.selectedChoice].amount(n.tracker):0),1),t("td",null,l(e.selectedChoice?"$"+e.choices[e.selectedChoice].cost.toFixed(2):0),1),t("td",null,l(e.selectedChoice?"~$"+e.choices[e.selectedChoice].costAll().toFixed(2):0),1),t("td",{innerHTML:e.selectedChoice?e.choices[e.selectedChoice].links:""},null,8,T)]))),128))])]),t("p",null,"Total: $"+l(n.total.toFixed(2)),1)])}const M=A(b,[["render",D],["__scopeId","data-v-dcf0858f"]]);const R={data(){return{tracker:2,components:[{name:"Type A USB Breakout",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:1.85,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"Type A USB Breakout Bare (AliExpress)",amount:()=>1,cost:1.18,costAll:()=>this.tracker+1.18,links:'AliExpress'},{name:"Type A USB Breakout Bare (Amazon)",amount:()=>1,cost:6.49,costAll:()=>this.tracker+5.49,links:'Amazon'},{name:"Type A USB Breakout With Cover (AliExpress)",amount:()=>1,cost:2.2,costAll:()=>this.tracker+1.2+1.99,links:'AliExpress'},{name:"Type A USB Breakout With Wire and Cover (Amazon)",amount:()=>1,cost:9.6,costAll:()=>this.tracker+8.6,links:'Amazon'}],selectedChoice:0,isOpen:!1},{name:"USB-C Breakout",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress Male & Female",amount:()=>1,cost:1.19,costAll:()=>this.tracker+1.19+1.37,links:'AliExpress Choose: "Color: 5Set".'},{name:"AliExpress Vertical Male",amount:()=>1,cost:2.37,costAll:()=>this.tracker+.37+1.99,links:'AliExpress'}],selectedChoice:0,isOpen:!1},{name:"Wire for ESPs",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need wire or already have."},{name:"Silicone Wire Kit",amount:()=>1,cost:5.96,costAll:()=>this.tracker+5.96+.99,links:'AliExpress 30 AWG or lower'},{name:"Generic Wire",amount:()=>1,cost:.7,costAll:()=>this.tracker+.7+1.24,links:'AliExpress Select "Specification: 30 AWG or lower"'}],selectedChoice:0,isOpen:!1},{name:"Wire for LEDs",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need wire or already have."},{name:"Silicone Wire Kit",amount:()=>1,cost:5.96,costAll:()=>this.tracker+5.96+.99,links:'AliExpress 30 AWG or higher'},{name:"Generic Wire",amount:()=>1,cost:.7,costAll:()=>this.tracker+.7+1.24,links:'AliExpress Select "Specification: 30 AWG or higher"'}],selectedChoice:0,isOpen:!1},{name:"Camera Extension Cables",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress 24pin 0.5mm Pitch",amount:()=>1,cost:1.33,costAll:()=>this.tracker+.33+1.99,links:'AliExpress Choose: "Insert Type: 24p 0.5mm pitch" and Type A. Length depends on HMD, usually 150mm or 200mm.'},{name:"Adafruit 24 pin 0.5mm pitch",amount:()=>this.tracker,cost:1.35,costAll:()=>this.tracker*1.35+6,links:'Adafruit 250mm'}],selectedChoice:0,isOpen:!1},{name:"Camera Extension Connectors",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress 24 pin",amount:()=>1,cost:1.32,costAll:()=>this.tracker+.32+1.99,links:'AliExpress Choose: "Pins: 24P".'},{name:"Adafruit 24 pin",amount:()=>this.tracker,cost:.86,costAll:()=>this.tracker*.865+6,links:'Adafruit'}],selectedChoice:0,isOpen:!1},{name:"External Antennas",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress Small",amount:()=>1,cost:.16,costAll:()=>this.tracker*.16+3.48,links:'AliExpress Choose: "Color: 2.4G Antenna".'},{name:"Amazon Large",amount:()=>1,cost:9.99,costAll:()=>this.tracker+7.99,links:'Amazon'}],selectedChoice:0,isOpen:!1},{name:"USB-C Cables",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"Short USB-C to USB-C Amazon",amount:()=>1,cost:6.29,costAll:()=>this.tracker+5.29,links:'Amazon'},{name:"Short USB-A to USB-C Amazon",amount:()=>1,cost:7.99,costAll:()=>this.tracker+5.99,links:'Amazon'}],selectedChoice:0,isOpen:!1},{name:"V4 LED Wire Extensions/Replacements",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"110mm Extension/Replacement",amount:()=>1,cost:1.5,costAll:()=>this.tracker+1.5+5,links:'ETVR Store'},{name:"200mm Extension/Replacement",amount:()=>1,cost:1.5,costAll:()=>this.tracker+1.5+5,links:'ETVR Store'}],selectedChoice:0,isOpen:!1}],total:0}},methods:{updatePrices(){let s=0;this.components.forEach(a=>{if(a.choices.length>1){const r=a.choices[a.selectedChoice];s+=r.costAll(this.tracker)}else a.choices.length===1&&(s+=a.choices[0].costAll(this.tracker))}),this.total=s},toggleDropdown(s,a){this.components.forEach(r=>{r!==s&&(r.isOpen=!1)}),s.isOpen=!s.isOpen},isOptionsAbove(s){return s>=this.components.length-2},selectOption(s,a){s.selectedChoice=a,s.isOpen=!1,this.updatePrices()},closeAllDropdowns(){this.components.forEach(s=>{s.isOpen=!1})},handleOutsideClick(s){s.target.closest(".custom-select")||this.closeAllDropdowns()}},mounted(){this.updatePrices(),document.addEventListener("click",this.handleOutsideClick)},beforeUnmount(){document.removeEventListener("click",this.handleOutsideClick)}},W={class:"table-container"},I={class:"component-col"},L={class:"choice-col"},z=["onClick"],U={class:"selected-option"},F=["onClick"],q={key:1},V=["innerHTML"];function N(s,a,r,v,n,c){return i(),o("div",W,[t("table",null,[a[1]||(a[1]=t("thead",null,[t("tr",null,[t("th",{class:"component-col"},"Component"),t("th",{class:"choice-col"},"Choice"),t("th",{class:"amount-col"},"Amount"),t("th",{class:"cost-col"},"Cost"),t("th",{class:"cost-all-col"},"Cost All"),t("th",{class:"links-col"},"Links")])],-1)),t("tbody",null,[(i(!0),o(p,null,k(n.components,(e,d)=>(i(),o("tr",{key:e.name},[t("th",I,l(e.name),1),t("td",L,[e.choices.length>1?(i(),o("div",{key:0,class:"custom-select",onClick:u=>c.toggleDropdown(e,d),ref_for:!0,ref:`select-${e.name}`},[t("div",U,[h(l(e.choices[e.selectedChoice].name)+" ",1),(i(),o("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:w(["dropdown-arrow",{rotate:e.isOpen}])},a[0]||(a[0]=[t("polyline",{points:"6 9 12 15 18 9"},null,-1)]),2))]),e.isOpen?(i(),o("div",{key:0,class:w(["options",{"options-above":c.isOptionsAbove(d)}])},[(i(!0),o(p,null,k(e.choices,(u,m)=>(i(),o("div",{key:m,onClick:g=>c.selectOption(e,m),class:"option"},l(u.name),9,F))),128))],2)):C("",!0)],8,z)):(i(),o("span",q,l(e.choices[0].name),1))]),t("td",null,l(e.selectedChoice?e.choices[e.selectedChoice].amount(n.tracker):0),1),t("td",null,l(e.selectedChoice?"$"+e.choices[e.selectedChoice].cost.toFixed(2):0),1),t("td",null,l(e.selectedChoice?"~$"+e.choices[e.selectedChoice].costAll().toFixed(2):0),1),t("td",{innerHTML:e.selectedChoice?e.choices[e.selectedChoice].links:""},null,8,V)]))),128))])]),t("p",null,"Total: $"+l(n.total.toFixed(2)),1)])}const $=A(R,[["render",N],["__scopeId","data-v-3e89084e"]]),G=JSON.parse('{"title":"Required Parts:","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/part_list.md","filePath":"how_to_build/part_list.md","lastUpdated":1730845983000}'),H={name:"how_to_build/part_list.md"},Q=Object.assign(H,{setup(s){return(a,r)=>(i(),o("div",null,[r[0]||(r[0]=t("p",null,"WIP new parts list. 3D printed parts will live on their own page.",-1)),r[1]||(r[1]=t("p",null,[h("Use the "),t("strong",null,"interactive"),h(" tables below to select parts!")],-1)),r[2]||(r[2]=t("h1",{id:"required-parts",tabindex:"-1"},[h("Required Parts: "),t("a",{class:"header-anchor",href:"#required-parts","aria-label":'Permalink to "Required Parts:"'},"​")],-1)),f(M),r[3]||(r[3]=t("h1",{id:"additional-parts",tabindex:"-1"},[h("Additional Parts: "),t("a",{class:"header-anchor",href:"#additional-parts","aria-label":'Permalink to "Additional Parts:"'},"​")],-1)),f($),r[4]||(r[4]=y('

Table modified greatly from the table on SlimeVR's Docs which was created by Carl

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wired over USB Serial

Wired Capable ESPs:

  • Seeed Studio XIAO Sense
  • FREENOVE ESP32-S3-WROOM CAM Board

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerate up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required compared to ESP32-CAM boards

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be slightly more costly
  • When in use with a Vive Facial Tracker or other bandwidth sensitive components, a MTT USB hub is required or the devices will be unusable (low FPS).
  • Requires beta app versions until the v2.0 app is released

Option 2: Wireless over WiFi 2.4 GHz

Wireless Capable ESPs:

  • Seeed Studio XIAO Sense
  • ESP32-CAM
  • FREENOVE ESP32-S3-WROOM CAM Board

This offers a good starting point as the ESP32-CAM boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they don't really make sense.

Pros:

  • Less cables (power only)
  • No issues with USB hubs
  • Easier to flash

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • High risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • Uses more power and heats up due to radio power needs
',19))]))}});export{G as __pageData,Q as default}; +import{_ as A,o as i,c as o,k as t,F as p,B as k,t as l,a as h,n as w,e as C,E as f,O as y}from"./chunks/framework.ece1a6f0.js";const b={data(){return{tracker:2,components:[{name:"ESP Microcontroller",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:1.85,costAll:()=>this.tracker*0,links:"If you already have a supported camera capable ESP32 or sourced elsewhere."},{name:"★ Seeed Studio XIAO Sense ESP32-S3",amount:()=>this.tracker,cost:12.87,costAll:()=>this.tracker*12.87+3.18,links:'AliExpress XIAO Sense Recommended'},{name:"ESP32-CAM",amount:()=>this.tracker,cost:12.87,costAll:()=>this.tracker*4.69+3.18,links:'AliExpress ESP32 CAM Requires additional programmer'},{name:"FREENOVE ESP32-S3-WROOM",amount:()=>this.tracker,cost:19.95,costAll:()=>this.tracker*19.95,links:'Amazon Large, more expensive than XIAO'}],selectedChoice:1,isOpen:!1},{name:"Camera",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you already have a supported camera or sourced elsewhere."},{name:"★ 130 Degree NO-IR",amount:()=>this.tracker,cost:5.41,costAll:()=>this.tracker*5.41,links:'AliExpress Select "Color: 75MM-130 Degree" Must manually remove IR filter'},{name:"160 Degree IR",amount:()=>this.tracker,cost:4.26,costAll:()=>this.tracker*4.26,links:'AliExpress Select "Color: 75MM-160 850nm"'}],selectedChoice:1,isOpen:!1},{name:"IR LEDs",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:'IR LED Safety If you already have safe IR LED hardware and know what you are doing.'},{name:"★ Official V4 mini No-Solder",amount:()=>1,cost:30,costAll:()=>this.tracker+30+5,links:'ETVR Store Length depending on HMD'},{name:"Official V4 mini Solder-Required",amount:()=>1,cost:25,costAll:()=>this.tracker+25+3,links:'ETVR Store Must solder up your own wires'},{name:"Official V4 lite Assemble Yourself",amount:()=>1,cost:7,costAll:()=>this.tracker+7+3,links:'ETVR Store Must assemble yourself'}],selectedChoice:1,isOpen:!1},{name:"USB Hub",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you already have safe IR LED hardware and know what you are doing."},{name:"★ 4 port USB 3.2 LDLrui (MTT Usually) (Best for Cost)",amount:()=>1,cost:17.99,costAll:()=>this.tracker+17.99,links:'Amazon Usually these are MTT, but sometimes not'},{name:"4 port USB 3.2 Sitecom CN-385 Hub (MTT)",amount:()=>1,cost:40.53,costAll:()=>this.tracker+17.99,links:'Amazon Known good MTT hub, but expensive'},{name:"4 port USB 2.0 Breakout (Not MTT)",amount:()=>1,cost:1.41,costAll:()=>this.tracker+1.41+1.99,links:'AliExpress Small but non MTT hub breakout'},{name:"★ 4 port Adafruit CH334F USB Hub Breakout (MTT) (Best for Size)",amount:()=>1,cost:4.99,costAll:()=>this.tracker+8,links:'Adafruit Small, high quality MTT hub breakout'},{name:"★ 3 port USB 3.0 Hub With Power Passthrough (MTT) (Best for Quest)",amount:()=>1,cost:17.99,costAll:()=>this.tracker+1.41,links:'Amazon Great for Quest due to power passthrough'}],selectedChoice:1,isOpen:!1},{name:"3D Printed Mounts",choices:[{name:"Print Yourself",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you have a 3d printer or have access to one somewhere such as a library, friend, or school."},{name:"JLCPCB Print Service, JLC3DP",amount:()=>this.tracker,cost:2,costAll:()=>this.tracker*2+5,links:'JLC3DP Printing Service'}],selectedChoice:0,isOpen:!1}],total:0}},methods:{updatePrices(){let s=0;this.components.forEach(a=>{if(a.choices.length>1){const r=a.choices[a.selectedChoice];s+=r.costAll(this.tracker)}else a.choices.length===1&&(s+=a.choices[0].costAll(this.tracker))}),this.total=s},toggleDropdown(s,a){this.components.forEach(r=>{r!==s&&(r.isOpen=!1)}),s.isOpen=!s.isOpen},isOptionsAbove(s){return s>=this.components.length-2},selectOption(s,a){s.selectedChoice=a,s.isOpen=!1,this.updatePrices()},closeAllDropdowns(){this.components.forEach(s=>{s.isOpen=!1})},handleOutsideClick(s){s.target.closest(".custom-select")||this.closeAllDropdowns()}},mounted(){this.updatePrices(),document.addEventListener("click",this.handleOutsideClick)},beforeUnmount(){document.removeEventListener("click",this.handleOutsideClick)}},S={class:"table-container"},E={class:"component-col"},O={class:"choice-col"},_=["onClick"],x={class:"selected-option"},B=["onClick"],P={key:1},T=["innerHTML"];function D(s,a,r,v,n,c){return i(),o("div",S,[t("table",null,[a[1]||(a[1]=t("thead",null,[t("tr",null,[t("th",{class:"component-col"},"Component"),t("th",{class:"choice-col"},"Choice"),t("th",{class:"amount-col"},"Amount"),t("th",{class:"cost-col"},"Cost"),t("th",{class:"cost-all-col"},"Cost All"),t("th",{class:"links-col"},"Links")])],-1)),t("tbody",null,[(i(!0),o(p,null,k(n.components,(e,d)=>(i(),o("tr",{key:e.name},[t("th",E,l(e.name),1),t("td",O,[e.choices.length>1?(i(),o("div",{key:0,class:"custom-select",onClick:u=>c.toggleDropdown(e,d),ref_for:!0,ref:`select-${e.name}`},[t("div",x,[h(l(e.choices[e.selectedChoice].name)+" ",1),(i(),o("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:w(["dropdown-arrow",{rotate:e.isOpen}])},a[0]||(a[0]=[t("polyline",{points:"6 9 12 15 18 9"},null,-1)]),2))]),e.isOpen?(i(),o("div",{key:0,class:w(["options",{"options-above":c.isOptionsAbove(d)}])},[(i(!0),o(p,null,k(e.choices,(u,m)=>(i(),o("div",{key:m,onClick:g=>c.selectOption(e,m),class:"option"},l(u.name),9,B))),128))],2)):C("",!0)],8,_)):(i(),o("span",P,l(e.choices[0].name),1))]),t("td",null,l(e.selectedChoice?e.choices[e.selectedChoice].amount(n.tracker):0),1),t("td",null,l(e.selectedChoice?"$"+e.choices[e.selectedChoice].cost.toFixed(2):0),1),t("td",null,l(e.selectedChoice?"~$"+e.choices[e.selectedChoice].costAll().toFixed(2):0),1),t("td",{innerHTML:e.selectedChoice?e.choices[e.selectedChoice].links:""},null,8,T)]))),128))])]),t("p",null,"Total: $"+l(n.total.toFixed(2)),1)])}const M=A(b,[["render",D],["__scopeId","data-v-dcf0858f"]]);const R={data(){return{tracker:2,components:[{name:"Type A USB Breakout",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:1.85,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"Type A USB Breakout Bare (AliExpress)",amount:()=>1,cost:1.18,costAll:()=>this.tracker+1.18,links:'AliExpress'},{name:"Type A USB Breakout Bare (Amazon)",amount:()=>1,cost:6.49,costAll:()=>this.tracker+5.49,links:'Amazon'},{name:"Type A USB Breakout With Cover (AliExpress)",amount:()=>1,cost:2.2,costAll:()=>this.tracker+1.2+1.99,links:'AliExpress'},{name:"Type A USB Breakout With Wire and Cover (Amazon)",amount:()=>1,cost:9.6,costAll:()=>this.tracker+8.6,links:'Amazon'}],selectedChoice:0,isOpen:!1},{name:"USB-C Breakout",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress Male & Female",amount:()=>1,cost:1.19,costAll:()=>this.tracker+1.19+1.37,links:'AliExpress Choose: "Color: 5Set".'},{name:"AliExpress Vertical Male",amount:()=>1,cost:2.37,costAll:()=>this.tracker+.37+1.99,links:'AliExpress'}],selectedChoice:0,isOpen:!1},{name:"Wire for ESPs",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need wire or already have."},{name:"Silicone Wire Kit",amount:()=>1,cost:5.96,costAll:()=>this.tracker+5.96+.99,links:'AliExpress 30 AWG or lower'},{name:"Generic Wire",amount:()=>1,cost:.7,costAll:()=>this.tracker+.7+1.24,links:'AliExpress Select "Specification: 30 AWG or lower"'}],selectedChoice:0,isOpen:!1},{name:"Wire for LEDs",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need wire or already have."},{name:"Silicone Wire Kit",amount:()=>1,cost:5.96,costAll:()=>this.tracker+5.96+.99,links:'AliExpress 30 AWG or higher'},{name:"Generic Wire",amount:()=>1,cost:.7,costAll:()=>this.tracker+.7+1.24,links:'AliExpress Select "Specification: 30 AWG or higher"'}],selectedChoice:0,isOpen:!1},{name:"Camera Extension Cables",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress 24pin 0.5mm Pitch",amount:()=>1,cost:1.33,costAll:()=>this.tracker+.33+1.99,links:'AliExpress Choose: "Insert Type: 24p 0.5mm pitch" and Type A. Length depends on HMD, usually 150mm or 200mm.'},{name:"Adafruit 24 pin 0.5mm pitch",amount:()=>this.tracker,cost:1.35,costAll:()=>this.tracker*1.35+6,links:'Adafruit 250mm'}],selectedChoice:0,isOpen:!1},{name:"Camera Extension Connectors",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress 24 pin",amount:()=>1,cost:1.32,costAll:()=>this.tracker+.32+1.99,links:'AliExpress Choose: "Pins: 24P".'},{name:"Adafruit 24 pin",amount:()=>this.tracker,cost:.86,costAll:()=>this.tracker*.865+6,links:'Adafruit'}],selectedChoice:0,isOpen:!1},{name:"External Antennas",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"AliExpress Small",amount:()=>1,cost:.16,costAll:()=>this.tracker*.16+3.48,links:'AliExpress Choose: "Color: 2.4G Antenna".'},{name:"Amazon Large",amount:()=>1,cost:9.99,costAll:()=>this.tracker+7.99,links:'Amazon'}],selectedChoice:0,isOpen:!1},{name:"USB-C Cables",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"Short USB-C to USB-C Amazon",amount:()=>1,cost:6.29,costAll:()=>this.tracker+5.29,links:'Amazon'},{name:"Short USB-A to USB-C Amazon",amount:()=>1,cost:7.99,costAll:()=>this.tracker+5.99,links:'Amazon'}],selectedChoice:0,isOpen:!1},{name:"V4 LED Wire Extensions/Replacements",choices:[{name:"Bring Your Own",amount:()=>this.tracker,cost:0,costAll:()=>this.tracker*0,links:"If you do not need or already have."},{name:"110mm Extension/Replacement",amount:()=>1,cost:1.5,costAll:()=>this.tracker+1.5+5,links:'ETVR Store'},{name:"200mm Extension/Replacement",amount:()=>1,cost:1.5,costAll:()=>this.tracker+1.5+5,links:'ETVR Store'}],selectedChoice:0,isOpen:!1}],total:0}},methods:{updatePrices(){let s=0;this.components.forEach(a=>{if(a.choices.length>1){const r=a.choices[a.selectedChoice];s+=r.costAll(this.tracker)}else a.choices.length===1&&(s+=a.choices[0].costAll(this.tracker))}),this.total=s},toggleDropdown(s,a){this.components.forEach(r=>{r!==s&&(r.isOpen=!1)}),s.isOpen=!s.isOpen},isOptionsAbove(s){return s>=this.components.length-2},selectOption(s,a){s.selectedChoice=a,s.isOpen=!1,this.updatePrices()},closeAllDropdowns(){this.components.forEach(s=>{s.isOpen=!1})},handleOutsideClick(s){s.target.closest(".custom-select")||this.closeAllDropdowns()}},mounted(){this.updatePrices(),document.addEventListener("click",this.handleOutsideClick)},beforeUnmount(){document.removeEventListener("click",this.handleOutsideClick)}},W={class:"table-container"},I={class:"component-col"},L={class:"choice-col"},z=["onClick"],U={class:"selected-option"},F=["onClick"],q={key:1},V=["innerHTML"];function N(s,a,r,v,n,c){return i(),o("div",W,[t("table",null,[a[1]||(a[1]=t("thead",null,[t("tr",null,[t("th",{class:"component-col"},"Component"),t("th",{class:"choice-col"},"Choice"),t("th",{class:"amount-col"},"Amount"),t("th",{class:"cost-col"},"Cost"),t("th",{class:"cost-all-col"},"Cost All"),t("th",{class:"links-col"},"Links")])],-1)),t("tbody",null,[(i(!0),o(p,null,k(n.components,(e,d)=>(i(),o("tr",{key:e.name},[t("th",I,l(e.name),1),t("td",L,[e.choices.length>1?(i(),o("div",{key:0,class:"custom-select",onClick:u=>c.toggleDropdown(e,d),ref_for:!0,ref:`select-${e.name}`},[t("div",U,[h(l(e.choices[e.selectedChoice].name)+" ",1),(i(),o("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:w(["dropdown-arrow",{rotate:e.isOpen}])},a[0]||(a[0]=[t("polyline",{points:"6 9 12 15 18 9"},null,-1)]),2))]),e.isOpen?(i(),o("div",{key:0,class:w(["options",{"options-above":c.isOptionsAbove(d)}])},[(i(!0),o(p,null,k(e.choices,(u,m)=>(i(),o("div",{key:m,onClick:g=>c.selectOption(e,m),class:"option"},l(u.name),9,F))),128))],2)):C("",!0)],8,z)):(i(),o("span",q,l(e.choices[0].name),1))]),t("td",null,l(e.selectedChoice?e.choices[e.selectedChoice].amount(n.tracker):0),1),t("td",null,l(e.selectedChoice?"$"+e.choices[e.selectedChoice].cost.toFixed(2):0),1),t("td",null,l(e.selectedChoice?"~$"+e.choices[e.selectedChoice].costAll().toFixed(2):0),1),t("td",{innerHTML:e.selectedChoice?e.choices[e.selectedChoice].links:""},null,8,V)]))),128))])]),t("p",null,"Total: $"+l(n.total.toFixed(2)),1)])}const $=A(R,[["render",N],["__scopeId","data-v-3e89084e"]]),G=JSON.parse('{"title":"Required Parts:","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/part_list.md","filePath":"how_to_build/part_list.md","lastUpdated":1730845983000}'),H={name:"how_to_build/part_list.md"},Q=Object.assign(H,{setup(s){return(a,r)=>(i(),o("div",null,[r[0]||(r[0]=t("p",null,"WIP new parts list. 3D printed parts will live on their own page.",-1)),r[1]||(r[1]=t("p",null,[h("Use the "),t("strong",null,"interactive"),h(" tables below to select parts!")],-1)),r[2]||(r[2]=t("h1",{id:"required-parts",tabindex:"-1"},[h("Required Parts: "),t("a",{class:"header-anchor",href:"#required-parts","aria-label":'Permalink to "Required Parts:"'},"​")],-1)),f(M),r[3]||(r[3]=t("h1",{id:"additional-parts",tabindex:"-1"},[h("Additional Parts: "),t("a",{class:"header-anchor",href:"#additional-parts","aria-label":'Permalink to "Additional Parts:"'},"​")],-1)),f($),r[4]||(r[4]=y('

Table modified greatly from the table on SlimeVR's Docs which was created by Carl

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wired over USB Serial

Wired Capable ESPs:

  • Seeed Studio XIAO Sense
  • FREENOVE ESP32-S3-WROOM CAM Board

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerate up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required compared to ESP32-CAM boards

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be slightly more costly
  • When in use with a Vive Facial Tracker or other bandwidth sensitive components, a MTT USB hub is required or the devices will be unusable (low FPS).
  • Requires beta app versions until the v2.0 app is released

Option 2: Wireless over WiFi 2.4 GHz

Wireless Capable ESPs:

  • Seeed Studio XIAO Sense
  • ESP32-CAM
  • FREENOVE ESP32-S3-WROOM CAM Board

This offers a good starting point as the ESP32-CAM boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they don't really make sense.

Pros:

  • Less cables (power only)
  • No issues with USB hubs
  • Easier to flash

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • High risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • Uses more power and heats up due to radio power needs
',19))]))}});export{G as __pageData,Q as default}; diff --git a/assets/how_to_build_parts_list.md.d57cd54a.js b/assets/how_to_build_parts_list.md.075e6e8f.js similarity index 98% rename from assets/how_to_build_parts_list.md.d57cd54a.js rename to assets/how_to_build_parts_list.md.075e6e8f.js index b4e3803..d091f78 100644 --- a/assets/how_to_build_parts_list.md.d57cd54a.js +++ b/assets/how_to_build_parts_list.md.075e6e8f.js @@ -1 +1 @@ -import{_ as o,a as s}from"./chunks/index.339f98d7.js";import{_ as h}from"./chunks/PartsList.b49df916.js";import{o as p,c as d,k as r,a as t,E as a,w as i,l,O as n}from"./chunks/framework.47aa8d5b.js";import"./chunks/Accordion.aff4964d.js";const k=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/parts_list.md","filePath":"how_to_build/parts_list.md","lastUpdated":1718650130000}'),u={name:"how_to_build/parts_list.md"},y=Object.assign(u,{setup(m){return(c,e)=>(p(),d("div",null,[e[11]||(e[11]=r("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[t("Parts List "),r("a",{class:"header-anchor",href:"#parts-list","aria-label":'Permalink to "Parts List {.text-[var(--font-accent)]}"'},"​")],-1)),a(o,{options:l(s).parts_list_one},{content:i(()=>e[0]||(e[0]=[r("p",null," Please note that no hardware has been fully set in stone, all purchases are at your own risk in case of hardware changes. ",-1)])),_:1},8,["options"]),a(o,{options:l(s).parts_list_three},{content:i(()=>e[1]||(e[1]=[r("p",null," It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay. ",-1)])),_:1},8,["options"]),e[12]||(e[12]=n('

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wireless over WiFi 2.4 GHz

This offers a good starting point as the ESP boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they start to make less sense.

Pros:

  • Wider user adoption and greater support
  • Low weight, less cables, easier to manage

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • Risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • ESP32-CAM uses more power and heats up due to radio module power needs

Option 2: Wired over USB Serial (in beta)

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerates up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be more costly

Required parts

With that in mind, here are the required parts for the setup.

Tracker boards:

    • 2x XIAO ESP32-S3 Sense Modules
      Very small size, wireless and wired support, does not require an additional programmer or separate antennas: SeedStudio

    AliExpress

    Alternatively:

    • 2x Freenove ESP 32-S3 WROOM
      Much larger, price may be higher than the XIAOs, supports wired and wireless as well, does not need a separate programmer, does not support a separate antenna. Amazon
  • A cheaper, wireless only alternative:

    • 2x ESPCAM32 Modules - They are cheaper, requires a separate programmer board, supports only wireless streaming and may require some soldering for attaching separate antennas: AliExpress
      This board also requires a special programmer board in order to flash the firmware. You'll need only one: AliExpress for just programmers or Amazon for 3 ESP32-Cams and programmers without the proper cameras

    • 2x External antennas for ESPs Required if you're running vive/tundra full body tracking or having issues with streaming. See the full build guide on how to configure the ESP board for antenna use.

Cameras

Camera modules:

The cameras that come with the boards will not work, they have an IR filter inside.

The filter can be removed, but doing so may break your cameras. Here's how to do it: https://www.youtube.com/watch?v=QYH-FWvDbDc

DANGER

If you decide to remove the filter, wear eye protection while doing so, the removal of the filter will shatter it.

  • 2x OV2640 160° FOV IR / Night vers 75mm (850nm)

(select 75MM-160 850nm) AliExpress

Amazon alternative (note that you will have to manually remove the IR filter)

Things worth noting:

  • There is an experimental option to purchase OV2640 130° FOV cameras and manually remove the IR filters. This can result in a clearer view of the eye and is smaller so it allows for HMDs like the Bigscreen Beyond, but it's not a default recommendation just yet. Checkout the listing "75MM-130 Degree" AliEXpress

  • If the cameras are Dead on Arrival (DOA), keep in mind that you can swap the lenses with the ones that come with the stock cameras that were included with the ESP32 boards, though they do require extension cables. I recommend just buying more (3-4 instead of just 2).

  • Optional Ribbon extensions:

Certain mounts may require a cable extension (ex: MUTE's frunk mod) To use a mount like that you will need a cable and a connector for each camera. Headsets like the Quest 2 do not require extensions if the camera boards are mounted at the bottom of the headset, near the facial interface.

Extensions (select 0.5mm, A-Forward Direction, 24P) AliExpress (200mm for MUTE's)

Connectors (select 24P) Aliexpress

USB Hubs - for if you are building the wired version

  • 1x USB 3.0+ hub The hub needs to support MTT if you wish to use a vive face tracker with the ESPs. Here is a hub that supports MTT and is not expensive Amazon

Ensure that it is of good quality, lightweight, compact in size, and I suggest a minimum of four ports - one for the face tracker, one for the LED kit, and two for ESP32-S3 boards. Ensure that you acquire appropriate USB-A to USB-C adapters wherever required. For example the Valve Index only has one USB-A port. Be wary that "mini" adapters with the short ends may not work properly. Ensure the adapter has a long end. Such adapter Amazon.

  • 2x USB C cables (as short as possible) to connect both ESPs (select 0.05m/5cm) AliExpress or AliExpress USB C to USB A As the ESP32-S3 has USB-C connectors, you may require some USB-C to USB-A cables depending on your USB hub. It's worth noting that the HTC Face Tracker requires a USB-C port, so you may need to consider this requirement as well. You may also make custom cables using USB breakout boards of your choice and wire.

Wires and adapters

If you are soldering and using custom cables:

IR emitters

We recommend getting the official kits:

Alternatively you can source the parts for V3 yourself:

DANGER

If they look like something you would find in a TV remote, do NOT use them. Even if you think you can alter them THEY WILL NOT WORK AND PUT YOU AT RISK. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.

DO NOT BUY FOCUSED ONES!

',44)),r("ul",null,[r("li",null,[e[3]||(e[3]=r("p",null,"4x Unfocused SMD IR emitters",-1)),a(o,{options:l(s).parts_list_four},{content:i(()=>e[2]||(e[2]=[r("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1)])),_:1},8,["options"]),e[4]||(e[4]=r("ul",null,[r("li",null,[r("a",{href:"https://www.lcsc.com/product-detail/Infrared-IR-LEDs_XINGLIGHT-XL-3216HIRC-850_C965891.html",target:"_blank",rel:"noreferrer"},"(Recommended) from LCSC here"),t(".")]),r("li",null,[r("a",{href:"https://www.digikey.com/en/products/detail/inolux/IN-P32ZTIR/10384796",target:"_blank",rel:"noreferrer"},"(Alternative) from Digikey here"),t("."),r("br"),t(" The difference between them is the ones from LCSC are rated for lower power, which means in the event of a short or mishap they should be safer, as well as being smaller in footprint, hence why they are recommended.")])],-1))]),e[5]||(e[5]=r("li",null,[r("p",null,[t("4x IR emitter PCBs (highly recommended) Gerber files and schematics located "),r("a",{href:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/IR%20Emmitter",target:"_blank",rel:"noreferrer"},"here.")])],-1)),e[6]||(e[6]=r("li",null,[r("p",null,"4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)")],-1)),e[7]||(e[7]=r("li",null,[r("p",null,[r("a",{href:"https://www.digikey.com/en/products/detail/stackpole-electronics-inc/RMCF1206FT357R/1759919",target:"_blank",rel:"noreferrer"},"357 ohm Digikey here")])],-1)),e[8]||(e[8]=r("li",null,[r("p",null,[r("a",{href:"https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_BOURNS-CR1206-FX-3480ELF_C205328.html",target:"_blank",rel:"noreferrer"},"348 ohm LCSC here")])],-1))]),e[13]||(e[13]=r("p",null,"This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.",-1)),e[14]||(e[14]=r("ul",null,[r("li",null,[t("1x Wire to power IR emitters"),r("br"),r("a",{href:"https://www.aliexpress.com/item/3256804720067942.html",target:"_blank",rel:"noreferrer"},"34 AWG AliExpress")])],-1)),e[15]||(e[15]=r("h2",{id:"_3d-printed-mounts",tabindex:"-1"},[t("3D Printed Mounts "),r("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts"'},"​")],-1)),e[16]||(e[16]=r("p",null,[t("Mounts with a "),r("code",null,"★"),t(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1)),a(o,{options:l(s).parts_list_three},{content:i(()=>e[9]||(e[9]=[r("p",null," You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't. ",-1)])),_:1},8,["options"]),a(h),e[17]||(e[17]=n('

Misc parts/tools

AliExpress (Generic)
Amazon (Generic)

  • 2x-4x Heatsinks (Optional) - for the ESP32-CAM AliExpress (14mm for ESP, 8mm for voltage regulator)

Other Headsets

If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.

Check out our basic guide on making your own mount here.

',7)),a(o,{options:l(s).parts_list_six},{content:i(()=>e[10]||(e[10]=[r("p",null," If you have a headset mount that is not listed above, please let us know in the discord so it can be added here. ",-1)])),_:1},8,["options"])]))}});export{k as __pageData,y as default}; +import{_ as o,a as s}from"./chunks/index.c19b2931.js";import{_ as h}from"./chunks/PartsList.a520a26d.js";import{o as p,c as d,k as r,a as t,E as a,w as i,l,O as n}from"./chunks/framework.ece1a6f0.js";import"./chunks/Accordion.44247159.js";const k=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/parts_list.md","filePath":"how_to_build/parts_list.md","lastUpdated":1718650130000}'),u={name:"how_to_build/parts_list.md"},y=Object.assign(u,{setup(m){return(c,e)=>(p(),d("div",null,[e[11]||(e[11]=r("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[t("Parts List "),r("a",{class:"header-anchor",href:"#parts-list","aria-label":'Permalink to "Parts List {.text-[var(--font-accent)]}"'},"​")],-1)),a(o,{options:l(s).parts_list_one},{content:i(()=>e[0]||(e[0]=[r("p",null," Please note that no hardware has been fully set in stone, all purchases are at your own risk in case of hardware changes. ",-1)])),_:1},8,["options"]),a(o,{options:l(s).parts_list_three},{content:i(()=>e[1]||(e[1]=[r("p",null," It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay. ",-1)])),_:1},8,["options"]),e[12]||(e[12]=n('

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wireless over WiFi 2.4 GHz

This offers a good starting point as the ESP boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they start to make less sense.

Pros:

  • Wider user adoption and greater support
  • Low weight, less cables, easier to manage

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • Risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • ESP32-CAM uses more power and heats up due to radio module power needs

Option 2: Wired over USB Serial (in beta)

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerates up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be more costly

Required parts

With that in mind, here are the required parts for the setup.

Tracker boards:

    • 2x XIAO ESP32-S3 Sense Modules
      Very small size, wireless and wired support, does not require an additional programmer or separate antennas: SeedStudio

    AliExpress

    Alternatively:

    • 2x Freenove ESP 32-S3 WROOM
      Much larger, price may be higher than the XIAOs, supports wired and wireless as well, does not need a separate programmer, does not support a separate antenna. Amazon
  • A cheaper, wireless only alternative:

    • 2x ESPCAM32 Modules - They are cheaper, requires a separate programmer board, supports only wireless streaming and may require some soldering for attaching separate antennas: AliExpress
      This board also requires a special programmer board in order to flash the firmware. You'll need only one: AliExpress for just programmers or Amazon for 3 ESP32-Cams and programmers without the proper cameras

    • 2x External antennas for ESPs Required if you're running vive/tundra full body tracking or having issues with streaming. See the full build guide on how to configure the ESP board for antenna use.

Cameras

Camera modules:

The cameras that come with the boards will not work, they have an IR filter inside.

The filter can be removed, but doing so may break your cameras. Here's how to do it: https://www.youtube.com/watch?v=QYH-FWvDbDc

DANGER

If you decide to remove the filter, wear eye protection while doing so, the removal of the filter will shatter it.

  • 2x OV2640 160° FOV IR / Night vers 75mm (850nm)

(select 75MM-160 850nm) AliExpress

Amazon alternative (note that you will have to manually remove the IR filter)

Things worth noting:

  • There is an experimental option to purchase OV2640 130° FOV cameras and manually remove the IR filters. This can result in a clearer view of the eye and is smaller so it allows for HMDs like the Bigscreen Beyond, but it's not a default recommendation just yet. Checkout the listing "75MM-130 Degree" AliEXpress

  • If the cameras are Dead on Arrival (DOA), keep in mind that you can swap the lenses with the ones that come with the stock cameras that were included with the ESP32 boards, though they do require extension cables. I recommend just buying more (3-4 instead of just 2).

  • Optional Ribbon extensions:

Certain mounts may require a cable extension (ex: MUTE's frunk mod) To use a mount like that you will need a cable and a connector for each camera. Headsets like the Quest 2 do not require extensions if the camera boards are mounted at the bottom of the headset, near the facial interface.

Extensions (select 0.5mm, A-Forward Direction, 24P) AliExpress (200mm for MUTE's)

Connectors (select 24P) Aliexpress

USB Hubs - for if you are building the wired version

  • 1x USB 3.0+ hub The hub needs to support MTT if you wish to use a vive face tracker with the ESPs. Here is a hub that supports MTT and is not expensive Amazon

Ensure that it is of good quality, lightweight, compact in size, and I suggest a minimum of four ports - one for the face tracker, one for the LED kit, and two for ESP32-S3 boards. Ensure that you acquire appropriate USB-A to USB-C adapters wherever required. For example the Valve Index only has one USB-A port. Be wary that "mini" adapters with the short ends may not work properly. Ensure the adapter has a long end. Such adapter Amazon.

  • 2x USB C cables (as short as possible) to connect both ESPs (select 0.05m/5cm) AliExpress or AliExpress USB C to USB A As the ESP32-S3 has USB-C connectors, you may require some USB-C to USB-A cables depending on your USB hub. It's worth noting that the HTC Face Tracker requires a USB-C port, so you may need to consider this requirement as well. You may also make custom cables using USB breakout boards of your choice and wire.

Wires and adapters

If you are soldering and using custom cables:

IR emitters

We recommend getting the official kits:

Alternatively you can source the parts for V3 yourself:

DANGER

If they look like something you would find in a TV remote, do NOT use them. Even if you think you can alter them THEY WILL NOT WORK AND PUT YOU AT RISK. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.

DO NOT BUY FOCUSED ONES!

',44)),r("ul",null,[r("li",null,[e[3]||(e[3]=r("p",null,"4x Unfocused SMD IR emitters",-1)),a(o,{options:l(s).parts_list_four},{content:i(()=>e[2]||(e[2]=[r("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1)])),_:1},8,["options"]),e[4]||(e[4]=r("ul",null,[r("li",null,[r("a",{href:"https://www.lcsc.com/product-detail/Infrared-IR-LEDs_XINGLIGHT-XL-3216HIRC-850_C965891.html",target:"_blank",rel:"noreferrer"},"(Recommended) from LCSC here"),t(".")]),r("li",null,[r("a",{href:"https://www.digikey.com/en/products/detail/inolux/IN-P32ZTIR/10384796",target:"_blank",rel:"noreferrer"},"(Alternative) from Digikey here"),t("."),r("br"),t(" The difference between them is the ones from LCSC are rated for lower power, which means in the event of a short or mishap they should be safer, as well as being smaller in footprint, hence why they are recommended.")])],-1))]),e[5]||(e[5]=r("li",null,[r("p",null,[t("4x IR emitter PCBs (highly recommended) Gerber files and schematics located "),r("a",{href:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/IR%20Emmitter",target:"_blank",rel:"noreferrer"},"here.")])],-1)),e[6]||(e[6]=r("li",null,[r("p",null,"4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)")],-1)),e[7]||(e[7]=r("li",null,[r("p",null,[r("a",{href:"https://www.digikey.com/en/products/detail/stackpole-electronics-inc/RMCF1206FT357R/1759919",target:"_blank",rel:"noreferrer"},"357 ohm Digikey here")])],-1)),e[8]||(e[8]=r("li",null,[r("p",null,[r("a",{href:"https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_BOURNS-CR1206-FX-3480ELF_C205328.html",target:"_blank",rel:"noreferrer"},"348 ohm LCSC here")])],-1))]),e[13]||(e[13]=r("p",null,"This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.",-1)),e[14]||(e[14]=r("ul",null,[r("li",null,[t("1x Wire to power IR emitters"),r("br"),r("a",{href:"https://www.aliexpress.com/item/3256804720067942.html",target:"_blank",rel:"noreferrer"},"34 AWG AliExpress")])],-1)),e[15]||(e[15]=r("h2",{id:"_3d-printed-mounts",tabindex:"-1"},[t("3D Printed Mounts "),r("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts"'},"​")],-1)),e[16]||(e[16]=r("p",null,[t("Mounts with a "),r("code",null,"★"),t(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1)),a(o,{options:l(s).parts_list_three},{content:i(()=>e[9]||(e[9]=[r("p",null," You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't. ",-1)])),_:1},8,["options"]),a(h),e[17]||(e[17]=n('

Misc parts/tools

AliExpress (Generic)
Amazon (Generic)

  • 2x-4x Heatsinks (Optional) - for the ESP32-CAM AliExpress (14mm for ESP, 8mm for voltage regulator)

Other Headsets

If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.

Check out our basic guide on making your own mount here.

',7)),a(o,{options:l(s).parts_list_six},{content:i(()=>e[10]||(e[10]=[r("p",null," If you have a headset mount that is not listed above, please let us know in the discord so it can be added here. ",-1)])),_:1},8,["options"])]))}});export{k as __pageData,y as default}; diff --git a/assets/how_to_build_parts_list.md.d57cd54a.lean.js b/assets/how_to_build_parts_list.md.075e6e8f.lean.js similarity index 98% rename from assets/how_to_build_parts_list.md.d57cd54a.lean.js rename to assets/how_to_build_parts_list.md.075e6e8f.lean.js index b4e3803..d091f78 100644 --- a/assets/how_to_build_parts_list.md.d57cd54a.lean.js +++ b/assets/how_to_build_parts_list.md.075e6e8f.lean.js @@ -1 +1 @@ -import{_ as o,a as s}from"./chunks/index.339f98d7.js";import{_ as h}from"./chunks/PartsList.b49df916.js";import{o as p,c as d,k as r,a as t,E as a,w as i,l,O as n}from"./chunks/framework.47aa8d5b.js";import"./chunks/Accordion.aff4964d.js";const k=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/parts_list.md","filePath":"how_to_build/parts_list.md","lastUpdated":1718650130000}'),u={name:"how_to_build/parts_list.md"},y=Object.assign(u,{setup(m){return(c,e)=>(p(),d("div",null,[e[11]||(e[11]=r("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[t("Parts List "),r("a",{class:"header-anchor",href:"#parts-list","aria-label":'Permalink to "Parts List {.text-[var(--font-accent)]}"'},"​")],-1)),a(o,{options:l(s).parts_list_one},{content:i(()=>e[0]||(e[0]=[r("p",null," Please note that no hardware has been fully set in stone, all purchases are at your own risk in case of hardware changes. ",-1)])),_:1},8,["options"]),a(o,{options:l(s).parts_list_three},{content:i(()=>e[1]||(e[1]=[r("p",null," It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay. ",-1)])),_:1},8,["options"]),e[12]||(e[12]=n('

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wireless over WiFi 2.4 GHz

This offers a good starting point as the ESP boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they start to make less sense.

Pros:

  • Wider user adoption and greater support
  • Low weight, less cables, easier to manage

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • Risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • ESP32-CAM uses more power and heats up due to radio module power needs

Option 2: Wired over USB Serial (in beta)

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerates up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be more costly

Required parts

With that in mind, here are the required parts for the setup.

Tracker boards:

    • 2x XIAO ESP32-S3 Sense Modules
      Very small size, wireless and wired support, does not require an additional programmer or separate antennas: SeedStudio

    AliExpress

    Alternatively:

    • 2x Freenove ESP 32-S3 WROOM
      Much larger, price may be higher than the XIAOs, supports wired and wireless as well, does not need a separate programmer, does not support a separate antenna. Amazon
  • A cheaper, wireless only alternative:

    • 2x ESPCAM32 Modules - They are cheaper, requires a separate programmer board, supports only wireless streaming and may require some soldering for attaching separate antennas: AliExpress
      This board also requires a special programmer board in order to flash the firmware. You'll need only one: AliExpress for just programmers or Amazon for 3 ESP32-Cams and programmers without the proper cameras

    • 2x External antennas for ESPs Required if you're running vive/tundra full body tracking or having issues with streaming. See the full build guide on how to configure the ESP board for antenna use.

Cameras

Camera modules:

The cameras that come with the boards will not work, they have an IR filter inside.

The filter can be removed, but doing so may break your cameras. Here's how to do it: https://www.youtube.com/watch?v=QYH-FWvDbDc

DANGER

If you decide to remove the filter, wear eye protection while doing so, the removal of the filter will shatter it.

  • 2x OV2640 160° FOV IR / Night vers 75mm (850nm)

(select 75MM-160 850nm) AliExpress

Amazon alternative (note that you will have to manually remove the IR filter)

Things worth noting:

  • There is an experimental option to purchase OV2640 130° FOV cameras and manually remove the IR filters. This can result in a clearer view of the eye and is smaller so it allows for HMDs like the Bigscreen Beyond, but it's not a default recommendation just yet. Checkout the listing "75MM-130 Degree" AliEXpress

  • If the cameras are Dead on Arrival (DOA), keep in mind that you can swap the lenses with the ones that come with the stock cameras that were included with the ESP32 boards, though they do require extension cables. I recommend just buying more (3-4 instead of just 2).

  • Optional Ribbon extensions:

Certain mounts may require a cable extension (ex: MUTE's frunk mod) To use a mount like that you will need a cable and a connector for each camera. Headsets like the Quest 2 do not require extensions if the camera boards are mounted at the bottom of the headset, near the facial interface.

Extensions (select 0.5mm, A-Forward Direction, 24P) AliExpress (200mm for MUTE's)

Connectors (select 24P) Aliexpress

USB Hubs - for if you are building the wired version

  • 1x USB 3.0+ hub The hub needs to support MTT if you wish to use a vive face tracker with the ESPs. Here is a hub that supports MTT and is not expensive Amazon

Ensure that it is of good quality, lightweight, compact in size, and I suggest a minimum of four ports - one for the face tracker, one for the LED kit, and two for ESP32-S3 boards. Ensure that you acquire appropriate USB-A to USB-C adapters wherever required. For example the Valve Index only has one USB-A port. Be wary that "mini" adapters with the short ends may not work properly. Ensure the adapter has a long end. Such adapter Amazon.

  • 2x USB C cables (as short as possible) to connect both ESPs (select 0.05m/5cm) AliExpress or AliExpress USB C to USB A As the ESP32-S3 has USB-C connectors, you may require some USB-C to USB-A cables depending on your USB hub. It's worth noting that the HTC Face Tracker requires a USB-C port, so you may need to consider this requirement as well. You may also make custom cables using USB breakout boards of your choice and wire.

Wires and adapters

If you are soldering and using custom cables:

IR emitters

We recommend getting the official kits:

Alternatively you can source the parts for V3 yourself:

DANGER

If they look like something you would find in a TV remote, do NOT use them. Even if you think you can alter them THEY WILL NOT WORK AND PUT YOU AT RISK. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.

DO NOT BUY FOCUSED ONES!

',44)),r("ul",null,[r("li",null,[e[3]||(e[3]=r("p",null,"4x Unfocused SMD IR emitters",-1)),a(o,{options:l(s).parts_list_four},{content:i(()=>e[2]||(e[2]=[r("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1)])),_:1},8,["options"]),e[4]||(e[4]=r("ul",null,[r("li",null,[r("a",{href:"https://www.lcsc.com/product-detail/Infrared-IR-LEDs_XINGLIGHT-XL-3216HIRC-850_C965891.html",target:"_blank",rel:"noreferrer"},"(Recommended) from LCSC here"),t(".")]),r("li",null,[r("a",{href:"https://www.digikey.com/en/products/detail/inolux/IN-P32ZTIR/10384796",target:"_blank",rel:"noreferrer"},"(Alternative) from Digikey here"),t("."),r("br"),t(" The difference between them is the ones from LCSC are rated for lower power, which means in the event of a short or mishap they should be safer, as well as being smaller in footprint, hence why they are recommended.")])],-1))]),e[5]||(e[5]=r("li",null,[r("p",null,[t("4x IR emitter PCBs (highly recommended) Gerber files and schematics located "),r("a",{href:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/IR%20Emmitter",target:"_blank",rel:"noreferrer"},"here.")])],-1)),e[6]||(e[6]=r("li",null,[r("p",null,"4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)")],-1)),e[7]||(e[7]=r("li",null,[r("p",null,[r("a",{href:"https://www.digikey.com/en/products/detail/stackpole-electronics-inc/RMCF1206FT357R/1759919",target:"_blank",rel:"noreferrer"},"357 ohm Digikey here")])],-1)),e[8]||(e[8]=r("li",null,[r("p",null,[r("a",{href:"https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_BOURNS-CR1206-FX-3480ELF_C205328.html",target:"_blank",rel:"noreferrer"},"348 ohm LCSC here")])],-1))]),e[13]||(e[13]=r("p",null,"This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.",-1)),e[14]||(e[14]=r("ul",null,[r("li",null,[t("1x Wire to power IR emitters"),r("br"),r("a",{href:"https://www.aliexpress.com/item/3256804720067942.html",target:"_blank",rel:"noreferrer"},"34 AWG AliExpress")])],-1)),e[15]||(e[15]=r("h2",{id:"_3d-printed-mounts",tabindex:"-1"},[t("3D Printed Mounts "),r("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts"'},"​")],-1)),e[16]||(e[16]=r("p",null,[t("Mounts with a "),r("code",null,"★"),t(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1)),a(o,{options:l(s).parts_list_three},{content:i(()=>e[9]||(e[9]=[r("p",null," You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't. ",-1)])),_:1},8,["options"]),a(h),e[17]||(e[17]=n('

Misc parts/tools

AliExpress (Generic)
Amazon (Generic)

  • 2x-4x Heatsinks (Optional) - for the ESP32-CAM AliExpress (14mm for ESP, 8mm for voltage regulator)

Other Headsets

If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.

Check out our basic guide on making your own mount here.

',7)),a(o,{options:l(s).parts_list_six},{content:i(()=>e[10]||(e[10]=[r("p",null," If you have a headset mount that is not listed above, please let us know in the discord so it can be added here. ",-1)])),_:1},8,["options"])]))}});export{k as __pageData,y as default}; +import{_ as o,a as s}from"./chunks/index.c19b2931.js";import{_ as h}from"./chunks/PartsList.a520a26d.js";import{o as p,c as d,k as r,a as t,E as a,w as i,l,O as n}from"./chunks/framework.ece1a6f0.js";import"./chunks/Accordion.44247159.js";const k=JSON.parse('{"title":"Parts List","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/parts_list.md","filePath":"how_to_build/parts_list.md","lastUpdated":1718650130000}'),u={name:"how_to_build/parts_list.md"},y=Object.assign(u,{setup(m){return(c,e)=>(p(),d("div",null,[e[11]||(e[11]=r("h1",{class:"text-[var(--font-accent)]",id:"parts-list",tabindex:"-1"},[t("Parts List "),r("a",{class:"header-anchor",href:"#parts-list","aria-label":'Permalink to "Parts List {.text-[var(--font-accent)]}"'},"​")],-1)),a(o,{options:l(s).parts_list_one},{content:i(()=>e[0]||(e[0]=[r("p",null," Please note that no hardware has been fully set in stone, all purchases are at your own risk in case of hardware changes. ",-1)])),_:1},8,["options"]),a(o,{options:l(s).parts_list_three},{content:i(()=>e[1]||(e[1]=[r("p",null," It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay. ",-1)])),_:1},8,["options"]),e[12]||(e[12]=n('

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wireless over WiFi 2.4 GHz

This offers a good starting point as the ESP boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they start to make less sense.

Pros:

  • Wider user adoption and greater support
  • Low weight, less cables, easier to manage

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • Risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • ESP32-CAM uses more power and heats up due to radio module power needs

Option 2: Wired over USB Serial (in beta)

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerates up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be more costly

Required parts

With that in mind, here are the required parts for the setup.

Tracker boards:

    • 2x XIAO ESP32-S3 Sense Modules
      Very small size, wireless and wired support, does not require an additional programmer or separate antennas: SeedStudio

    AliExpress

    Alternatively:

    • 2x Freenove ESP 32-S3 WROOM
      Much larger, price may be higher than the XIAOs, supports wired and wireless as well, does not need a separate programmer, does not support a separate antenna. Amazon
  • A cheaper, wireless only alternative:

    • 2x ESPCAM32 Modules - They are cheaper, requires a separate programmer board, supports only wireless streaming and may require some soldering for attaching separate antennas: AliExpress
      This board also requires a special programmer board in order to flash the firmware. You'll need only one: AliExpress for just programmers or Amazon for 3 ESP32-Cams and programmers without the proper cameras

    • 2x External antennas for ESPs Required if you're running vive/tundra full body tracking or having issues with streaming. See the full build guide on how to configure the ESP board for antenna use.

Cameras

Camera modules:

The cameras that come with the boards will not work, they have an IR filter inside.

The filter can be removed, but doing so may break your cameras. Here's how to do it: https://www.youtube.com/watch?v=QYH-FWvDbDc

DANGER

If you decide to remove the filter, wear eye protection while doing so, the removal of the filter will shatter it.

  • 2x OV2640 160° FOV IR / Night vers 75mm (850nm)

(select 75MM-160 850nm) AliExpress

Amazon alternative (note that you will have to manually remove the IR filter)

Things worth noting:

  • There is an experimental option to purchase OV2640 130° FOV cameras and manually remove the IR filters. This can result in a clearer view of the eye and is smaller so it allows for HMDs like the Bigscreen Beyond, but it's not a default recommendation just yet. Checkout the listing "75MM-130 Degree" AliEXpress

  • If the cameras are Dead on Arrival (DOA), keep in mind that you can swap the lenses with the ones that come with the stock cameras that were included with the ESP32 boards, though they do require extension cables. I recommend just buying more (3-4 instead of just 2).

  • Optional Ribbon extensions:

Certain mounts may require a cable extension (ex: MUTE's frunk mod) To use a mount like that you will need a cable and a connector for each camera. Headsets like the Quest 2 do not require extensions if the camera boards are mounted at the bottom of the headset, near the facial interface.

Extensions (select 0.5mm, A-Forward Direction, 24P) AliExpress (200mm for MUTE's)

Connectors (select 24P) Aliexpress

USB Hubs - for if you are building the wired version

  • 1x USB 3.0+ hub The hub needs to support MTT if you wish to use a vive face tracker with the ESPs. Here is a hub that supports MTT and is not expensive Amazon

Ensure that it is of good quality, lightweight, compact in size, and I suggest a minimum of four ports - one for the face tracker, one for the LED kit, and two for ESP32-S3 boards. Ensure that you acquire appropriate USB-A to USB-C adapters wherever required. For example the Valve Index only has one USB-A port. Be wary that "mini" adapters with the short ends may not work properly. Ensure the adapter has a long end. Such adapter Amazon.

  • 2x USB C cables (as short as possible) to connect both ESPs (select 0.05m/5cm) AliExpress or AliExpress USB C to USB A As the ESP32-S3 has USB-C connectors, you may require some USB-C to USB-A cables depending on your USB hub. It's worth noting that the HTC Face Tracker requires a USB-C port, so you may need to consider this requirement as well. You may also make custom cables using USB breakout boards of your choice and wire.

Wires and adapters

If you are soldering and using custom cables:

IR emitters

We recommend getting the official kits:

Alternatively you can source the parts for V3 yourself:

DANGER

If they look like something you would find in a TV remote, do NOT use them. Even if you think you can alter them THEY WILL NOT WORK AND PUT YOU AT RISK. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.

DO NOT BUY FOCUSED ONES!

',44)),r("ul",null,[r("li",null,[e[3]||(e[3]=r("p",null,"4x Unfocused SMD IR emitters",-1)),a(o,{options:l(s).parts_list_four},{content:i(()=>e[2]||(e[2]=[r("p",null," The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended. ",-1)])),_:1},8,["options"]),e[4]||(e[4]=r("ul",null,[r("li",null,[r("a",{href:"https://www.lcsc.com/product-detail/Infrared-IR-LEDs_XINGLIGHT-XL-3216HIRC-850_C965891.html",target:"_blank",rel:"noreferrer"},"(Recommended) from LCSC here"),t(".")]),r("li",null,[r("a",{href:"https://www.digikey.com/en/products/detail/inolux/IN-P32ZTIR/10384796",target:"_blank",rel:"noreferrer"},"(Alternative) from Digikey here"),t("."),r("br"),t(" The difference between them is the ones from LCSC are rated for lower power, which means in the event of a short or mishap they should be safer, as well as being smaller in footprint, hence why they are recommended.")])],-1))]),e[5]||(e[5]=r("li",null,[r("p",null,[t("4x IR emitter PCBs (highly recommended) Gerber files and schematics located "),r("a",{href:"https://github.com/EyeTrackVR/EyeTrackVR-Hardware/tree/main/IR%20Emmitter",target:"_blank",rel:"noreferrer"},"here.")])],-1)),e[6]||(e[6]=r("li",null,[r("p",null,"4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)")],-1)),e[7]||(e[7]=r("li",null,[r("p",null,[r("a",{href:"https://www.digikey.com/en/products/detail/stackpole-electronics-inc/RMCF1206FT357R/1759919",target:"_blank",rel:"noreferrer"},"357 ohm Digikey here")])],-1)),e[8]||(e[8]=r("li",null,[r("p",null,[r("a",{href:"https://lcsc.com/product-detail/Chip-Resistor-Surface-Mount_BOURNS-CR1206-FX-3480ELF_C205328.html",target:"_blank",rel:"noreferrer"},"348 ohm LCSC here")])],-1))]),e[13]||(e[13]=r("p",null,"This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.",-1)),e[14]||(e[14]=r("ul",null,[r("li",null,[t("1x Wire to power IR emitters"),r("br"),r("a",{href:"https://www.aliexpress.com/item/3256804720067942.html",target:"_blank",rel:"noreferrer"},"34 AWG AliExpress")])],-1)),e[15]||(e[15]=r("h2",{id:"_3d-printed-mounts",tabindex:"-1"},[t("3D Printed Mounts "),r("a",{class:"header-anchor",href:"#_3d-printed-mounts","aria-label":'Permalink to "3D Printed Mounts"'},"​")],-1)),e[16]||(e[16]=r("p",null,[t("Mounts with a "),r("code",null,"★"),t(" next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.")],-1)),a(o,{options:l(s).parts_list_three},{content:i(()=>e[9]||(e[9]=[r("p",null," You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't. ",-1)])),_:1},8,["options"]),a(h),e[17]||(e[17]=n('

Misc parts/tools

AliExpress (Generic)
Amazon (Generic)

  • 2x-4x Heatsinks (Optional) - for the ESP32-CAM AliExpress (14mm for ESP, 8mm for voltage regulator)

Other Headsets

If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.

Check out our basic guide on making your own mount here.

',7)),a(o,{options:l(s).parts_list_six},{content:i(()=>e[10]||(e[10]=[r("p",null," If you have a headset mount that is not listed above, please let us know in the discord so it can be added here. ",-1)])),_:1},8,["options"])]))}});export{k as __pageData,y as default}; diff --git a/assets/how_to_build_preparing_cameras.md.0a4aab5a.js b/assets/how_to_build_preparing_cameras.md.e4e61b6c.js similarity index 98% rename from assets/how_to_build_preparing_cameras.md.0a4aab5a.js rename to assets/how_to_build_preparing_cameras.md.e4e61b6c.js index 981fdc5..8baa584 100644 --- a/assets/how_to_build_preparing_cameras.md.0a4aab5a.js +++ b/assets/how_to_build_preparing_cameras.md.e4e61b6c.js @@ -1 +1 @@ -import{_ as t,i as o}from"./chunks/index.c1fed1bd.js";import{o as s,c as p,k as i,a as l,O as n,E as a,l as r}from"./chunks/framework.47aa8d5b.js";const b=JSON.parse('{"title":"IR Filter Removal","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/preparing_cameras.md","filePath":"how_to_build/preparing_cameras.md","lastUpdated":1728239607000}'),c={name:"how_to_build/preparing_cameras.md"},f=Object.assign(c,{setup(u){return(m,e)=>(s(),p("div",null,[e[0]||(e[0]=i("h1",{class:"text-[var(--font-accent)]",id:"ir-filter-removal",tabindex:"-1"},[l("IR Filter Removal "),i("a",{class:"header-anchor",href:"#ir-filter-removal","aria-label":'Permalink to "IR Filter Removal {.text-[var(--font-accent)]}"'},"​")],-1)),e[1]||(e[1]=i("p",null,"Some cameras require a removal of the IR filter, so the sensors are able to pick up the lighting provided by the IR LED's. Many times, the IR filter will still be on the 160° night vision model. If your feed looks dark, this may be why!",-1)),e[2]||(e[2]=i("h3",{id:"_130°-ir-filter-removal",tabindex:"-1"},[l("130° IR Filter removal "),i("a",{class:"header-anchor",href:"#_130°-ir-filter-removal","aria-label":'Permalink to "130° IR Filter removal"'},"​")],-1)),e[3]||(e[3]=i("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/mRSLSeX3omA",title:"How to Remove the IR Filter on a 130 Deg OV2640 Camera",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",referrerpolicy:"strict-origin-when-cross-origin",allowfullscreen:""},null,-1)),e[4]||(e[4]=i("h3",{id:"_160°-ir-filter-removal",tabindex:"-1"},[l("160° IR Filter removal "),i("a",{class:"header-anchor",href:"#_160°-ir-filter-removal","aria-label":'Permalink to "160° IR Filter removal"'},"​")],-1)),e[5]||(e[5]=i("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/QYH-FWvDbDc?si=XKXL1B2BZKtDMlQ4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",referrerpolicy:"strict-origin-when-cross-origin",allowfullscreen:""},null,-1)),e[6]||(e[6]=n('

Blurry Camera?

If your feed looks blurry in the ETVR app, you likely need to focus the cameras by turning the lens. They are glued in place from factory, but easily breakable with pliers.

Use a point of reference like the LED's while holding the camera, rotate the lens with pliers in either direction and watch if the feed gets more or less blurry. Repeat until you dial it in nicely. You should do this prior to mounting the cameras or atleast prevent mounting and unmounting them too many times or you risk breaking them.

Protecting a Camera Ribbon Cable

The ribbon cables that these cameras use are notoriously prone to damage rendering them useless.

By wrapping them in tape such as electrical tape and following best practices covered in the guide, you can significantly reduce the risk of killing a camera.

It is recommended to do this before building your setup so you are less likely to kill a camera in the process of building a setup.

Wrapping the Camera Ribbon

First get a roll of electrical tape to wrap the camera ribbon. It does not strictly need to be electrical tape, but that is what I have found to work good, (and look good too).

',11)),a(t,{options:r(o).camera_protect1},null,8,["options"]),e[7]||(e[7]=i("p",null,"Place the camera on the tape so that the entire bottom area including the sensor are covered and that one side of the camera ribbon has slightly more tape (helps make it look good).",-1)),a(t,{options:r(o).camera_protect2},null,8,["options"]),e[8]||(e[8]=i("p",null,"Cut the tape from the roll, here I used flat cutters. Be careful to not cut the camera connector in the process.",-1)),a(t,{options:r(o).camera_protect3},null,8,["options"]),a(t,{options:r(o).camera_protect4},null,8,["options"]),e[9]||(e[9]=i("p",null,"With the tape cut from the roll, lay it down and get out a X-ACTO knife.",-1)),a(t,{options:r(o).camera_protect5},null,8,["options"]),e[10]||(e[10]=i("p",null,"Begin to cut around the camera connector so the tape can be peeled off.",-1)),a(t,{options:r(o).camera_protect6},null,8,["options"]),a(t,{options:r(o).camera_protect7},null,8,["options"]),e[11]||(e[11]=i("p",null,"When each side has been cut, begin to peel off the part that covered the connections.",-1)),a(t,{options:r(o).camera_protect8},null,8,["options"]),a(t,{options:r(o).camera_protect9},null,8,["options"]),a(t,{options:r(o).camera_protect10},null,8,["options"]),e[12]||(e[12]=i("p",null,'Now, carefully cut around the camera sensor part to remove its "skirt" leaving tape on the back of it.',-1)),a(t,{options:r(o).camera_protect11},null,8,["options"]),a(t,{options:r(o).camera_protect13},null,8,["options"]),a(t,{options:r(o).camera_protect14},null,8,["options"]),a(t,{options:r(o).camera_protect15},null,8,["options"]),a(t,{options:r(o).camera_protect12},null,8,["options"]),e[13]||(e[13]=i("p",null,"Gently pull off this outline of tape from the camera.",-1)),a(t,{options:r(o).camera_protect16},null,8,["options"]),a(t,{options:r(o).camera_protect17},null,8,["options"]),e[14]||(e[14]=i("p",null,"Begin to wrap the tape along the ribbon cable by first folding in the slightly shorter side.",-1)),a(t,{options:r(o).camera_protect18},null,8,["options"]),a(t,{options:r(o).camera_protect19},null,8,["options"]),e[15]||(e[15]=i("p",null,"Fold over the other side.",-1)),a(t,{options:r(o).camera_protect20},null,8,["options"]),a(t,{options:r(o).camera_protect21},null,8,["options"]),e[16]||(e[16]=i("p",null,"And you are done!",-1)),a(t,{options:r(o).camera_protect22},null,8,["options"]),e[17]||(e[17]=n('

Best Practices When Handling Cameras

  • Do not pull or jerk on the ribbon
  • Do not fold tightly or bend the ribbon cable sharper than ~45 degrees if possible
  • Do not expose to sharp objects or crevices
  • The less wear while handling or putting on/off a headset the better
  • Do not unmount and mount the cameras repetitively.

Conclusion

You have successfully wrapped your camera to be protected and learned the best practices with handling cameras!

',4))]))}});export{b as __pageData,f as default}; +import{_ as t,i as o}from"./chunks/index.41b0dfea.js";import{o as s,c as p,k as i,a as l,O as n,E as a,l as r}from"./chunks/framework.ece1a6f0.js";const b=JSON.parse('{"title":"IR Filter Removal","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/preparing_cameras.md","filePath":"how_to_build/preparing_cameras.md","lastUpdated":1728239607000}'),c={name:"how_to_build/preparing_cameras.md"},f=Object.assign(c,{setup(u){return(m,e)=>(s(),p("div",null,[e[0]||(e[0]=i("h1",{class:"text-[var(--font-accent)]",id:"ir-filter-removal",tabindex:"-1"},[l("IR Filter Removal "),i("a",{class:"header-anchor",href:"#ir-filter-removal","aria-label":'Permalink to "IR Filter Removal {.text-[var(--font-accent)]}"'},"​")],-1)),e[1]||(e[1]=i("p",null,"Some cameras require a removal of the IR filter, so the sensors are able to pick up the lighting provided by the IR LED's. Many times, the IR filter will still be on the 160° night vision model. If your feed looks dark, this may be why!",-1)),e[2]||(e[2]=i("h3",{id:"_130°-ir-filter-removal",tabindex:"-1"},[l("130° IR Filter removal "),i("a",{class:"header-anchor",href:"#_130°-ir-filter-removal","aria-label":'Permalink to "130° IR Filter removal"'},"​")],-1)),e[3]||(e[3]=i("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/mRSLSeX3omA",title:"How to Remove the IR Filter on a 130 Deg OV2640 Camera",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",referrerpolicy:"strict-origin-when-cross-origin",allowfullscreen:""},null,-1)),e[4]||(e[4]=i("h3",{id:"_160°-ir-filter-removal",tabindex:"-1"},[l("160° IR Filter removal "),i("a",{class:"header-anchor",href:"#_160°-ir-filter-removal","aria-label":'Permalink to "160° IR Filter removal"'},"​")],-1)),e[5]||(e[5]=i("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/QYH-FWvDbDc?si=XKXL1B2BZKtDMlQ4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",referrerpolicy:"strict-origin-when-cross-origin",allowfullscreen:""},null,-1)),e[6]||(e[6]=n('

Blurry Camera?

If your feed looks blurry in the ETVR app, you likely need to focus the cameras by turning the lens. They are glued in place from factory, but easily breakable with pliers.

Use a point of reference like the LED's while holding the camera, rotate the lens with pliers in either direction and watch if the feed gets more or less blurry. Repeat until you dial it in nicely. You should do this prior to mounting the cameras or atleast prevent mounting and unmounting them too many times or you risk breaking them.

Protecting a Camera Ribbon Cable

The ribbon cables that these cameras use are notoriously prone to damage rendering them useless.

By wrapping them in tape such as electrical tape and following best practices covered in the guide, you can significantly reduce the risk of killing a camera.

It is recommended to do this before building your setup so you are less likely to kill a camera in the process of building a setup.

Wrapping the Camera Ribbon

First get a roll of electrical tape to wrap the camera ribbon. It does not strictly need to be electrical tape, but that is what I have found to work good, (and look good too).

',11)),a(t,{options:r(o).camera_protect1},null,8,["options"]),e[7]||(e[7]=i("p",null,"Place the camera on the tape so that the entire bottom area including the sensor are covered and that one side of the camera ribbon has slightly more tape (helps make it look good).",-1)),a(t,{options:r(o).camera_protect2},null,8,["options"]),e[8]||(e[8]=i("p",null,"Cut the tape from the roll, here I used flat cutters. Be careful to not cut the camera connector in the process.",-1)),a(t,{options:r(o).camera_protect3},null,8,["options"]),a(t,{options:r(o).camera_protect4},null,8,["options"]),e[9]||(e[9]=i("p",null,"With the tape cut from the roll, lay it down and get out a X-ACTO knife.",-1)),a(t,{options:r(o).camera_protect5},null,8,["options"]),e[10]||(e[10]=i("p",null,"Begin to cut around the camera connector so the tape can be peeled off.",-1)),a(t,{options:r(o).camera_protect6},null,8,["options"]),a(t,{options:r(o).camera_protect7},null,8,["options"]),e[11]||(e[11]=i("p",null,"When each side has been cut, begin to peel off the part that covered the connections.",-1)),a(t,{options:r(o).camera_protect8},null,8,["options"]),a(t,{options:r(o).camera_protect9},null,8,["options"]),a(t,{options:r(o).camera_protect10},null,8,["options"]),e[12]||(e[12]=i("p",null,'Now, carefully cut around the camera sensor part to remove its "skirt" leaving tape on the back of it.',-1)),a(t,{options:r(o).camera_protect11},null,8,["options"]),a(t,{options:r(o).camera_protect13},null,8,["options"]),a(t,{options:r(o).camera_protect14},null,8,["options"]),a(t,{options:r(o).camera_protect15},null,8,["options"]),a(t,{options:r(o).camera_protect12},null,8,["options"]),e[13]||(e[13]=i("p",null,"Gently pull off this outline of tape from the camera.",-1)),a(t,{options:r(o).camera_protect16},null,8,["options"]),a(t,{options:r(o).camera_protect17},null,8,["options"]),e[14]||(e[14]=i("p",null,"Begin to wrap the tape along the ribbon cable by first folding in the slightly shorter side.",-1)),a(t,{options:r(o).camera_protect18},null,8,["options"]),a(t,{options:r(o).camera_protect19},null,8,["options"]),e[15]||(e[15]=i("p",null,"Fold over the other side.",-1)),a(t,{options:r(o).camera_protect20},null,8,["options"]),a(t,{options:r(o).camera_protect21},null,8,["options"]),e[16]||(e[16]=i("p",null,"And you are done!",-1)),a(t,{options:r(o).camera_protect22},null,8,["options"]),e[17]||(e[17]=n('

Best Practices When Handling Cameras

  • Do not pull or jerk on the ribbon
  • Do not fold tightly or bend the ribbon cable sharper than ~45 degrees if possible
  • Do not expose to sharp objects or crevices
  • The less wear while handling or putting on/off a headset the better
  • Do not unmount and mount the cameras repetitively.

Conclusion

You have successfully wrapped your camera to be protected and learned the best practices with handling cameras!

',4))]))}});export{b as __pageData,f as default}; diff --git a/assets/how_to_build_preparing_cameras.md.0a4aab5a.lean.js b/assets/how_to_build_preparing_cameras.md.e4e61b6c.lean.js similarity index 98% rename from assets/how_to_build_preparing_cameras.md.0a4aab5a.lean.js rename to assets/how_to_build_preparing_cameras.md.e4e61b6c.lean.js index 981fdc5..8baa584 100644 --- a/assets/how_to_build_preparing_cameras.md.0a4aab5a.lean.js +++ b/assets/how_to_build_preparing_cameras.md.e4e61b6c.lean.js @@ -1 +1 @@ -import{_ as t,i as o}from"./chunks/index.c1fed1bd.js";import{o as s,c as p,k as i,a as l,O as n,E as a,l as r}from"./chunks/framework.47aa8d5b.js";const b=JSON.parse('{"title":"IR Filter Removal","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/preparing_cameras.md","filePath":"how_to_build/preparing_cameras.md","lastUpdated":1728239607000}'),c={name:"how_to_build/preparing_cameras.md"},f=Object.assign(c,{setup(u){return(m,e)=>(s(),p("div",null,[e[0]||(e[0]=i("h1",{class:"text-[var(--font-accent)]",id:"ir-filter-removal",tabindex:"-1"},[l("IR Filter Removal "),i("a",{class:"header-anchor",href:"#ir-filter-removal","aria-label":'Permalink to "IR Filter Removal {.text-[var(--font-accent)]}"'},"​")],-1)),e[1]||(e[1]=i("p",null,"Some cameras require a removal of the IR filter, so the sensors are able to pick up the lighting provided by the IR LED's. Many times, the IR filter will still be on the 160° night vision model. If your feed looks dark, this may be why!",-1)),e[2]||(e[2]=i("h3",{id:"_130°-ir-filter-removal",tabindex:"-1"},[l("130° IR Filter removal "),i("a",{class:"header-anchor",href:"#_130°-ir-filter-removal","aria-label":'Permalink to "130° IR Filter removal"'},"​")],-1)),e[3]||(e[3]=i("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/mRSLSeX3omA",title:"How to Remove the IR Filter on a 130 Deg OV2640 Camera",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",referrerpolicy:"strict-origin-when-cross-origin",allowfullscreen:""},null,-1)),e[4]||(e[4]=i("h3",{id:"_160°-ir-filter-removal",tabindex:"-1"},[l("160° IR Filter removal "),i("a",{class:"header-anchor",href:"#_160°-ir-filter-removal","aria-label":'Permalink to "160° IR Filter removal"'},"​")],-1)),e[5]||(e[5]=i("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/QYH-FWvDbDc?si=XKXL1B2BZKtDMlQ4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",referrerpolicy:"strict-origin-when-cross-origin",allowfullscreen:""},null,-1)),e[6]||(e[6]=n('

Blurry Camera?

If your feed looks blurry in the ETVR app, you likely need to focus the cameras by turning the lens. They are glued in place from factory, but easily breakable with pliers.

Use a point of reference like the LED's while holding the camera, rotate the lens with pliers in either direction and watch if the feed gets more or less blurry. Repeat until you dial it in nicely. You should do this prior to mounting the cameras or atleast prevent mounting and unmounting them too many times or you risk breaking them.

Protecting a Camera Ribbon Cable

The ribbon cables that these cameras use are notoriously prone to damage rendering them useless.

By wrapping them in tape such as electrical tape and following best practices covered in the guide, you can significantly reduce the risk of killing a camera.

It is recommended to do this before building your setup so you are less likely to kill a camera in the process of building a setup.

Wrapping the Camera Ribbon

First get a roll of electrical tape to wrap the camera ribbon. It does not strictly need to be electrical tape, but that is what I have found to work good, (and look good too).

',11)),a(t,{options:r(o).camera_protect1},null,8,["options"]),e[7]||(e[7]=i("p",null,"Place the camera on the tape so that the entire bottom area including the sensor are covered and that one side of the camera ribbon has slightly more tape (helps make it look good).",-1)),a(t,{options:r(o).camera_protect2},null,8,["options"]),e[8]||(e[8]=i("p",null,"Cut the tape from the roll, here I used flat cutters. Be careful to not cut the camera connector in the process.",-1)),a(t,{options:r(o).camera_protect3},null,8,["options"]),a(t,{options:r(o).camera_protect4},null,8,["options"]),e[9]||(e[9]=i("p",null,"With the tape cut from the roll, lay it down and get out a X-ACTO knife.",-1)),a(t,{options:r(o).camera_protect5},null,8,["options"]),e[10]||(e[10]=i("p",null,"Begin to cut around the camera connector so the tape can be peeled off.",-1)),a(t,{options:r(o).camera_protect6},null,8,["options"]),a(t,{options:r(o).camera_protect7},null,8,["options"]),e[11]||(e[11]=i("p",null,"When each side has been cut, begin to peel off the part that covered the connections.",-1)),a(t,{options:r(o).camera_protect8},null,8,["options"]),a(t,{options:r(o).camera_protect9},null,8,["options"]),a(t,{options:r(o).camera_protect10},null,8,["options"]),e[12]||(e[12]=i("p",null,'Now, carefully cut around the camera sensor part to remove its "skirt" leaving tape on the back of it.',-1)),a(t,{options:r(o).camera_protect11},null,8,["options"]),a(t,{options:r(o).camera_protect13},null,8,["options"]),a(t,{options:r(o).camera_protect14},null,8,["options"]),a(t,{options:r(o).camera_protect15},null,8,["options"]),a(t,{options:r(o).camera_protect12},null,8,["options"]),e[13]||(e[13]=i("p",null,"Gently pull off this outline of tape from the camera.",-1)),a(t,{options:r(o).camera_protect16},null,8,["options"]),a(t,{options:r(o).camera_protect17},null,8,["options"]),e[14]||(e[14]=i("p",null,"Begin to wrap the tape along the ribbon cable by first folding in the slightly shorter side.",-1)),a(t,{options:r(o).camera_protect18},null,8,["options"]),a(t,{options:r(o).camera_protect19},null,8,["options"]),e[15]||(e[15]=i("p",null,"Fold over the other side.",-1)),a(t,{options:r(o).camera_protect20},null,8,["options"]),a(t,{options:r(o).camera_protect21},null,8,["options"]),e[16]||(e[16]=i("p",null,"And you are done!",-1)),a(t,{options:r(o).camera_protect22},null,8,["options"]),e[17]||(e[17]=n('

Best Practices When Handling Cameras

  • Do not pull or jerk on the ribbon
  • Do not fold tightly or bend the ribbon cable sharper than ~45 degrees if possible
  • Do not expose to sharp objects or crevices
  • The less wear while handling or putting on/off a headset the better
  • Do not unmount and mount the cameras repetitively.

Conclusion

You have successfully wrapped your camera to be protected and learned the best practices with handling cameras!

',4))]))}});export{b as __pageData,f as default}; +import{_ as t,i as o}from"./chunks/index.41b0dfea.js";import{o as s,c as p,k as i,a as l,O as n,E as a,l as r}from"./chunks/framework.ece1a6f0.js";const b=JSON.parse('{"title":"IR Filter Removal","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/preparing_cameras.md","filePath":"how_to_build/preparing_cameras.md","lastUpdated":1728239607000}'),c={name:"how_to_build/preparing_cameras.md"},f=Object.assign(c,{setup(u){return(m,e)=>(s(),p("div",null,[e[0]||(e[0]=i("h1",{class:"text-[var(--font-accent)]",id:"ir-filter-removal",tabindex:"-1"},[l("IR Filter Removal "),i("a",{class:"header-anchor",href:"#ir-filter-removal","aria-label":'Permalink to "IR Filter Removal {.text-[var(--font-accent)]}"'},"​")],-1)),e[1]||(e[1]=i("p",null,"Some cameras require a removal of the IR filter, so the sensors are able to pick up the lighting provided by the IR LED's. Many times, the IR filter will still be on the 160° night vision model. If your feed looks dark, this may be why!",-1)),e[2]||(e[2]=i("h3",{id:"_130°-ir-filter-removal",tabindex:"-1"},[l("130° IR Filter removal "),i("a",{class:"header-anchor",href:"#_130°-ir-filter-removal","aria-label":'Permalink to "130° IR Filter removal"'},"​")],-1)),e[3]||(e[3]=i("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/mRSLSeX3omA",title:"How to Remove the IR Filter on a 130 Deg OV2640 Camera",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",referrerpolicy:"strict-origin-when-cross-origin",allowfullscreen:""},null,-1)),e[4]||(e[4]=i("h3",{id:"_160°-ir-filter-removal",tabindex:"-1"},[l("160° IR Filter removal "),i("a",{class:"header-anchor",href:"#_160°-ir-filter-removal","aria-label":'Permalink to "160° IR Filter removal"'},"​")],-1)),e[5]||(e[5]=i("iframe",{width:"560",height:"315",src:"https://www.youtube.com/embed/QYH-FWvDbDc?si=XKXL1B2BZKtDMlQ4",title:"YouTube video player",frameborder:"0",allow:"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",referrerpolicy:"strict-origin-when-cross-origin",allowfullscreen:""},null,-1)),e[6]||(e[6]=n('

Blurry Camera?

If your feed looks blurry in the ETVR app, you likely need to focus the cameras by turning the lens. They are glued in place from factory, but easily breakable with pliers.

Use a point of reference like the LED's while holding the camera, rotate the lens with pliers in either direction and watch if the feed gets more or less blurry. Repeat until you dial it in nicely. You should do this prior to mounting the cameras or atleast prevent mounting and unmounting them too many times or you risk breaking them.

Protecting a Camera Ribbon Cable

The ribbon cables that these cameras use are notoriously prone to damage rendering them useless.

By wrapping them in tape such as electrical tape and following best practices covered in the guide, you can significantly reduce the risk of killing a camera.

It is recommended to do this before building your setup so you are less likely to kill a camera in the process of building a setup.

Wrapping the Camera Ribbon

First get a roll of electrical tape to wrap the camera ribbon. It does not strictly need to be electrical tape, but that is what I have found to work good, (and look good too).

',11)),a(t,{options:r(o).camera_protect1},null,8,["options"]),e[7]||(e[7]=i("p",null,"Place the camera on the tape so that the entire bottom area including the sensor are covered and that one side of the camera ribbon has slightly more tape (helps make it look good).",-1)),a(t,{options:r(o).camera_protect2},null,8,["options"]),e[8]||(e[8]=i("p",null,"Cut the tape from the roll, here I used flat cutters. Be careful to not cut the camera connector in the process.",-1)),a(t,{options:r(o).camera_protect3},null,8,["options"]),a(t,{options:r(o).camera_protect4},null,8,["options"]),e[9]||(e[9]=i("p",null,"With the tape cut from the roll, lay it down and get out a X-ACTO knife.",-1)),a(t,{options:r(o).camera_protect5},null,8,["options"]),e[10]||(e[10]=i("p",null,"Begin to cut around the camera connector so the tape can be peeled off.",-1)),a(t,{options:r(o).camera_protect6},null,8,["options"]),a(t,{options:r(o).camera_protect7},null,8,["options"]),e[11]||(e[11]=i("p",null,"When each side has been cut, begin to peel off the part that covered the connections.",-1)),a(t,{options:r(o).camera_protect8},null,8,["options"]),a(t,{options:r(o).camera_protect9},null,8,["options"]),a(t,{options:r(o).camera_protect10},null,8,["options"]),e[12]||(e[12]=i("p",null,'Now, carefully cut around the camera sensor part to remove its "skirt" leaving tape on the back of it.',-1)),a(t,{options:r(o).camera_protect11},null,8,["options"]),a(t,{options:r(o).camera_protect13},null,8,["options"]),a(t,{options:r(o).camera_protect14},null,8,["options"]),a(t,{options:r(o).camera_protect15},null,8,["options"]),a(t,{options:r(o).camera_protect12},null,8,["options"]),e[13]||(e[13]=i("p",null,"Gently pull off this outline of tape from the camera.",-1)),a(t,{options:r(o).camera_protect16},null,8,["options"]),a(t,{options:r(o).camera_protect17},null,8,["options"]),e[14]||(e[14]=i("p",null,"Begin to wrap the tape along the ribbon cable by first folding in the slightly shorter side.",-1)),a(t,{options:r(o).camera_protect18},null,8,["options"]),a(t,{options:r(o).camera_protect19},null,8,["options"]),e[15]||(e[15]=i("p",null,"Fold over the other side.",-1)),a(t,{options:r(o).camera_protect20},null,8,["options"]),a(t,{options:r(o).camera_protect21},null,8,["options"]),e[16]||(e[16]=i("p",null,"And you are done!",-1)),a(t,{options:r(o).camera_protect22},null,8,["options"]),e[17]||(e[17]=n('

Best Practices When Handling Cameras

  • Do not pull or jerk on the ribbon
  • Do not fold tightly or bend the ribbon cable sharper than ~45 degrees if possible
  • Do not expose to sharp objects or crevices
  • The less wear while handling or putting on/off a headset the better
  • Do not unmount and mount the cameras repetitively.

Conclusion

You have successfully wrapped your camera to be protected and learned the best practices with handling cameras!

',4))]))}});export{b as __pageData,f as default}; diff --git a/assets/how_to_build_preparing_xiao.md.fcacda59.js b/assets/how_to_build_preparing_xiao.md.840809cc.js similarity index 96% rename from assets/how_to_build_preparing_xiao.md.fcacda59.js rename to assets/how_to_build_preparing_xiao.md.840809cc.js index 3d71cfb..b32b7e3 100644 --- a/assets/how_to_build_preparing_xiao.md.fcacda59.js +++ b/assets/how_to_build_preparing_xiao.md.840809cc.js @@ -1 +1 @@ -import{_ as o,i as t}from"./chunks/index.c1fed1bd.js";import{o as r,c as s,k as e,a as l,E as i,l as a}from"./chunks/framework.47aa8d5b.js";const g=JSON.parse('{"title":"How to prepare a Seeed Studio XIAO Sense ESP32","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/preparing_xiao.md","filePath":"how_to_build/preparing_xiao.md","lastUpdated":1710896915000}'),p={name:"how_to_build/preparing_xiao.md"},f=Object.assign(p,{setup(d){return(u,n)=>(r(),s("div",null,[n[0]||(n[0]=e("h1",{class:"text-[var(--font-accent)]",id:"how-to-prepare-a-seeed-studio-xiao-sense-esp32",tabindex:"-1"},[l("How to prepare a Seeed Studio XIAO Sense ESP32 "),e("a",{class:"header-anchor",href:"#how-to-prepare-a-seeed-studio-xiao-sense-esp32","aria-label":'Permalink to "How to prepare a Seeed Studio XIAO Sense ESP32 {.text-[var(--font-accent)]}"'},"​")],-1)),n[1]||(n[1]=e("h2",{id:"what-s-in-the-box",tabindex:"-1"},[l("What's in the box "),e("a",{class:"header-anchor",href:"#what-s-in-the-box","aria-label":`Permalink to "What's in the box"`},"​")],-1)),n[2]||(n[2]=e("p",null,"Your XIAO should come with the following components:",-1)),n[3]||(n[3]=e("ul",null,[e("li",null,"ESP32-S3 Main Board"),e("li",null,"Camera Hat With Low FOV Camera"),e("li",null,"External Antenna")],-1)),i(o,{options:a(t).xiao_kit},null,8,["options"]),n[4]||(n[4]=e("h2",{id:"wired-vs-wireless",tabindex:"-1"},[l("Wired vs Wireless "),e("a",{class:"header-anchor",href:"#wired-vs-wireless","aria-label":'Permalink to "Wired vs Wireless"'},"​")],-1)),n[5]||(n[5]=e("p",null,"The only difference in hardware config between wireless and wired XIAOs is if the antenna is connected or not.",-1)),n[6]||(n[6]=e("h2",{id:"wireless-configuration",tabindex:"-1"},[l("Wireless Configuration "),e("a",{class:"header-anchor",href:"#wireless-configuration","aria-label":'Permalink to "Wireless Configuration"'},"​")],-1)),n[7]||(n[7]=e("p",null,"If you are making a wireless setup, you will need to connect the antenna.",-1)),n[8]||(n[8]=e("p",null,"Line up the antenna connector to the one on the board,",-1)),i(o,{options:a(t).xiao_antenna},null,8,["options"]),n[9]||(n[9]=e("p",null,"then press firmly until it snaps on.",-1)),i(o,{options:a(t).xiao_antenna2},null,8,["options"]),n[10]||(n[10]=e("p",null,"Once connected it should be flat like this:",-1)),i(o,{options:a(t).xiao_antenna3},null,8,["options"]),n[11]||(n[11]=e("h2",{id:"wired-configuration",tabindex:"-1"},[l("Wired Configuration "),e("a",{class:"header-anchor",href:"#wired-configuration","aria-label":'Permalink to "Wired Configuration"'},"​")],-1)),n[12]||(n[12]=e("p",null,"If you are making a wired setup, you do not need to attach the antenna. Set it aside and continue to the next step.",-1)),n[13]||(n[13]=e("h2",{id:"connecting-the-camera-hat",tabindex:"-1"},[l("Connecting the Camera Hat "),e("a",{class:"header-anchor",href:"#connecting-the-camera-hat","aria-label":'Permalink to "Connecting the Camera Hat"'},"​")],-1)),n[14]||(n[14]=e("p",null,"First, locate the connector on the camera hat, and the corresponding one on the XIAO main board circled below.",-1)),i(o,{options:a(t).xiao2},null,8,["options"]),n[15]||(n[15]=e("p",null,"Press down carefully until it snaps on.",-1)),i(o,{options:a(t).xiao3},null,8,["options"]),i(o,{options:a(t).xiao4},null,8,["options"]),n[16]||(n[16]=e("p",null,"Once connected remember to be careful, it is known that these connectors can break semi-easily so avoid ripping them apart too many times or twisting on them weirdly.",-1)),n[17]||(n[17]=e("h2",{id:"removing-the-camera",tabindex:"-1"},[l("Removing the Camera "),e("a",{class:"header-anchor",href:"#removing-the-camera","aria-label":'Permalink to "Removing the Camera"'},"​")],-1)),n[18]||(n[18]=e("p",null,"First we need to remove the existing camera from the XIAO and replace it with a higher FOV longer ribbon camera.",-1)),n[19]||(n[19]=e("p",null,"Begin by lifting up the grey part of the camera connector gently until it raises up.",-1)),i(o,{options:a(t).xiao5},null,8,["options"]),i(o,{options:a(t).xiao6},null,8,["options"]),n[20]||(n[20]=e("p",null,"Now grab the camera and gently wiggle it out of the connector.",-1)),i(o,{options:a(t).xiao7},null,8,["options"]),i(o,{options:a(t).xiao8},null,8,["options"]),n[21]||(n[21]=e("h2",{id:"connecting-the-camera",tabindex:"-1"},[l("Connecting the camera "),e("a",{class:"header-anchor",href:"#connecting-the-camera","aria-label":'Permalink to "Connecting the camera"'},"​")],-1)),n[22]||(n[22]=e("p",null,"The camera should have the pins facing downward, you should only see the black end.",-1)),n[23]||(n[23]=e("p",null,"Line up the camera with the pins on the connector like below.",-1)),i(o,{options:a(t).xiao9},null,8,["options"]),n[24]||(n[24]=e("p",null,"Push the camera in by using a finger on each side of the connector, slowly pushing straight in until it stops. Be gentle so you do not damage the ribbon cable.",-1)),i(o,{options:a(t).xiao10},null,8,["options"]),n[25]||(n[25]=e("p",null,"The cable should go about half way in like this image:",-1)),i(o,{options:a(t).xiao11},null,8,["options"]),n[26]||(n[26]=e("p",null,"Now, close the camera connector by flipping the grey part down.",-1)),i(o,{options:a(t).xiao12},null,8,["options"]),i(o,{options:a(t).xiao13},null,8,["options"]),n[27]||(n[27]=e("h2",{id:"conclusion",tabindex:"-1"},[l("Conclusion "),e("a",{class:"header-anchor",href:"#conclusion","aria-label":'Permalink to "Conclusion"'},"​")],-1)),n[28]||(n[28]=e("p",null,[l("You should now have your XIAO Sense ESP32 ready for "),e("a",{href:"./../firmware_guide/flashing_tool"},"firmware flashing!")],-1))]))}});export{g as __pageData,f as default}; +import{_ as o,i as t}from"./chunks/index.41b0dfea.js";import{o as r,c as s,k as e,a as l,E as i,l as a}from"./chunks/framework.ece1a6f0.js";const g=JSON.parse('{"title":"How to prepare a Seeed Studio XIAO Sense ESP32","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/preparing_xiao.md","filePath":"how_to_build/preparing_xiao.md","lastUpdated":1710896915000}'),p={name:"how_to_build/preparing_xiao.md"},f=Object.assign(p,{setup(d){return(u,n)=>(r(),s("div",null,[n[0]||(n[0]=e("h1",{class:"text-[var(--font-accent)]",id:"how-to-prepare-a-seeed-studio-xiao-sense-esp32",tabindex:"-1"},[l("How to prepare a Seeed Studio XIAO Sense ESP32 "),e("a",{class:"header-anchor",href:"#how-to-prepare-a-seeed-studio-xiao-sense-esp32","aria-label":'Permalink to "How to prepare a Seeed Studio XIAO Sense ESP32 {.text-[var(--font-accent)]}"'},"​")],-1)),n[1]||(n[1]=e("h2",{id:"what-s-in-the-box",tabindex:"-1"},[l("What's in the box "),e("a",{class:"header-anchor",href:"#what-s-in-the-box","aria-label":`Permalink to "What's in the box"`},"​")],-1)),n[2]||(n[2]=e("p",null,"Your XIAO should come with the following components:",-1)),n[3]||(n[3]=e("ul",null,[e("li",null,"ESP32-S3 Main Board"),e("li",null,"Camera Hat With Low FOV Camera"),e("li",null,"External Antenna")],-1)),i(o,{options:a(t).xiao_kit},null,8,["options"]),n[4]||(n[4]=e("h2",{id:"wired-vs-wireless",tabindex:"-1"},[l("Wired vs Wireless "),e("a",{class:"header-anchor",href:"#wired-vs-wireless","aria-label":'Permalink to "Wired vs Wireless"'},"​")],-1)),n[5]||(n[5]=e("p",null,"The only difference in hardware config between wireless and wired XIAOs is if the antenna is connected or not.",-1)),n[6]||(n[6]=e("h2",{id:"wireless-configuration",tabindex:"-1"},[l("Wireless Configuration "),e("a",{class:"header-anchor",href:"#wireless-configuration","aria-label":'Permalink to "Wireless Configuration"'},"​")],-1)),n[7]||(n[7]=e("p",null,"If you are making a wireless setup, you will need to connect the antenna.",-1)),n[8]||(n[8]=e("p",null,"Line up the antenna connector to the one on the board,",-1)),i(o,{options:a(t).xiao_antenna},null,8,["options"]),n[9]||(n[9]=e("p",null,"then press firmly until it snaps on.",-1)),i(o,{options:a(t).xiao_antenna2},null,8,["options"]),n[10]||(n[10]=e("p",null,"Once connected it should be flat like this:",-1)),i(o,{options:a(t).xiao_antenna3},null,8,["options"]),n[11]||(n[11]=e("h2",{id:"wired-configuration",tabindex:"-1"},[l("Wired Configuration "),e("a",{class:"header-anchor",href:"#wired-configuration","aria-label":'Permalink to "Wired Configuration"'},"​")],-1)),n[12]||(n[12]=e("p",null,"If you are making a wired setup, you do not need to attach the antenna. Set it aside and continue to the next step.",-1)),n[13]||(n[13]=e("h2",{id:"connecting-the-camera-hat",tabindex:"-1"},[l("Connecting the Camera Hat "),e("a",{class:"header-anchor",href:"#connecting-the-camera-hat","aria-label":'Permalink to "Connecting the Camera Hat"'},"​")],-1)),n[14]||(n[14]=e("p",null,"First, locate the connector on the camera hat, and the corresponding one on the XIAO main board circled below.",-1)),i(o,{options:a(t).xiao2},null,8,["options"]),n[15]||(n[15]=e("p",null,"Press down carefully until it snaps on.",-1)),i(o,{options:a(t).xiao3},null,8,["options"]),i(o,{options:a(t).xiao4},null,8,["options"]),n[16]||(n[16]=e("p",null,"Once connected remember to be careful, it is known that these connectors can break semi-easily so avoid ripping them apart too many times or twisting on them weirdly.",-1)),n[17]||(n[17]=e("h2",{id:"removing-the-camera",tabindex:"-1"},[l("Removing the Camera "),e("a",{class:"header-anchor",href:"#removing-the-camera","aria-label":'Permalink to "Removing the Camera"'},"​")],-1)),n[18]||(n[18]=e("p",null,"First we need to remove the existing camera from the XIAO and replace it with a higher FOV longer ribbon camera.",-1)),n[19]||(n[19]=e("p",null,"Begin by lifting up the grey part of the camera connector gently until it raises up.",-1)),i(o,{options:a(t).xiao5},null,8,["options"]),i(o,{options:a(t).xiao6},null,8,["options"]),n[20]||(n[20]=e("p",null,"Now grab the camera and gently wiggle it out of the connector.",-1)),i(o,{options:a(t).xiao7},null,8,["options"]),i(o,{options:a(t).xiao8},null,8,["options"]),n[21]||(n[21]=e("h2",{id:"connecting-the-camera",tabindex:"-1"},[l("Connecting the camera "),e("a",{class:"header-anchor",href:"#connecting-the-camera","aria-label":'Permalink to "Connecting the camera"'},"​")],-1)),n[22]||(n[22]=e("p",null,"The camera should have the pins facing downward, you should only see the black end.",-1)),n[23]||(n[23]=e("p",null,"Line up the camera with the pins on the connector like below.",-1)),i(o,{options:a(t).xiao9},null,8,["options"]),n[24]||(n[24]=e("p",null,"Push the camera in by using a finger on each side of the connector, slowly pushing straight in until it stops. Be gentle so you do not damage the ribbon cable.",-1)),i(o,{options:a(t).xiao10},null,8,["options"]),n[25]||(n[25]=e("p",null,"The cable should go about half way in like this image:",-1)),i(o,{options:a(t).xiao11},null,8,["options"]),n[26]||(n[26]=e("p",null,"Now, close the camera connector by flipping the grey part down.",-1)),i(o,{options:a(t).xiao12},null,8,["options"]),i(o,{options:a(t).xiao13},null,8,["options"]),n[27]||(n[27]=e("h2",{id:"conclusion",tabindex:"-1"},[l("Conclusion "),e("a",{class:"header-anchor",href:"#conclusion","aria-label":'Permalink to "Conclusion"'},"​")],-1)),n[28]||(n[28]=e("p",null,[l("You should now have your XIAO Sense ESP32 ready for "),e("a",{href:"./../firmware_guide/flashing_tool"},"firmware flashing!")],-1))]))}});export{g as __pageData,f as default}; diff --git a/assets/how_to_build_preparing_xiao.md.fcacda59.lean.js b/assets/how_to_build_preparing_xiao.md.840809cc.lean.js similarity index 96% rename from assets/how_to_build_preparing_xiao.md.fcacda59.lean.js rename to assets/how_to_build_preparing_xiao.md.840809cc.lean.js index 3d71cfb..b32b7e3 100644 --- a/assets/how_to_build_preparing_xiao.md.fcacda59.lean.js +++ b/assets/how_to_build_preparing_xiao.md.840809cc.lean.js @@ -1 +1 @@ -import{_ as o,i as t}from"./chunks/index.c1fed1bd.js";import{o as r,c as s,k as e,a as l,E as i,l as a}from"./chunks/framework.47aa8d5b.js";const g=JSON.parse('{"title":"How to prepare a Seeed Studio XIAO Sense ESP32","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/preparing_xiao.md","filePath":"how_to_build/preparing_xiao.md","lastUpdated":1710896915000}'),p={name:"how_to_build/preparing_xiao.md"},f=Object.assign(p,{setup(d){return(u,n)=>(r(),s("div",null,[n[0]||(n[0]=e("h1",{class:"text-[var(--font-accent)]",id:"how-to-prepare-a-seeed-studio-xiao-sense-esp32",tabindex:"-1"},[l("How to prepare a Seeed Studio XIAO Sense ESP32 "),e("a",{class:"header-anchor",href:"#how-to-prepare-a-seeed-studio-xiao-sense-esp32","aria-label":'Permalink to "How to prepare a Seeed Studio XIAO Sense ESP32 {.text-[var(--font-accent)]}"'},"​")],-1)),n[1]||(n[1]=e("h2",{id:"what-s-in-the-box",tabindex:"-1"},[l("What's in the box "),e("a",{class:"header-anchor",href:"#what-s-in-the-box","aria-label":`Permalink to "What's in the box"`},"​")],-1)),n[2]||(n[2]=e("p",null,"Your XIAO should come with the following components:",-1)),n[3]||(n[3]=e("ul",null,[e("li",null,"ESP32-S3 Main Board"),e("li",null,"Camera Hat With Low FOV Camera"),e("li",null,"External Antenna")],-1)),i(o,{options:a(t).xiao_kit},null,8,["options"]),n[4]||(n[4]=e("h2",{id:"wired-vs-wireless",tabindex:"-1"},[l("Wired vs Wireless "),e("a",{class:"header-anchor",href:"#wired-vs-wireless","aria-label":'Permalink to "Wired vs Wireless"'},"​")],-1)),n[5]||(n[5]=e("p",null,"The only difference in hardware config between wireless and wired XIAOs is if the antenna is connected or not.",-1)),n[6]||(n[6]=e("h2",{id:"wireless-configuration",tabindex:"-1"},[l("Wireless Configuration "),e("a",{class:"header-anchor",href:"#wireless-configuration","aria-label":'Permalink to "Wireless Configuration"'},"​")],-1)),n[7]||(n[7]=e("p",null,"If you are making a wireless setup, you will need to connect the antenna.",-1)),n[8]||(n[8]=e("p",null,"Line up the antenna connector to the one on the board,",-1)),i(o,{options:a(t).xiao_antenna},null,8,["options"]),n[9]||(n[9]=e("p",null,"then press firmly until it snaps on.",-1)),i(o,{options:a(t).xiao_antenna2},null,8,["options"]),n[10]||(n[10]=e("p",null,"Once connected it should be flat like this:",-1)),i(o,{options:a(t).xiao_antenna3},null,8,["options"]),n[11]||(n[11]=e("h2",{id:"wired-configuration",tabindex:"-1"},[l("Wired Configuration "),e("a",{class:"header-anchor",href:"#wired-configuration","aria-label":'Permalink to "Wired Configuration"'},"​")],-1)),n[12]||(n[12]=e("p",null,"If you are making a wired setup, you do not need to attach the antenna. Set it aside and continue to the next step.",-1)),n[13]||(n[13]=e("h2",{id:"connecting-the-camera-hat",tabindex:"-1"},[l("Connecting the Camera Hat "),e("a",{class:"header-anchor",href:"#connecting-the-camera-hat","aria-label":'Permalink to "Connecting the Camera Hat"'},"​")],-1)),n[14]||(n[14]=e("p",null,"First, locate the connector on the camera hat, and the corresponding one on the XIAO main board circled below.",-1)),i(o,{options:a(t).xiao2},null,8,["options"]),n[15]||(n[15]=e("p",null,"Press down carefully until it snaps on.",-1)),i(o,{options:a(t).xiao3},null,8,["options"]),i(o,{options:a(t).xiao4},null,8,["options"]),n[16]||(n[16]=e("p",null,"Once connected remember to be careful, it is known that these connectors can break semi-easily so avoid ripping them apart too many times or twisting on them weirdly.",-1)),n[17]||(n[17]=e("h2",{id:"removing-the-camera",tabindex:"-1"},[l("Removing the Camera "),e("a",{class:"header-anchor",href:"#removing-the-camera","aria-label":'Permalink to "Removing the Camera"'},"​")],-1)),n[18]||(n[18]=e("p",null,"First we need to remove the existing camera from the XIAO and replace it with a higher FOV longer ribbon camera.",-1)),n[19]||(n[19]=e("p",null,"Begin by lifting up the grey part of the camera connector gently until it raises up.",-1)),i(o,{options:a(t).xiao5},null,8,["options"]),i(o,{options:a(t).xiao6},null,8,["options"]),n[20]||(n[20]=e("p",null,"Now grab the camera and gently wiggle it out of the connector.",-1)),i(o,{options:a(t).xiao7},null,8,["options"]),i(o,{options:a(t).xiao8},null,8,["options"]),n[21]||(n[21]=e("h2",{id:"connecting-the-camera",tabindex:"-1"},[l("Connecting the camera "),e("a",{class:"header-anchor",href:"#connecting-the-camera","aria-label":'Permalink to "Connecting the camera"'},"​")],-1)),n[22]||(n[22]=e("p",null,"The camera should have the pins facing downward, you should only see the black end.",-1)),n[23]||(n[23]=e("p",null,"Line up the camera with the pins on the connector like below.",-1)),i(o,{options:a(t).xiao9},null,8,["options"]),n[24]||(n[24]=e("p",null,"Push the camera in by using a finger on each side of the connector, slowly pushing straight in until it stops. Be gentle so you do not damage the ribbon cable.",-1)),i(o,{options:a(t).xiao10},null,8,["options"]),n[25]||(n[25]=e("p",null,"The cable should go about half way in like this image:",-1)),i(o,{options:a(t).xiao11},null,8,["options"]),n[26]||(n[26]=e("p",null,"Now, close the camera connector by flipping the grey part down.",-1)),i(o,{options:a(t).xiao12},null,8,["options"]),i(o,{options:a(t).xiao13},null,8,["options"]),n[27]||(n[27]=e("h2",{id:"conclusion",tabindex:"-1"},[l("Conclusion "),e("a",{class:"header-anchor",href:"#conclusion","aria-label":'Permalink to "Conclusion"'},"​")],-1)),n[28]||(n[28]=e("p",null,[l("You should now have your XIAO Sense ESP32 ready for "),e("a",{href:"./../firmware_guide/flashing_tool"},"firmware flashing!")],-1))]))}});export{g as __pageData,f as default}; +import{_ as o,i as t}from"./chunks/index.41b0dfea.js";import{o as r,c as s,k as e,a as l,E as i,l as a}from"./chunks/framework.ece1a6f0.js";const g=JSON.parse('{"title":"How to prepare a Seeed Studio XIAO Sense ESP32","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/preparing_xiao.md","filePath":"how_to_build/preparing_xiao.md","lastUpdated":1710896915000}'),p={name:"how_to_build/preparing_xiao.md"},f=Object.assign(p,{setup(d){return(u,n)=>(r(),s("div",null,[n[0]||(n[0]=e("h1",{class:"text-[var(--font-accent)]",id:"how-to-prepare-a-seeed-studio-xiao-sense-esp32",tabindex:"-1"},[l("How to prepare a Seeed Studio XIAO Sense ESP32 "),e("a",{class:"header-anchor",href:"#how-to-prepare-a-seeed-studio-xiao-sense-esp32","aria-label":'Permalink to "How to prepare a Seeed Studio XIAO Sense ESP32 {.text-[var(--font-accent)]}"'},"​")],-1)),n[1]||(n[1]=e("h2",{id:"what-s-in-the-box",tabindex:"-1"},[l("What's in the box "),e("a",{class:"header-anchor",href:"#what-s-in-the-box","aria-label":`Permalink to "What's in the box"`},"​")],-1)),n[2]||(n[2]=e("p",null,"Your XIAO should come with the following components:",-1)),n[3]||(n[3]=e("ul",null,[e("li",null,"ESP32-S3 Main Board"),e("li",null,"Camera Hat With Low FOV Camera"),e("li",null,"External Antenna")],-1)),i(o,{options:a(t).xiao_kit},null,8,["options"]),n[4]||(n[4]=e("h2",{id:"wired-vs-wireless",tabindex:"-1"},[l("Wired vs Wireless "),e("a",{class:"header-anchor",href:"#wired-vs-wireless","aria-label":'Permalink to "Wired vs Wireless"'},"​")],-1)),n[5]||(n[5]=e("p",null,"The only difference in hardware config between wireless and wired XIAOs is if the antenna is connected or not.",-1)),n[6]||(n[6]=e("h2",{id:"wireless-configuration",tabindex:"-1"},[l("Wireless Configuration "),e("a",{class:"header-anchor",href:"#wireless-configuration","aria-label":'Permalink to "Wireless Configuration"'},"​")],-1)),n[7]||(n[7]=e("p",null,"If you are making a wireless setup, you will need to connect the antenna.",-1)),n[8]||(n[8]=e("p",null,"Line up the antenna connector to the one on the board,",-1)),i(o,{options:a(t).xiao_antenna},null,8,["options"]),n[9]||(n[9]=e("p",null,"then press firmly until it snaps on.",-1)),i(o,{options:a(t).xiao_antenna2},null,8,["options"]),n[10]||(n[10]=e("p",null,"Once connected it should be flat like this:",-1)),i(o,{options:a(t).xiao_antenna3},null,8,["options"]),n[11]||(n[11]=e("h2",{id:"wired-configuration",tabindex:"-1"},[l("Wired Configuration "),e("a",{class:"header-anchor",href:"#wired-configuration","aria-label":'Permalink to "Wired Configuration"'},"​")],-1)),n[12]||(n[12]=e("p",null,"If you are making a wired setup, you do not need to attach the antenna. Set it aside and continue to the next step.",-1)),n[13]||(n[13]=e("h2",{id:"connecting-the-camera-hat",tabindex:"-1"},[l("Connecting the Camera Hat "),e("a",{class:"header-anchor",href:"#connecting-the-camera-hat","aria-label":'Permalink to "Connecting the Camera Hat"'},"​")],-1)),n[14]||(n[14]=e("p",null,"First, locate the connector on the camera hat, and the corresponding one on the XIAO main board circled below.",-1)),i(o,{options:a(t).xiao2},null,8,["options"]),n[15]||(n[15]=e("p",null,"Press down carefully until it snaps on.",-1)),i(o,{options:a(t).xiao3},null,8,["options"]),i(o,{options:a(t).xiao4},null,8,["options"]),n[16]||(n[16]=e("p",null,"Once connected remember to be careful, it is known that these connectors can break semi-easily so avoid ripping them apart too many times or twisting on them weirdly.",-1)),n[17]||(n[17]=e("h2",{id:"removing-the-camera",tabindex:"-1"},[l("Removing the Camera "),e("a",{class:"header-anchor",href:"#removing-the-camera","aria-label":'Permalink to "Removing the Camera"'},"​")],-1)),n[18]||(n[18]=e("p",null,"First we need to remove the existing camera from the XIAO and replace it with a higher FOV longer ribbon camera.",-1)),n[19]||(n[19]=e("p",null,"Begin by lifting up the grey part of the camera connector gently until it raises up.",-1)),i(o,{options:a(t).xiao5},null,8,["options"]),i(o,{options:a(t).xiao6},null,8,["options"]),n[20]||(n[20]=e("p",null,"Now grab the camera and gently wiggle it out of the connector.",-1)),i(o,{options:a(t).xiao7},null,8,["options"]),i(o,{options:a(t).xiao8},null,8,["options"]),n[21]||(n[21]=e("h2",{id:"connecting-the-camera",tabindex:"-1"},[l("Connecting the camera "),e("a",{class:"header-anchor",href:"#connecting-the-camera","aria-label":'Permalink to "Connecting the camera"'},"​")],-1)),n[22]||(n[22]=e("p",null,"The camera should have the pins facing downward, you should only see the black end.",-1)),n[23]||(n[23]=e("p",null,"Line up the camera with the pins on the connector like below.",-1)),i(o,{options:a(t).xiao9},null,8,["options"]),n[24]||(n[24]=e("p",null,"Push the camera in by using a finger on each side of the connector, slowly pushing straight in until it stops. Be gentle so you do not damage the ribbon cable.",-1)),i(o,{options:a(t).xiao10},null,8,["options"]),n[25]||(n[25]=e("p",null,"The cable should go about half way in like this image:",-1)),i(o,{options:a(t).xiao11},null,8,["options"]),n[26]||(n[26]=e("p",null,"Now, close the camera connector by flipping the grey part down.",-1)),i(o,{options:a(t).xiao12},null,8,["options"]),i(o,{options:a(t).xiao13},null,8,["options"]),n[27]||(n[27]=e("h2",{id:"conclusion",tabindex:"-1"},[l("Conclusion "),e("a",{class:"header-anchor",href:"#conclusion","aria-label":'Permalink to "Conclusion"'},"​")],-1)),n[28]||(n[28]=e("p",null,[l("You should now have your XIAO Sense ESP32 ready for "),e("a",{href:"./../firmware_guide/flashing_tool"},"firmware flashing!")],-1))]))}});export{g as __pageData,f as default}; diff --git a/assets/how_to_build_v4_full_build.md.0dd3c5e7.js b/assets/how_to_build_v4_full_build.md.f873c9bf.js similarity index 94% rename from assets/how_to_build_v4_full_build.md.0dd3c5e7.js rename to assets/how_to_build_v4_full_build.md.f873c9bf.js index ea7f6ad..327450d 100644 --- a/assets/how_to_build_v4_full_build.md.0dd3c5e7.js +++ b/assets/how_to_build_v4_full_build.md.f873c9bf.js @@ -1,6 +1,6 @@ -import{o as a,c as t,O as o}from"./chunks/framework.47aa8d5b.js";const s=JSON.parse('{"title":"V4 Build Guide (WIP)","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/v4_full_build.md","filePath":"how_to_build/v4_full_build.md","lastUpdated":1745115874000}'),r={name:"how_to_build/v4_full_build.md"},d=Object.assign(r,{setup(i){return(n,e)=>(a(),t("div",null,e[0]||(e[0]=[o(`

V4 Build Guide (WIP)

This is a heavily unfinished docs page for a V4 setup build.

After following our part's list you should have the following components.

You should have the following parts:

2 × Supported ESP32 Camera Boards
-2 × OV2640 Cameras Without IR Filters
-2 × V4 IR emitter Kit
+import{o as a,c as t,O as o}from"./chunks/framework.ece1a6f0.js";const s=JSON.parse('{"title":"V4 Build Guide (WIP)","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/v4_full_build.md","filePath":"how_to_build/v4_full_build.md","lastUpdated":1748655682000}'),r={name:"how_to_build/v4_full_build.md"},d=Object.assign(r,{setup(i){return(n,e)=>(a(),t("div",null,e[0]||(e[0]=[o(`

V4 Build Guide (WIP)

This is a heavily unfinished docs page for a V4 setup build.

After following our part's list you should have the following components.

You should have the following parts:

2 × Supported ESP32 Camera Boards
+2 × OV2640 130 or 160 Degree Cameras Without IR Filters
+1 × V4 IR Emitter Kit
 3 × USB-C cables
 1 × USB hub
 1 × Set of 3D printed mounts
diff --git a/assets/how_to_build_v4_full_build.md.0dd3c5e7.lean.js b/assets/how_to_build_v4_full_build.md.f873c9bf.lean.js
similarity index 94%
rename from assets/how_to_build_v4_full_build.md.0dd3c5e7.lean.js
rename to assets/how_to_build_v4_full_build.md.f873c9bf.lean.js
index ea7f6ad..327450d 100644
--- a/assets/how_to_build_v4_full_build.md.0dd3c5e7.lean.js
+++ b/assets/how_to_build_v4_full_build.md.f873c9bf.lean.js
@@ -1,6 +1,6 @@
-import{o as a,c as t,O as o}from"./chunks/framework.47aa8d5b.js";const s=JSON.parse('{"title":"V4 Build Guide (WIP)","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/v4_full_build.md","filePath":"how_to_build/v4_full_build.md","lastUpdated":1745115874000}'),r={name:"how_to_build/v4_full_build.md"},d=Object.assign(r,{setup(i){return(n,e)=>(a(),t("div",null,e[0]||(e[0]=[o(`

V4 Build Guide (WIP)

This is a heavily unfinished docs page for a V4 setup build.

After following our part's list you should have the following components.

You should have the following parts:

2 × Supported ESP32 Camera Boards
-2 × OV2640 Cameras Without IR Filters
-2 × V4 IR emitter Kit
+import{o as a,c as t,O as o}from"./chunks/framework.ece1a6f0.js";const s=JSON.parse('{"title":"V4 Build Guide (WIP)","description":"","frontmatter":{},"headers":[],"relativePath":"how_to_build/v4_full_build.md","filePath":"how_to_build/v4_full_build.md","lastUpdated":1748655682000}'),r={name:"how_to_build/v4_full_build.md"},d=Object.assign(r,{setup(i){return(n,e)=>(a(),t("div",null,e[0]||(e[0]=[o(`

V4 Build Guide (WIP)

This is a heavily unfinished docs page for a V4 setup build.

After following our part's list you should have the following components.

You should have the following parts:

2 × Supported ESP32 Camera Boards
+2 × OV2640 130 or 160 Degree Cameras Without IR Filters
+1 × V4 IR Emitter Kit
 3 × USB-C cables
 1 × USB hub
 1 × Set of 3D printed mounts
diff --git a/assets/index.md.269511a8.js b/assets/index.md.780db674.js
similarity index 96%
rename from assets/index.md.269511a8.js
rename to assets/index.md.780db674.js
index 1544cf6..2e24096 100644
--- a/assets/index.md.269511a8.js
+++ b/assets/index.md.780db674.js
@@ -1 +1 @@
-import{_ as e,o as t,c as a}from"./chunks/framework.47aa8d5b.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","head":[["meta",{"name":"keywords","content":"EyeTrackVR (ETVR) VR Virtual Reality Eye Tracking VRChat Social VR Games VR Game VR Games VRChat Avatar VRChat Avatars VRChat Eye Tracking VRChat Eye Tracking Avatar VRChat Eye Tracking Avatars"}]],"hero":{"name":"EyeTrackVR Docs","text":"Source First and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETVR logo"},"tagline":"For Social VR Games via OSC and UDP protocol.","actions":[{"theme":"brand","text":"Get Started","link":"/getting_started/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/EyeTrackVR/EyeTrackVR"}]},"features":[{"icon":"⚡️","title":"Source First","details":"open and free to use."},{"icon":"🎉","title":"Community Driven","details":"built by you for you."},{"icon":"💰","title":"Affordable","details":"affordable and easy to use."},{"icon":"🎮","title":"Nearly All VR Headsets","details":"EyeTrackVR works with nearly all VR headsets."},{"icon":"🔨","title":"Completely DIY","details":"completely DIY and easy to build."},{"icon":"🌐","title":"Open Platform","details":"open platform and works with any Social VR game."},{"icon":"🔏","title":"Privacy Focused","details":"privacy focused and does not collect any data, hosted on your own PC."},{"icon":"📡","title":"Open Protocol","details":"EyeTrackVR uses the Open Sound Control (OSC) protocol."}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1745113876000}'),o={name:"index.md"};function i(n,r,l,s,c,d){return t(),a("div")}const p=e(o,[["render",i]]);export{m as __pageData,p as default};
+import{_ as e,o as t,c as a}from"./chunks/framework.ece1a6f0.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","head":[["meta",{"name":"keywords","content":"EyeTrackVR (ETVR) VR Virtual Reality Eye Tracking VRChat Social VR Games VR Game VR Games VRChat Avatar VRChat Avatars VRChat Eye Tracking VRChat Eye Tracking Avatar VRChat Eye Tracking Avatars"}]],"hero":{"name":"EyeTrackVR Docs","text":"Source First and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETVR logo"},"tagline":"For Social VR Games via OSC and UDP protocol.","actions":[{"theme":"brand","text":"Get Started","link":"/getting_started/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/EyeTrackVR/EyeTrackVR"}]},"features":[{"icon":"⚡️","title":"Source First","details":"open and free to use."},{"icon":"🎉","title":"Community Driven","details":"built by you for you."},{"icon":"💰","title":"Affordable","details":"affordable and easy to use."},{"icon":"🎮","title":"Nearly All VR Headsets","details":"EyeTrackVR works with nearly all VR headsets."},{"icon":"🔨","title":"Completely DIY","details":"completely DIY and easy to build."},{"icon":"🌐","title":"Open Platform","details":"open platform and works with any Social VR game."},{"icon":"🔏","title":"Privacy Focused","details":"privacy focused and does not collect any data, hosted on your own PC."},{"icon":"📡","title":"Open Protocol","details":"EyeTrackVR uses the Open Sound Control (OSC) protocol."}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1745113876000}'),o={name:"index.md"};function i(n,r,l,s,c,d){return t(),a("div")}const p=e(o,[["render",i]]);export{m as __pageData,p as default};
diff --git a/assets/index.md.269511a8.lean.js b/assets/index.md.780db674.lean.js
similarity index 96%
rename from assets/index.md.269511a8.lean.js
rename to assets/index.md.780db674.lean.js
index 1544cf6..2e24096 100644
--- a/assets/index.md.269511a8.lean.js
+++ b/assets/index.md.780db674.lean.js
@@ -1 +1 @@
-import{_ as e,o as t,c as a}from"./chunks/framework.47aa8d5b.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","head":[["meta",{"name":"keywords","content":"EyeTrackVR (ETVR) VR Virtual Reality Eye Tracking VRChat Social VR Games VR Game VR Games VRChat Avatar VRChat Avatars VRChat Eye Tracking VRChat Eye Tracking Avatar VRChat Eye Tracking Avatars"}]],"hero":{"name":"EyeTrackVR Docs","text":"Source First and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETVR logo"},"tagline":"For Social VR Games via OSC and UDP protocol.","actions":[{"theme":"brand","text":"Get Started","link":"/getting_started/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/EyeTrackVR/EyeTrackVR"}]},"features":[{"icon":"⚡️","title":"Source First","details":"open and free to use."},{"icon":"🎉","title":"Community Driven","details":"built by you for you."},{"icon":"💰","title":"Affordable","details":"affordable and easy to use."},{"icon":"🎮","title":"Nearly All VR Headsets","details":"EyeTrackVR works with nearly all VR headsets."},{"icon":"🔨","title":"Completely DIY","details":"completely DIY and easy to build."},{"icon":"🌐","title":"Open Platform","details":"open platform and works with any Social VR game."},{"icon":"🔏","title":"Privacy Focused","details":"privacy focused and does not collect any data, hosted on your own PC."},{"icon":"📡","title":"Open Protocol","details":"EyeTrackVR uses the Open Sound Control (OSC) protocol."}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1745113876000}'),o={name:"index.md"};function i(n,r,l,s,c,d){return t(),a("div")}const p=e(o,[["render",i]]);export{m as __pageData,p as default};
+import{_ as e,o as t,c as a}from"./chunks/framework.ece1a6f0.js";const m=JSON.parse('{"title":"","description":"","frontmatter":{"layout":"home","head":[["meta",{"name":"keywords","content":"EyeTrackVR (ETVR) VR Virtual Reality Eye Tracking VRChat Social VR Games VR Game VR Games VRChat Avatar VRChat Avatars VRChat Eye Tracking VRChat Eye Tracking Avatar VRChat Eye Tracking Avatars"}]],"hero":{"name":"EyeTrackVR Docs","text":"Source First and affordable VR eye tracking.","image":{"src":"/logo_light.png","alt":"ETVR logo"},"tagline":"For Social VR Games via OSC and UDP protocol.","actions":[{"theme":"brand","text":"Get Started","link":"/getting_started/intro"},{"theme":"alt","text":"View on GitHub","link":"https://github.com/EyeTrackVR/EyeTrackVR"}]},"features":[{"icon":"⚡️","title":"Source First","details":"open and free to use."},{"icon":"🎉","title":"Community Driven","details":"built by you for you."},{"icon":"💰","title":"Affordable","details":"affordable and easy to use."},{"icon":"🎮","title":"Nearly All VR Headsets","details":"EyeTrackVR works with nearly all VR headsets."},{"icon":"🔨","title":"Completely DIY","details":"completely DIY and easy to build."},{"icon":"🌐","title":"Open Platform","details":"open platform and works with any Social VR game."},{"icon":"🔏","title":"Privacy Focused","details":"privacy focused and does not collect any data, hosted on your own PC."},{"icon":"📡","title":"Open Protocol","details":"EyeTrackVR uses the Open Sound Control (OSC) protocol."}]},"headers":[],"relativePath":"index.md","filePath":"index.md","lastUpdated":1745113876000}'),o={name:"index.md"};function i(n,r,l,s,c,d){return t(),a("div")}const p=e(o,[["render",i]]);export{m as __pageData,p as default};
diff --git a/assets/misc_faq.md.a2c23752.js b/assets/misc_faq.md.1b8caa13.js
similarity index 96%
rename from assets/misc_faq.md.a2c23752.js
rename to assets/misc_faq.md.1b8caa13.js
index e92792d..05382f4 100644
--- a/assets/misc_faq.md.a2c23752.js
+++ b/assets/misc_faq.md.1b8caa13.js
@@ -1 +1 @@
-import{A as d}from"./chunks/Accordion.aff4964d.js";import{o as a,c as n,F as u,B as c,b as h,w as r,k as e,t as i,e as p,l as f,a as m,E as y}from"./chunks/framework.47aa8d5b.js";const k={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eye tracker for Social games like VRChat as well as provide an open eye tracking platform.",hyper_link:"",link_description:""},{question:"What headsets will be supported?",answer:"Any headset that the hardware can fit in with community mounts or a mount you design.",hyper_link:"",link_description:""},{question:"How will this work?",answer:"Currently, a camera is mounted inside the headset for each eye. The camera streams through wifi to a PC client which processes and sends eye tracking data to an OSC endpoint ex VRChat.",hyper_link:"",link_description:""},{question:"What features will be supported?",answer:"The goal is eye tracking with eye openness, and some form of pupil dilation. A far away aspiration of this project is some form of weak foveated rendering because it's cool and any small performance increase in VR is welcome.",hyper_link:"",link_description:""},{question:"When will this be completed?",answer:"When it's done 😉 I have a semi busy life so development may slow and speed up inconsistently.",hyper_link:"",link_description:""},{question:"Will IR damage my eyes?",answer:"This project has safety in mind. If you do all of the safety measures that we put into place and visually test the amount of IR light you will be fine. Please note we have not finished development of all safety stuff so be careful.",hyper_link:"https://look.ams-osram.com/m/1d720a7b18ab3fce/original/Details-on-photobiological-safety-of-LED-light-sources.pdf",link_description:" here is a pdf with safety information"},{question:"How expensive will this be?",answer:"My goal is to keep it as cheap as possible with around $75 as the absolute max, with current setups being around $30-80. aaaa",hyper_link:"",link_description:""},{question:"How do I set up my avatar?",answer:"Check out the VR Chat face tracking wiki on our github. Keep in mind that we currently only support float parameters. ",hyper_link:"",link_description:""},{question:"What hardware does this use / How do I build?",answer:"Checkout our build guides on this site for specific information, hardware may change and evolve over time.",hyper_link:"",link_description:""},{question:"Where are the docs?",answer:"All of our documentation is located on this website, all future documentation will be found here as well.",hyper_link:"",link_description:""}]},_={class:"font-semibold text-xl"},w={class:""},g={style:{"list-style":"none"}},q={key:0},b=["href"],v={__name:"FAQ",setup(l){return(o,t)=>(a(),n("div",null,[(a(!0),n(u,null,c(f(k).faq,s=>(a(),h(d,{class:"mb-4"},{title:r(()=>[e("span",_,i(s.question),1)]),content:r(()=>[e("div",null,[e("span",w,[e("blockquote",null,[e("ul",g,[e("li",null,i(s.answer),1),s.hyper_link!=o.NULL&&s.hyper_link!=""?(a(),n("p",q,[e("a",{href:s.hyper_link,target:"_blank"},i(s.link_description),9,b)])):p("",!0)])])])])]),_:2},1024))),256))]))}},V=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","filePath":"misc/faq.md","lastUpdated":1676223729000}'),x={name:"misc/faq.md"},W=Object.assign(x,{setup(l){return(o,t)=>(a(),n("div",null,[t[0]||(t[0]=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[m("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-label":'Permalink to "Frequently Asked Questions {.text-[var(--font-accent)]}"'},"​")],-1)),t[1]||(t[1]=e("br",null,null,-1)),t[2]||(t[2]=e("hr",null,null,-1)),y(v)]))}});export{V as __pageData,W as default};
+import{A as d}from"./chunks/Accordion.44247159.js";import{o as a,c as n,F as u,B as c,b as h,w as r,k as e,t as i,e as p,l as f,a as m,E as y}from"./chunks/framework.ece1a6f0.js";const k={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eye tracker for Social games like VRChat as well as provide an open eye tracking platform.",hyper_link:"",link_description:""},{question:"What headsets will be supported?",answer:"Any headset that the hardware can fit in with community mounts or a mount you design.",hyper_link:"",link_description:""},{question:"How will this work?",answer:"Currently, a camera is mounted inside the headset for each eye. The camera streams through wifi to a PC client which processes and sends eye tracking data to an OSC endpoint ex VRChat.",hyper_link:"",link_description:""},{question:"What features will be supported?",answer:"The goal is eye tracking with eye openness, and some form of pupil dilation. A far away aspiration of this project is some form of weak foveated rendering because it's cool and any small performance increase in VR is welcome.",hyper_link:"",link_description:""},{question:"When will this be completed?",answer:"When it's done 😉 I have a semi busy life so development may slow and speed up inconsistently.",hyper_link:"",link_description:""},{question:"Will IR damage my eyes?",answer:"This project has safety in mind. If you do all of the safety measures that we put into place and visually test the amount of IR light you will be fine. Please note we have not finished development of all safety stuff so be careful.",hyper_link:"https://look.ams-osram.com/m/1d720a7b18ab3fce/original/Details-on-photobiological-safety-of-LED-light-sources.pdf",link_description:" here is a pdf with safety information"},{question:"How expensive will this be?",answer:"My goal is to keep it as cheap as possible with around $75 as the absolute max, with current setups being around $30-80. aaaa",hyper_link:"",link_description:""},{question:"How do I set up my avatar?",answer:"Check out the VR Chat face tracking wiki on our github. Keep in mind that we currently only support float parameters. ",hyper_link:"",link_description:""},{question:"What hardware does this use / How do I build?",answer:"Checkout our build guides on this site for specific information, hardware may change and evolve over time.",hyper_link:"",link_description:""},{question:"Where are the docs?",answer:"All of our documentation is located on this website, all future documentation will be found here as well.",hyper_link:"",link_description:""}]},_={class:"font-semibold text-xl"},w={class:""},g={style:{"list-style":"none"}},q={key:0},b=["href"],v={__name:"FAQ",setup(l){return(o,t)=>(a(),n("div",null,[(a(!0),n(u,null,c(f(k).faq,s=>(a(),h(d,{class:"mb-4"},{title:r(()=>[e("span",_,i(s.question),1)]),content:r(()=>[e("div",null,[e("span",w,[e("blockquote",null,[e("ul",g,[e("li",null,i(s.answer),1),s.hyper_link!=o.NULL&&s.hyper_link!=""?(a(),n("p",q,[e("a",{href:s.hyper_link,target:"_blank"},i(s.link_description),9,b)])):p("",!0)])])])])]),_:2},1024))),256))]))}},V=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","filePath":"misc/faq.md","lastUpdated":1676223729000}'),x={name:"misc/faq.md"},W=Object.assign(x,{setup(l){return(o,t)=>(a(),n("div",null,[t[0]||(t[0]=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[m("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-label":'Permalink to "Frequently Asked Questions {.text-[var(--font-accent)]}"'},"​")],-1)),t[1]||(t[1]=e("br",null,null,-1)),t[2]||(t[2]=e("hr",null,null,-1)),y(v)]))}});export{V as __pageData,W as default};
diff --git a/assets/misc_faq.md.a2c23752.lean.js b/assets/misc_faq.md.1b8caa13.lean.js
similarity index 96%
rename from assets/misc_faq.md.a2c23752.lean.js
rename to assets/misc_faq.md.1b8caa13.lean.js
index e92792d..05382f4 100644
--- a/assets/misc_faq.md.a2c23752.lean.js
+++ b/assets/misc_faq.md.1b8caa13.lean.js
@@ -1 +1 @@
-import{A as d}from"./chunks/Accordion.aff4964d.js";import{o as a,c as n,F as u,B as c,b as h,w as r,k as e,t as i,e as p,l as f,a as m,E as y}from"./chunks/framework.47aa8d5b.js";const k={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eye tracker for Social games like VRChat as well as provide an open eye tracking platform.",hyper_link:"",link_description:""},{question:"What headsets will be supported?",answer:"Any headset that the hardware can fit in with community mounts or a mount you design.",hyper_link:"",link_description:""},{question:"How will this work?",answer:"Currently, a camera is mounted inside the headset for each eye. The camera streams through wifi to a PC client which processes and sends eye tracking data to an OSC endpoint ex VRChat.",hyper_link:"",link_description:""},{question:"What features will be supported?",answer:"The goal is eye tracking with eye openness, and some form of pupil dilation. A far away aspiration of this project is some form of weak foveated rendering because it's cool and any small performance increase in VR is welcome.",hyper_link:"",link_description:""},{question:"When will this be completed?",answer:"When it's done 😉 I have a semi busy life so development may slow and speed up inconsistently.",hyper_link:"",link_description:""},{question:"Will IR damage my eyes?",answer:"This project has safety in mind. If you do all of the safety measures that we put into place and visually test the amount of IR light you will be fine. Please note we have not finished development of all safety stuff so be careful.",hyper_link:"https://look.ams-osram.com/m/1d720a7b18ab3fce/original/Details-on-photobiological-safety-of-LED-light-sources.pdf",link_description:" here is a pdf with safety information"},{question:"How expensive will this be?",answer:"My goal is to keep it as cheap as possible with around $75 as the absolute max, with current setups being around $30-80. aaaa",hyper_link:"",link_description:""},{question:"How do I set up my avatar?",answer:"Check out the VR Chat face tracking wiki on our github. Keep in mind that we currently only support float parameters. ",hyper_link:"",link_description:""},{question:"What hardware does this use / How do I build?",answer:"Checkout our build guides on this site for specific information, hardware may change and evolve over time.",hyper_link:"",link_description:""},{question:"Where are the docs?",answer:"All of our documentation is located on this website, all future documentation will be found here as well.",hyper_link:"",link_description:""}]},_={class:"font-semibold text-xl"},w={class:""},g={style:{"list-style":"none"}},q={key:0},b=["href"],v={__name:"FAQ",setup(l){return(o,t)=>(a(),n("div",null,[(a(!0),n(u,null,c(f(k).faq,s=>(a(),h(d,{class:"mb-4"},{title:r(()=>[e("span",_,i(s.question),1)]),content:r(()=>[e("div",null,[e("span",w,[e("blockquote",null,[e("ul",g,[e("li",null,i(s.answer),1),s.hyper_link!=o.NULL&&s.hyper_link!=""?(a(),n("p",q,[e("a",{href:s.hyper_link,target:"_blank"},i(s.link_description),9,b)])):p("",!0)])])])])]),_:2},1024))),256))]))}},V=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","filePath":"misc/faq.md","lastUpdated":1676223729000}'),x={name:"misc/faq.md"},W=Object.assign(x,{setup(l){return(o,t)=>(a(),n("div",null,[t[0]||(t[0]=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[m("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-label":'Permalink to "Frequently Asked Questions {.text-[var(--font-accent)]}"'},"​")],-1)),t[1]||(t[1]=e("br",null,null,-1)),t[2]||(t[2]=e("hr",null,null,-1)),y(v)]))}});export{V as __pageData,W as default};
+import{A as d}from"./chunks/Accordion.44247159.js";import{o as a,c as n,F as u,B as c,b as h,w as r,k as e,t as i,e as p,l as f,a as m,E as y}from"./chunks/framework.ece1a6f0.js";const k={faq:[{question:"What is the goal of this project?",answer:"To provide an open source, affordable VR eye tracker for Social games like VRChat as well as provide an open eye tracking platform.",hyper_link:"",link_description:""},{question:"What headsets will be supported?",answer:"Any headset that the hardware can fit in with community mounts or a mount you design.",hyper_link:"",link_description:""},{question:"How will this work?",answer:"Currently, a camera is mounted inside the headset for each eye. The camera streams through wifi to a PC client which processes and sends eye tracking data to an OSC endpoint ex VRChat.",hyper_link:"",link_description:""},{question:"What features will be supported?",answer:"The goal is eye tracking with eye openness, and some form of pupil dilation. A far away aspiration of this project is some form of weak foveated rendering because it's cool and any small performance increase in VR is welcome.",hyper_link:"",link_description:""},{question:"When will this be completed?",answer:"When it's done 😉 I have a semi busy life so development may slow and speed up inconsistently.",hyper_link:"",link_description:""},{question:"Will IR damage my eyes?",answer:"This project has safety in mind. If you do all of the safety measures that we put into place and visually test the amount of IR light you will be fine. Please note we have not finished development of all safety stuff so be careful.",hyper_link:"https://look.ams-osram.com/m/1d720a7b18ab3fce/original/Details-on-photobiological-safety-of-LED-light-sources.pdf",link_description:" here is a pdf with safety information"},{question:"How expensive will this be?",answer:"My goal is to keep it as cheap as possible with around $75 as the absolute max, with current setups being around $30-80. aaaa",hyper_link:"",link_description:""},{question:"How do I set up my avatar?",answer:"Check out the VR Chat face tracking wiki on our github. Keep in mind that we currently only support float parameters. ",hyper_link:"",link_description:""},{question:"What hardware does this use / How do I build?",answer:"Checkout our build guides on this site for specific information, hardware may change and evolve over time.",hyper_link:"",link_description:""},{question:"Where are the docs?",answer:"All of our documentation is located on this website, all future documentation will be found here as well.",hyper_link:"",link_description:""}]},_={class:"font-semibold text-xl"},w={class:""},g={style:{"list-style":"none"}},q={key:0},b=["href"],v={__name:"FAQ",setup(l){return(o,t)=>(a(),n("div",null,[(a(!0),n(u,null,c(f(k).faq,s=>(a(),h(d,{class:"mb-4"},{title:r(()=>[e("span",_,i(s.question),1)]),content:r(()=>[e("div",null,[e("span",w,[e("blockquote",null,[e("ul",g,[e("li",null,i(s.answer),1),s.hyper_link!=o.NULL&&s.hyper_link!=""?(a(),n("p",q,[e("a",{href:s.hyper_link,target:"_blank"},i(s.link_description),9,b)])):p("",!0)])])])])]),_:2},1024))),256))]))}},V=JSON.parse('{"title":"Frequently Asked Questions","description":"","frontmatter":{},"headers":[],"relativePath":"misc/faq.md","filePath":"misc/faq.md","lastUpdated":1676223729000}'),x={name:"misc/faq.md"},W=Object.assign(x,{setup(l){return(o,t)=>(a(),n("div",null,[t[0]||(t[0]=e("h1",{class:"text-[var(--font-accent)]",id:"frequently-asked-questions",tabindex:"-1"},[m("Frequently Asked Questions "),e("a",{class:"header-anchor",href:"#frequently-asked-questions","aria-label":'Permalink to "Frequently Asked Questions {.text-[var(--font-accent)]}"'},"​")],-1)),t[1]||(t[1]=e("br",null,null,-1)),t[2]||(t[2]=e("hr",null,null,-1)),y(v)]))}});export{V as __pageData,W as default};
diff --git a/assets/misc_jlc3dp.md.5e8875c4.js b/assets/misc_jlc3dp.md.aa8f0fcf.js
similarity index 95%
rename from assets/misc_jlc3dp.md.5e8875c4.js
rename to assets/misc_jlc3dp.md.aa8f0fcf.js
index f034a8f..bfe2992 100644
--- a/assets/misc_jlc3dp.md.5e8875c4.js
+++ b/assets/misc_jlc3dp.md.aa8f0fcf.js
@@ -1 +1 @@
-import{_ as e,o as i,c as a,O as r}from"./chunks/framework.47aa8d5b.js";const g=JSON.parse('{"title":"3D Printing Service JLC3DP","description":"","frontmatter":{},"headers":[],"relativePath":"misc/jlc3dp.md","filePath":"misc/jlc3dp.md","lastUpdated":1727916239000}'),o={name:"misc/jlc3dp.md"};function n(l,t,s,p,d,h){return i(),a("div",null,t[0]||(t[0]=[r('

3D Printing Service JLC3DP

If you don't own a 3D Printer, you can order high quality prints by the dollar using JLC3DP

https://jlc3dp.com/3d-printing-quote

Upload your STL files with the following print settings

Do note that if you are printing for a example, a lens mount, you may need to mirror it in blender, or any slicer, to get both a left and right STL and upload them separate. Do not upload them combined

UploadJLC

Choose a cheaper shipping option, for me this is global standard direct line

Shipping

In the likely event you get an email or alert from JLC asking for consent to print as the STL has thin walls, you can agree to the print without worry.

',9)]))}const u=e(o,[["render",n]]);export{g as __pageData,u as default}; +import{_ as e,o as i,c as a,O as r}from"./chunks/framework.ece1a6f0.js";const g=JSON.parse('{"title":"3D Printing Service JLC3DP","description":"","frontmatter":{},"headers":[],"relativePath":"misc/jlc3dp.md","filePath":"misc/jlc3dp.md","lastUpdated":1727916239000}'),o={name:"misc/jlc3dp.md"};function n(l,t,s,p,d,h){return i(),a("div",null,t[0]||(t[0]=[r('

3D Printing Service JLC3DP

If you don't own a 3D Printer, you can order high quality prints by the dollar using JLC3DP

https://jlc3dp.com/3d-printing-quote

Upload your STL files with the following print settings

Do note that if you are printing for a example, a lens mount, you may need to mirror it in blender, or any slicer, to get both a left and right STL and upload them separate. Do not upload them combined

UploadJLC

Choose a cheaper shipping option, for me this is global standard direct line

Shipping

In the likely event you get an email or alert from JLC asking for consent to print as the STL has thin walls, you can agree to the print without worry.

',9)]))}const u=e(o,[["render",n]]);export{g as __pageData,u as default}; diff --git a/assets/misc_jlc3dp.md.5e8875c4.lean.js b/assets/misc_jlc3dp.md.aa8f0fcf.lean.js similarity index 95% rename from assets/misc_jlc3dp.md.5e8875c4.lean.js rename to assets/misc_jlc3dp.md.aa8f0fcf.lean.js index f034a8f..bfe2992 100644 --- a/assets/misc_jlc3dp.md.5e8875c4.lean.js +++ b/assets/misc_jlc3dp.md.aa8f0fcf.lean.js @@ -1 +1 @@ -import{_ as e,o as i,c as a,O as r}from"./chunks/framework.47aa8d5b.js";const g=JSON.parse('{"title":"3D Printing Service JLC3DP","description":"","frontmatter":{},"headers":[],"relativePath":"misc/jlc3dp.md","filePath":"misc/jlc3dp.md","lastUpdated":1727916239000}'),o={name:"misc/jlc3dp.md"};function n(l,t,s,p,d,h){return i(),a("div",null,t[0]||(t[0]=[r('

3D Printing Service JLC3DP

If you don't own a 3D Printer, you can order high quality prints by the dollar using JLC3DP

https://jlc3dp.com/3d-printing-quote

Upload your STL files with the following print settings

Do note that if you are printing for a example, a lens mount, you may need to mirror it in blender, or any slicer, to get both a left and right STL and upload them separate. Do not upload them combined

UploadJLC

Choose a cheaper shipping option, for me this is global standard direct line

Shipping

In the likely event you get an email or alert from JLC asking for consent to print as the STL has thin walls, you can agree to the print without worry.

',9)]))}const u=e(o,[["render",n]]);export{g as __pageData,u as default}; +import{_ as e,o as i,c as a,O as r}from"./chunks/framework.ece1a6f0.js";const g=JSON.parse('{"title":"3D Printing Service JLC3DP","description":"","frontmatter":{},"headers":[],"relativePath":"misc/jlc3dp.md","filePath":"misc/jlc3dp.md","lastUpdated":1727916239000}'),o={name:"misc/jlc3dp.md"};function n(l,t,s,p,d,h){return i(),a("div",null,t[0]||(t[0]=[r('

3D Printing Service JLC3DP

If you don't own a 3D Printer, you can order high quality prints by the dollar using JLC3DP

https://jlc3dp.com/3d-printing-quote

Upload your STL files with the following print settings

Do note that if you are printing for a example, a lens mount, you may need to mirror it in blender, or any slicer, to get both a left and right STL and upload them separate. Do not upload them combined

UploadJLC

Choose a cheaper shipping option, for me this is global standard direct line

Shipping

In the likely event you get an email or alert from JLC asking for consent to print as the STL has thin walls, you can agree to the print without worry.

',9)]))}const u=e(o,[["render",n]]);export{g as __pageData,u as default}; diff --git a/assets/misc_vrc_avatar_setup.md.2d1bc492.js b/assets/misc_vrc_avatar_setup.md.b22f00a0.js similarity index 94% rename from assets/misc_vrc_avatar_setup.md.2d1bc492.js rename to assets/misc_vrc_avatar_setup.md.b22f00a0.js index de2d771..e15fb31 100644 --- a/assets/misc_vrc_avatar_setup.md.2d1bc492.js +++ b/assets/misc_vrc_avatar_setup.md.b22f00a0.js @@ -1 +1 @@ -import{_ as a,a as r}from"./chunks/index.339f98d7.js";import{o,c as s,k as t,a as n,O as i,E as c,w as l,l as d}from"./chunks/framework.47aa8d5b.js";const p={align:"center"},g=JSON.parse('{"title":"How to set up your avatar for eye tracking:","description":"","frontmatter":{},"headers":[],"relativePath":"misc/vrc_avatar_setup.md","filePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),u={name:"misc/vrc_avatar_setup.md"},v=Object.assign(u,{setup(f){return(m,e)=>(o(),s("div",null,[e[1]||(e[1]=t("h1",{class:"text-[var(--font-accent)]",id:"how-to-set-up-your-avatar-for-eye-tracking",tabindex:"-1"},[n("How to set up your avatar for eye tracking: "),t("a",{class:"header-anchor",href:"#how-to-set-up-your-avatar-for-eye-tracking","aria-label":'Permalink to "How to set up your avatar for eye tracking: {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=t("p",null,"Here is an avatar setup video created by a contributor:",-1)),e[3]||(e[3]=t("div",{align:"center"},[t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/Dfm-tkaruq0",title:"Add eye tracking support to your VRChat avatar",frameborder:"1",allow:"encrypted-media;",allowfullscreen:""})],-1)),e[4]||(e[4]=i('

Another good resource is the VRC Face Tracking Wiki and their Discord.

We currently use the following paramaters

LeftEyeX

RightEyeX

EyesY

LeftEyeLidExpandedSqueeze

RightEyeLidExpandedSqueeze

',7)),t("div",p,[c(a,{options:d(r).vrc_avatar_setup},{content:l(()=>e[0]||(e[0]=[t("p",null," We currently only support float parameters, please adjust your setup accordingly. ",-1)])),_:1},8,["options"])])]))}});export{g as __pageData,v as default}; +import{_ as a,a as r}from"./chunks/index.c19b2931.js";import{o,c as s,k as t,a as n,O as i,E as c,w as l,l as d}from"./chunks/framework.ece1a6f0.js";const p={align:"center"},g=JSON.parse('{"title":"How to set up your avatar for eye tracking:","description":"","frontmatter":{},"headers":[],"relativePath":"misc/vrc_avatar_setup.md","filePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),u={name:"misc/vrc_avatar_setup.md"},v=Object.assign(u,{setup(f){return(m,e)=>(o(),s("div",null,[e[1]||(e[1]=t("h1",{class:"text-[var(--font-accent)]",id:"how-to-set-up-your-avatar-for-eye-tracking",tabindex:"-1"},[n("How to set up your avatar for eye tracking: "),t("a",{class:"header-anchor",href:"#how-to-set-up-your-avatar-for-eye-tracking","aria-label":'Permalink to "How to set up your avatar for eye tracking: {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=t("p",null,"Here is an avatar setup video created by a contributor:",-1)),e[3]||(e[3]=t("div",{align:"center"},[t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/Dfm-tkaruq0",title:"Add eye tracking support to your VRChat avatar",frameborder:"1",allow:"encrypted-media;",allowfullscreen:""})],-1)),e[4]||(e[4]=i('

Another good resource is the VRC Face Tracking Wiki and their Discord.

We currently use the following paramaters

LeftEyeX

RightEyeX

EyesY

LeftEyeLidExpandedSqueeze

RightEyeLidExpandedSqueeze

',7)),t("div",p,[c(a,{options:d(r).vrc_avatar_setup},{content:l(()=>e[0]||(e[0]=[t("p",null," We currently only support float parameters, please adjust your setup accordingly. ",-1)])),_:1},8,["options"])])]))}});export{g as __pageData,v as default}; diff --git a/assets/misc_vrc_avatar_setup.md.2d1bc492.lean.js b/assets/misc_vrc_avatar_setup.md.b22f00a0.lean.js similarity index 94% rename from assets/misc_vrc_avatar_setup.md.2d1bc492.lean.js rename to assets/misc_vrc_avatar_setup.md.b22f00a0.lean.js index de2d771..e15fb31 100644 --- a/assets/misc_vrc_avatar_setup.md.2d1bc492.lean.js +++ b/assets/misc_vrc_avatar_setup.md.b22f00a0.lean.js @@ -1 +1 @@ -import{_ as a,a as r}from"./chunks/index.339f98d7.js";import{o,c as s,k as t,a as n,O as i,E as c,w as l,l as d}from"./chunks/framework.47aa8d5b.js";const p={align:"center"},g=JSON.parse('{"title":"How to set up your avatar for eye tracking:","description":"","frontmatter":{},"headers":[],"relativePath":"misc/vrc_avatar_setup.md","filePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),u={name:"misc/vrc_avatar_setup.md"},v=Object.assign(u,{setup(f){return(m,e)=>(o(),s("div",null,[e[1]||(e[1]=t("h1",{class:"text-[var(--font-accent)]",id:"how-to-set-up-your-avatar-for-eye-tracking",tabindex:"-1"},[n("How to set up your avatar for eye tracking: "),t("a",{class:"header-anchor",href:"#how-to-set-up-your-avatar-for-eye-tracking","aria-label":'Permalink to "How to set up your avatar for eye tracking: {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=t("p",null,"Here is an avatar setup video created by a contributor:",-1)),e[3]||(e[3]=t("div",{align:"center"},[t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/Dfm-tkaruq0",title:"Add eye tracking support to your VRChat avatar",frameborder:"1",allow:"encrypted-media;",allowfullscreen:""})],-1)),e[4]||(e[4]=i('

Another good resource is the VRC Face Tracking Wiki and their Discord.

We currently use the following paramaters

LeftEyeX

RightEyeX

EyesY

LeftEyeLidExpandedSqueeze

RightEyeLidExpandedSqueeze

',7)),t("div",p,[c(a,{options:d(r).vrc_avatar_setup},{content:l(()=>e[0]||(e[0]=[t("p",null," We currently only support float parameters, please adjust your setup accordingly. ",-1)])),_:1},8,["options"])])]))}});export{g as __pageData,v as default}; +import{_ as a,a as r}from"./chunks/index.c19b2931.js";import{o,c as s,k as t,a as n,O as i,E as c,w as l,l as d}from"./chunks/framework.ece1a6f0.js";const p={align:"center"},g=JSON.parse('{"title":"How to set up your avatar for eye tracking:","description":"","frontmatter":{},"headers":[],"relativePath":"misc/vrc_avatar_setup.md","filePath":"misc/vrc_avatar_setup.md","lastUpdated":1677196572000}'),u={name:"misc/vrc_avatar_setup.md"},v=Object.assign(u,{setup(f){return(m,e)=>(o(),s("div",null,[e[1]||(e[1]=t("h1",{class:"text-[var(--font-accent)]",id:"how-to-set-up-your-avatar-for-eye-tracking",tabindex:"-1"},[n("How to set up your avatar for eye tracking: "),t("a",{class:"header-anchor",href:"#how-to-set-up-your-avatar-for-eye-tracking","aria-label":'Permalink to "How to set up your avatar for eye tracking: {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=t("p",null,"Here is an avatar setup video created by a contributor:",-1)),e[3]||(e[3]=t("div",{align:"center"},[t("iframe",{width:"500",height:"300",src:"https://www.youtube.com/embed/Dfm-tkaruq0",title:"Add eye tracking support to your VRChat avatar",frameborder:"1",allow:"encrypted-media;",allowfullscreen:""})],-1)),e[4]||(e[4]=i('

Another good resource is the VRC Face Tracking Wiki and their Discord.

We currently use the following paramaters

LeftEyeX

RightEyeX

EyesY

LeftEyeLidExpandedSqueeze

RightEyeLidExpandedSqueeze

',7)),t("div",p,[c(a,{options:d(r).vrc_avatar_setup},{content:l(()=>e[0]||(e[0]=[t("p",null," We currently only support float parameters, please adjust your setup accordingly. ",-1)])),_:1},8,["options"])])]))}});export{g as __pageData,v as default}; diff --git a/assets/software_guide_VRCFT_tracking_module.md.d148b9dc.js b/assets/software_guide_VRCFT_tracking_module.md.b34c3266.js similarity index 99% rename from assets/software_guide_VRCFT_tracking_module.md.d148b9dc.js rename to assets/software_guide_VRCFT_tracking_module.md.b34c3266.js index 65b8b5c..e4b50f2 100644 --- a/assets/software_guide_VRCFT_tracking_module.md.d148b9dc.js +++ b/assets/software_guide_VRCFT_tracking_module.md.b34c3266.js @@ -1,3 +1,3 @@ -import{_ as t,i as o}from"./chunks/index.c1fed1bd.js";import{o as l,c as d,O as a,E as i,l as n,k as r,a as s}from"./chunks/framework.47aa8d5b.js";const m=JSON.parse('{"title":"VRCFT ETVR Tracking module, or simply the ETVR tracking module","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/VRCFT_tracking_module.md","filePath":"software_guide/VRCFT_tracking_module.md","lastUpdated":1720893602000}'),h={name:"software_guide/VRCFT_tracking_module.md"},f=Object.assign(h,{setup(u){return(c,e)=>(l(),d("div",null,[e[0]||(e[0]=a('

VRCFT ETVR Tracking module, or simply the ETVR tracking module

What is this?

VRCFT ETVR Tracking module is an extension for VRCFT. It allows ETVR to send out tracking data and have it converted to parameters expected by VRCFT and avatars compatible with VRCFT.

In effect, ETVR will be compatible with whichever game or program that supports VRCFT, thanks to this module.

It is required for all avatrs that are setup to use Unified Expression(UE) or V2 parameters, optional for ones setup with so-called legacy or v1 parameters.

What do I need and how do I set this up?

To make ETVR work with VRCFT, you'll need two things. VRCFT itself, and the tracking module.

Required programs / Files

VRCFT

To get VRCFT head over to: their docs page!

ETVR Module

Once you've installed VRCFT, you can find the most recent version of the module in the registry.

',12)),i(t,{options:n(o).vrcft_etvr_module_registry},null,8,["options"]),e[1]||(e[1]=r("p",null,[s("Clicking on "),r("code",null,"install"),s(" will download and load the module, VRCFT will now be setup to listen for ETVR data. That's it!")],-1)),e[2]||(e[2]=r("h3",{id:"setting-up-etvr-to-use-the-module",tabindex:"-1"},[s("Setting up ETVR to use the module "),r("a",{class:"header-anchor",href:"#setting-up-etvr-to-use-the-module","aria-label":'Permalink to "Setting up ETVR to use the module"'},"​")],-1)),i(t,{options:n(o).vrcft_etvr_setitgs_page},null,8,["options"]),e[3]||(e[3]=a('
  • Open settings tab
  • Under OSC section select Use the ETVR Module
  • Select the desired parameters - V1 or V2 (UE)
  • Go back into the tracking tab

Settings will apply automatically, no need to change port or restart the app. ETVR will automatically start sending the data to the module.

Sending the tracking data to VRCFT running on a separate PC.

',3)),i(t,{options:n(o).vrcft_etvr_setitgs_page_inter_pc_setup},null,8,["options"]),e[4]||(e[4]=a('

If you're running a hybrid setup where one machine does all of the ETVR tracking, and the other has VRCFT and other software running, you'll need to adjust the settings a bit.

First, make sure that both machines are on the same network and they can see each other. If they're connected via Ethernet to the same router, or to the same WiFi network, things should just work.

Next, find out that's the IP address of the machine running VRCFT. For how to, refer to Microsoft's documentation

With that, head over to ETVR, select the VRCFT Module Settings tab. Notice the VRCFT Module listening IP section. By default it's set to 127.0.0.1, change it to the IP the PC that runs VRCFT.

Reseting the module to default settings in case something went wrong.

',5)),i(t,{options:n(o).vrcft_etvr_setitgs_page_reset_settings},null,8,["options"]),e[5]||(e[5]=a(`

This is also taken care of by the app, simply make sure that VRCFT is running and the ETVR module got loaded in.

Then, in ETVR head back over to VRCFT Module Settings tab and hit Reset Settings to default.

This will reset the module's settings to default values for both - ETVR and VRCFT.

There's a breaking change reported, what does that mean? What do I do?

When we say there's a breaking change, we mean that something changed so drastically that there's a high chance of the module failing to load. This is a very rare thing, usually happens when settings get modified so much that they're no longer compatible.

In such cases, deleting the module's settings file is enough. Check the FAQ section - Where's the module's configuration file? For locating and deleting it.

Dev version of the module for testing

Sometimes, we'll have a new version of the module ready for test, or a special one with a lot of additional logging to help us debug some stuff on your end. This version won't be available in the registry right away so how you install it?

  1. Uninstall any pre-existing EVT Modules:

Uninstall your current ETVR Module installation.

Similarly to installing it for the first time, navigate to VRCFT's module registry, find the ETVR Module and hit uninstall.

  1. Download the latest build:

Download the latest release / pre-release from the repo or from the discord.

  1. Install the development version:

Navigate to:

C:\\Users\\<Your PC name>\\AppData\\Roaming\\VRCFaceTracking\\CustomLibs

And place the module there. If CustomLibs doesn't exist yet, create it. VRCFT will use it to load the development version of the module next time you launch the app.

Building from source

Download the ETVR Module source from github

First, just like you'd do with the apps source, download it from github. Either via downloading and extracting a zip or by using git clone.

Donwload the latest VRCFT Source

Download the VRCFT Source from their github. It's important to put next to the ETVR module. Your directory should look more or less like this:

parent_directory
+import{_ as t,i as o}from"./chunks/index.41b0dfea.js";import{o as l,c as d,O as a,E as i,l as n,k as r,a as s}from"./chunks/framework.ece1a6f0.js";const m=JSON.parse('{"title":"VRCFT ETVR Tracking module, or simply the ETVR tracking module","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/VRCFT_tracking_module.md","filePath":"software_guide/VRCFT_tracking_module.md","lastUpdated":1720893602000}'),h={name:"software_guide/VRCFT_tracking_module.md"},f=Object.assign(h,{setup(u){return(c,e)=>(l(),d("div",null,[e[0]||(e[0]=a('

VRCFT ETVR Tracking module, or simply the ETVR tracking module

What is this?

VRCFT ETVR Tracking module is an extension for VRCFT. It allows ETVR to send out tracking data and have it converted to parameters expected by VRCFT and avatars compatible with VRCFT.

In effect, ETVR will be compatible with whichever game or program that supports VRCFT, thanks to this module.

It is required for all avatrs that are setup to use Unified Expression(UE) or V2 parameters, optional for ones setup with so-called legacy or v1 parameters.

What do I need and how do I set this up?

To make ETVR work with VRCFT, you'll need two things. VRCFT itself, and the tracking module.

Required programs / Files

VRCFT

To get VRCFT head over to: their docs page!

ETVR Module

Once you've installed VRCFT, you can find the most recent version of the module in the registry.

',12)),i(t,{options:n(o).vrcft_etvr_module_registry},null,8,["options"]),e[1]||(e[1]=r("p",null,[s("Clicking on "),r("code",null,"install"),s(" will download and load the module, VRCFT will now be setup to listen for ETVR data. That's it!")],-1)),e[2]||(e[2]=r("h3",{id:"setting-up-etvr-to-use-the-module",tabindex:"-1"},[s("Setting up ETVR to use the module "),r("a",{class:"header-anchor",href:"#setting-up-etvr-to-use-the-module","aria-label":'Permalink to "Setting up ETVR to use the module"'},"​")],-1)),i(t,{options:n(o).vrcft_etvr_setitgs_page},null,8,["options"]),e[3]||(e[3]=a('
  • Open settings tab
  • Under OSC section select Use the ETVR Module
  • Select the desired parameters - V1 or V2 (UE)
  • Go back into the tracking tab

Settings will apply automatically, no need to change port or restart the app. ETVR will automatically start sending the data to the module.

Sending the tracking data to VRCFT running on a separate PC.

',3)),i(t,{options:n(o).vrcft_etvr_setitgs_page_inter_pc_setup},null,8,["options"]),e[4]||(e[4]=a('

If you're running a hybrid setup where one machine does all of the ETVR tracking, and the other has VRCFT and other software running, you'll need to adjust the settings a bit.

First, make sure that both machines are on the same network and they can see each other. If they're connected via Ethernet to the same router, or to the same WiFi network, things should just work.

Next, find out that's the IP address of the machine running VRCFT. For how to, refer to Microsoft's documentation

With that, head over to ETVR, select the VRCFT Module Settings tab. Notice the VRCFT Module listening IP section. By default it's set to 127.0.0.1, change it to the IP the PC that runs VRCFT.

Reseting the module to default settings in case something went wrong.

',5)),i(t,{options:n(o).vrcft_etvr_setitgs_page_reset_settings},null,8,["options"]),e[5]||(e[5]=a(`

This is also taken care of by the app, simply make sure that VRCFT is running and the ETVR module got loaded in.

Then, in ETVR head back over to VRCFT Module Settings tab and hit Reset Settings to default.

This will reset the module's settings to default values for both - ETVR and VRCFT.

There's a breaking change reported, what does that mean? What do I do?

When we say there's a breaking change, we mean that something changed so drastically that there's a high chance of the module failing to load. This is a very rare thing, usually happens when settings get modified so much that they're no longer compatible.

In such cases, deleting the module's settings file is enough. Check the FAQ section - Where's the module's configuration file? For locating and deleting it.

Dev version of the module for testing

Sometimes, we'll have a new version of the module ready for test, or a special one with a lot of additional logging to help us debug some stuff on your end. This version won't be available in the registry right away so how you install it?

  1. Uninstall any pre-existing EVT Modules:

Uninstall your current ETVR Module installation.

Similarly to installing it for the first time, navigate to VRCFT's module registry, find the ETVR Module and hit uninstall.

  1. Download the latest build:

Download the latest release / pre-release from the repo or from the discord.

  1. Install the development version:

Navigate to:

C:\\Users\\<Your PC name>\\AppData\\Roaming\\VRCFaceTracking\\CustomLibs

And place the module there. If CustomLibs doesn't exist yet, create it. VRCFT will use it to load the development version of the module next time you launch the app.

Building from source

Download the ETVR Module source from github

First, just like you'd do with the apps source, download it from github. Either via downloading and extracting a zip or by using git clone.

Donwload the latest VRCFT Source

Download the VRCFT Source from their github. It's important to put next to the ETVR module. Your directory should look more or less like this:

parent_directory
     - ETVR Module
     - VRCFT Repo

Building the module requires some of the VRCFT stuff to be present, namely the Core directory. To make it easier to compile, we've set the project up so that it will look for it, next to its own directory.

Install Visual Studio or Jetbrains Rider, and open the project

Whichever IDE you prefer, both just work, both make it easier to work with the source code.

Once installed, open the project in them and wait for everything to load.

Building the module

That's the last step, now we just need to verify that everything is setup correctly. Click on build, or hit ctrl+b and watch the output.

It should build just fine and the resulting file should get copied to the VRCFT CustomModules\` directory.

Note, the copying will fail when VRCFT is running. If it does, close VRCFT and hit build again, this time only the copy step will be executed

FAQ

Where's the module's configuration file?

In the rare cases where you need to modify the configuration file, here's how to find it:

Since CRVFT is an UWP app and those behave quite a bit differently than regular apps, there's no easy way to access that file. Instead, you'll need to search on your C:/ drive for 'ETVRModuleConfig.json and it should show up.

WHat do the fields in this file mean?

Range explanation: 0 - fully closed, 1 - fully open.

  • OutputMultiplier: Defines by how much the output should be multiplied, it helps with making your tracking less or more expressive. 1 by default, [0 - 2] range.

  • PortNumber: the port under which the module will be listening for OSC messages, by default 8889

  • ShouldEmulateEyeWiden: Toggle for emulating eye widen, think surprised face. On by default, will at 0.97 of fully open eye

  • ShouldEmulateEyeSquint: Toggle for emulating squinting, think shutting your eyes with a bit of force. On by default, will activate at 0.05 of eye openness.

  • ShouldEmulateEyebrows: Togggle for emulating eyebrow movement, depending on eye openness, the module will try and move the avis eye brows a little. On by default at 0.89, range [0 - 1]

  • EyebrowThresholdRising: Defines when eyebrow emulation should kick in, by default at 0.89, range [0 - 1]

  • EyebrowThresholdLowering: Defines when eyebrow emulation should kick in but in the opposite direction, by default at 0.06, range [0 - 1]

  • SqueezeThresholdV1 - Defines when squeeze emulation should begin, and how "fast" should it be. By default, [0.06, 0.51], with range first: [0 - 1], second: [0 - 2]. This is used for v1 or legacy parameters

-SqueezeThresholdV2 - Defines when squeeze emulation should begin, and how "fast" should it be. By default, [0.06, -0.99], with range first: [0 - 1], second: [-2 - 0]. This is used for v2 or Unified Expressions parameters

  • WidenThresholdV1 - Defines when Widen emulation should begin, and how "fast" should it be. By default, [0.93, 1.01], with range first: [0 - 1], second: [0 - 2]. This is used for v1 or legacy parameters

  • WidenThresholdV2 - Defines when widen emulation should begin, and how "fast" should it be. By default, [0.96, 1.04], with range first: [0 - 1], second: [0 - 2]. This is used for v2 or Unified Expressions parameters

To better explain how Widen / Squeeze emulation thresholds work: They're implemented via a simple smoothstep, you can play around with it here, simply plug in the values in smoothstep() and watch how the graph reacts.

`,41))]))}});export{m as __pageData,f as default}; diff --git a/assets/software_guide_VRCFT_tracking_module.md.d148b9dc.lean.js b/assets/software_guide_VRCFT_tracking_module.md.b34c3266.lean.js similarity index 99% rename from assets/software_guide_VRCFT_tracking_module.md.d148b9dc.lean.js rename to assets/software_guide_VRCFT_tracking_module.md.b34c3266.lean.js index 65b8b5c..e4b50f2 100644 --- a/assets/software_guide_VRCFT_tracking_module.md.d148b9dc.lean.js +++ b/assets/software_guide_VRCFT_tracking_module.md.b34c3266.lean.js @@ -1,3 +1,3 @@ -import{_ as t,i as o}from"./chunks/index.c1fed1bd.js";import{o as l,c as d,O as a,E as i,l as n,k as r,a as s}from"./chunks/framework.47aa8d5b.js";const m=JSON.parse('{"title":"VRCFT ETVR Tracking module, or simply the ETVR tracking module","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/VRCFT_tracking_module.md","filePath":"software_guide/VRCFT_tracking_module.md","lastUpdated":1720893602000}'),h={name:"software_guide/VRCFT_tracking_module.md"},f=Object.assign(h,{setup(u){return(c,e)=>(l(),d("div",null,[e[0]||(e[0]=a('

VRCFT ETVR Tracking module, or simply the ETVR tracking module

What is this?

VRCFT ETVR Tracking module is an extension for VRCFT. It allows ETVR to send out tracking data and have it converted to parameters expected by VRCFT and avatars compatible with VRCFT.

In effect, ETVR will be compatible with whichever game or program that supports VRCFT, thanks to this module.

It is required for all avatrs that are setup to use Unified Expression(UE) or V2 parameters, optional for ones setup with so-called legacy or v1 parameters.

What do I need and how do I set this up?

To make ETVR work with VRCFT, you'll need two things. VRCFT itself, and the tracking module.

Required programs / Files

VRCFT

To get VRCFT head over to: their docs page!

ETVR Module

Once you've installed VRCFT, you can find the most recent version of the module in the registry.

',12)),i(t,{options:n(o).vrcft_etvr_module_registry},null,8,["options"]),e[1]||(e[1]=r("p",null,[s("Clicking on "),r("code",null,"install"),s(" will download and load the module, VRCFT will now be setup to listen for ETVR data. That's it!")],-1)),e[2]||(e[2]=r("h3",{id:"setting-up-etvr-to-use-the-module",tabindex:"-1"},[s("Setting up ETVR to use the module "),r("a",{class:"header-anchor",href:"#setting-up-etvr-to-use-the-module","aria-label":'Permalink to "Setting up ETVR to use the module"'},"​")],-1)),i(t,{options:n(o).vrcft_etvr_setitgs_page},null,8,["options"]),e[3]||(e[3]=a('
  • Open settings tab
  • Under OSC section select Use the ETVR Module
  • Select the desired parameters - V1 or V2 (UE)
  • Go back into the tracking tab

Settings will apply automatically, no need to change port or restart the app. ETVR will automatically start sending the data to the module.

Sending the tracking data to VRCFT running on a separate PC.

',3)),i(t,{options:n(o).vrcft_etvr_setitgs_page_inter_pc_setup},null,8,["options"]),e[4]||(e[4]=a('

If you're running a hybrid setup where one machine does all of the ETVR tracking, and the other has VRCFT and other software running, you'll need to adjust the settings a bit.

First, make sure that both machines are on the same network and they can see each other. If they're connected via Ethernet to the same router, or to the same WiFi network, things should just work.

Next, find out that's the IP address of the machine running VRCFT. For how to, refer to Microsoft's documentation

With that, head over to ETVR, select the VRCFT Module Settings tab. Notice the VRCFT Module listening IP section. By default it's set to 127.0.0.1, change it to the IP the PC that runs VRCFT.

Reseting the module to default settings in case something went wrong.

',5)),i(t,{options:n(o).vrcft_etvr_setitgs_page_reset_settings},null,8,["options"]),e[5]||(e[5]=a(`

This is also taken care of by the app, simply make sure that VRCFT is running and the ETVR module got loaded in.

Then, in ETVR head back over to VRCFT Module Settings tab and hit Reset Settings to default.

This will reset the module's settings to default values for both - ETVR and VRCFT.

There's a breaking change reported, what does that mean? What do I do?

When we say there's a breaking change, we mean that something changed so drastically that there's a high chance of the module failing to load. This is a very rare thing, usually happens when settings get modified so much that they're no longer compatible.

In such cases, deleting the module's settings file is enough. Check the FAQ section - Where's the module's configuration file? For locating and deleting it.

Dev version of the module for testing

Sometimes, we'll have a new version of the module ready for test, or a special one with a lot of additional logging to help us debug some stuff on your end. This version won't be available in the registry right away so how you install it?

  1. Uninstall any pre-existing EVT Modules:

Uninstall your current ETVR Module installation.

Similarly to installing it for the first time, navigate to VRCFT's module registry, find the ETVR Module and hit uninstall.

  1. Download the latest build:

Download the latest release / pre-release from the repo or from the discord.

  1. Install the development version:

Navigate to:

C:\\Users\\<Your PC name>\\AppData\\Roaming\\VRCFaceTracking\\CustomLibs

And place the module there. If CustomLibs doesn't exist yet, create it. VRCFT will use it to load the development version of the module next time you launch the app.

Building from source

Download the ETVR Module source from github

First, just like you'd do with the apps source, download it from github. Either via downloading and extracting a zip or by using git clone.

Donwload the latest VRCFT Source

Download the VRCFT Source from their github. It's important to put next to the ETVR module. Your directory should look more or less like this:

parent_directory
+import{_ as t,i as o}from"./chunks/index.41b0dfea.js";import{o as l,c as d,O as a,E as i,l as n,k as r,a as s}from"./chunks/framework.ece1a6f0.js";const m=JSON.parse('{"title":"VRCFT ETVR Tracking module, or simply the ETVR tracking module","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/VRCFT_tracking_module.md","filePath":"software_guide/VRCFT_tracking_module.md","lastUpdated":1720893602000}'),h={name:"software_guide/VRCFT_tracking_module.md"},f=Object.assign(h,{setup(u){return(c,e)=>(l(),d("div",null,[e[0]||(e[0]=a('

VRCFT ETVR Tracking module, or simply the ETVR tracking module

What is this?

VRCFT ETVR Tracking module is an extension for VRCFT. It allows ETVR to send out tracking data and have it converted to parameters expected by VRCFT and avatars compatible with VRCFT.

In effect, ETVR will be compatible with whichever game or program that supports VRCFT, thanks to this module.

It is required for all avatrs that are setup to use Unified Expression(UE) or V2 parameters, optional for ones setup with so-called legacy or v1 parameters.

What do I need and how do I set this up?

To make ETVR work with VRCFT, you'll need two things. VRCFT itself, and the tracking module.

Required programs / Files

VRCFT

To get VRCFT head over to: their docs page!

ETVR Module

Once you've installed VRCFT, you can find the most recent version of the module in the registry.

',12)),i(t,{options:n(o).vrcft_etvr_module_registry},null,8,["options"]),e[1]||(e[1]=r("p",null,[s("Clicking on "),r("code",null,"install"),s(" will download and load the module, VRCFT will now be setup to listen for ETVR data. That's it!")],-1)),e[2]||(e[2]=r("h3",{id:"setting-up-etvr-to-use-the-module",tabindex:"-1"},[s("Setting up ETVR to use the module "),r("a",{class:"header-anchor",href:"#setting-up-etvr-to-use-the-module","aria-label":'Permalink to "Setting up ETVR to use the module"'},"​")],-1)),i(t,{options:n(o).vrcft_etvr_setitgs_page},null,8,["options"]),e[3]||(e[3]=a('
  • Open settings tab
  • Under OSC section select Use the ETVR Module
  • Select the desired parameters - V1 or V2 (UE)
  • Go back into the tracking tab

Settings will apply automatically, no need to change port or restart the app. ETVR will automatically start sending the data to the module.

Sending the tracking data to VRCFT running on a separate PC.

',3)),i(t,{options:n(o).vrcft_etvr_setitgs_page_inter_pc_setup},null,8,["options"]),e[4]||(e[4]=a('

If you're running a hybrid setup where one machine does all of the ETVR tracking, and the other has VRCFT and other software running, you'll need to adjust the settings a bit.

First, make sure that both machines are on the same network and they can see each other. If they're connected via Ethernet to the same router, or to the same WiFi network, things should just work.

Next, find out that's the IP address of the machine running VRCFT. For how to, refer to Microsoft's documentation

With that, head over to ETVR, select the VRCFT Module Settings tab. Notice the VRCFT Module listening IP section. By default it's set to 127.0.0.1, change it to the IP the PC that runs VRCFT.

Reseting the module to default settings in case something went wrong.

',5)),i(t,{options:n(o).vrcft_etvr_setitgs_page_reset_settings},null,8,["options"]),e[5]||(e[5]=a(`

This is also taken care of by the app, simply make sure that VRCFT is running and the ETVR module got loaded in.

Then, in ETVR head back over to VRCFT Module Settings tab and hit Reset Settings to default.

This will reset the module's settings to default values for both - ETVR and VRCFT.

There's a breaking change reported, what does that mean? What do I do?

When we say there's a breaking change, we mean that something changed so drastically that there's a high chance of the module failing to load. This is a very rare thing, usually happens when settings get modified so much that they're no longer compatible.

In such cases, deleting the module's settings file is enough. Check the FAQ section - Where's the module's configuration file? For locating and deleting it.

Dev version of the module for testing

Sometimes, we'll have a new version of the module ready for test, or a special one with a lot of additional logging to help us debug some stuff on your end. This version won't be available in the registry right away so how you install it?

  1. Uninstall any pre-existing EVT Modules:

Uninstall your current ETVR Module installation.

Similarly to installing it for the first time, navigate to VRCFT's module registry, find the ETVR Module and hit uninstall.

  1. Download the latest build:

Download the latest release / pre-release from the repo or from the discord.

  1. Install the development version:

Navigate to:

C:\\Users\\<Your PC name>\\AppData\\Roaming\\VRCFaceTracking\\CustomLibs

And place the module there. If CustomLibs doesn't exist yet, create it. VRCFT will use it to load the development version of the module next time you launch the app.

Building from source

Download the ETVR Module source from github

First, just like you'd do with the apps source, download it from github. Either via downloading and extracting a zip or by using git clone.

Donwload the latest VRCFT Source

Download the VRCFT Source from their github. It's important to put next to the ETVR module. Your directory should look more or less like this:

parent_directory
     - ETVR Module
     - VRCFT Repo

Building the module requires some of the VRCFT stuff to be present, namely the Core directory. To make it easier to compile, we've set the project up so that it will look for it, next to its own directory.

Install Visual Studio or Jetbrains Rider, and open the project

Whichever IDE you prefer, both just work, both make it easier to work with the source code.

Once installed, open the project in them and wait for everything to load.

Building the module

That's the last step, now we just need to verify that everything is setup correctly. Click on build, or hit ctrl+b and watch the output.

It should build just fine and the resulting file should get copied to the VRCFT CustomModules\` directory.

Note, the copying will fail when VRCFT is running. If it does, close VRCFT and hit build again, this time only the copy step will be executed

FAQ

Where's the module's configuration file?

In the rare cases where you need to modify the configuration file, here's how to find it:

Since CRVFT is an UWP app and those behave quite a bit differently than regular apps, there's no easy way to access that file. Instead, you'll need to search on your C:/ drive for 'ETVRModuleConfig.json and it should show up.

WHat do the fields in this file mean?

Range explanation: 0 - fully closed, 1 - fully open.

  • OutputMultiplier: Defines by how much the output should be multiplied, it helps with making your tracking less or more expressive. 1 by default, [0 - 2] range.

  • PortNumber: the port under which the module will be listening for OSC messages, by default 8889

  • ShouldEmulateEyeWiden: Toggle for emulating eye widen, think surprised face. On by default, will at 0.97 of fully open eye

  • ShouldEmulateEyeSquint: Toggle for emulating squinting, think shutting your eyes with a bit of force. On by default, will activate at 0.05 of eye openness.

  • ShouldEmulateEyebrows: Togggle for emulating eyebrow movement, depending on eye openness, the module will try and move the avis eye brows a little. On by default at 0.89, range [0 - 1]

  • EyebrowThresholdRising: Defines when eyebrow emulation should kick in, by default at 0.89, range [0 - 1]

  • EyebrowThresholdLowering: Defines when eyebrow emulation should kick in but in the opposite direction, by default at 0.06, range [0 - 1]

  • SqueezeThresholdV1 - Defines when squeeze emulation should begin, and how "fast" should it be. By default, [0.06, 0.51], with range first: [0 - 1], second: [0 - 2]. This is used for v1 or legacy parameters

-SqueezeThresholdV2 - Defines when squeeze emulation should begin, and how "fast" should it be. By default, [0.06, -0.99], with range first: [0 - 1], second: [-2 - 0]. This is used for v2 or Unified Expressions parameters

  • WidenThresholdV1 - Defines when Widen emulation should begin, and how "fast" should it be. By default, [0.93, 1.01], with range first: [0 - 1], second: [0 - 2]. This is used for v1 or legacy parameters

  • WidenThresholdV2 - Defines when widen emulation should begin, and how "fast" should it be. By default, [0.96, 1.04], with range first: [0 - 1], second: [0 - 2]. This is used for v2 or Unified Expressions parameters

To better explain how Widen / Squeeze emulation thresholds work: They're implemented via a simple smoothstep, you can play around with it here, simply plug in the values in smoothstep() and watch how the graph reacts.

`,41))]))}});export{m as __pageData,f as default}; diff --git a/assets/software_guide_build_software.md.b0d1c681.js b/assets/software_guide_build_software.md.aa1553be.js similarity index 94% rename from assets/software_guide_build_software.md.b0d1c681.js rename to assets/software_guide_build_software.md.aa1553be.js index 3979786..52a5df8 100644 --- a/assets/software_guide_build_software.md.b0d1c681.js +++ b/assets/software_guide_build_software.md.aa1553be.js @@ -1 +1 @@ -import{_ as n,a as l}from"./chunks/index.339f98d7.js";import{_ as i}from"./chunks/CheckBoxList.80273cd9.js";import{o as s,c as p,k as t,a as o,E as a,w as d,l as r,O as h}from"./chunks/framework.47aa8d5b.js";const u={state:!0,object:[{label:"Python 3.11.0",link:"https://www.python.org/downloads/release/python-3110/"},{label:"Poetry",link:"https://python-poetry.org/"},{label:"Windows/Linux PC",link:""}]},g=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/build_software.md","filePath":"software_guide/build_software.md","lastUpdated":1700510338000}'),c={name:"software_guide/build_software.md"},P=Object.assign(c,{setup(m){return(f,e)=>(s(),p("div",null,[e[1]||(e[1]=t("h1",{class:"text-[var(--font-accent)]",id:"build-the-app-from-source",tabindex:"-1"},[o("Build the app from source "),t("a",{class:"header-anchor",href:"#build-the-app-from-source","aria-label":'Permalink to "Build the app from source {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=t("h2",{id:"this-guide-will-show-how-to-build-the-app-from-source",tabindex:"-1"},[o("This guide will show how to build the app from source "),t("a",{class:"header-anchor",href:"#this-guide-will-show-how-to-build-the-app-from-source","aria-label":'Permalink to "This guide will show how to build the app from source"'},"​")],-1)),a(n,{options:r(l).build_software_one},{content:d(()=>e[0]||(e[0]=[t("p",null," This is NOT a required step, you do not need to build the app from source. ",-1)])),_:1},8,["options"]),e[3]||(e[3]=t("h2",{id:"requirements",tabindex:"-1"},[o("Requirements "),t("a",{class:"header-anchor",href:"#requirements","aria-label":'Permalink to "Requirements"'},"​")],-1)),a(i,{options:{...r(u)}},null,8,["options"]),e[4]||(e[4]=h('

Install Python

EyeTrackVR is currently using Python 3.11.0 Before you continue, please install it.

Installing Poetry

Starting with version 0.1.7, EyeTrackVR uses Poetry to manage app dependencies. To build the app, you must first install Poetry to fetch the required dependencies.

To install Poetry open Windows Powershell and run the following command (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

Poetry Documentation

Install the required Python modules

After cloning the project and installing Poetry, open a command prompt in the EyeTrackApp folder. Then run the command: poetry install

This should install all of the required modules.

Build the app

Now, you should be ready to build the app. With a command prompt open in the EyeTrackApp folder, run the command poetry run pyinstaller eyetrackapp.spec

Give it time to build the app. Once done, the app should be under dist/eyetrackapp

',12))]))}});export{g as __pageData,P as default}; +import{_ as n,a as l}from"./chunks/index.c19b2931.js";import{_ as i}from"./chunks/CheckBoxList.1747249a.js";import{o as s,c as p,k as t,a as o,E as a,w as d,l as r,O as h}from"./chunks/framework.ece1a6f0.js";const u={state:!0,object:[{label:"Python 3.11.0",link:"https://www.python.org/downloads/release/python-3110/"},{label:"Poetry",link:"https://python-poetry.org/"},{label:"Windows/Linux PC",link:""}]},g=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/build_software.md","filePath":"software_guide/build_software.md","lastUpdated":1700510338000}'),c={name:"software_guide/build_software.md"},P=Object.assign(c,{setup(m){return(f,e)=>(s(),p("div",null,[e[1]||(e[1]=t("h1",{class:"text-[var(--font-accent)]",id:"build-the-app-from-source",tabindex:"-1"},[o("Build the app from source "),t("a",{class:"header-anchor",href:"#build-the-app-from-source","aria-label":'Permalink to "Build the app from source {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=t("h2",{id:"this-guide-will-show-how-to-build-the-app-from-source",tabindex:"-1"},[o("This guide will show how to build the app from source "),t("a",{class:"header-anchor",href:"#this-guide-will-show-how-to-build-the-app-from-source","aria-label":'Permalink to "This guide will show how to build the app from source"'},"​")],-1)),a(n,{options:r(l).build_software_one},{content:d(()=>e[0]||(e[0]=[t("p",null," This is NOT a required step, you do not need to build the app from source. ",-1)])),_:1},8,["options"]),e[3]||(e[3]=t("h2",{id:"requirements",tabindex:"-1"},[o("Requirements "),t("a",{class:"header-anchor",href:"#requirements","aria-label":'Permalink to "Requirements"'},"​")],-1)),a(i,{options:{...r(u)}},null,8,["options"]),e[4]||(e[4]=h('

Install Python

EyeTrackVR is currently using Python 3.11.0 Before you continue, please install it.

Installing Poetry

Starting with version 0.1.7, EyeTrackVR uses Poetry to manage app dependencies. To build the app, you must first install Poetry to fetch the required dependencies.

To install Poetry open Windows Powershell and run the following command (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

Poetry Documentation

Install the required Python modules

After cloning the project and installing Poetry, open a command prompt in the EyeTrackApp folder. Then run the command: poetry install

This should install all of the required modules.

Build the app

Now, you should be ready to build the app. With a command prompt open in the EyeTrackApp folder, run the command poetry run pyinstaller eyetrackapp.spec

Give it time to build the app. Once done, the app should be under dist/eyetrackapp

',12))]))}});export{g as __pageData,P as default}; diff --git a/assets/software_guide_build_software.md.b0d1c681.lean.js b/assets/software_guide_build_software.md.aa1553be.lean.js similarity index 94% rename from assets/software_guide_build_software.md.b0d1c681.lean.js rename to assets/software_guide_build_software.md.aa1553be.lean.js index 3979786..52a5df8 100644 --- a/assets/software_guide_build_software.md.b0d1c681.lean.js +++ b/assets/software_guide_build_software.md.aa1553be.lean.js @@ -1 +1 @@ -import{_ as n,a as l}from"./chunks/index.339f98d7.js";import{_ as i}from"./chunks/CheckBoxList.80273cd9.js";import{o as s,c as p,k as t,a as o,E as a,w as d,l as r,O as h}from"./chunks/framework.47aa8d5b.js";const u={state:!0,object:[{label:"Python 3.11.0",link:"https://www.python.org/downloads/release/python-3110/"},{label:"Poetry",link:"https://python-poetry.org/"},{label:"Windows/Linux PC",link:""}]},g=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/build_software.md","filePath":"software_guide/build_software.md","lastUpdated":1700510338000}'),c={name:"software_guide/build_software.md"},P=Object.assign(c,{setup(m){return(f,e)=>(s(),p("div",null,[e[1]||(e[1]=t("h1",{class:"text-[var(--font-accent)]",id:"build-the-app-from-source",tabindex:"-1"},[o("Build the app from source "),t("a",{class:"header-anchor",href:"#build-the-app-from-source","aria-label":'Permalink to "Build the app from source {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=t("h2",{id:"this-guide-will-show-how-to-build-the-app-from-source",tabindex:"-1"},[o("This guide will show how to build the app from source "),t("a",{class:"header-anchor",href:"#this-guide-will-show-how-to-build-the-app-from-source","aria-label":'Permalink to "This guide will show how to build the app from source"'},"​")],-1)),a(n,{options:r(l).build_software_one},{content:d(()=>e[0]||(e[0]=[t("p",null," This is NOT a required step, you do not need to build the app from source. ",-1)])),_:1},8,["options"]),e[3]||(e[3]=t("h2",{id:"requirements",tabindex:"-1"},[o("Requirements "),t("a",{class:"header-anchor",href:"#requirements","aria-label":'Permalink to "Requirements"'},"​")],-1)),a(i,{options:{...r(u)}},null,8,["options"]),e[4]||(e[4]=h('

Install Python

EyeTrackVR is currently using Python 3.11.0 Before you continue, please install it.

Installing Poetry

Starting with version 0.1.7, EyeTrackVR uses Poetry to manage app dependencies. To build the app, you must first install Poetry to fetch the required dependencies.

To install Poetry open Windows Powershell and run the following command (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

Poetry Documentation

Install the required Python modules

After cloning the project and installing Poetry, open a command prompt in the EyeTrackApp folder. Then run the command: poetry install

This should install all of the required modules.

Build the app

Now, you should be ready to build the app. With a command prompt open in the EyeTrackApp folder, run the command poetry run pyinstaller eyetrackapp.spec

Give it time to build the app. Once done, the app should be under dist/eyetrackapp

',12))]))}});export{g as __pageData,P as default}; +import{_ as n,a as l}from"./chunks/index.c19b2931.js";import{_ as i}from"./chunks/CheckBoxList.1747249a.js";import{o as s,c as p,k as t,a as o,E as a,w as d,l as r,O as h}from"./chunks/framework.ece1a6f0.js";const u={state:!0,object:[{label:"Python 3.11.0",link:"https://www.python.org/downloads/release/python-3110/"},{label:"Poetry",link:"https://python-poetry.org/"},{label:"Windows/Linux PC",link:""}]},g=JSON.parse('{"title":"Build the app from source","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/build_software.md","filePath":"software_guide/build_software.md","lastUpdated":1700510338000}'),c={name:"software_guide/build_software.md"},P=Object.assign(c,{setup(m){return(f,e)=>(s(),p("div",null,[e[1]||(e[1]=t("h1",{class:"text-[var(--font-accent)]",id:"build-the-app-from-source",tabindex:"-1"},[o("Build the app from source "),t("a",{class:"header-anchor",href:"#build-the-app-from-source","aria-label":'Permalink to "Build the app from source {.text-[var(--font-accent)]}"'},"​")],-1)),e[2]||(e[2]=t("h2",{id:"this-guide-will-show-how-to-build-the-app-from-source",tabindex:"-1"},[o("This guide will show how to build the app from source "),t("a",{class:"header-anchor",href:"#this-guide-will-show-how-to-build-the-app-from-source","aria-label":'Permalink to "This guide will show how to build the app from source"'},"​")],-1)),a(n,{options:r(l).build_software_one},{content:d(()=>e[0]||(e[0]=[t("p",null," This is NOT a required step, you do not need to build the app from source. ",-1)])),_:1},8,["options"]),e[3]||(e[3]=t("h2",{id:"requirements",tabindex:"-1"},[o("Requirements "),t("a",{class:"header-anchor",href:"#requirements","aria-label":'Permalink to "Requirements"'},"​")],-1)),a(i,{options:{...r(u)}},null,8,["options"]),e[4]||(e[4]=h('

Install Python

EyeTrackVR is currently using Python 3.11.0 Before you continue, please install it.

Installing Poetry

Starting with version 0.1.7, EyeTrackVR uses Poetry to manage app dependencies. To build the app, you must first install Poetry to fetch the required dependencies.

To install Poetry open Windows Powershell and run the following command (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

Poetry Documentation

Install the required Python modules

After cloning the project and installing Poetry, open a command prompt in the EyeTrackApp folder. Then run the command: poetry install

This should install all of the required modules.

Build the app

Now, you should be ready to build the app. With a command prompt open in the EyeTrackApp folder, run the command poetry run pyinstaller eyetrackapp.spec

Give it time to build the app. Once done, the app should be under dist/eyetrackapp

',12))]))}});export{g as __pageData,P as default}; diff --git a/assets/software_guide_eyetrackvr_app_guide.md.dce4a9fb.js b/assets/software_guide_eyetrackvr_app_guide.md.832069a1.js similarity index 97% rename from assets/software_guide_eyetrackvr_app_guide.md.dce4a9fb.js rename to assets/software_guide_eyetrackvr_app_guide.md.832069a1.js index 3bf2505..9465b9d 100644 --- a/assets/software_guide_eyetrackvr_app_guide.md.dce4a9fb.js +++ b/assets/software_guide_eyetrackvr_app_guide.md.832069a1.js @@ -1 +1 @@ -import{_ as l,a as d}from"./chunks/index.339f98d7.js";import{_ as r,i}from"./chunks/index.c1fed1bd.js";import{o as h,c as p,O as s,E as a,l as o,k as t,a as n,w as u}from"./chunks/framework.47aa8d5b.js";const k=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/eyetrackvr_app_guide.md","filePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1728244210000}'),c={name:"software_guide/eyetrackvr_app_guide.md"},w=Object.assign(c,{setup(y){return(g,e)=>(h(),p("div",null,[e[1]||(e[1]=s('

How to install, run and adjust the EyeTrackVR app.

Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app

Go to the latest GitHub release here and download the Setup.exe file.

Follow the prompts and the app should be installed.

Step 2: Run the EyeTrackVR app

If the Create Desktop Shortcut option was checked you should see an icon on your desktop, double click it to run.

You then should be greeted with a GUI that looks like this:

',7)),a(r,{options:o(i).eyetrack_vr_guide_three},null,8,["options"]),e[2]||(e[2]=s('

Step 3: Getting familiar with settings and terminology

Let's go over some basic terminology you will find in the app.

Starting from the top:

Right eye

Shows the right eye feed and settings only.

Left eye

Shows the left eye feed and settings only.

Both eyes

Shows both eyes' feed and settings.

Camera Address

This is where you enter the IP address of your camera. Alternatively, it can be used to put the cam number for wired cameras or pass in a video file.

Tracking Mode

This changes the GUI to the tracking mode where it outputs values.

Cropping Mode

This is where you will crop out your eye.

Threshold

This is used to cut out things that aren't dark like your pupil.

Rotation

For our method to work best, you want your eye to be level. Use this slider to adjust it to where that is the case.

Restart Calibration

This will start a calibration mode for your eye where you look to all extremes.

Recenter Eye

This will recenter your eye to whatever point you are looking at.

Step 4: Adding your cameras to the software and configuring them

Wireless configuration

Power your ESPs and find what the IP address is for your right eye. This can be done by opening both Cameras in a browser and then holding your finger over your right eye camera.

Copy that IP address and then close the browser tab with it open.

Enter that IP address into the app's Camera Address field.

Press the Save and Restart Tracking button.

Wired configuration (experimental)

Note this is a Beta app feature only. Please use the latest Open Beta in the Discord.

Find your ESPs in Device Manager and figure out their COM port numbers, e.g. COM4.

Enter that COM port number into the app's Camera Address field.

Press the Save and Restart Tracking button.

Setting up ROI

Don't see your camera feed? That's because an ROI hasn't been set yet.

',36)),a(r,{options:o(i).eyetrack_vr_guide_four},null,8,["options"]),e[3]||(e[3]=t("p",null,[n("Now press the "),t("code",null,"Cropping Mode"),n(" button. You should see a feed of your camera.")],-1)),e[4]||(e[4]=t("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1)),e[5]||(e[5]=t("p",null,"You should see something like this:",-1)),a(r,{options:o(i).eyetrack_vr_guide_five},null,8,["options"]),e[6]||(e[6]=t("p",null,"Now, draw a rectangle that selects your eye.",-1)),e[7]||(e[7]=t("p",null,"A good example of an ROI",-1)),a(r,{options:o(i).eyetrack_vr_guide_six},null,8,["options"]),e[8]||(e[8]=t("p",null,[n("Head back over to the "),t("code",null,"Tracking mode"),n(".")],-1)),e[9]||(e[9]=t("p",null,[n("We will now adjust our rotation by moving the "),t("code",null,"Rotation"),n(" slider.")],-1)),e[10]||(e[10]=t("p",null,"From this:",-1)),a(r,{options:o(i).eyetrack_vr_guide_seven},null,8,["options"]),e[11]||(e[11]=t("p",null,"To this:",-1)),a(r,{options:o(i).eyetrack_vr_guide_eight},null,8,["options"]),e[12]||(e[12]=t("p",null,"Now we will adjust our threshold.",-1)),e[13]||(e[13]=t("p",null,"Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.",-1)),e[14]||(e[14]=t("p",null,"Example of a threshold being too low:",-1)),a(r,{options:o(i).eyetrack_vr_guide_nine},null,8,["options"]),e[15]||(e[15]=t("p",null,"Example of too high of a threshold:",-1)),a(r,{options:o(i).eyetrack_vr_guide_ten},null,8,["options"]),e[16]||(e[16]=t("p",null,"Example of a good threshold:",-1)),a(r,{options:o(i).eyetrack_vr_guide_eleven},null,8,["options"]),e[17]||(e[17]=s('

Repeat everything in this step for your left eye.

Step 5: Calibrating your eyes

Once your eye is trackable by the software we need to calibrate it.

Press the Restart Calibration button and look around. The important part is that you look to all extremes, all the way up, left, etc. Once you have done so, wait for the Mode to say Tracking

The next step is to center your eye.

Look straight forward and press the Recenter Eye button.

Your eye is now fully calibrated.

Repeat for your other eye.

',8)),a(l,{options:o(d).eyetrack_vr_guide_two},{content:u(()=>e[0]||(e[0]=[t("p",null," To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes. ",-1)])),_:1},8,["options"])]))}});export{k as __pageData,w as default}; +import{_ as l,a as d}from"./chunks/index.c19b2931.js";import{_ as r,i}from"./chunks/index.41b0dfea.js";import{o as h,c as p,O as s,E as a,l as o,k as t,a as n,w as u}from"./chunks/framework.ece1a6f0.js";const k=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/eyetrackvr_app_guide.md","filePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1728244210000}'),c={name:"software_guide/eyetrackvr_app_guide.md"},w=Object.assign(c,{setup(y){return(g,e)=>(h(),p("div",null,[e[1]||(e[1]=s('

How to install, run and adjust the EyeTrackVR app.

Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app

Go to the latest GitHub release here and download the Setup.exe file.

Follow the prompts and the app should be installed.

Step 2: Run the EyeTrackVR app

If the Create Desktop Shortcut option was checked you should see an icon on your desktop, double click it to run.

You then should be greeted with a GUI that looks like this:

',7)),a(r,{options:o(i).eyetrack_vr_guide_three},null,8,["options"]),e[2]||(e[2]=s('

Step 3: Getting familiar with settings and terminology

Let's go over some basic terminology you will find in the app.

Starting from the top:

Right eye

Shows the right eye feed and settings only.

Left eye

Shows the left eye feed and settings only.

Both eyes

Shows both eyes' feed and settings.

Camera Address

This is where you enter the IP address of your camera. Alternatively, it can be used to put the cam number for wired cameras or pass in a video file.

Tracking Mode

This changes the GUI to the tracking mode where it outputs values.

Cropping Mode

This is where you will crop out your eye.

Threshold

This is used to cut out things that aren't dark like your pupil.

Rotation

For our method to work best, you want your eye to be level. Use this slider to adjust it to where that is the case.

Restart Calibration

This will start a calibration mode for your eye where you look to all extremes.

Recenter Eye

This will recenter your eye to whatever point you are looking at.

Step 4: Adding your cameras to the software and configuring them

Wireless configuration

Power your ESPs and find what the IP address is for your right eye. This can be done by opening both Cameras in a browser and then holding your finger over your right eye camera.

Copy that IP address and then close the browser tab with it open.

Enter that IP address into the app's Camera Address field.

Press the Save and Restart Tracking button.

Wired configuration (experimental)

Note this is a Beta app feature only. Please use the latest Open Beta in the Discord.

Find your ESPs in Device Manager and figure out their COM port numbers, e.g. COM4.

Enter that COM port number into the app's Camera Address field.

Press the Save and Restart Tracking button.

Setting up ROI

Don't see your camera feed? That's because an ROI hasn't been set yet.

',36)),a(r,{options:o(i).eyetrack_vr_guide_four},null,8,["options"]),e[3]||(e[3]=t("p",null,[n("Now press the "),t("code",null,"Cropping Mode"),n(" button. You should see a feed of your camera.")],-1)),e[4]||(e[4]=t("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1)),e[5]||(e[5]=t("p",null,"You should see something like this:",-1)),a(r,{options:o(i).eyetrack_vr_guide_five},null,8,["options"]),e[6]||(e[6]=t("p",null,"Now, draw a rectangle that selects your eye.",-1)),e[7]||(e[7]=t("p",null,"A good example of an ROI",-1)),a(r,{options:o(i).eyetrack_vr_guide_six},null,8,["options"]),e[8]||(e[8]=t("p",null,[n("Head back over to the "),t("code",null,"Tracking mode"),n(".")],-1)),e[9]||(e[9]=t("p",null,[n("We will now adjust our rotation by moving the "),t("code",null,"Rotation"),n(" slider.")],-1)),e[10]||(e[10]=t("p",null,"From this:",-1)),a(r,{options:o(i).eyetrack_vr_guide_seven},null,8,["options"]),e[11]||(e[11]=t("p",null,"To this:",-1)),a(r,{options:o(i).eyetrack_vr_guide_eight},null,8,["options"]),e[12]||(e[12]=t("p",null,"Now we will adjust our threshold.",-1)),e[13]||(e[13]=t("p",null,"Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.",-1)),e[14]||(e[14]=t("p",null,"Example of a threshold being too low:",-1)),a(r,{options:o(i).eyetrack_vr_guide_nine},null,8,["options"]),e[15]||(e[15]=t("p",null,"Example of too high of a threshold:",-1)),a(r,{options:o(i).eyetrack_vr_guide_ten},null,8,["options"]),e[16]||(e[16]=t("p",null,"Example of a good threshold:",-1)),a(r,{options:o(i).eyetrack_vr_guide_eleven},null,8,["options"]),e[17]||(e[17]=s('

Repeat everything in this step for your left eye.

Step 5: Calibrating your eyes

Once your eye is trackable by the software we need to calibrate it.

Press the Restart Calibration button and look around. The important part is that you look to all extremes, all the way up, left, etc. Once you have done so, wait for the Mode to say Tracking

The next step is to center your eye.

Look straight forward and press the Recenter Eye button.

Your eye is now fully calibrated.

Repeat for your other eye.

',8)),a(l,{options:o(d).eyetrack_vr_guide_two},{content:u(()=>e[0]||(e[0]=[t("p",null," To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes. ",-1)])),_:1},8,["options"])]))}});export{k as __pageData,w as default}; diff --git a/assets/software_guide_eyetrackvr_app_guide.md.dce4a9fb.lean.js b/assets/software_guide_eyetrackvr_app_guide.md.832069a1.lean.js similarity index 97% rename from assets/software_guide_eyetrackvr_app_guide.md.dce4a9fb.lean.js rename to assets/software_guide_eyetrackvr_app_guide.md.832069a1.lean.js index 3bf2505..9465b9d 100644 --- a/assets/software_guide_eyetrackvr_app_guide.md.dce4a9fb.lean.js +++ b/assets/software_guide_eyetrackvr_app_guide.md.832069a1.lean.js @@ -1 +1 @@ -import{_ as l,a as d}from"./chunks/index.339f98d7.js";import{_ as r,i}from"./chunks/index.c1fed1bd.js";import{o as h,c as p,O as s,E as a,l as o,k as t,a as n,w as u}from"./chunks/framework.47aa8d5b.js";const k=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/eyetrackvr_app_guide.md","filePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1728244210000}'),c={name:"software_guide/eyetrackvr_app_guide.md"},w=Object.assign(c,{setup(y){return(g,e)=>(h(),p("div",null,[e[1]||(e[1]=s('

How to install, run and adjust the EyeTrackVR app.

Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app

Go to the latest GitHub release here and download the Setup.exe file.

Follow the prompts and the app should be installed.

Step 2: Run the EyeTrackVR app

If the Create Desktop Shortcut option was checked you should see an icon on your desktop, double click it to run.

You then should be greeted with a GUI that looks like this:

',7)),a(r,{options:o(i).eyetrack_vr_guide_three},null,8,["options"]),e[2]||(e[2]=s('

Step 3: Getting familiar with settings and terminology

Let's go over some basic terminology you will find in the app.

Starting from the top:

Right eye

Shows the right eye feed and settings only.

Left eye

Shows the left eye feed and settings only.

Both eyes

Shows both eyes' feed and settings.

Camera Address

This is where you enter the IP address of your camera. Alternatively, it can be used to put the cam number for wired cameras or pass in a video file.

Tracking Mode

This changes the GUI to the tracking mode where it outputs values.

Cropping Mode

This is where you will crop out your eye.

Threshold

This is used to cut out things that aren't dark like your pupil.

Rotation

For our method to work best, you want your eye to be level. Use this slider to adjust it to where that is the case.

Restart Calibration

This will start a calibration mode for your eye where you look to all extremes.

Recenter Eye

This will recenter your eye to whatever point you are looking at.

Step 4: Adding your cameras to the software and configuring them

Wireless configuration

Power your ESPs and find what the IP address is for your right eye. This can be done by opening both Cameras in a browser and then holding your finger over your right eye camera.

Copy that IP address and then close the browser tab with it open.

Enter that IP address into the app's Camera Address field.

Press the Save and Restart Tracking button.

Wired configuration (experimental)

Note this is a Beta app feature only. Please use the latest Open Beta in the Discord.

Find your ESPs in Device Manager and figure out their COM port numbers, e.g. COM4.

Enter that COM port number into the app's Camera Address field.

Press the Save and Restart Tracking button.

Setting up ROI

Don't see your camera feed? That's because an ROI hasn't been set yet.

',36)),a(r,{options:o(i).eyetrack_vr_guide_four},null,8,["options"]),e[3]||(e[3]=t("p",null,[n("Now press the "),t("code",null,"Cropping Mode"),n(" button. You should see a feed of your camera.")],-1)),e[4]||(e[4]=t("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1)),e[5]||(e[5]=t("p",null,"You should see something like this:",-1)),a(r,{options:o(i).eyetrack_vr_guide_five},null,8,["options"]),e[6]||(e[6]=t("p",null,"Now, draw a rectangle that selects your eye.",-1)),e[7]||(e[7]=t("p",null,"A good example of an ROI",-1)),a(r,{options:o(i).eyetrack_vr_guide_six},null,8,["options"]),e[8]||(e[8]=t("p",null,[n("Head back over to the "),t("code",null,"Tracking mode"),n(".")],-1)),e[9]||(e[9]=t("p",null,[n("We will now adjust our rotation by moving the "),t("code",null,"Rotation"),n(" slider.")],-1)),e[10]||(e[10]=t("p",null,"From this:",-1)),a(r,{options:o(i).eyetrack_vr_guide_seven},null,8,["options"]),e[11]||(e[11]=t("p",null,"To this:",-1)),a(r,{options:o(i).eyetrack_vr_guide_eight},null,8,["options"]),e[12]||(e[12]=t("p",null,"Now we will adjust our threshold.",-1)),e[13]||(e[13]=t("p",null,"Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.",-1)),e[14]||(e[14]=t("p",null,"Example of a threshold being too low:",-1)),a(r,{options:o(i).eyetrack_vr_guide_nine},null,8,["options"]),e[15]||(e[15]=t("p",null,"Example of too high of a threshold:",-1)),a(r,{options:o(i).eyetrack_vr_guide_ten},null,8,["options"]),e[16]||(e[16]=t("p",null,"Example of a good threshold:",-1)),a(r,{options:o(i).eyetrack_vr_guide_eleven},null,8,["options"]),e[17]||(e[17]=s('

Repeat everything in this step for your left eye.

Step 5: Calibrating your eyes

Once your eye is trackable by the software we need to calibrate it.

Press the Restart Calibration button and look around. The important part is that you look to all extremes, all the way up, left, etc. Once you have done so, wait for the Mode to say Tracking

The next step is to center your eye.

Look straight forward and press the Recenter Eye button.

Your eye is now fully calibrated.

Repeat for your other eye.

',8)),a(l,{options:o(d).eyetrack_vr_guide_two},{content:u(()=>e[0]||(e[0]=[t("p",null," To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes. ",-1)])),_:1},8,["options"])]))}});export{k as __pageData,w as default}; +import{_ as l,a as d}from"./chunks/index.c19b2931.js";import{_ as r,i}from"./chunks/index.41b0dfea.js";import{o as h,c as p,O as s,E as a,l as o,k as t,a as n,w as u}from"./chunks/framework.ece1a6f0.js";const k=JSON.parse('{"title":"How to install, run and adjust the EyeTrackVR app.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/eyetrackvr_app_guide.md","filePath":"software_guide/eyetrackvr_app_guide.md","lastUpdated":1728244210000}'),c={name:"software_guide/eyetrackvr_app_guide.md"},w=Object.assign(c,{setup(y){return(g,e)=>(h(),p("div",null,[e[1]||(e[1]=s('

How to install, run and adjust the EyeTrackVR app.

Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app

Go to the latest GitHub release here and download the Setup.exe file.

Follow the prompts and the app should be installed.

Step 2: Run the EyeTrackVR app

If the Create Desktop Shortcut option was checked you should see an icon on your desktop, double click it to run.

You then should be greeted with a GUI that looks like this:

',7)),a(r,{options:o(i).eyetrack_vr_guide_three},null,8,["options"]),e[2]||(e[2]=s('

Step 3: Getting familiar with settings and terminology

Let's go over some basic terminology you will find in the app.

Starting from the top:

Right eye

Shows the right eye feed and settings only.

Left eye

Shows the left eye feed and settings only.

Both eyes

Shows both eyes' feed and settings.

Camera Address

This is where you enter the IP address of your camera. Alternatively, it can be used to put the cam number for wired cameras or pass in a video file.

Tracking Mode

This changes the GUI to the tracking mode where it outputs values.

Cropping Mode

This is where you will crop out your eye.

Threshold

This is used to cut out things that aren't dark like your pupil.

Rotation

For our method to work best, you want your eye to be level. Use this slider to adjust it to where that is the case.

Restart Calibration

This will start a calibration mode for your eye where you look to all extremes.

Recenter Eye

This will recenter your eye to whatever point you are looking at.

Step 4: Adding your cameras to the software and configuring them

Wireless configuration

Power your ESPs and find what the IP address is for your right eye. This can be done by opening both Cameras in a browser and then holding your finger over your right eye camera.

Copy that IP address and then close the browser tab with it open.

Enter that IP address into the app's Camera Address field.

Press the Save and Restart Tracking button.

Wired configuration (experimental)

Note this is a Beta app feature only. Please use the latest Open Beta in the Discord.

Find your ESPs in Device Manager and figure out their COM port numbers, e.g. COM4.

Enter that COM port number into the app's Camera Address field.

Press the Save and Restart Tracking button.

Setting up ROI

Don't see your camera feed? That's because an ROI hasn't been set yet.

',36)),a(r,{options:o(i).eyetrack_vr_guide_four},null,8,["options"]),e[3]||(e[3]=t("p",null,[n("Now press the "),t("code",null,"Cropping Mode"),n(" button. You should see a feed of your camera.")],-1)),e[4]||(e[4]=t("p",null,"Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)",-1)),e[5]||(e[5]=t("p",null,"You should see something like this:",-1)),a(r,{options:o(i).eyetrack_vr_guide_five},null,8,["options"]),e[6]||(e[6]=t("p",null,"Now, draw a rectangle that selects your eye.",-1)),e[7]||(e[7]=t("p",null,"A good example of an ROI",-1)),a(r,{options:o(i).eyetrack_vr_guide_six},null,8,["options"]),e[8]||(e[8]=t("p",null,[n("Head back over to the "),t("code",null,"Tracking mode"),n(".")],-1)),e[9]||(e[9]=t("p",null,[n("We will now adjust our rotation by moving the "),t("code",null,"Rotation"),n(" slider.")],-1)),e[10]||(e[10]=t("p",null,"From this:",-1)),a(r,{options:o(i).eyetrack_vr_guide_seven},null,8,["options"]),e[11]||(e[11]=t("p",null,"To this:",-1)),a(r,{options:o(i).eyetrack_vr_guide_eight},null,8,["options"]),e[12]||(e[12]=t("p",null,"Now we will adjust our threshold.",-1)),e[13]||(e[13]=t("p",null,"Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.",-1)),e[14]||(e[14]=t("p",null,"Example of a threshold being too low:",-1)),a(r,{options:o(i).eyetrack_vr_guide_nine},null,8,["options"]),e[15]||(e[15]=t("p",null,"Example of too high of a threshold:",-1)),a(r,{options:o(i).eyetrack_vr_guide_ten},null,8,["options"]),e[16]||(e[16]=t("p",null,"Example of a good threshold:",-1)),a(r,{options:o(i).eyetrack_vr_guide_eleven},null,8,["options"]),e[17]||(e[17]=s('

Repeat everything in this step for your left eye.

Step 5: Calibrating your eyes

Once your eye is trackable by the software we need to calibrate it.

Press the Restart Calibration button and look around. The important part is that you look to all extremes, all the way up, left, etc. Once you have done so, wait for the Mode to say Tracking

The next step is to center your eye.

Look straight forward and press the Recenter Eye button.

Your eye is now fully calibrated.

Repeat for your other eye.

',8)),a(l,{options:o(d).eyetrack_vr_guide_two},{content:u(()=>e[0]||(e[0]=[t("p",null," To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes. ",-1)])),_:1},8,["options"])]))}});export{k as __pageData,w as default}; diff --git a/assets/software_guide_osc_setup.md.af1d1fce.js b/assets/software_guide_osc_setup.md.9f8815ef.js similarity index 95% rename from assets/software_guide_osc_setup.md.af1d1fce.js rename to assets/software_guide_osc_setup.md.9f8815ef.js index 2a7e637..0b53f35 100644 --- a/assets/software_guide_osc_setup.md.af1d1fce.js +++ b/assets/software_guide_osc_setup.md.9f8815ef.js @@ -1 +1 @@ -import{_ as l,a as d}from"./chunks/index.339f98d7.js";import{_ as a,i}from"./chunks/index.c1fed1bd.js";import{o as p,c as u,k as t,a as r,E as o,w as h,l as n,O as s}from"./chunks/framework.47aa8d5b.js";const v=JSON.parse('{"title":"Setting up recalibration and recentering from VRChat.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/osc_setup.md","filePath":"software_guide/osc_setup.md","lastUpdated":1714430348000}'),c={name:"software_guide/osc_setup.md"},w=Object.assign(c,{setup(m){return(f,e)=>(p(),u("div",null,[e[1]||(e[1]=t("h1",{id:"setting-up-recalibration-and-recentering-from-vrchat",tabindex:"-1"},[r("Setting up recalibration and recentering from VRChat. "),t("a",{class:"header-anchor",href:"#setting-up-recalibration-and-recentering-from-vrchat","aria-label":'Permalink to "Setting up recalibration and recentering from VRChat."'},"​")],-1)),e[2]||(e[2]=t("p",null,"ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to set up your avatar to make use of OSC to trigger this from within VRC itself.",-1)),o(l,{options:n(d).parts_list_two},{content:h(()=>e[0]||(e[0]=[t("p",null," Note, while this page explains how to do it from the point of view of vrchat, it can be done in Resonite and CVR too, all the app listens for are two OSC messages. ",-1)])),_:1},8,["options"]),e[3]||(e[3]=s('

Setting up your parameters

Adding parameters

You'll need to add two parameters to your Parameters config, those being:

  • etvr_recalibrate: Bool
  • etvr_recenter: Bool

Both of them do not have to be synced, meaning they won't increase your total memory count.

To do this, in Unity, select your avatar on the scene and find Avatar Descriptor in the inspector. In it, find the section named "expressions", expand it and click on the file assigned to the "parameters" field, that's your Parameters config.

',6)),o(a,{options:n(i).unity_vrc_expressions},null,8,["options"]),e[4]||(e[4]=t("p",null,[r("Clicking on it will highlight the associated asset in the asset browser. Click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector, click on the "),t("code",null,"Add"),r(" button to add the parameters mentioned above. Both of them need to be of type Bool, but they don't need to be synced nor saved.")],-1)),o(a,{options:n(i).unity_vrc_expressions_add_fields},null,8,["options"]),o(a,{options:n(i).unity_vrc_expressions_fields},null,8,["options"]),e[5]||(e[5]=t("p",null,"That's it for the parameters.",-1)),e[6]||(e[6]=t("h3",{id:"adding-buttons-to-the-menu",tabindex:"-1"},[r("Adding buttons to the menu "),t("a",{class:"header-anchor",href:"#adding-buttons-to-the-menu","aria-label":'Permalink to "Adding buttons to the menu"'},"​")],-1)),e[7]||(e[7]=t("p",null,"Now, you will need to add actual buttons for them in your gesture menu.",-1)),e[8]||(e[8]=t("p",null,"The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.",-1)),o(a,{options:n(i).unity_vrc_expressions},null,8,["options"]),e[9]||(e[9]=t("p",null,'Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.',-1)),o(a,{options:n(i).unity_vrc_empty_control},null,8,["options"]),e[10]||(e[10]=t("p",null,`You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.`,-1)),e[11]||(e[11]=t("p",null,"Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.",-1)),e[12]||(e[12]=t("p",null,[r("Now, in the parameter section, click on the "),t("code",null,"[None]"),r(" and select one of the parameters you have created in the previous section.")],-1)),o(a,{options:n(i).unity_vrc_control_setup},null,8,["options"]),e[13]||(e[13]=s('

Repeat the steps for the other one.

Once done simply build and upload the updated version of your avatar.

And that's it, you now should be able to recenter and recalibrate your tracking form inside of VRC!

Resetting the OSC config in case the parameters don't work

Sometimes VRChat won't regenerate the config files that it uses to communicate the changes to anyone that's listening. To fix this, it's enough to simply delete the auto generated configuration files and let VRC remake them.

They are stored under

C:\\Users\\<user>\\AppData\\LocalLow\\VRChat\\VRChat\\OSC\\<your user uuid>\\Avatars\\

Deleting the contents of the Avatars directory will resolve the issue.

Other platforms

Like mentioned in the note, this functionality is not limited to VRC.

The app itself listens to OSC messages sent on port 9001 to two addresses:

  • /avatar/parameters/etvr_recenter
  • /avatar/parameters/etvr_recalibrate

It only needs to receive a Bool value of True to trigger the recenter and calibration.

The port and the addresses can be changed in the app settings, if need be.

',14))]))}});export{v as __pageData,w as default}; +import{_ as l,a as d}from"./chunks/index.c19b2931.js";import{_ as a,i}from"./chunks/index.41b0dfea.js";import{o as p,c as u,k as t,a as r,E as o,w as h,l as n,O as s}from"./chunks/framework.ece1a6f0.js";const v=JSON.parse('{"title":"Setting up recalibration and recentering from VRChat.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/osc_setup.md","filePath":"software_guide/osc_setup.md","lastUpdated":1714430348000}'),c={name:"software_guide/osc_setup.md"},w=Object.assign(c,{setup(m){return(f,e)=>(p(),u("div",null,[e[1]||(e[1]=t("h1",{id:"setting-up-recalibration-and-recentering-from-vrchat",tabindex:"-1"},[r("Setting up recalibration and recentering from VRChat. "),t("a",{class:"header-anchor",href:"#setting-up-recalibration-and-recentering-from-vrchat","aria-label":'Permalink to "Setting up recalibration and recentering from VRChat."'},"​")],-1)),e[2]||(e[2]=t("p",null,"ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to set up your avatar to make use of OSC to trigger this from within VRC itself.",-1)),o(l,{options:n(d).parts_list_two},{content:h(()=>e[0]||(e[0]=[t("p",null," Note, while this page explains how to do it from the point of view of vrchat, it can be done in Resonite and CVR too, all the app listens for are two OSC messages. ",-1)])),_:1},8,["options"]),e[3]||(e[3]=s('

Setting up your parameters

Adding parameters

You'll need to add two parameters to your Parameters config, those being:

  • etvr_recalibrate: Bool
  • etvr_recenter: Bool

Both of them do not have to be synced, meaning they won't increase your total memory count.

To do this, in Unity, select your avatar on the scene and find Avatar Descriptor in the inspector. In it, find the section named "expressions", expand it and click on the file assigned to the "parameters" field, that's your Parameters config.

',6)),o(a,{options:n(i).unity_vrc_expressions},null,8,["options"]),e[4]||(e[4]=t("p",null,[r("Clicking on it will highlight the associated asset in the asset browser. Click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector, click on the "),t("code",null,"Add"),r(" button to add the parameters mentioned above. Both of them need to be of type Bool, but they don't need to be synced nor saved.")],-1)),o(a,{options:n(i).unity_vrc_expressions_add_fields},null,8,["options"]),o(a,{options:n(i).unity_vrc_expressions_fields},null,8,["options"]),e[5]||(e[5]=t("p",null,"That's it for the parameters.",-1)),e[6]||(e[6]=t("h3",{id:"adding-buttons-to-the-menu",tabindex:"-1"},[r("Adding buttons to the menu "),t("a",{class:"header-anchor",href:"#adding-buttons-to-the-menu","aria-label":'Permalink to "Adding buttons to the menu"'},"​")],-1)),e[7]||(e[7]=t("p",null,"Now, you will need to add actual buttons for them in your gesture menu.",-1)),e[8]||(e[8]=t("p",null,"The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.",-1)),o(a,{options:n(i).unity_vrc_expressions},null,8,["options"]),e[9]||(e[9]=t("p",null,'Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.',-1)),o(a,{options:n(i).unity_vrc_empty_control},null,8,["options"]),e[10]||(e[10]=t("p",null,`You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.`,-1)),e[11]||(e[11]=t("p",null,"Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.",-1)),e[12]||(e[12]=t("p",null,[r("Now, in the parameter section, click on the "),t("code",null,"[None]"),r(" and select one of the parameters you have created in the previous section.")],-1)),o(a,{options:n(i).unity_vrc_control_setup},null,8,["options"]),e[13]||(e[13]=s('

Repeat the steps for the other one.

Once done simply build and upload the updated version of your avatar.

And that's it, you now should be able to recenter and recalibrate your tracking form inside of VRC!

Resetting the OSC config in case the parameters don't work

Sometimes VRChat won't regenerate the config files that it uses to communicate the changes to anyone that's listening. To fix this, it's enough to simply delete the auto generated configuration files and let VRC remake them.

They are stored under

C:\\Users\\<user>\\AppData\\LocalLow\\VRChat\\VRChat\\OSC\\<your user uuid>\\Avatars\\

Deleting the contents of the Avatars directory will resolve the issue.

Other platforms

Like mentioned in the note, this functionality is not limited to VRC.

The app itself listens to OSC messages sent on port 9001 to two addresses:

  • /avatar/parameters/etvr_recenter
  • /avatar/parameters/etvr_recalibrate

It only needs to receive a Bool value of True to trigger the recenter and calibration.

The port and the addresses can be changed in the app settings, if need be.

',14))]))}});export{v as __pageData,w as default}; diff --git a/assets/software_guide_osc_setup.md.af1d1fce.lean.js b/assets/software_guide_osc_setup.md.9f8815ef.lean.js similarity index 95% rename from assets/software_guide_osc_setup.md.af1d1fce.lean.js rename to assets/software_guide_osc_setup.md.9f8815ef.lean.js index 2a7e637..0b53f35 100644 --- a/assets/software_guide_osc_setup.md.af1d1fce.lean.js +++ b/assets/software_guide_osc_setup.md.9f8815ef.lean.js @@ -1 +1 @@ -import{_ as l,a as d}from"./chunks/index.339f98d7.js";import{_ as a,i}from"./chunks/index.c1fed1bd.js";import{o as p,c as u,k as t,a as r,E as o,w as h,l as n,O as s}from"./chunks/framework.47aa8d5b.js";const v=JSON.parse('{"title":"Setting up recalibration and recentering from VRChat.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/osc_setup.md","filePath":"software_guide/osc_setup.md","lastUpdated":1714430348000}'),c={name:"software_guide/osc_setup.md"},w=Object.assign(c,{setup(m){return(f,e)=>(p(),u("div",null,[e[1]||(e[1]=t("h1",{id:"setting-up-recalibration-and-recentering-from-vrchat",tabindex:"-1"},[r("Setting up recalibration and recentering from VRChat. "),t("a",{class:"header-anchor",href:"#setting-up-recalibration-and-recentering-from-vrchat","aria-label":'Permalink to "Setting up recalibration and recentering from VRChat."'},"​")],-1)),e[2]||(e[2]=t("p",null,"ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to set up your avatar to make use of OSC to trigger this from within VRC itself.",-1)),o(l,{options:n(d).parts_list_two},{content:h(()=>e[0]||(e[0]=[t("p",null," Note, while this page explains how to do it from the point of view of vrchat, it can be done in Resonite and CVR too, all the app listens for are two OSC messages. ",-1)])),_:1},8,["options"]),e[3]||(e[3]=s('

Setting up your parameters

Adding parameters

You'll need to add two parameters to your Parameters config, those being:

  • etvr_recalibrate: Bool
  • etvr_recenter: Bool

Both of them do not have to be synced, meaning they won't increase your total memory count.

To do this, in Unity, select your avatar on the scene and find Avatar Descriptor in the inspector. In it, find the section named "expressions", expand it and click on the file assigned to the "parameters" field, that's your Parameters config.

',6)),o(a,{options:n(i).unity_vrc_expressions},null,8,["options"]),e[4]||(e[4]=t("p",null,[r("Clicking on it will highlight the associated asset in the asset browser. Click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector, click on the "),t("code",null,"Add"),r(" button to add the parameters mentioned above. Both of them need to be of type Bool, but they don't need to be synced nor saved.")],-1)),o(a,{options:n(i).unity_vrc_expressions_add_fields},null,8,["options"]),o(a,{options:n(i).unity_vrc_expressions_fields},null,8,["options"]),e[5]||(e[5]=t("p",null,"That's it for the parameters.",-1)),e[6]||(e[6]=t("h3",{id:"adding-buttons-to-the-menu",tabindex:"-1"},[r("Adding buttons to the menu "),t("a",{class:"header-anchor",href:"#adding-buttons-to-the-menu","aria-label":'Permalink to "Adding buttons to the menu"'},"​")],-1)),e[7]||(e[7]=t("p",null,"Now, you will need to add actual buttons for them in your gesture menu.",-1)),e[8]||(e[8]=t("p",null,"The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.",-1)),o(a,{options:n(i).unity_vrc_expressions},null,8,["options"]),e[9]||(e[9]=t("p",null,'Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.',-1)),o(a,{options:n(i).unity_vrc_empty_control},null,8,["options"]),e[10]||(e[10]=t("p",null,`You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.`,-1)),e[11]||(e[11]=t("p",null,"Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.",-1)),e[12]||(e[12]=t("p",null,[r("Now, in the parameter section, click on the "),t("code",null,"[None]"),r(" and select one of the parameters you have created in the previous section.")],-1)),o(a,{options:n(i).unity_vrc_control_setup},null,8,["options"]),e[13]||(e[13]=s('

Repeat the steps for the other one.

Once done simply build and upload the updated version of your avatar.

And that's it, you now should be able to recenter and recalibrate your tracking form inside of VRC!

Resetting the OSC config in case the parameters don't work

Sometimes VRChat won't regenerate the config files that it uses to communicate the changes to anyone that's listening. To fix this, it's enough to simply delete the auto generated configuration files and let VRC remake them.

They are stored under

C:\\Users\\<user>\\AppData\\LocalLow\\VRChat\\VRChat\\OSC\\<your user uuid>\\Avatars\\

Deleting the contents of the Avatars directory will resolve the issue.

Other platforms

Like mentioned in the note, this functionality is not limited to VRC.

The app itself listens to OSC messages sent on port 9001 to two addresses:

  • /avatar/parameters/etvr_recenter
  • /avatar/parameters/etvr_recalibrate

It only needs to receive a Bool value of True to trigger the recenter and calibration.

The port and the addresses can be changed in the app settings, if need be.

',14))]))}});export{v as __pageData,w as default}; +import{_ as l,a as d}from"./chunks/index.c19b2931.js";import{_ as a,i}from"./chunks/index.41b0dfea.js";import{o as p,c as u,k as t,a as r,E as o,w as h,l as n,O as s}from"./chunks/framework.ece1a6f0.js";const v=JSON.parse('{"title":"Setting up recalibration and recentering from VRChat.","description":"","frontmatter":{},"headers":[],"relativePath":"software_guide/osc_setup.md","filePath":"software_guide/osc_setup.md","lastUpdated":1714430348000}'),c={name:"software_guide/osc_setup.md"},w=Object.assign(c,{setup(m){return(f,e)=>(p(),u("div",null,[e[1]||(e[1]=t("h1",{id:"setting-up-recalibration-and-recentering-from-vrchat",tabindex:"-1"},[r("Setting up recalibration and recentering from VRChat. "),t("a",{class:"header-anchor",href:"#setting-up-recalibration-and-recentering-from-vrchat","aria-label":'Permalink to "Setting up recalibration and recentering from VRChat."'},"​")],-1)),e[2]||(e[2]=t("p",null,"ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to set up your avatar to make use of OSC to trigger this from within VRC itself.",-1)),o(l,{options:n(d).parts_list_two},{content:h(()=>e[0]||(e[0]=[t("p",null," Note, while this page explains how to do it from the point of view of vrchat, it can be done in Resonite and CVR too, all the app listens for are two OSC messages. ",-1)])),_:1},8,["options"]),e[3]||(e[3]=s('

Setting up your parameters

Adding parameters

You'll need to add two parameters to your Parameters config, those being:

  • etvr_recalibrate: Bool
  • etvr_recenter: Bool

Both of them do not have to be synced, meaning they won't increase your total memory count.

To do this, in Unity, select your avatar on the scene and find Avatar Descriptor in the inspector. In it, find the section named "expressions", expand it and click on the file assigned to the "parameters" field, that's your Parameters config.

',6)),o(a,{options:n(i).unity_vrc_expressions},null,8,["options"]),e[4]||(e[4]=t("p",null,[r("Clicking on it will highlight the associated asset in the asset browser. Click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector, click on the "),t("code",null,"Add"),r(" button to add the parameters mentioned above. Both of them need to be of type Bool, but they don't need to be synced nor saved.")],-1)),o(a,{options:n(i).unity_vrc_expressions_add_fields},null,8,["options"]),o(a,{options:n(i).unity_vrc_expressions_fields},null,8,["options"]),e[5]||(e[5]=t("p",null,"That's it for the parameters.",-1)),e[6]||(e[6]=t("h3",{id:"adding-buttons-to-the-menu",tabindex:"-1"},[r("Adding buttons to the menu "),t("a",{class:"header-anchor",href:"#adding-buttons-to-the-menu","aria-label":'Permalink to "Adding buttons to the menu"'},"​")],-1)),e[7]||(e[7]=t("p",null,"Now, you will need to add actual buttons for them in your gesture menu.",-1)),e[8]||(e[8]=t("p",null,"The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.",-1)),o(a,{options:n(i).unity_vrc_expressions},null,8,["options"]),e[9]||(e[9]=t("p",null,'Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.',-1)),o(a,{options:n(i).unity_vrc_empty_control},null,8,["options"]),e[10]||(e[10]=t("p",null,`You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.`,-1)),e[11]||(e[11]=t("p",null,"Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.",-1)),e[12]||(e[12]=t("p",null,[r("Now, in the parameter section, click on the "),t("code",null,"[None]"),r(" and select one of the parameters you have created in the previous section.")],-1)),o(a,{options:n(i).unity_vrc_control_setup},null,8,["options"]),e[13]||(e[13]=s('

Repeat the steps for the other one.

Once done simply build and upload the updated version of your avatar.

And that's it, you now should be able to recenter and recalibrate your tracking form inside of VRC!

Resetting the OSC config in case the parameters don't work

Sometimes VRChat won't regenerate the config files that it uses to communicate the changes to anyone that's listening. To fix this, it's enough to simply delete the auto generated configuration files and let VRC remake them.

They are stored under

C:\\Users\\<user>\\AppData\\LocalLow\\VRChat\\VRChat\\OSC\\<your user uuid>\\Avatars\\

Deleting the contents of the Avatars directory will resolve the issue.

Other platforms

Like mentioned in the note, this functionality is not limited to VRC.

The app itself listens to OSC messages sent on port 9001 to two addresses:

  • /avatar/parameters/etvr_recenter
  • /avatar/parameters/etvr_recalibrate

It only needs to receive a Bool value of True to trigger the recenter and calibration.

The port and the addresses can be changed in the app settings, if need be.

',14))]))}});export{v as __pageData,w as default}; diff --git a/contact.html b/contact.html index 4df72e3..d3d933d 100644 --- a/contact.html +++ b/contact.html @@ -7,18 +7,18 @@ - + - - - + + + - + \ No newline at end of file diff --git a/dev_roadmap.html b/dev_roadmap.html index ba5f017..5553eb8 100644 --- a/dev_roadmap.html +++ b/dev_roadmap.html @@ -7,19 +7,19 @@ - + - - - - + + + +
Skip to content

Released under the MIT License.

- + \ No newline at end of file diff --git a/development/docs/dev_docs.html b/development/docs/dev_docs.html index 2ba0d7f..fce1fd3 100644 --- a/development/docs/dev_docs.html +++ b/development/docs/dev_docs.html @@ -7,18 +7,18 @@ - + - - - + + +
Skip to content

Development Documentation for the EyeTrackVR Docs Site

This is the documentation for the EyeTrackVR Docs site. It is built using VitePress.

Getting Started

Prerequisites

  • Node.js (v14.15.4 or higher)
  • Yarn (v1.22.10 or higher)
  • Git (v2.30.1 or higher)
  • VSCode (v1.56.2 or higher)

Installation

  1. Clone the repo

    sh
    git clone https://github.com/EyeTrackVR/EyeTrackVR-Docs.git
  2. Navigate to the vitepress folder

    sh
    cd vitepress
  3. Install Yarn packages

    sh
     yarn
  4. Start the dev server

    sh
    yarn dev
  5. Open the site in your browser

Contributing

Project Structure

  1. Familiarize yourself with the VitePress documentation.
  2. Then, move on to our project specific documentation below.

Standards

  • All documentation should be written in Markdown or Vue components.
  • All file names are snake case and lowercase letters.
  • Do not make naming changes to the vitepress folder.
  • Do not make major changes to the vitepress folder structure without proir consultation of team members.
  • For Vue componentes, follow the Vue3 docs.

Released under the MIT License.

- + \ No newline at end of file diff --git a/development/docs/pages.html b/development/docs/pages.html index 3db6734..3b7aab2 100644 --- a/development/docs/pages.html +++ b/development/docs/pages.html @@ -7,11 +7,11 @@ - + - - - + + + @@ -26,7 +26,7 @@ { text: "My Page", link: "/my_folder/my_page" }, // Add this line - subdir then file ], },

Note

The link property does not require a file extension. Please do not add it.

Title Style

The title style is the style of the title that appears at the top of the page.

We like to keep this cohesive, so please use the following style:

md
# My Page {.text-[var(--font-accent)]}

This will give the title a nice orange colour.

The {} are required, and the .text-[#e67e22] is the colour using TailWindCSS classes. You can also use our built in CSS variables {.text-[var(--font-accent)]}. You will find these in the src/styles/theme.css file. You can change this to any colour you like, but please keep it consistent with the rest of the site.

Tip

This entire site supports TailWindCSS classes. You can find the documentation here.

All classes you wish to add, must be prefaced with a . when inside of the {}.

When using classes on HTML elements, you can use the class attribute. For example:

html
<h1 class="text-[#e67e22]">My Page</h1>

Editing a Page

To edit a page, you will need to edit the Markdown file in the vitepress/docs/src/pages folder.

Released under the MIT License.

- + \ No newline at end of file diff --git a/development/docs/standards.html b/development/docs/standards.html index 4f4c254..4424ac5 100644 --- a/development/docs/standards.html +++ b/development/docs/standards.html @@ -7,11 +7,11 @@ - + - - - + + + @@ -26,7 +26,7 @@ - added new thing # some detail about the new thing BREAKING CHANGE: this is a breaking change #this line is optionaland only used if needed

Released under the MIT License.

- + \ No newline at end of file diff --git a/firmware_guide/configure_firmware.html b/firmware_guide/configure_firmware.html index f6b740e..fb5ea72 100644 --- a/firmware_guide/configure_firmware.html +++ b/firmware_guide/configure_firmware.html @@ -7,20 +7,20 @@ - + - - - - - + + + + +
Skip to content

Configuring the firmware

Once you have opened the project, you should see something on the left side like this

'img'

Open the ini/user_config.ini file

'img'

INFO

These settings are applicable only when using Wi-Fi for communication with your computer. If you are using USB, you can skip to reading about Environments.

Replace the placeholder text with your correct SSID (WiFi access point name), and password respectively.

INFO

Special characters such as ! and @ are not supported. If you have a special character in your password or ssid, you will need to change it.

Similarly, spaces are not supported in the SSID and password. If you have a space in either, you will need to change it.

The firmware supports AP mode, however it is not recommended. If you wish to use AP mode, you will need to set the enableadhoc to 1.

Then, you will need to set the ap_ssid to the name of your AP, and ap_password to the password of your AP.

You can choose to leave the ap_ssid and ap_password as defaults, but you will need to set the enableadhoc to 1.

Note: If you are enabling AP mode for both ESPs, you will need to set the ap_ssid and ap_password to different values for both ESPs. It is best to set AP mode only for one ESP, and leave the other ESP in STA mode. Connect the other ESP to the AP of the ESP in AP mode. Then connect your computer to the AP of the ESP in AP mode. This will allow you to connect to the ESP in AP mode, and the ESP in STA mode.

CAUTION

Make sure your WiFi router has a 2.4 GHz band. While most do, this is not always the case. Setting each band (5GHz, and 2.4GHz) to different SSIDs is recommended, though not required.

Double check that you have correctly entered your WiFi credentials and that said wifi network has a 2.4GHz band.

Additional configuration

mDNS

If you do not wish to manually keep track of the ESPs IP addresses and ports, you can enable the mDNS feature. This will allow you to connect to the ESPs using the following format: http://<some_name>.local. This feature only works when you are on the same network as the ESPs and have mDNS enabled on your computer. If you are using Windows, you can enable mDNS by following this guide.

OTA

The firmware supports OTA updates. This means that you can update the firmware without having to connect to the ESPs. To enable OTA updates, you will need to set the enableota to 1. Then, you will need to set the otapassword to the password you wish to use to update the firmware. You will need to use this password to update the firmware. If you do not wish to use a password, you can set the otapassword to nothing. This will allow you to update the firmware without a password. However, this is not recommended, as anyone on your network will be able to update the firmware.

You will also need to set the otaserverip to the IP address of the ESP you wish to update. This is the IP address of the ESP you wish to update. If you are using mDNS, you can use the mDNS name of the ESP you wish to update. For example, if you are updating the ESP with the dns set to http://esp32.local, you will need to set the otaserverip to http://esp32.local.

REST API

The firmware also supports a fully featured REST API. This means that you can control the ESPs using a REST API. This feature is enabled by defauly, and can not be turned off.

This feature is used more for advanced users, and is not required for basic operation.

The REST API was developed to be used by our new app (still in development). However, it can be used by any REST API client, you can not send POST requests to the ESPs using a browser though, so some REST API functionality can only be used by tools like Thunder Client or Postman.

The full REST API is documented here.

Environments

The firmware supports multiple environments. This means that we have full support for multiple types of ESPs. Each ESP is configured to be in a different environment. If you are using a different ESP, you will need to change the environment to the correct one.

Please reference the Firmware Enviroments Page for more information.

Now, move on to uploading the firmware

Released under the MIT License.

- + \ No newline at end of file diff --git a/firmware_guide/environments.html b/firmware_guide/environments.html index ffee916..ed73e63 100644 --- a/firmware_guide/environments.html +++ b/firmware_guide/environments.html @@ -7,19 +7,19 @@ - + - - - - + + + +
Skip to content

Firmware Environments

What is it?

A firmware environment is a way to store the custom firmware config for a specific device. This is useful if you want to have multiple devices with different firmware configs.

We use environments to store the firmware config for each device, so that you can easily switch between them.

Environments are broken up into two distinct parts:

  • The build type (e.g. debug, release)
  • The board type (e.g. espaithinker, esp32cam)

Build Types

We now have a couple of options letting us decide how we want to build the firmware.

  • Debug - The debug environment is the default environment and does not need to be specified. It has a lot of logging so it is useful for getting everything setup for the first time and to see what is going on.

  • _release - Has a lot less debugging, may also be missing some things available only in debug for debug purposes, this should be flashed when everything is working.

Examples:
xiaosenses3 - This is the debug environment.
xiaosenses3_release - This is the release environment for daily use.

Tip

We recommend starting with a debug environment, and then switching to release once everything is working. A debug environnement should not be used permanently.

Board Types

We currently support for several different boards, and we are working on adding more.

Warning

It is important to note that the esp32AIThinker environment is the default environment. Only switch your environment if you have another board or an environment is not working.

Most esp32Cams from Aliexpress will work with the esp32AIThinker environment, but some may require the esp32cam environment. Test the default environment first, and if it does not work, try the esp32cam environment.

Currently supported boards:

  • esp32AIThinker - This is the default environment. This is for the ESP32-AI-THINKER and generic alibaba/aliexpress/amazon esp cam boards.
  • esp32Cam - This is for the special ESP32-CAM, it is unlikely that you will need to use this environment.
  • esp32M5Stack - This is for ESP32M5Stack.
  • esp32WRover - This is for the ESP32WRover.
  • esp-eye - This is for the ESP-EYE (not the S3 variant).
  • wrooms3 - For FREENOVE-ESP32-S3 (wireless mode)
  • wrooms3QIO - For FREENOVE-ESP32-S3 (wireless mode, for boards with octal flash)
  • wrooms3USB - For FREENOVE-ESP32-S3 (wired mode)
  • wrooms3QIOUSB - For FREENOVE-ESP32-S3 (wired mode, for boards with octal flash)
  • xiaosenses3 - For SeedStudio's XAIO ESP32-S3 Sense (wireless mode)
  • xiaosenses3_USB - For SeedStudio's XAIO ESP32-S3 Sense (wired mode)

You can change the board enviroment by changing the default_envs argument in platformio.ini to a supported board like shown:

GIF showing a switch of board environments.

Released under the MIT License.

- + \ No newline at end of file diff --git a/firmware_guide/firmware.html b/firmware_guide/firmware.html index d2e2cca..59ca0be 100644 --- a/firmware_guide/firmware.html +++ b/firmware_guide/firmware.html @@ -7,18 +7,18 @@ - + - - - + + +
Skip to content

What is this?

Firmware is the second part of the equation to get your trackers going. It lives on the ESP32 chip, and is responsible for streaming video data from the tracker. We currently fully support wireless streaming over 2.4GHz, and are working on adding support for wired streaming to the main desktop App.

What should I download and where?

You can access the firmware, as well as flash your boards, using our new Firmware Flashing Tool.

Caution

This tool is currently in beta.

We are working on adding support for Over-The-Air (OTA) and configuring network settings. If you have any issues, please let us know by opening an issue on the repository.

This tool relies on our own solution called OpenIris, found here.

Note

You do not need to download OpenIris separately. The flashing tool will download it for you.

To check the status of the project, please visit the Development Road Map

I want to use VSCode - How would I do this?

Follow the steps described here

Released under the MIT License.

- + \ No newline at end of file diff --git a/firmware_guide/flashing_tool.html b/firmware_guide/flashing_tool.html index f8103fb..0559de5 100644 --- a/firmware_guide/flashing_tool.html +++ b/firmware_guide/flashing_tool.html @@ -7,19 +7,19 @@ - + - - - - + + + +
Skip to content

Firmware Flashing Tool

Before we proceed

Note

Step 1: Download and Install the Firmware Flashing Tool

  • Download the Firmware Flashing Tool Installer from the latest GitHub release.
  • Run the installer and follow the on-screen instructions to complete the installation of the Firmware Flashing Tool app.

Step 2: Run the Firmware Flashing Tool app

After the installation is complete, you should see an icon on your desktop. To open the application, double-click the icon.

You then should be greeted with a GUI that looks like this:

Flashing Tool ui lower half

Step 3: Select board.

We now have a couple of options letting us decide how we want to build the firmware.

  • Debug
    This is the default environment and does not need to be explicitly chosen. It includes extensive logging, making it ideal for initial setup and troubleshooting, as it provides comprehensive visibility into the system’s operation.

  • _release
    Has a lot less debugging, may also be missing some things available only in debug for debug purposes, this should be flashed when everything is working.

Press left click on the Select Board dropdown, then choose your desired board from the list. Once you've selected your board, click Confirm to move on to the next step.

preview of manage boards

Step 4: Flash firmware.

Once you're ready, hold down the B or IO0 button on your board and connect it to your PC. (The button may be small, but it's there). Next, click Install OpenIris and select the port corresponding to your board to complete the installation.

preview of how to install openiris

Step 5: That's it!.

Installation complete! Everything is set up and ready to go.
Click Show Logs to view the results.

preview of flashing success

Step 6: Logs.

If you choose the wired option, the correct logs should appear as follows.
If the logs don't look right, ensure that your camera is properly connected to the board.

logs

How to configure wifi.

Note

  • Please note that 5GHz networks are not supported by the hardware, so you will need to use a 2.4GHz network.

Step 1: Select board

Ensure that the selected board has a wireless mode checkmark below it.

preview of manage boards

Step 2: Configure wifi network

You'll need to provide information about the network you're planning to connect to.

SSID
The SSID is your Wi-Fi name, make sure it doesn't contain any special characters.

Password
You'll need to provide the password used to connect to the selected Wi-Fi network.

How to send wifi

Step 3: Send wifi credentials.

Once the installation is complete, unplug your board, then reconnect it to the PC without pressing any buttons and press Send credentials.

how to setup credentials

Step 4: Get working stream.

After sending is complete, disconnect your board, then reconnect it to the PC without pressing any buttons, and click Show logs.
Scroll down to find the text labeled IP: 192.168.XXX.XXX.

camera preview

This IP can then be entered into the app or a web browser like: http://192.168.XXX.XXX

Released under the MIT License.

- + \ No newline at end of file diff --git a/firmware_guide/mdns.html b/firmware_guide/mdns.html index 1cc5a5f..69cac2b 100644 --- a/firmware_guide/mdns.html +++ b/firmware_guide/mdns.html @@ -7,18 +7,18 @@ - + - - - + + +
Skip to content

MDNS

What is it?

mDNS is a protocol that allows you to connect to a device using a name instead of an IP address. This is useful if you do not know the IP address of the device, or if you do not want to keep track of the IP address of the device. This is also useful if you are using a device that does not have a static IP address.

In the mDNS protocol the IP address of the device can change, but the name of the device will always be the same. This means that you can connect to the device using the name of the device, even if the IP address of the device changes.

How to use it

Enable mDNS

The mDNS is enabled by default on the new firmware, and can not be disabled.

To use it, all you need to do is set the name of the device in the firmware config file.

This setting can be located under the [wifi] section of the ini/user_config.ini file.

ini
mdnsname = "openiristracker" # do not add .local

By default, the name of the device is openiristracker, however you can change it to whatever you want.

Change the name

Since you have two ESP32 devices, you need to make sure that the name of the device is different for each device. If you do not change the name of the device, you will not be able to connect to both devices at the same time.

Connect to the device

To connect to the device, you need to use the name of the device followed by .local. For example, if the name of the device is esp32, you can connect to the device using http://esp32.local.

Prerequisites Bonjour

Bonjour is required to use the mDNS protocol for windows and mac only. If you are using Windows, you can download Bonjour from here. If you are using macOS, Bonjour is already installed.

You can also get the fully tested Bonjour package from us here (for Windows only).

Troubleshooting

Can not connect to the device

If you can not connect to the device, make sure that the name of the device is correct. If the name of the device is correct, make sure that the device is connected to the network.

If the device is connected to the network, try to restart the device. If the device is still not connected, try to restart the router.

Released under the MIT License.

- + \ No newline at end of file diff --git a/firmware_guide/rest_api.html b/firmware_guide/rest_api.html index f3fb89f..38383c6 100644 --- a/firmware_guide/rest_api.html +++ b/firmware_guide/rest_api.html @@ -7,11 +7,11 @@ - + - - - + + + @@ -44,7 +44,7 @@ WIFI_POWER_2dBm = 8,// 2dBm WIFI_POWER_MINUS_1dBm = -4// -1dBm } wifi_power_t;
ParamDescription
txPowerThe power level to set.

Camera Params

ParamDescriptionValue Effect
vflipWhether to flip the frames vertically.0 or 1
framesizeA value between 0-7 indicating the frame resolution.Larger number - higher resolution.
hflipWhether to flip the frames horizontally.0 or 1
qualityThe JPEG quality level: 1-63?Smaller number = higher quality, more latency and less fps
brightnessThe agc_gain of the camera.Larger number = more bright.

Released under the MIT License.

- + \ No newline at end of file diff --git a/firmware_guide/setup_vscode.html b/firmware_guide/setup_vscode.html index fedff1e..0dc795e 100644 --- a/firmware_guide/setup_vscode.html +++ b/firmware_guide/setup_vscode.html @@ -7,19 +7,19 @@ - + - - - - + + + +
Skip to content

Setting up the environment

This procedure will show how to prepare your system for uploading the firmware to your tracker.

1. Install Visual Studio Code

Download the latest Visual Studio Code and install it.

Download


'img'

Install


'img'

2. Install the drivers

In order to flash the firmware, you'll need some drivers, mainly the CH340 drivers, here's where to get them from:

https://learn.sparkfun.com/tutorials/how-to-install-ch340-drivers/all

3. Install PlatformIO IDE

Once Visual Studio Code is installed, open it and install PlatformIO IDE for VSCode, an extension that will allow you to connect to the tracker, build and upload the firmware.

'img'

4. Clone the firmware project

Make sure you close any current projects you have open or open a new window before moving forward with these steps.

  1. Go to https://github.com/EyeTrackVR/OpenIris and clone the latest version from the main branch.
    1. If you do not have git installed please install it from here.

    2. Open Git Bash.

'img'
  1. Change the directory to the directory that you want the firmware to be cloned. Ex: cd C:/
'img'
  1. Clone the repository by entering the command: git clone https://github.com/EyeTrackVR/OpenIris.git
'img'

For more info about cloning please refer to this documentation

Do not download as a zip - please only properly clone the project, take note of the path you run the clone command in, this is where the files will be downloaded. When we open it in PlatformIO later, this path will be needed.

  1. Open the firmware in VSCode by going to PlatformIO, selecting open, then navigating to OpenIris/ESP folder and opening it.
'img'

This is an adaptation from SlimeVR. Some Credit goes to the SlimeVR team adapted from here

Released under the MIT License.

- + \ No newline at end of file diff --git a/firmware_guide/update_platformio.html b/firmware_guide/update_platformio.html index 9fd4e56..f1451bf 100644 --- a/firmware_guide/update_platformio.html +++ b/firmware_guide/update_platformio.html @@ -7,19 +7,19 @@ - + - - - - + + + +
Skip to content

Updating Platformio

Sometimes, when building and uploading the firmware, you may run into bizarre, even-though the code is correct - platformio will refuse to build and instead will complain with some weird error.

It usually means that either PlatformIO, or ArduinoSDK got and update and that's the moment when this guide may come in handy.

Updating PlatformIO itself

There are two ways to update your platformio installation

Via CLI

You can update it easily by simply typing in one command into your terminal.

pio upgrade command in the terminal
  1. Open a terminal / command prompt
  2. Type pio upgrade and press enter
  3. Wait for it to finish
  4. Done

Via PlatformIO in Visual Studio Code

You can also update it using the platformio tab in your Visual Studio Code.

  1. Open VSC
  2. Click on that little and icon on the sidebar
Platformio logo button
  1. A side panel will open, there will be a couple of sections, one of them called Quick Access, open it.
Platformio logo Quick Access Section
  1. In Quick Access section, click on the Miscelleneous tab
Platformio miscellaneous section
  1. Then, click on the Upgrade PlatformIO Core
Platformio upgrade core button
  1. Wait for it to finnish and done!

Upgrading the SDK

You'll also need to upgrade the SDK from timem to do this

Upgrading the SDK via VSC

  1. Follow the guide above up until clicking on the Quick Access section.
  2. Instead, open the PIO Home and select Open
Platformio open home
  1. This will open a window for PlatformIO dashboard, in there, click on a Platforms button on the sidebar
Platformio platforms sidebar
  1. Once there, you should see a couple of tabs next to the side bard, things like Installed or Embedded. Click on Updates
Platformio platforms sections
  1. Locate a platform called Espressif 32 and click on Update to <version>
Platformio platforms update view
  1. Wait until it is done and that's it!

Released under the MIT License.

- + \ No newline at end of file diff --git a/firmware_guide/upload_and_update_firmware.html b/firmware_guide/upload_and_update_firmware.html index e5bfaa3..ab128d0 100644 --- a/firmware_guide/upload_and_update_firmware.html +++ b/firmware_guide/upload_and_update_firmware.html @@ -7,13 +7,13 @@ - + - - - - - + + + + + @@ -24,7 +24,7 @@ otaserverip = "openiristrackerL.local" # here we use a custom mDNS name otapassword = "12345678" otaserverport = 3232
  1. Change to OTA env

To do that, in visual studio code, locate the uplaod button, next to it will be listed a couple of buttons and your current environment.

For example, if you have a working esp32AIThinker environment, you would change your environment to esp32AIThinker_OTA.

Click on it.

'An example of how the popup list of envs looks like'

This will open a list of all available environments, select the one that matches your board and has a _OTA suffix

'An example of how the button for selecting env looks like'
  1. Restart the ESPs, they must be power cycled
  2. Press the upload button to upload the firmware.

    img
  3. Do not touch esps or move them during OTA upload
  4. Wait around 1 minute.
  5. Repeat for as many trackers as you need.

Finding the IP address of your tracker

Connect your tracker to your PC and then open a serial monitor in VSC by pressing the plug icon.

'platformio serial monitor button'

Now, press the restart button on the esp itself. watch the monitor for output like this:

'img of platformio serial monitor'

The text, highlighted in green for demonstration, is the stream address of the camera. Take note of this for input into the software.

Keep in mind while testing and getting set up, the ESP can only have one client, to use the camera in the app, make sure you close the browser tab you tested it in.

Updating the firmware to the newest version

To update the firmware you'll need to follow a couple of steps.

  1. Open a terminal and enter the directory you've cloned OpenIris into, for example cd C:/OpenIris/

  2. Save your current changes to the config using git stash

  3. Download the newest changes from the repo using git pull

  4. Apply your saved changes so that you don't have to retype your WI-FI credentials using git stash apply

CAUTION

Skip this step if the update message denotes that the config had changed. If it does so, retype your credentials in the updated files.

4.1. If anything went wrong, you can reset everything to the default state using git reset --hard and then retyping your credentials

  1. Upload your firmware following steps from the uploading section

Troubleshooting

If you encountered an issue while following these steps check the FAQ.

If you don't find an answer to your question there ask in #questions channel in the discord, we will be happy to help.

Adapted from the SlimeVR docs, Some Credit goes to the SlimeVR team here

Released under the MIT License.

- + \ No newline at end of file diff --git a/getting_started/intro.html b/getting_started/intro.html index 1bdc238..48ba25a 100644 --- a/getting_started/intro.html +++ b/getting_started/intro.html @@ -7,20 +7,20 @@ - + - - - - - + + + + +
Skip to content

EyeTrackVR

EyeTrackVR is a Source First, affordable eye-tracking platform designed specifically for Virtual Reality—especially for Social VR experiences like VRChat. It works by sending real-time eye tracking data over OSC or UDP, making it compatible with many existing VR applications.

Whether you're here to build your own tracker, contribute to development, or explore how it works, you're in the right place.


Get Started

This documentation covers everything from assembly and firmware setup to headset mounting and safety. If you're new to the project, we recommend starting with the following pages:

CAUTION

This project is under active development, but it's already working reliably for many users. Your feedback helps us improve!


Eye Safety Notice

Eye safety is a top priority. Infrared (IR) light is invisible but not harmless—especially at close distances and high intensities. EyeTrackVR has built-in safety measures, but users must also follow proper precautions.

Always use the recommended LEDs, wiring, and firmware settings.

DANGER

Never bypass safety features or swap out IR components without understanding the risks. Doing so could result in permanent eye damage.

Our default configuration stays well below international safety thresholds (see ICNIRP guidelines), but it's your responsibility to:

  • Use non-focused emitters
  • Keep total radiant intensity below 5 mW/sr
  • Verify LED brightness with an IR camera
  • Stop using the device if you feel warmth or discomfort in your eyes
WARNING
Please pay attention

Use only non-focused LEDs, and ensure total output is 4 mW/sr or less.

Safety References

Effect of infrared radiation on the lens
Photobiological safety of LED light sources
ICNIRP Guidelines (0.38 to 3 µm)
Training Library – NIR Standards


Hardware Overview

See our Parts List and Hardware Repository to source components, print mounts, and prepare your setup.

Firmware

The firmware powering EyeTrackVR's ESP32 cameras is called OpenIris, developed by lorow.
You can find it here on GitHub.


Headset Compatibility

EyeTrackVR can work with any VR headset—but not every model has a 3D-printed mount available yet.

Check our mount list to see if your headset is supported.
If not, you’re welcome to design your own or wait for a community-sourced version.


Community & Support

Join our Discord server for updates, and community projects. We’re excited to have you on board!

'discord banner'

Released under the MIT License.

- + \ No newline at end of file diff --git a/getting_started/led_safety.html b/getting_started/led_safety.html index d21fd74..d98dd83 100644 --- a/getting_started/led_safety.html +++ b/getting_started/led_safety.html @@ -7,11 +7,11 @@ - + - - - + + + @@ -35,7 +35,7 @@ Ie = Ie₍20ₘₐ₎ × I / 20 mA E (per LED) = Ie / A E_total = E × (# of LEDs)

Appendix B – Quoted Guideline (ICNIRP 2013)

“To avoid thermal injury of the cornea and possible delayed effects on the lens of the eye (cataractogenesis), infrared radiation (780 nm < λ < 3 µm) should be limited to 100 W m⁻² (10 mW cm⁻²) for lengthy exposures (> 1000 s).”

ICNIRP Guidelines on Limits of Exposure to Incoherent Optical Radiation (2013)
PDF


If you have suggestions, believe these calculations are inaccurate, or wish to contribute improvements, please open a discussion on GitHub. Your feedback helps us keep everyone safe.

Released under the MIT License.

- + \ No newline at end of file diff --git a/getting_started/things_to_know.html b/getting_started/things_to_know.html index 041e871..a6ea11e 100644 --- a/getting_started/things_to_know.html +++ b/getting_started/things_to_know.html @@ -7,18 +7,18 @@ - + - - - + + +
Skip to content

Things To Know Before You Start

This page is an overview of things to know and understand before you start this project

Software is not final

Bugs can and will occur which may hinder the experience or usability at times. Do not expect 100% reliable and perfect function. Not all features are fully developed yet.

Firmware may have user difficulties

As our firmware matures, bugs may creep up that make the process not flawless.

IR emitters can be dangerous

If handled wrong or precautions are ignored you can and will cause damage to your eyes. Please make sure to only buy linked emitters at calculated power or ones with specs that match exactly. We will not be responsible for damage caused if you go your own route. Our official kits are designed to be well within safety limits when used as designed.

Documentation may be incomplete

Important steps may be missing or unclear. We are working to bring documentation to completeness but it is a large undertaking and takes time. Feel free to ask questions in our Discord if things are unclear.

Once you have acknowledged the items above, move on to the Full Build Guide

Released under the MIT License.

- + \ No newline at end of file diff --git a/hashmap.json b/hashmap.json index 6ebfa87..ca6b588 100644 --- a/hashmap.json +++ b/hashmap.json @@ -1 +1 @@ -{"development_docs_pages.md":"85e22694","firmware_guide_update_platformio.md":"d52a99e0","about.md":"055b7111","firmware_guide_setup_vscode.md":"fefbbc55","getting_started_led_safety.md":"78277ff3","how_to_build_led_setup.md":"6d99addb","firmware_guide_environments.md":"6b0604e7","headset_guides_valve_index.md":"891da17f","how_to_build_3d_printed_mounts.md":"5d2aa5cb","firmware_guide_configure_firmware.md":"4eb536cf","contact.md":"034a53d4","development_docs_standards.md":"f9558435","misc_jlc3dp.md":"5e8875c4","misc_vrc_avatar_setup.md":"2d1bc492","getting_started_things_to_know.md":"4cd89e47","how_to_build_part_list.md":"3640f4dd","index.md":"269511a8","software_guide_build_software.md":"b0d1c681","software_guide_eyetrackvr_app_guide.md":"dce4a9fb","software_guide_osc_setup.md":"af1d1fce","getting_started_intro.md":"d6d8f855","firmware_guide_rest_api.md":"8a0ea54a","firmware_guide_upload_and_update_firmware.md":"0806ea0f","how_to_build_v4_full_build.md":"0dd3c5e7","how_to_build_preparing_xiao.md":"fcacda59","how_to_build_preparing_cameras.md":"0a4aab5a","software_guide_vrcft_tracking_module.md":"d148b9dc","firmware_guide_mdns.md":"8a95e855","firmware_guide_firmware.md":"6c8e1ae6","dev_roadmap.md":"2f96c918","development_docs_dev_docs.md":"b7b0d76e","how_to_build_full_build.md":"f324b1f6","how_to_build_parts_list.md":"d57cd54a","firmware_guide_flashing_tool.md":"c180a2ca","misc_faq.md":"a2c23752","headset_guides_what_is_this.md":"60052a7d","archive_fox_ir_v2_build_instructions.md":"ebf3c880","how_to_build_creating_your_own_mount.md":"70ac1088"} +{"contact.md":"11afb62a","firmware_guide_firmware.md":"300bf02a","how_to_build_3d_printed_mounts.md":"26a27ef1","firmware_guide_mdns.md":"046e48da","firmware_guide_setup_vscode.md":"b24c20ae","how_to_build_parts_list.md":"075e6e8f","how_to_build_v4_full_build.md":"f873c9bf","firmware_guide_update_platformio.md":"02ea0fb7","how_to_build_preparing_cameras.md":"e4e61b6c","firmware_guide_rest_api.md":"302dda8a","misc_faq.md":"1b8caa13","misc_jlc3dp.md":"aa8f0fcf","how_to_build_part_list.md":"69b5aa87","software_guide_build_software.md":"aa1553be","software_guide_vrcft_tracking_module.md":"b34c3266","dev_roadmap.md":"881dcb79","development_docs_dev_docs.md":"a6e54c81","how_to_build_full_build.md":"6f33011b","software_guide_osc_setup.md":"9f8815ef","misc_vrc_avatar_setup.md":"b22f00a0","archive_fox_ir_v2_build_instructions.md":"536f1af3","headset_guides_valve_index.md":"2a84f8ad","firmware_guide_flashing_tool.md":"e2b12f74","development_docs_pages.md":"d059df93","getting_started_led_safety.md":"910fc2df","firmware_guide_configure_firmware.md":"7944a4ab","getting_started_intro.md":"1f5b1337","development_docs_standards.md":"84a36195","about.md":"ce94d681","firmware_guide_environments.md":"4cf0bd9b","software_guide_eyetrackvr_app_guide.md":"832069a1","index.md":"780db674","getting_started_things_to_know.md":"99db9ad8","firmware_guide_upload_and_update_firmware.md":"c675cc09","how_to_build_led_setup.md":"5f02b3d6","headset_guides_what_is_this.md":"7430c224","how_to_build_preparing_xiao.md":"840809cc","how_to_build_creating_your_own_mount.md":"5b60d788"} diff --git a/headset_guides/valve_index.html b/headset_guides/valve_index.html index 848751f..819aef8 100644 --- a/headset_guides/valve_index.html +++ b/headset_guides/valve_index.html @@ -7,18 +7,18 @@ - + - - - + + +
Skip to content

Valve Index

These are two proven/tested ways to do a clean ETVR build on the Valve Index. Don't treat this as a must follow, but a setup to go for if you don't have other plans.

Physics-Dude's 160° V18 (mirror the STL for left)

Foow17's 130 / 160°

Foow17's 130 / 160° VROPTICIAN

Frosty704's 160/120° WidmoVR Mount

Please note due to the LED positioning, these will require you to use the included 110mm extensions included in the V4 Kit

V4 LED Kit Assembly

MUTEtheCyberwolf's DEV Frunk Mod:

DevFrunk1HMD

Mod Details

The DEV Frunk is a popular choice for ETVR on the Index. Replacing the original index frunk entirely, it has multiple mounting points for both the XIAO's, a Vive Facial Tracker (or project babble!), and cutouts for 30x30x7mm fans.

It also provides excellent ventilation simply due to the design being much more open, as well as a flip up design for the face tracker mount.

Combined, it creates a clean setup with no need for hot glue or alternatives to mount your hardware.

Extra Parts Needed:

I recommend a screw kit like this one

  • 1x T5 Torx Screwdriver
  • 1x H3.0 Screwdriver
  • 1x Soldering Iron for heat inserts
  • 8x M4x8.1 Heat Inserts AliExpress Choose Size: M4 (OD 6mm)50pcs | Color: Length 8mm
  • 6x M4x10 Screws AliExpress Choose Size: M4 20pcs | Length: 10mm
  • 1x M4x30 Screws AliExpress Choose Size: M4 20pcs | Length: 30mm

3D Printed Mounts

Found at MUTEtheCyberwolf's GitHub Repo

You will need to print:

  • 1x Coverplate for XIAO Retention Clip (Logo or no Logo)
  • 1x XIAO Retention Clip (Letters or no Letters)
  • 1x Eyetrack VR Prototype XIAO Mount.stl
  • 1x FacialTrackerBeerHingeVIDEVFrunk1.stl
  • 1x FacialTrackerBridgeVIDEVFrunk1.stl
  • 1x ValveIndexDEVFrunk1.stl
    • Alternatively, if you are interested in routing the ribbon cables internally, this modified DEV Frunk has holes at the top for sliding through ribbon cables and power cables. Example

Drawing1

Assembly Details:

1. Heat Inserts

  1. Start with inserting your heat inserts to the designated holes on the frunk. Place the heat inserts so the side with the smaller radius sits in the hole
  • When heating up the inserts, let the weight of the soldering iron do the work, they make take a few seconds to start moving on their own.
    • Do not push down, and remove the iron when they are level with the print. It doesn't need to be perfect, so take your time!

FRUNK

Bottom picture courtesy of amoistman

  1. Next, place a heat insert into the bigger hole of the facial tracker bridge

BRIDGE

  1. Lastly, place another heat insert into the thick side of the beer hinge

HINGE

  1. Your finished heat inserts should look like this

INSERTSEXAMPLE

Picture courtesy of amoistman

2. Screws

Now you're done with the hardest part! We can move onto screwing in the XIAO Mount and Facial tracker bridge onto the frunk, into the heat inserts we just inserted.

  • The XIAO mount should be placed so the longer side is not blocking the fan holes
  • If you have trouble screwing them in, try screwing them equally to distribute the pressure more evenly.
    • Screw one a little, screw the opposite the same amount, repeat.

M4SCREWGUIDE

Two last things to screw in will be the beer hinge and vive facial tracker or babble case if you have it

  1. Place the smaller hole of the beer hinge inbetween the bridge's screw holes.
    • Screwing in opposite of where the heat insert is. You should be screwing into the heat insert

M4SCREWGUIDE2

  1. For the last screw, repeat the same steps, but line up your face tracker or babble case. Screw from the same direction, into the heat insert of the beer hinge. Use either an M4x10 or an M4x30. I find the M4x10 sometimes loses tension, while the M4x30 doesnt.

  2. Your final result should look like this FINAL

3. Mounting components

  1. You can now push the XIAO's into the mount, making sure they are down snug, if you haven't already.

XIAO

  1. Place your V4 LED kit PCB into the middle of the XIAO Retention Clip. Ensure the hole in the PCB alligns with the small bump on the retention clip. You will have to slide it in and push it under the overhangs until they snap over the PCB.

XIAO-V4

  1. Route your V4 LED connectors through the coverplate holes prior to putting it on

V4POWER

  1. Place the coverplate ontop of the LED PCB until the front of it snaps down and locks it over the retention clip.

  2. Then you can slide the retention clip over your XIAO mount to keep them in place.

4. Replacing frunk

PLEASE UNPLUG YOUR INDEX FROM POWER BEFORE CONTINUING

You must have a T5 Torx screwdriver to remove the original index frunk screws, we will use the same screws to hold the dev frunk in place.

Picture courtesy of iFixit

T5SCREWS

  1. If you do not have fans, and are mounting a USB Hub infront, I recommend now plugging in the USB hub through the fan holes, as you won't be able to after dev frunk is screwed on.

Alternatively, you can use the USB C port below the middle bottom screw, and passthrough a hub with a FEMALE USB-C/A to MALE USB A cable

  1. Once the frunk is removed, line up your DEV Frunk and screw it back in the same way. Support it in a way you can screw in without it falling.

T5SCREWS2

Physics-Dude's Gumstick USB Hub Dongle

newnewnewnwe

Mod Details

Physics-Dude's Gumstick Dongle provides a way to cleanly install EyeTrackVR, all fitting into the frunk. It will require significantly more tinkering and ability to solder.

Installation instructions and BOM available on Physics-Dude's Repo

Released under the MIT License.

- + \ No newline at end of file diff --git a/headset_guides/what_is_this.html b/headset_guides/what_is_this.html index 4611139..08a2870 100644 --- a/headset_guides/what_is_this.html +++ b/headset_guides/what_is_this.html @@ -7,18 +7,18 @@ - + - - - + + +
Skip to content

What are "Headset Specific Guides"?

This is an initiative to provide specific information on specific headsets. Any weird quirks, recommended 3d printed mounts and different setup types are to be included on a page.

Complete submissions will receive a 50% off coupon for the ETVR store. Partial completions (one specific mount) will receive 15% off coupons to show our appreciation and provide an incentive. (reach out to me in dms to receive the code @prohurtz)

Thank you for working to improve EyeTrackVR's accessibility!

Guidelines

Please keep it as concise as possible, and spell check before submitting. You can submit by making a PR on github, or sending the .md file to #documentation in the ETVR Discord pinging @prohurtz . Take a look at the Valve Index guide for inspiration.

file name: headset_name.md ex. HTC_Vive_Pro_2.md, Bigscreen_Beyond.md

Page formatting and template:

Headset Name

Xyz's mod:

[image(s) of mod (limit ~2)]

Mod Details

This mod supports lens inserts and is very compact and easy to use. It provides good frunk ventilation and wide hardware support.

Extra Parts Needed:

  • 2x Camera extensions
  • 2x Camera extension connectors

Parts Link (If the parts needed are not on the additional parts page, let me know. You can also just directly link to them.)

3D Printed Mounts

Found at Xyz's GitHub

You will need to print:

  • 2x camera mount
  • 2x frunk mount

Lens insert support Yes/No: Yes Compatable mount

Note

There are 160 and 130-degree variants for camera mounts; pick which one corresponds with your cameras.

Assembly Details:

(make sure to include quirks of setup not covered in other parts of documentation)

First, screw an M2 screw into the hole on part A:

[image showing "part A" and screw]

You must have a Torx screwdriver set to remove the frunk screw, do so now.

[image]

Then attach part b and tighten:

[image]

Now clip on [image]

Abc's mod:

[image(s) of mod (limit ~2)]

Mod Details

This mod supports lens inserts and is very compact and easy to use. It provides good frunk ventilation and wide hardware support.

Extra Parts Needed:

  • 2x Camera extensions
  • 2x Camera extension connectors
  • 50 M3 screws Parts Link (If the parts needed are not on the additional parts page, let me know. You can also just directly link to them.)

3D Printed Mounts

Found at Abc's GitHub

You will need to print:

  • 2x camera mount
  • 2x frunk mount

Lens insert support Yes/No: Yes Compatable mount

Note

There are 160 and 130-degree variants for camera mounts; pick which one corresponds with your cameras.

Assembly Details:

(make sure to include quirks of setup not covered in other parts of documentation)

First, screw an M2 screw into the hole on part A:

[image showing "part A" and screw]

You must have a Torx screwdriver set to remove the frunk screw, do so now.

[image]

Then attach part b and tighten:

[image]

Now clip on [image]

Released under the MIT License.

- + \ No newline at end of file diff --git a/how_to_build/3d_printed_mounts.html b/how_to_build/3d_printed_mounts.html index d02c7dc..e6e44ee 100644 --- a/how_to_build/3d_printed_mounts.html +++ b/how_to_build/3d_printed_mounts.html @@ -7,21 +7,21 @@ - + - - - - - - + + + + + +
Skip to content

3D Printed Mounts

Mounts with a next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.

NOTE

Keep in mind, some mounts only have the right(or left) version available. You may need to use blender or a slicer to mirror the STL for the other side.

Dont see your headset?

There may be mounts in the Discord that have not been added here. Check out the #community-mounts fourm for additional mounts here.

Released under the MIT License.

- + \ No newline at end of file diff --git a/how_to_build/creating_your_own_mount.html b/how_to_build/creating_your_own_mount.html index d13b821..00044bc 100644 --- a/how_to_build/creating_your_own_mount.html +++ b/how_to_build/creating_your_own_mount.html @@ -7,18 +7,18 @@ - + - - - + + +
Skip to content

Creating Your Own Mount

This page will include a basic rundown on how to create your own camera mount for a headset that may not have any existing community mounts

So, you have a headset that does not have any mounts or none that work well for you. Here I will show some simple steps to get some form of a mount working.

Step 1: Find a way to mount to your headset's lens

The easiest way to get started is to find a lens protector for your headset. You can visit a website like Thingiverse or do a search for "3d printed lens protector for {your headset here}"

Example: Here is a lens protector for the Quest 1/2 and Rift S https://www.thingiverse.com/thing:3653631

Step 2: Find a camera mount

Now, you need a way to attach the camera. We have a basic design created by qdot, based on his mount on the hardware GitHub here

Alternatively, you can create your own mount if you have the skills.

Step 3: Place the camera mount where it will give a good camera angle

The "Ideal" location is a place that gives a good view of the pupil when looking to all extremes, the lower corners do a good job at getting there, or nearly there.

It is recommended to place the camera as close as possible to the headset's lens to maximize the view of the eye. I recommend looking at other headset mounts for inspiration.

Step 4: Mount your LEDs

You can either add parts to your mount for holding the LED boards or just glue them on. It's up to you and what works best for you, experiment!

Step 5: Test everything

It is unlikely you will get a perfect mount on the first try. Print, test, adjust, and repeat until you have a satisfactory mount. Good luck!

Step 6: Get your mounts listed

Send me the mount to be added to the docs here! You can upload it to Thingiverse or similar services, or just send me the .STLs via discord (Prohurtz#0001)

Released under the MIT License.

- + \ No newline at end of file diff --git a/how_to_build/full_build.html b/how_to_build/full_build.html index 1a11768..99d87eb 100644 --- a/how_to_build/full_build.html +++ b/how_to_build/full_build.html @@ -7,21 +7,21 @@ - + - - - - - - + + + + + +
Skip to content

V3 Build Guide

This page will contain a step-by-step assembly guide.

Updated documentation for V4 is still in progress and not updated here, please be patient.

This guide provides a walkthrough on the assembly of a wireless V3 eye tracking. V4 specific final docs are Work In Progress: V4 LED Solderless assemblly rough edit:

Sketch of V4 solderless wiring:

Sketch of V4 wiring

Credit: @balty via Discord

Sketch of solder assembly of V4:

Sketch of V4 wire

Nevertheless, it's worth noting that these instructions are also mostly applicable to those who are using wired or V4 trackers.

Step 1: Make sure your have read the Things to know before you start guide

This will give you a basic overview of the project's status and what to expect currently.

Step 2: Order all the parts listed on our Parts list

Please take note of the fact that hardware still may change, although with more developments it seems like we are going to stick with current hardware.

Step 3: Wait for things to arrive

Long shipping times from China are f u n. Please allow anywhere from 2 weeks to 2 months for everything to arrive.

Step 4: Gather up all of your hardware

Make sure you have at least the following:

'img of components'

'ESPs, cams, a programmer and a USB connector'

Step 5: Install external antennas or shield ESP antenna with an antistatic bag

Some ESP-CAM boards have issues with signal integrity, there are 2 things you can do to help/solve the issues.

The first option is to use an external antenna.

This is the best solution when it comes to the final result. If you have Vive/Tundra trackers, this is a REQUIRED step. The interference from the trackers will make your ESP stream unusable. An antistatic bag does not help in this case. Unfortunately, removing the antenna is not super easy, you have to either move a resistor or, remove it and bridge 2 solder pads. The attached image below shows the orientation of the pads that need to be connected, depending on the mode You can not bridge all connections and have both antennas active at the same time. The 0-ohm resistor does not need to be on the board, you can simply bridge the connections.

Below is an example of bridging the connections and attaching an antenna.

'img of external antenna resistors'

The second option is to cover the ESP's antenna with an antistatic bag. This can help aid problems, and can completely solve them in some cases. Best of all, it is completely free! However, it should be noted that it performs worse than an external antenna and in certain cases will not solve the issue like if you have Vive trackers.

Step 6: Attach cameras to ESPs

Look at your ESP and locate the camera ribbon cable connector as circled below.

'img of camera socket'

Flip the gray part up to allow the cameras to be connected. Do not force it, or shove objects into it to open, fingernails are fine.

'img of camera clip'

Now slide in a camera, please note that the pins are facing down, you should only see the black part.

'img of camera cable'

Once the camera has been slid in, press the gray part of the connector back down. There will be a small amount of force but still be gentle. Note the ammount of black coming out of the connector.

'img of camera cable'

Step 7: Connect ESP to the programmer to flash

Why flash before you have it assembled? It's simple, to make sure they actually work before you spend time soldering to them.

Slide your ESP into the programmer, and note the USB port goes away from the ESP's camera.

Step 8: Configure Visual Studio Code and prepare to flash the firmware

Check out our guide on Setting up VS Code

Once VS Code is set up, move on to the next step.

Step 9: Plug in your ESP and flash the firmware

Our guide, Building and uploading the firmware manually has steps on how to do this. After it has flashed, make sure you get a video stream in your browser, then power it down and flash your next ESP.

Step 10: Connect your power wires to a USB Type-A board

WARNING

Powering from the programmer board will not work correctly. This delivers a lower voltage which results in dim LEDs and video artifacts. These are highly likely to mess up tracking.

Get two pairs of wire, preferably two different colors, Cut them to length (56mm in my case) and twist together two for ground and two for 5V. Here I used speaker wire where the copper denotes positive and silver negative. Then, strip the wires to about 3mm of exposed wire.

Step 11: Cut wires for IR LEDs

To find the optimal length, take a piece of wire and a marker and mock up your wire route, and mark the wire, cut it, then make another at the same size for the other eye. You will need 3 different cuts of wire. 2 short ones for connecting the 2 PCBs per eye together, 2 Longer ones for power, or ground and 2 slightly longer ones for power or ground for the LED near the camera at the bottom.

Once cut, strip them to around 4mm of exposed wire.

Step 12: Twist the positive USB wire and positive IR LED wires together and tin them

Once twisted together add solder to keep them together. This makes the connection much easier.

Step 13: Solder the positive wire to ESP

Lay the wire on the outside of the 5V pin and apply solder.

Step 14: Solder the negative wire to ESP

Repeat Step 12 but with the negative wires.

INFO

As a user in our discord has learned, you can short the IO12 pin with the ground pin (GND) without issues.

In the below example I put it on the top of the pin, It will be a weak-ish joint but that's where glue comes in handy.

Step 15: Wire up the 2nd ESP

Repeat steps 12-14 with the 2nd ESP.

Step 16: Prepare to solder IR LED PCBs

Get your magnifying glass out, it's time to solder very smol things.

Gather 4 PCBs, 4 IR LEDs, and either 4 ~350ohm.


357ohm resistors and V3 PCBs

Here are the PCB pin-out labels:


V3

LED labels:


The green markings and notched corners mark the positive sides of the LEDs pictured above.

If you have different LEDs, please consult their datasheet.

Some terminology related to them:

5V: 5-volt power in.

GND: Ground or power out.

AR: After-Resistor this is to be used as the power in on the 2nd PCB in series as resistors are not needed on the 2nd PCB since they are on the 1st one.

SNG: Single resistor, use this as 5V in if you are using only 1 ~700ohm resistor on V3 boards (not recommended).

Negative: This marks the negative side of the LED.

Positive: This marks the positive side of the LED.

Step 18: Solder resistors on PCB V3

You only need 1 PCB to have resistors per eye.

Tin the resistor pads. Note: in this example, I use too much solder, it should only be enough to lightly cover the pad.

Next, grab a resistor and hold it on the pads.

While holding the resistor add solder to your soldering iron and apply it to the resistor.

I like to do this by having a piece of my solder stick up in the air and then put it on my iron that way.

Flip the PCB and solder the other end.

Now repeat for the other one.

Solder LEDs on PCB V3

Tin the LED pads.

Orientate the LED and hold it in place.

Solder one end.

Flip around and solder the other end.

Wire up the PCBs V3

WARNING

Pay attention to the direction of the LEDs on the PCBs.

If the green dot is facing inwards toward the text like in the picture below:

Use the following diagram:

If the green dot is facing away from the text like the picture below:

Use the following diagram:

Step 19: 3D print mounts

Head to the 3D printed parts section of the parts list here.

Find which parts are for your headset and print them. Some may work better or worse, it is recommended to test all of them if there are multiple, print one of each kind. If none work, try making an edit yourself if you have the skills. If you have made a mount make sure to ping me, Prohurtz#0001, so I can add them to the list.

Having trouble getting them to fit? Try resizing the mounts up, or down a little to ensure a good fit.

There are 2 different types of mounts, how to secure the camera to each type will be documented below.

Type 1

This uses a method of sliding in the camera. Generally, this is the recommended mounting method as it generally requires no glue.

Place the camera into the mount

Slowly apply pressure inwards until the camera snaps into place.

NOTE

There is a good chance of breaking the mount when putting in the camera. If this happens you may be able to save the mount depending on where the break was. A small dab of hot glue around the camera is likely all that is needed.

Type 2

This method involves gluing the camera in place.

Apply a bit of glue to the bottom of the camera mount.

Place the camera on the mount.

IR LED mounting

This again differs from mount to mount.

In some cases, there are designated spots for the LEDs to go.

In others there are no specified spots, you will have to mess around to find what works best. This image shows the optimal/near-optimal position for the LEDs. Hot glue is your friend with this.

TIP

Use rubbing alcohol to easily remove hot glue.

Released under the MIT License.

- + \ No newline at end of file diff --git a/how_to_build/led_setup.html b/how_to_build/led_setup.html index 36feb47..9f1c04b 100644 --- a/how_to_build/led_setup.html +++ b/how_to_build/led_setup.html @@ -7,18 +7,18 @@ - + - - - + + +
Skip to content

Pardon the mess, this page is WIP more docs for other configurations and assemblly are in the works.

How to assemble a V4 mini LED hardware kit:

Getting to know your hardware

There are 3 main components of an IR LED kit; the mainboard, LEDs and wires.

Mainboard

Below is the V4 mini mainboard with major features labled. V4mini
V4mini_back

LEDs

There are 2 different types of LED boards. The one you should have more of are the "N" LEDs. N stands for Normal, these make up 3 of the leds per eye. nLED
NLEDback

The second type is the "E" LEDs. E stands for End as these are put at the end of the LED strand.

eLED
eLEDback

In future orders the "E" LEDs will be purple for easier distinction. eLEDpurple

Wires

The included wires are a bit special, they have 3 pins on the connectors but only 2 wires are attached. v4wire

This distinction is crutial in assembling a kit as the wires need to go in a specific orientation outlined in the assembly picture which shows the pins without wires as dashes - - -.

Wiring up V4 mini

Start by pluggin in the long wires to the main board like shown.

notpluggedr
pluggedinr

Then connect the wires to leds in the sequence:

Mainboard -> N LED -> N LED -> N LED - > E LED

You need to pay very close attention to the orientation of the wires so that the missing wire is facing the correct way. The following image shows a kit fully assembled:

v4minifull

Here is an example of the right eye's LED strand.

v4minireye

How to assemble V4 Lite LED kit:

Getting to know V4 lite

V4 lite is a soldering-required approach to LEDs. There are a few specific caveats to know before assembling and using this hardware.

  1. The board must be supplied with 5v.

    • Other voltages may result in darker/non functioning LEDs.
  2. You must change resistors if you change from a single or dual eye setup to the other.

    • Not doing so will result in too dim of LEDs or extremely bright LEDs. Ensure you are always using the correct one for your application.
  3. Shorts on the main board can result in damaged hardware, dangerously bright LEDs, or nonfunctioning hardware.

    • Please ensure there are no shorts (even very small stray solder strands) between any pins or solder joints on the main board or LEDs.

Wiring up V4 Lite

First, decide if you want dual eye or single eye operation and pick the appropiate resistor.

Single Eye:
Use the 130ohm resistor marked with Black, Black, and Gold middle rings:

v4litesingleeye

Dual Eye:
Use the 65ohm resistor marked with Yellow, White and Gold middle rings:

v4litedualeye

Now, solder the resistor on the board (any orientation), and then the black 3 pin voltage regulator (orientation matters, solder on the side with the white outline and have it fit in the outline's shape)

v4litemainboardassem

Now, wire up the LEDs like shown.

v4litefullassmb

Released under the MIT License.

- + \ No newline at end of file diff --git a/how_to_build/part_list.html b/how_to_build/part_list.html index 4817940..b06f5e4 100644 --- a/how_to_build/part_list.html +++ b/how_to_build/part_list.html @@ -7,18 +7,18 @@ - + - - - + + +
Skip to content

WIP new parts list. 3D printed parts will live on their own page.

Use the interactive tables below to select parts!

Required Parts:

ComponentChoiceAmountCostCost AllLinks
ESP Microcontroller
★ Seeed Studio XIAO Sense ESP32-S3
2$12.87~$28.92AliExpress XIAO Sense Recommended
Camera
★ 130 Degree NO-IR
2$5.41~$10.82AliExpress Select "Color: 75MM-130 Degree" Must manually remove IR filter
IR LEDs
★ Official V4 mini No-Solder
1$30.00~$37.00ETVR Store Length depending on HMD
USB Hub
★ 4 port USB 3.2 LDLrui (MTT Usually) (Best for Cost)
1$17.99~$19.99Amazon Usually these are MTT, but sometimes not
3D Printed Mounts
Print Yourself
000

Total: $0.00

Additional Parts:

ComponentChoiceAmountCostCost AllLinks
Type A USB Breakout
Bring Your Own
000
USB-C Breakout
Bring Your Own
000
Wire for ESPs
Bring Your Own
000
Wire for LEDs
Bring Your Own
000
Camera Extension Cables
Bring Your Own
000
Camera Extension Connectors
Bring Your Own
000
External Antennas
Bring Your Own
000
USB-C Cables
Bring Your Own
000
V4 LED Wire Extensions/Replacements
Bring Your Own
000

Total: $0.00

Table modified greatly from the table on SlimeVR's Docs which was created by Carl

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wired over USB Serial

Wired Capable ESPs:

  • Seeed Studio XIAO Sense
  • FREENOVE ESP32-S3-WROOM CAM Board

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerate up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required compared to ESP32-CAM boards

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be slightly more costly
  • When in use with a Vive Facial Tracker or other bandwidth sensitive components, a MTT USB hub is required or the devices will be unusable (low FPS).
  • Requires beta app versions until the v2.0 app is released

Option 2: Wireless over WiFi 2.4 GHz

Wireless Capable ESPs:

  • Seeed Studio XIAO Sense
  • ESP32-CAM
  • FREENOVE ESP32-S3-WROOM CAM Board

This offers a good starting point as the ESP32-CAM boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they don't really make sense.

Pros:

  • Less cables (power only)
  • No issues with USB hubs
  • Easier to flash

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • High risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • Uses more power and heats up due to radio power needs

Released under the MIT License.

- + \ No newline at end of file diff --git a/how_to_build/parts_list.html b/how_to_build/parts_list.html index db0df46..ecb7be2 100644 --- a/how_to_build/parts_list.html +++ b/how_to_build/parts_list.html @@ -7,21 +7,21 @@ - + - - - - - - + + + + + +
Skip to content

Parts List

CAUTION

Please note that no hardware has been fully set in stone, all purchases are at your own risk in case of hardware changes.

NOTE

It is good practice to buy more than needed in some cases, namely cameras,programmers and ESPs. This reduces the risk of a DOA (dead on arrival) causing a delay.

ESP setup options:

DANGER

There are two primary categories of trackers supported: wireless and wired. It's super important that you really look at all your options and consider your use case before making a decision.

Option 1: Wireless over WiFi 2.4 GHz

This offers a good starting point as the ESP boards are cheaper than wired capable trackers. However, they can be a bit more temperamental and if you are using a wired headset, they start to make less sense.

Pros:

  • Wider user adoption and greater support
  • Low weight, less cables, easier to manage

Cons:

  • Requires two external antennas for optimal streaming quality
  • Requires WiFi 2.4 GHz router or access point in reasonable proximity
  • Risk of radio interference with FBT and other WiFi 2.4 GHz devices
  • ESP32-CAM uses more power and heats up due to radio module power needs

Option 2: Wired over USB Serial (in beta)

This is our latest setup recommended for users with wired headsets such as the Valve Index.

Pros:

  • Much better performance and higher framerates up to 70 FPS with lower latency
  • No conflicts with advanced FBT setups such as Vive or Tundra Trackers
  • Can be wireless or wired
  • Less soldering required

Cons:

  • Requires USB port i.e. on Valve Index and USB hub mounted on your headset
  • Can be more costly

Required parts

With that in mind, here are the required parts for the setup.

Tracker boards:

    • 2x XIAO ESP32-S3 Sense Modules
      Very small size, wireless and wired support, does not require an additional programmer or separate antennas: SeedStudio

    AliExpress

    Alternatively:

    • 2x Freenove ESP 32-S3 WROOM
      Much larger, price may be higher than the XIAOs, supports wired and wireless as well, does not need a separate programmer, does not support a separate antenna. Amazon
  • A cheaper, wireless only alternative:

    • 2x ESPCAM32 Modules - They are cheaper, requires a separate programmer board, supports only wireless streaming and may require some soldering for attaching separate antennas: AliExpress
      This board also requires a special programmer board in order to flash the firmware. You'll need only one: AliExpress for just programmers or Amazon for 3 ESP32-Cams and programmers without the proper cameras

    • 2x External antennas for ESPs Required if you're running vive/tundra full body tracking or having issues with streaming. See the full build guide on how to configure the ESP board for antenna use.

Cameras

Camera modules:

The cameras that come with the boards will not work, they have an IR filter inside.

The filter can be removed, but doing so may break your cameras. Here's how to do it: https://www.youtube.com/watch?v=QYH-FWvDbDc

DANGER

If you decide to remove the filter, wear eye protection while doing so, the removal of the filter will shatter it.

  • 2x OV2640 160° FOV IR / Night vers 75mm (850nm)

(select 75MM-160 850nm) AliExpress

Amazon alternative (note that you will have to manually remove the IR filter)

Things worth noting:

  • There is an experimental option to purchase OV2640 130° FOV cameras and manually remove the IR filters. This can result in a clearer view of the eye and is smaller so it allows for HMDs like the Bigscreen Beyond, but it's not a default recommendation just yet. Checkout the listing "75MM-130 Degree" AliEXpress

  • If the cameras are Dead on Arrival (DOA), keep in mind that you can swap the lenses with the ones that come with the stock cameras that were included with the ESP32 boards, though they do require extension cables. I recommend just buying more (3-4 instead of just 2).

  • Optional Ribbon extensions:

Certain mounts may require a cable extension (ex: MUTE's frunk mod) To use a mount like that you will need a cable and a connector for each camera. Headsets like the Quest 2 do not require extensions if the camera boards are mounted at the bottom of the headset, near the facial interface.

Extensions (select 0.5mm, A-Forward Direction, 24P) AliExpress (200mm for MUTE's)

Connectors (select 24P) Aliexpress

USB Hubs - for if you are building the wired version

  • 1x USB 3.0+ hub The hub needs to support MTT if you wish to use a vive face tracker with the ESPs. Here is a hub that supports MTT and is not expensive Amazon

Ensure that it is of good quality, lightweight, compact in size, and I suggest a minimum of four ports - one for the face tracker, one for the LED kit, and two for ESP32-S3 boards. Ensure that you acquire appropriate USB-A to USB-C adapters wherever required. For example the Valve Index only has one USB-A port. Be wary that "mini" adapters with the short ends may not work properly. Ensure the adapter has a long end. Such adapter Amazon.

  • 2x USB C cables (as short as possible) to connect both ESPs (select 0.05m/5cm) AliExpress or AliExpress USB C to USB A As the ESP32-S3 has USB-C connectors, you may require some USB-C to USB-A cables depending on your USB hub. It's worth noting that the HTC Face Tracker requires a USB-C port, so you may need to consider this requirement as well. You may also make custom cables using USB breakout boards of your choice and wire.

Wires and adapters

If you are soldering and using custom cables:

IR emitters

We recommend getting the official kits:

Alternatively you can source the parts for V3 yourself:

DANGER

If they look like something you would find in a TV remote, do NOT use them. Even if you think you can alter them THEY WILL NOT WORK AND PUT YOU AT RISK. If you aren't exactly sure what you are doing, buy them from the LCSC or Digikey link.

DO NOT BUY FOCUSED ONES!

  • 4x Unfocused SMD IR emitters

    NOTE

    The smaller ones can not be soldered at temps above 245C or they will burn. Low temp solder is recommended.

  • 4x IR emitter PCBs (highly recommended) Gerber files and schematics located here.

  • 4x 350ohm 1206 SMD resistors for IR emitters (If you are not using PCBs for the emitters then buying regular through-hole resistors is acceptable)

  • 357 ohm Digikey here

  • 348 ohm LCSC here

This ensures you get the correct IR emitter parts. If you are a Patreon please check out discount codes available to you, and also check out unit pricing.

3D Printed Mounts

Mounts with a next to them are the recommended mounts for the respected hmd. This is based on user feedback on what works best for most people.

NOTE

You'll need both - a mount for the IR emitters and a mount for the camera boards, some files include both, some don't.

Misc parts/tools

AliExpress (Generic)
Amazon (Generic)

  • 2x-4x Heatsinks (Optional) - for the ESP32-CAM AliExpress (14mm for ESP, 8mm for voltage regulator)

Other Headsets

If you own another headset not listed above, that means there are no mounts designed for them yet. If you have basic skills in modeling or think up a solution to mount cams and emitters, please try to make a mount and then let us in the discord know so it can be added here. Any headset that can fit the camera is potentially compatible. If you are willing, give it a shot to design a mount for the rest of the community.

Check out our basic guide on making your own mount here.

TIP

If you have a headset mount that is not listed above, please let us know in the discord so it can be added here.

Released under the MIT License.

- + \ No newline at end of file diff --git a/how_to_build/preparing_cameras.html b/how_to_build/preparing_cameras.html index 5d41bf3..d8a5904 100644 --- a/how_to_build/preparing_cameras.html +++ b/how_to_build/preparing_cameras.html @@ -7,19 +7,19 @@ - + - - - - + + + +
Skip to content

IR Filter Removal

Some cameras require a removal of the IR filter, so the sensors are able to pick up the lighting provided by the IR LED's. Many times, the IR filter will still be on the 160° night vision model. If your feed looks dark, this may be why!

130° IR Filter removal

160° IR Filter removal

Blurry Camera?

If your feed looks blurry in the ETVR app, you likely need to focus the cameras by turning the lens. They are glued in place from factory, but easily breakable with pliers.

Use a point of reference like the LED's while holding the camera, rotate the lens with pliers in either direction and watch if the feed gets more or less blurry. Repeat until you dial it in nicely. You should do this prior to mounting the cameras or atleast prevent mounting and unmounting them too many times or you risk breaking them.

Protecting a Camera Ribbon Cable

The ribbon cables that these cameras use are notoriously prone to damage rendering them useless.

By wrapping them in tape such as electrical tape and following best practices covered in the guide, you can significantly reduce the risk of killing a camera.

It is recommended to do this before building your setup so you are less likely to kill a camera in the process of building a setup.

Wrapping the Camera Ribbon

First get a roll of electrical tape to wrap the camera ribbon. It does not strictly need to be electrical tape, but that is what I have found to work good, (and look good too).

Place the camera on the tape so that the entire bottom area including the sensor are covered and that one side of the camera ribbon has slightly more tape (helps make it look good).

Cut the tape from the roll, here I used flat cutters. Be careful to not cut the camera connector in the process.

With the tape cut from the roll, lay it down and get out a X-ACTO knife.

Begin to cut around the camera connector so the tape can be peeled off.

When each side has been cut, begin to peel off the part that covered the connections.

Now, carefully cut around the camera sensor part to remove its "skirt" leaving tape on the back of it.

Gently pull off this outline of tape from the camera.

Begin to wrap the tape along the ribbon cable by first folding in the slightly shorter side.

Fold over the other side.

And you are done!

Best Practices When Handling Cameras

  • Do not pull or jerk on the ribbon
  • Do not fold tightly or bend the ribbon cable sharper than ~45 degrees if possible
  • Do not expose to sharp objects or crevices
  • The less wear while handling or putting on/off a headset the better
  • Do not unmount and mount the cameras repetitively.

Conclusion

You have successfully wrapped your camera to be protected and learned the best practices with handling cameras!

Released under the MIT License.

- + \ No newline at end of file diff --git a/how_to_build/preparing_xiao.html b/how_to_build/preparing_xiao.html index de4779b..2a19c24 100644 --- a/how_to_build/preparing_xiao.html +++ b/how_to_build/preparing_xiao.html @@ -7,19 +7,19 @@ - + - - - - + + + +
Skip to content

How to prepare a Seeed Studio XIAO Sense ESP32

What's in the box

Your XIAO should come with the following components:

  • ESP32-S3 Main Board
  • Camera Hat With Low FOV Camera
  • External Antenna
'img of xiao esp'

Seeed Studio XIAO Sense ESP32 Contents

Wired vs Wireless

The only difference in hardware config between wireless and wired XIAOs is if the antenna is connected or not.

Wireless Configuration

If you are making a wireless setup, you will need to connect the antenna.

Line up the antenna connector to the one on the board,

'img of xiao esp'

then press firmly until it snaps on.

'img of xiao esp'

Once connected it should be flat like this:

'img of xiao esp'

Wired Configuration

If you are making a wired setup, you do not need to attach the antenna. Set it aside and continue to the next step.

Connecting the Camera Hat

First, locate the connector on the camera hat, and the corresponding one on the XIAO main board circled below.

'img of xiao esp'

Press down carefully until it snaps on.

'img of xiao esp'
'img of xiao esp'

Once connected remember to be careful, it is known that these connectors can break semi-easily so avoid ripping them apart too many times or twisting on them weirdly.

Removing the Camera

First we need to remove the existing camera from the XIAO and replace it with a higher FOV longer ribbon camera.

Begin by lifting up the grey part of the camera connector gently until it raises up.

'img of xiao esp'
'img of xiao esp'

Now grab the camera and gently wiggle it out of the connector.

'img of xiao esp'
'img of xiao esp'

Connecting the camera

The camera should have the pins facing downward, you should only see the black end.

Line up the camera with the pins on the connector like below.

'img of xiao esp'

Push the camera in by using a finger on each side of the connector, slowly pushing straight in until it stops. Be gentle so you do not damage the ribbon cable.

'img of xiao esp'

The cable should go about half way in like this image:

'img of xiao esp'

Now, close the camera connector by flipping the grey part down.

'img of xiao esp'
'img of xiao esp'

Conclusion

You should now have your XIAO Sense ESP32 ready for firmware flashing!

Released under the MIT License.

- + \ No newline at end of file diff --git a/how_to_build/v4_full_build.html b/how_to_build/v4_full_build.html index a5e393f..a306059 100644 --- a/how_to_build/v4_full_build.html +++ b/how_to_build/v4_full_build.html @@ -7,24 +7,24 @@ - + - - - + + +
Skip to content

V4 Build Guide (WIP)

This is a heavily unfinished docs page for a V4 setup build.

After following our part's list you should have the following components.

You should have the following parts:

2 × Supported ESP32 Camera Boards
-2 × OV2640 Cameras Without IR Filters
-2 × V4 IR emitter Kit
+2 × OV2640 130 or 160 Degree Cameras Without IR Filters
+1 × V4 IR Emitter Kit
 3 × USB-C cables
 1 × USB hub
 1 × Set of 3D printed mounts
-

Prepare you hardware

Follow the docs pages for preparing the LEDs, cameras and XIAO ESPs.

Flash the OpenIris firmware onto the ESPs.

Prepare and assemble the 3d printed mounts

Clip the LEDs into the 3d printed mounts, routing the wires up to the top of the headset.

Attach the cameras to the mount carefully. If you are using 130 degree cameras you might need to hotglue them depending on the mount. Glue the plastic housing and not the lens or back of the camera (it will melt).

Now, carefully attach the mounts to your lens and route the camera cables down and out, and the LED wires up and through the top of the headset gasket.

Now, attach the ESPs to your headset by hot-gluing a mount or whatever other mount they use.

Attach your headset gasket carefully now.

Wiring it up

Now, connect your USB hub to your headset and connect the ESPs and LED board with USB-C cables.

Attach any ESP antennas now to your headset.

Cable manage!

Software

At this point you should have all of your hardware and firmware ready so it is time to set-up the tracking app.

Wired

On Windows, you will need to open Device manager and find the COM port. (you may have this from the firmware flashing step). Under Serial Devices (Com) there will be a list of devices. You can unplug an ESP and see which one disconnects which will be the port of the ESP. Enter this into the app under the cooresponding eye (right or left) like COM4.

Wireless

When flashing the firmware you will have set a MDNS address like ETVR-left.local. Enter this into the app under its corresponding eye.

Released under the MIT License.

- +

Prepare you hardware

Follow the docs pages for preparing the LEDs, cameras and XIAO ESPs.

Flash the OpenIris firmware onto the ESPs.

Prepare and assemble the 3d printed mounts

Clip the LEDs into the 3d printed mounts, routing the wires up to the top of the headset.

Attach the cameras to the mount carefully. If you are using 130 degree cameras you might need to hotglue them depending on the mount. Glue the plastic housing and not the lens or back of the camera (it will melt).

Now, carefully attach the mounts to your lens and route the camera cables down and out, and the LED wires up and through the top of the headset gasket.

Now, attach the ESPs to your headset by hot-gluing a mount or whatever other mount they use.

Attach your headset gasket carefully now.

Wiring it up

Now, connect your USB hub to your headset and connect the ESPs and LED board with USB-C cables.

Attach any ESP antennas now to your headset.

Cable manage!

Software

At this point you should have all of your hardware and firmware ready so it is time to set-up the tracking app.

Wired

On Windows, you will need to open Device manager and find the COM port. (you may have this from the firmware flashing step). Under Serial Devices (Com) there will be a list of devices. You can unplug an ESP and see which one disconnects which will be the port of the ESP. Enter this into the app under the cooresponding eye (right or left) like COM4.

Wireless

When flashing the firmware you will have set a MDNS address like ETVR-left.local. Enter this into the app under its corresponding eye.

Released under the MIT License.

+ \ No newline at end of file diff --git a/index.html b/index.html index 66363de..24cf7b3 100644 --- a/index.html +++ b/index.html @@ -7,11 +7,11 @@ - + - - - + + + @@ -19,7 +19,7 @@
Skip to content

EyeTrackVR Docs

Source First and affordable VR eye tracking.

For Social VR Games via OSC and UDP protocol.

ETVR logo

Released under the MIT License.

- + \ No newline at end of file diff --git a/misc/faq.html b/misc/faq.html index 0d09d54..af27186 100644 --- a/misc/faq.html +++ b/misc/faq.html @@ -7,19 +7,19 @@ - + - - - - + + + +
Skip to content

Frequently Asked Questions



Released under the MIT License.

- + \ No newline at end of file diff --git a/misc/jlc3dp.html b/misc/jlc3dp.html index e68c907..c4c54ed 100644 --- a/misc/jlc3dp.html +++ b/misc/jlc3dp.html @@ -7,18 +7,18 @@ - + - - - + + +
Skip to content

3D Printing Service JLC3DP

If you don't own a 3D Printer, you can order high quality prints by the dollar using JLC3DP

https://jlc3dp.com/3d-printing-quote

Upload your STL files with the following print settings

Do note that if you are printing for a example, a lens mount, you may need to mirror it in blender, or any slicer, to get both a left and right STL and upload them separate. Do not upload them combined

UploadJLC

Choose a cheaper shipping option, for me this is global standard direct line

Shipping

In the likely event you get an email or alert from JLC asking for consent to print as the STL has thin walls, you can agree to the print without worry.

Released under the MIT License.

- + \ No newline at end of file diff --git a/misc/vrc_avatar_setup.html b/misc/vrc_avatar_setup.html index 03f7346..300df3f 100644 --- a/misc/vrc_avatar_setup.html +++ b/misc/vrc_avatar_setup.html @@ -7,19 +7,19 @@ - + - - - - + + + +
Skip to content

How to set up your avatar for eye tracking:

Here is an avatar setup video created by a contributor:

Another good resource is the VRC Face Tracking Wiki and their Discord.

We currently use the following paramaters

LeftEyeX

RightEyeX

EyesY

LeftEyeLidExpandedSqueeze

RightEyeLidExpandedSqueeze

NOTE

We currently only support float parameters, please adjust your setup accordingly.

Released under the MIT License.

- + \ No newline at end of file diff --git a/software_guide/VRCFT_tracking_module.html b/software_guide/VRCFT_tracking_module.html index c56d3e0..867d232 100644 --- a/software_guide/VRCFT_tracking_module.html +++ b/software_guide/VRCFT_tracking_module.html @@ -7,12 +7,12 @@ - + - - - - + + + + @@ -21,7 +21,7 @@
Skip to content

VRCFT ETVR Tracking module, or simply the ETVR tracking module

What is this?

VRCFT ETVR Tracking module is an extension for VRCFT. It allows ETVR to send out tracking data and have it converted to parameters expected by VRCFT and avatars compatible with VRCFT.

In effect, ETVR will be compatible with whichever game or program that supports VRCFT, thanks to this module.

It is required for all avatrs that are setup to use Unified Expression(UE) or V2 parameters, optional for ones setup with so-called legacy or v1 parameters.

What do I need and how do I set this up?

To make ETVR work with VRCFT, you'll need two things. VRCFT itself, and the tracking module.

Required programs / Files

VRCFT

To get VRCFT head over to: their docs page!

ETVR Module

Once you've installed VRCFT, you can find the most recent version of the module in the registry.

Screenshot showcasing the VRCFT module registry, with ETVR Tracking Module selected

Clicking on install will download and load the module, VRCFT will now be setup to listen for ETVR data. That's it!

Setting up ETVR to use the module

Screenshot showcasing the settings page of ETVR, explaining how to setup the VRCFT module
  • Open settings tab
  • Under OSC section select Use the ETVR Module
  • Select the desired parameters - V1 or V2 (UE)
  • Go back into the tracking tab

Settings will apply automatically, no need to change port or restart the app. ETVR will automatically start sending the data to the module.

Sending the tracking data to VRCFT running on a separate PC.

Screenshot showcasing the settings page of ETVR, explaining how to setup ETVR to talk to a different PC

If you're running a hybrid setup where one machine does all of the ETVR tracking, and the other has VRCFT and other software running, you'll need to adjust the settings a bit.

First, make sure that both machines are on the same network and they can see each other. If they're connected via Ethernet to the same router, or to the same WiFi network, things should just work.

Next, find out that's the IP address of the machine running VRCFT. For how to, refer to Microsoft's documentation

With that, head over to ETVR, select the VRCFT Module Settings tab. Notice the VRCFT Module listening IP section. By default it's set to 127.0.0.1, change it to the IP the PC that runs VRCFT.

Reseting the module to default settings in case something went wrong.

Screenshot showcasing the settings page of ETVR, explaining how to reset the ETVR Module

This is also taken care of by the app, simply make sure that VRCFT is running and the ETVR module got loaded in.

Then, in ETVR head back over to VRCFT Module Settings tab and hit Reset Settings to default.

This will reset the module's settings to default values for both - ETVR and VRCFT.

There's a breaking change reported, what does that mean? What do I do?

When we say there's a breaking change, we mean that something changed so drastically that there's a high chance of the module failing to load. This is a very rare thing, usually happens when settings get modified so much that they're no longer compatible.

In such cases, deleting the module's settings file is enough. Check the FAQ section - Where's the module's configuration file? For locating and deleting it.

Dev version of the module for testing

Sometimes, we'll have a new version of the module ready for test, or a special one with a lot of additional logging to help us debug some stuff on your end. This version won't be available in the registry right away so how you install it?

  1. Uninstall any pre-existing EVT Modules:

Uninstall your current ETVR Module installation.

Similarly to installing it for the first time, navigate to VRCFT's module registry, find the ETVR Module and hit uninstall.

  1. Download the latest build:

Download the latest release / pre-release from the repo or from the discord.

  1. Install the development version:

Navigate to:

C:\Users\<Your PC name>\AppData\Roaming\VRCFaceTracking\CustomLibs

And place the module there. If CustomLibs doesn't exist yet, create it. VRCFT will use it to load the development version of the module next time you launch the app.

Building from source

Download the ETVR Module source from github

First, just like you'd do with the apps source, download it from github. Either via downloading and extracting a zip or by using git clone.

Donwload the latest VRCFT Source

Download the VRCFT Source from their github. It's important to put next to the ETVR module. Your directory should look more or less like this:

parent_directory
     - ETVR Module
     - VRCFT Repo

Building the module requires some of the VRCFT stuff to be present, namely the Core directory. To make it easier to compile, we've set the project up so that it will look for it, next to its own directory.

Install Visual Studio or Jetbrains Rider, and open the project

Whichever IDE you prefer, both just work, both make it easier to work with the source code.

Once installed, open the project in them and wait for everything to load.

Building the module

That's the last step, now we just need to verify that everything is setup correctly. Click on build, or hit ctrl+b and watch the output.

It should build just fine and the resulting file should get copied to the VRCFT CustomModules` directory.

Note, the copying will fail when VRCFT is running. If it does, close VRCFT and hit build again, this time only the copy step will be executed

FAQ

Where's the module's configuration file?

In the rare cases where you need to modify the configuration file, here's how to find it:

Since CRVFT is an UWP app and those behave quite a bit differently than regular apps, there's no easy way to access that file. Instead, you'll need to search on your C:/ drive for 'ETVRModuleConfig.json and it should show up.

WHat do the fields in this file mean?

Range explanation: 0 - fully closed, 1 - fully open.

  • OutputMultiplier: Defines by how much the output should be multiplied, it helps with making your tracking less or more expressive. 1 by default, [0 - 2] range.

  • PortNumber: the port under which the module will be listening for OSC messages, by default 8889

  • ShouldEmulateEyeWiden: Toggle for emulating eye widen, think surprised face. On by default, will at 0.97 of fully open eye

  • ShouldEmulateEyeSquint: Toggle for emulating squinting, think shutting your eyes with a bit of force. On by default, will activate at 0.05 of eye openness.

  • ShouldEmulateEyebrows: Togggle for emulating eyebrow movement, depending on eye openness, the module will try and move the avis eye brows a little. On by default at 0.89, range [0 - 1]

  • EyebrowThresholdRising: Defines when eyebrow emulation should kick in, by default at 0.89, range [0 - 1]

  • EyebrowThresholdLowering: Defines when eyebrow emulation should kick in but in the opposite direction, by default at 0.06, range [0 - 1]

  • SqueezeThresholdV1 - Defines when squeeze emulation should begin, and how "fast" should it be. By default, [0.06, 0.51], with range first: [0 - 1], second: [0 - 2]. This is used for v1 or legacy parameters

-SqueezeThresholdV2 - Defines when squeeze emulation should begin, and how "fast" should it be. By default, [0.06, -0.99], with range first: [0 - 1], second: [-2 - 0]. This is used for v2 or Unified Expressions parameters

  • WidenThresholdV1 - Defines when Widen emulation should begin, and how "fast" should it be. By default, [0.93, 1.01], with range first: [0 - 1], second: [0 - 2]. This is used for v1 or legacy parameters

  • WidenThresholdV2 - Defines when widen emulation should begin, and how "fast" should it be. By default, [0.96, 1.04], with range first: [0 - 1], second: [0 - 2]. This is used for v2 or Unified Expressions parameters

To better explain how Widen / Squeeze emulation thresholds work: They're implemented via a simple smoothstep, you can play around with it here, simply plug in the values in smoothstep() and watch how the graph reacts.

Released under the MIT License.

- + \ No newline at end of file diff --git a/software_guide/build_software.html b/software_guide/build_software.html index 25b647c..e6482d9 100644 --- a/software_guide/build_software.html +++ b/software_guide/build_software.html @@ -7,20 +7,20 @@ - + - - - - - + + + + +
Skip to content

Build the app from source

This guide will show how to build the app from source

NOTE

This is NOT a required step, you do not need to build the app from source.

Requirements

Install Python

EyeTrackVR is currently using Python 3.11.0 Before you continue, please install it.

Installing Poetry

Starting with version 0.1.7, EyeTrackVR uses Poetry to manage app dependencies. To build the app, you must first install Poetry to fetch the required dependencies.

To install Poetry open Windows Powershell and run the following command (Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -

Poetry Documentation

Install the required Python modules

After cloning the project and installing Poetry, open a command prompt in the EyeTrackApp folder. Then run the command: poetry install

This should install all of the required modules.

Build the app

Now, you should be ready to build the app. With a command prompt open in the EyeTrackApp folder, run the command poetry run pyinstaller eyetrackapp.spec

Give it time to build the app. Once done, the app should be under dist/eyetrackapp

Released under the MIT License.

- + \ No newline at end of file diff --git a/software_guide/eyetrackvr_app_guide.html b/software_guide/eyetrackvr_app_guide.html index 5f03ff2..5f39346 100644 --- a/software_guide/eyetrackvr_app_guide.html +++ b/software_guide/eyetrackvr_app_guide.html @@ -7,20 +7,20 @@ - + - - - - - + + + + +
Skip to content

How to install, run and adjust the EyeTrackVR app.

Step 1: Download the EyeTrackVR Installer and install the EyeTrackVR app

Go to the latest GitHub release here and download the Setup.exe file.

Follow the prompts and the app should be installed.

Step 2: Run the EyeTrackVR app

If the Create Desktop Shortcut option was checked you should see an icon on your desktop, double click it to run.

You then should be greeted with a GUI that looks like this:

'img'

Step 3: Getting familiar with settings and terminology

Let's go over some basic terminology you will find in the app.

Starting from the top:

Right eye

Shows the right eye feed and settings only.

Left eye

Shows the left eye feed and settings only.

Both eyes

Shows both eyes' feed and settings.

Camera Address

This is where you enter the IP address of your camera. Alternatively, it can be used to put the cam number for wired cameras or pass in a video file.

Tracking Mode

This changes the GUI to the tracking mode where it outputs values.

Cropping Mode

This is where you will crop out your eye.

Threshold

This is used to cut out things that aren't dark like your pupil.

Rotation

For our method to work best, you want your eye to be level. Use this slider to adjust it to where that is the case.

Restart Calibration

This will start a calibration mode for your eye where you look to all extremes.

Recenter Eye

This will recenter your eye to whatever point you are looking at.

Step 4: Adding your cameras to the software and configuring them

Wireless configuration

Power your ESPs and find what the IP address is for your right eye. This can be done by opening both Cameras in a browser and then holding your finger over your right eye camera.

Copy that IP address and then close the browser tab with it open.

Enter that IP address into the app's Camera Address field.

Press the Save and Restart Tracking button.

Wired configuration (experimental)

Note this is a Beta app feature only. Please use the latest Open Beta in the Discord.

Find your ESPs in Device Manager and figure out their COM port numbers, e.g. COM4.

Enter that COM port number into the app's Camera Address field.

Press the Save and Restart Tracking button.

Setting up ROI

Don't see your camera feed? That's because an ROI hasn't been set yet.

'img'

See the Awaiting Eye Cropping Settings text?

Now press the Cropping Mode button. You should see a feed of your camera.

Put your headset on and use an application to see your desktop. (Virtual desktop, SteamVR desktop, etc.)

You should see something like this:

'img'

:O It's my eye!

Now, draw a rectangle that selects your eye.

A good example of an ROI

'img'

Head back over to the Tracking mode.

We will now adjust our rotation by moving the Rotation slider.

From this:

'img'

It's crooked!

To this:

'img'

Much better!

Now we will adjust our threshold.

Continuing with your headset on, move the slider all the way up. start slowly backing it off until mainly only your pupil is being visualized in the threshold viewer.

Example of a threshold being too low:

'img'

Much better!

Example of too high of a threshold:

'img'

Much better!

Example of a good threshold:

'img'

Much better!

Repeat everything in this step for your left eye.

Step 5: Calibrating your eyes

Once your eye is trackable by the software we need to calibrate it.

Press the Restart Calibration button and look around. The important part is that you look to all extremes, all the way up, left, etc. Once you have done so, wait for the Mode to say Tracking

The next step is to center your eye.

Look straight forward and press the Recenter Eye button.

Your eye is now fully calibrated.

Repeat for your other eye.

NOTE

To best center both eyes, look at one spot and hit the 'Recenter Eye' button for each eye without moving your eyes.

Released under the MIT License.

- + \ No newline at end of file diff --git a/software_guide/osc_setup.html b/software_guide/osc_setup.html index cae188d..b9cf05a 100644 --- a/software_guide/osc_setup.html +++ b/software_guide/osc_setup.html @@ -7,20 +7,20 @@ - + - - - - - + + + + +
Skip to content

Setting up recalibration and recentering from VRChat.

ETVR has a mechanism that allows you to recalibrate and recenter your tracking without the need to interact with the app directly, here's how to set up your avatar to make use of OSC to trigger this from within VRC itself.

NOTE

Note, while this page explains how to do it from the point of view of vrchat, it can be done in Resonite and CVR too, all the app listens for are two OSC messages.

Setting up your parameters

Adding parameters

You'll need to add two parameters to your Parameters config, those being:

  • etvr_recalibrate: Bool
  • etvr_recenter: Bool

Both of them do not have to be synced, meaning they won't increase your total memory count.

To do this, in Unity, select your avatar on the scene and find Avatar Descriptor in the inspector. In it, find the section named "expressions", expand it and click on the file assigned to the "parameters" field, that's your Parameters config.

Screenshot showing expressions section of vrc avatar descriptor

Clicking on it will highlight the associated asset in the asset browser. Click on the highlighted file to get its content to show in the inspector panel. Now, in the inspector, click on the Add button to add the parameters mentioned above. Both of them need to be of type Bool, but they don't need to be synced nor saved.

Screenshot showing adding parameters to parameter menu
Screenshot showing the params that need to be added

That's it for the parameters.

Adding buttons to the menu

Now, you will need to add actual buttons for them in your gesture menu.

The expressions section mentioned above also contains the menu, you can use that to either add the buttons there directly or create a small submenu to make it less cluttered, here we will add them directly.

Screenshot showing expressions section of vrc avatar descriptor

Once you have the menu file opened in the inspector, click on the "add control" button. This will add an empty action slot, expand it.

Screenshot showing the the empty controls field

You'll see a bunch of fields, like name, icon, type and parameter. Firstly, let's give it a friendly name like "recalibrate eyes" or "recenter tracking" depending on the action you want to assign to them.

Leave the type as is - as a button, it's more convenient as it bounces back into the off state by itself.

Now, in the parameter section, click on the [None] and select one of the parameters you have created in the previous section.

Screenshot showing the the controls setup

Repeat the steps for the other one.

Once done simply build and upload the updated version of your avatar.

And that's it, you now should be able to recenter and recalibrate your tracking form inside of VRC!

Resetting the OSC config in case the parameters don't work

Sometimes VRChat won't regenerate the config files that it uses to communicate the changes to anyone that's listening. To fix this, it's enough to simply delete the auto generated configuration files and let VRC remake them.

They are stored under

C:\Users\<user>\AppData\LocalLow\VRChat\VRChat\OSC\<your user uuid>\Avatars\

Deleting the contents of the Avatars directory will resolve the issue.

Other platforms

Like mentioned in the note, this functionality is not limited to VRC.

The app itself listens to OSC messages sent on port 9001 to two addresses:

  • /avatar/parameters/etvr_recenter
  • /avatar/parameters/etvr_recalibrate

It only needs to receive a Bool value of True to trigger the recenter and calibration.

The port and the addresses can be changed in the app settings, if need be.

Released under the MIT License.

- + \ No newline at end of file