SteamVR Input

This commit is contained in:
bjorn 2019-05-12 22:04:41 -07:00
parent c20554645e
commit 7c2a119324
15 changed files with 2095 additions and 141 deletions

2
deps/openvr vendored

@ -1 +1 @@
Subproject commit 5d0574bf6473130d25dd296ad30206ccd148590b
Subproject commit b72abcebff7e6c6c70ce8ac8f6a09b70d44397e2

View File

@ -57,10 +57,8 @@ const char* DeviceButtons[] = {
const char* DeviceAxes[] = {
[AXIS_TRIGGER] = "trigger",
[AXIS_THUMBSTICK_X] = "thumbstick/x",
[AXIS_THUMBSTICK_Y] = "thumbstick/y",
[AXIS_TOUCHPAD_X] = "touchpad/x",
[AXIS_TOUCHPAD_Y] = "touchpad/y",
[AXIS_THUMBSTICK] = "thumbstick",
[AXIS_TOUCHPAD] = "touchpad",
[AXIS_PINCH] = "pinch",
[AXIS_GRIP] = "grip",
NULL
@ -418,11 +416,22 @@ int l_lovrHeadsetIsTouched(lua_State* L) {
int l_lovrHeadsetGetAxis(lua_State* L) {
Device device = luax_optdevice(L, 1);
DeviceAxis axis = luaL_checkoption(L, 2, NULL, DeviceAxes);
float value;
float value[3];
FOREACH_TRACKING_DRIVER(driver) {
if (driver->getAxis(device, axis, &value)) {
lua_pushnumber(L, value);
return 1;
if (driver->getAxis(device, axis, value)) {
switch (axis) {
case MAX_AXES:
case AXIS_TRIGGER:
case AXIS_PINCH:
case AXIS_GRIP:
lua_pushnumber(L, value[0]);
return 1;
case AXIS_THUMBSTICK:
case AXIS_TOUCHPAD:
lua_pushnumber(L, value[0]);
lua_pushnumber(L, value[1]);
return 2;
}
}
}
return 0;

View File

@ -122,7 +122,7 @@ static bool desktop_isTouched(Device device, DeviceButton button, bool* touched)
return false;
}
static bool desktop_getAxis(Device device, DeviceAxis axis, float* value) {
static bool desktop_getAxis(Device device, DeviceAxis axis, vec3 value) {
return false;
}

View File

@ -33,7 +33,8 @@ typedef enum {
DEVICE_TRACKER_1,
DEVICE_TRACKER_2,
DEVICE_TRACKER_3,
DEVICE_TRACKER_4
DEVICE_TRACKER_4,
MAX_DEVICES
} Device;
typedef enum {
@ -46,17 +47,17 @@ typedef enum {
BUTTON_B,
BUTTON_X,
BUTTON_Y,
BUTTON_PROXIMITY
BUTTON_PROXIMITY,
MAX_BUTTONS
} DeviceButton;
typedef enum {
AXIS_TRIGGER,
AXIS_THUMBSTICK_X,
AXIS_THUMBSTICK_Y,
AXIS_TOUCHPAD_X,
AXIS_TOUCHPAD_Y,
AXIS_THUMBSTICK,
AXIS_TOUCHPAD,
AXIS_PINCH,
AXIS_GRIP
AXIS_GRIP,
MAX_AXES
} DeviceAxis;
typedef enum {

View File

@ -252,7 +252,7 @@ static bool oculus_isTouched(Device device, DeviceButton button, bool* touched)
}
}
static bool oculus_getAxis(Device device, DeviceAxis axis, float* value) {
static bool oculus_getAxis(Device device, DeviceAxis axis, vec3* value) {
if (device != DEVICE_HAND_LEFT && device != DEVICE_HAND_RIGHT) {
return false;
}
@ -263,8 +263,10 @@ static bool oculus_getAxis(Device device, DeviceAxis axis, float* value) {
switch (axis) {
case AXIS_GRIP: return *value = is->HandTriggerNoDeadzone[hand], true;
case AXIS_TRIGGER: return *value = is->IndexTriggerNoDeadzone[hand], true;
case AXIS_THUMBSTICK_X: return *value = is->ThumbstickNoDeadzone[hand].x, true;
case AXIS_THUMBSTICK_Y: return *value = is->ThumbstickNoDeadzone[hand].y, true;
case AXIS_THUMBSTICK:
value[0] = is->ThumbstickNoDeadzone[hand].x;
value[1] = is->ThumbstickNoDeadzone[hand].y;
return true;
default: return false;
}
}

View File

@ -131,16 +131,21 @@ static bool vrapi_isTouched(Device device, DeviceButton button, bool* touched) {
return buttonCheck(bridgeLovrMobileData.updateData.goButtonTouch, device, button, touched);
}
static int vrapi_getAxis(Device device, DeviceAxis axis, float* x, float* y, float* z) {
static int vrapi_getAxis(Device device, DeviceAxis axis, float* value) {
if (device != DEVICE_HAND) {
return false;
}
switch (axis) {
case AXIS_TOUCHPAD_X: return *value = (bridgeLovrMobileData.updateData.goTrackpad.x - 160.f) / 160.f, true;
case AXIS_TOUCHPAD_Y: return *value = (bridgeLovrMobileData.updateData.goTrackpad.y - 160.f) / 160.f, true;
case AXIS_TRIGGER: return *value = bridgeLovrMobileData.updateData.goButtonDown ? 1.f : 0.f, true;
default: return false;
case AXIS_TOUCHPAD:
value[0] = (bridgeLovrMobileData.updateData.goTrackpad.x - 160.f) / 160.f, true;
value[1] = (bridgeLovrMobileData.updateData.goTrackpad.y - 160.f) / 160.f, true;
return true;
case AXIS_TRIGGER:
value[0] = bridgeLovrMobileData.updateData.goButtonDown ? 1.f : 0.f;
return true;
default:
return false;
}
}

View File

@ -1,5 +1,9 @@
#include "headset/headset.h"
#include "resources/actions.json.h"
#include "resources/bindings_vive.json.h"
#include "resources/bindings_knuckles.json.h"
#include "event/event.h"
#include "filesystem/filesystem.h"
#include "graphics/graphics.h"
#include "graphics/canvas.h"
#include "lib/maf.h"
@ -24,6 +28,42 @@ extern void VR_ShutdownInternal();
extern bool VR_IsHmdPresent();
extern intptr_t VR_GetGenericInterface(const char* pchInterfaceVersion, EVRInitError* peError);
extern bool VR_IsRuntimeInstalled();
typedef enum {
eBone_Root = 0,
eBone_Wrist,
eBone_Thumb0,
eBone_Thumb1,
eBone_Thumb2,
eBone_Thumb3,
eBone_IndexFinger0,
eBone_IndexFinger1,
eBone_IndexFinger2,
eBone_IndexFinger3,
eBone_IndexFinger4,
eBone_MiddleFinger0,
eBone_MiddleFinger1,
eBone_MiddleFinger2,
eBone_MiddleFinger3,
eBone_MiddleFinger4,
eBone_RingFinger0,
eBone_RingFinger1,
eBone_RingFinger2,
eBone_RingFinger3,
eBone_RingFinger4,
eBone_PinkyFinger0,
eBone_PinkyFinger1,
eBone_PinkyFinger2,
eBone_PinkyFinger3,
eBone_PinkyFinger4,
eBone_Aux_Thumb,
eBone_Aux_IndexFinger,
eBone_Aux_MiddleFinger,
eBone_Aux_RingFinger,
eBone_Aux_PinkyFinger,
eBone_Count
} OpenVRBone;
#define HEADSET k_unTrackedDeviceIndex_Hmd
#define INVALID_DEVICE k_unTrackedDeviceIndexInvalid
@ -32,7 +72,15 @@ static struct {
struct VR_IVRCompositor_FnTable* compositor;
struct VR_IVRChaperone_FnTable* chaperone;
struct VR_IVRRenderModels_FnTable* renderModels;
TrackedDevicePose_t poses[16];
struct VR_IVRInput_FnTable* input;
VRActionSetHandle_t actionSet;
VRActionHandle_t poseActions[MAX_DEVICES];
VRActionHandle_t buttonActions[2][MAX_BUTTONS];
VRActionHandle_t touchActions[2][MAX_BUTTONS];
VRActionHandle_t axisActions[2][MAX_AXES];
VRActionHandle_t skeletonActions[2];
VRActionHandle_t hapticActions[2];
TrackedDevicePose_t renderPose;
RenderModel_t* deviceModels[16];
RenderModel_TextureMap_t* deviceTextures[16];
Canvas* canvas;
@ -80,12 +128,86 @@ static bool openvr_init(float offset, int msaa) {
sprintf(buffer, "FnTable:%s", IVRCompositor_Version), state.compositor = (struct VR_IVRCompositor_FnTable*) VR_GetGenericInterface(buffer, &vrError);
sprintf(buffer, "FnTable:%s", IVRChaperone_Version), state.chaperone = (struct VR_IVRChaperone_FnTable*) VR_GetGenericInterface(buffer, &vrError);
sprintf(buffer, "FnTable:%s", IVRRenderModels_Version), state.renderModels = (struct VR_IVRRenderModels_FnTable*) VR_GetGenericInterface(buffer, &vrError);
sprintf(buffer, "FnTable:%s", IVRInput_Version), state.input = (struct VR_IVRInput_FnTable*) VR_GetGenericInterface(buffer, &vrError);
if (!state.system || !state.compositor || !state.chaperone || !state.renderModels) {
if (!state.system || !state.compositor || !state.chaperone || !state.renderModels || !state.input) {
VR_ShutdownInternal();
return false;
}
// Find the location of the action manifest, create it if it doesn't exist or isn't in the save directory
const char* actionManifestLocation = lovrFilesystemGetRealDirectory("actions.json");
if (!actionManifestLocation || strcmp(actionManifestLocation, lovrFilesystemGetSaveDirectory())) {
if (lovrFilesystemWrite("actions.json", (const char*) actions_json, actions_json_len, false) != actions_json_len) { return VR_ShutdownInternal(), false; }
if (lovrFilesystemWrite("bindings_vive.json", (const char*) bindings_vive_json, bindings_vive_json_len, false) != bindings_vive_json_len) { return VR_ShutdownInternal(), false; }
if (lovrFilesystemWrite("bindings_knuckles.json", (const char*) bindings_knuckles_json, bindings_knuckles_json_len, false) != bindings_knuckles_json_len) { return VR_ShutdownInternal(), false; }
}
char path[LOVR_PATH_MAX];
snprintf(path, sizeof(path), "%s%cactions.json", lovrFilesystemGetSaveDirectory(), lovrDirSep);
state.input->SetActionManifestPath(path);
state.input->GetActionSetHandle("/actions/lovr", &state.actionSet);
state.input->GetActionHandle("/actions/lovr/in/headPose", &state.poseActions[DEVICE_HEAD]);
state.input->GetActionHandle("/actions/lovr/in/leftHandPose", &state.poseActions[DEVICE_HAND_LEFT]);
state.input->GetActionHandle("/actions/lovr/in/rightHandPose", &state.poseActions[DEVICE_HAND_RIGHT]);
state.input->GetActionHandle("/actions/lovr/in/leftTriggerDown", &state.buttonActions[0][BUTTON_TRIGGER]);
state.input->GetActionHandle("/actions/lovr/in/leftThumbstickDown", &state.buttonActions[0][BUTTON_THUMBSTICK]);
state.input->GetActionHandle("/actions/lovr/in/leftTouchpadDown", &state.buttonActions[0][BUTTON_TOUCHPAD]);
state.input->GetActionHandle("/actions/lovr/in/leftGripDown", &state.buttonActions[0][BUTTON_GRIP]);
state.input->GetActionHandle("/actions/lovr/in/leftMenuDown", &state.buttonActions[0][BUTTON_MENU]);
state.input->GetActionHandle("/actions/lovr/in/leftADown", &state.buttonActions[0][BUTTON_A]);
state.input->GetActionHandle("/actions/lovr/in/leftBDown", &state.buttonActions[0][BUTTON_B]);
state.input->GetActionHandle("/actions/lovr/in/leftXDown", &state.buttonActions[0][BUTTON_X]);
state.input->GetActionHandle("/actions/lovr/in/leftYDown", &state.buttonActions[0][BUTTON_Y]);
state.input->GetActionHandle("/actions/lovr/in/rightTriggerDown", &state.buttonActions[1][BUTTON_TRIGGER]);
state.input->GetActionHandle("/actions/lovr/in/rightThumbstickDown", &state.buttonActions[1][BUTTON_THUMBSTICK]);
state.input->GetActionHandle("/actions/lovr/in/rightTouchpadDown", &state.buttonActions[1][BUTTON_TOUCHPAD]);
state.input->GetActionHandle("/actions/lovr/in/rightGripDown", &state.buttonActions[1][BUTTON_GRIP]);
state.input->GetActionHandle("/actions/lovr/in/rightMenuDown", &state.buttonActions[1][BUTTON_MENU]);
state.input->GetActionHandle("/actions/lovr/in/rightADown", &state.buttonActions[1][BUTTON_A]);
state.input->GetActionHandle("/actions/lovr/in/rightBDown", &state.buttonActions[1][BUTTON_B]);
state.input->GetActionHandle("/actions/lovr/in/rightXDown", &state.buttonActions[1][BUTTON_X]);
state.input->GetActionHandle("/actions/lovr/in/rightYDown", &state.buttonActions[1][BUTTON_Y]);
state.input->GetActionHandle("/actions/lovr/in/leftTriggerTouch", &state.touchActions[0][BUTTON_TRIGGER]);
state.input->GetActionHandle("/actions/lovr/in/leftThumbstickTouch", &state.touchActions[0][BUTTON_THUMBSTICK]);
state.input->GetActionHandle("/actions/lovr/in/leftTouchpadTouch", &state.touchActions[0][BUTTON_TOUCHPAD]);
state.input->GetActionHandle("/actions/lovr/in/leftGripTouch", &state.touchActions[0][BUTTON_GRIP]);
state.input->GetActionHandle("/actions/lovr/in/leftMenuTouch", &state.touchActions[0][BUTTON_MENU]);
state.input->GetActionHandle("/actions/lovr/in/leftATouch", &state.touchActions[0][BUTTON_A]);
state.input->GetActionHandle("/actions/lovr/in/leftBTouch", &state.touchActions[0][BUTTON_B]);
state.input->GetActionHandle("/actions/lovr/in/leftXTouch", &state.touchActions[0][BUTTON_X]);
state.input->GetActionHandle("/actions/lovr/in/leftYTouch", &state.touchActions[0][BUTTON_Y]);
state.input->GetActionHandle("/actions/lovr/in/rightTriggerTouch", &state.touchActions[1][BUTTON_TRIGGER]);
state.input->GetActionHandle("/actions/lovr/in/rightThumbstickTouch", &state.touchActions[1][BUTTON_THUMBSTICK]);
state.input->GetActionHandle("/actions/lovr/in/rightTouchpadTouch", &state.touchActions[1][BUTTON_TOUCHPAD]);
state.input->GetActionHandle("/actions/lovr/in/rightGripTouch", &state.touchActions[1][BUTTON_GRIP]);
state.input->GetActionHandle("/actions/lovr/in/rightMenuTouch", &state.touchActions[1][BUTTON_MENU]);
state.input->GetActionHandle("/actions/lovr/in/rightATouch", &state.touchActions[1][BUTTON_A]);
state.input->GetActionHandle("/actions/lovr/in/rightBTouch", &state.touchActions[1][BUTTON_B]);
state.input->GetActionHandle("/actions/lovr/in/rightXTouch", &state.touchActions[1][BUTTON_X]);
state.input->GetActionHandle("/actions/lovr/in/rightYTouch", &state.touchActions[1][BUTTON_Y]);
state.input->GetActionHandle("/actions/lovr/in/leftTriggerAxis", &state.axisActions[0][AXIS_TRIGGER]);
state.input->GetActionHandle("/actions/lovr/in/leftThumbstickAxis", &state.axisActions[0][AXIS_THUMBSTICK]);
state.input->GetActionHandle("/actions/lovr/in/leftTouchpadAxis", &state.axisActions[0][AXIS_TOUCHPAD]);
state.input->GetActionHandle("/actions/lovr/in/leftGripAxis", &state.axisActions[0][AXIS_GRIP]);
state.input->GetActionHandle("/actions/lovr/in/rightTriggerAxis", &state.axisActions[1][AXIS_TRIGGER]);
state.input->GetActionHandle("/actions/lovr/in/rightThumbstickAxis", &state.axisActions[1][AXIS_THUMBSTICK]);
state.input->GetActionHandle("/actions/lovr/in/rightTouchpadAxis", &state.axisActions[1][AXIS_TOUCHPAD]);
state.input->GetActionHandle("/actions/lovr/in/rightGripAxis", &state.axisActions[1][AXIS_GRIP]);
state.input->GetActionHandle("/actions/lovr/in/leftHandSkeleton", &state.skeletonActions[0]);
state.input->GetActionHandle("/actions/lovr/in/rightHandSkeleton", &state.skeletonActions[1]);
state.input->GetActionHandle("/actions/lovr/out/leftHandBZZ", &state.hapticActions[0]);
state.input->GetActionHandle("/actions/lovr/out/rightHandBZZ", &state.hapticActions[1]);
openvr_getName(buffer, sizeof(buffer));
state.rift = !strncmp(buffer, "Oculus", sizeof(buffer));
state.clipNear = 0.1f;
@ -175,123 +297,134 @@ static const float* openvr_getBoundsGeometry(int* count) {
return NULL;
}
static bool getTransform(unsigned int index, mat4 transform) {
TrackedDevicePose_t pose = state.poses[index];
if (!pose.bPoseIsValid || !pose.bDeviceIsConnected) {
static bool getTransform(Device device, mat4 transform) {
if (!state.poseActions[device]) {
return false;
} else {
mat4_fromMat34(transform, pose.mDeviceToAbsoluteTracking.m);
transform[13] += state.offset;
return true;
}
InputPoseActionData_t actionData;
state.input->GetPoseActionData(state.poseActions[device], state.compositor->GetTrackingSpace(), 0.f, &actionData, sizeof(actionData), 0);
mat4_fromMat34(transform, actionData.pose.mDeviceToAbsoluteTracking.m);
transform[13] += state.offset;
return actionData.bActive;
}
static bool openvr_getPose(Device device, vec3 position, quat orientation) {
float transform[16];
TrackedDeviceIndex_t index = getDeviceIndex(device);
if (index == INVALID_DEVICE || !getTransform(index, transform)) {
if (getTransform(device, transform)) {
mat4_getPosition(transform, position);
mat4_getOrientation(transform, orientation);
return true;
}
return false;
}
static bool openvr_getBonePose(Device device, DeviceBone bone, vec3 position, quat orientation) {
if (device != DEVICE_HAND_LEFT && device != DEVICE_HAND_RIGHT) {
return false;
}
float transform[16];
if (!getTransform(device, transform)) {
return false;
}
InputSkeletalActionData_t actionData;
state.input->GetSkeletalActionData(state.skeletonActions[device - DEVICE_HAND_LEFT], &actionData, sizeof(actionData));
if (!actionData.bActive) {
return false;
}
VRBoneTransform_t bones[31];
EVRSkeletalTransformSpace transformSpace = EVRSkeletalTransformSpace_VRSkeletalTransformSpace_Model;
EVRSkeletalMotionRange motionRange = EVRSkeletalMotionRange_VRSkeletalMotionRange_WithController;
state.input->GetSkeletalBoneData(state.skeletonActions[device - DEVICE_HAND_LEFT], transformSpace, motionRange, bones, sizeof(bones) / sizeof(bones[0]));
int index;
switch (bone) {
case BONE_THUMB_1: index = eBone_Thumb0; break;
case BONE_THUMB_2: index = eBone_Thumb1; break;
case BONE_THUMB_3: index = eBone_Thumb2; break;
case BONE_THUMB: index = eBone_Thumb3; break;
case BONE_INDEX_1: index = eBone_IndexFinger0; break;
case BONE_INDEX_2: index = eBone_IndexFinger1; break;
case BONE_INDEX_3: index = eBone_IndexFinger2; break;
case BONE_INDEX_4: index = eBone_IndexFinger3; break;
case BONE_INDEX: index = eBone_IndexFinger4; break;
case BONE_MIDDLE_1: index = eBone_MiddleFinger0; break;
case BONE_MIDDLE_2: index = eBone_MiddleFinger1; break;
case BONE_MIDDLE_3: index = eBone_MiddleFinger2; break;
case BONE_MIDDLE_4: index = eBone_MiddleFinger3; break;
case BONE_MIDDLE: index = eBone_MiddleFinger4; break;
case BONE_RING_1: index = eBone_RingFinger0; break;
case BONE_RING_2: index = eBone_RingFinger1; break;
case BONE_RING_3: index = eBone_RingFinger2; break;
case BONE_RING_4: index = eBone_RingFinger3; break;
case BONE_RING: index = eBone_RingFinger4; break;
case BONE_PINKY_1: index = eBone_PinkyFinger0; break;
case BONE_PINKY_2: index = eBone_PinkyFinger1; break;
case BONE_PINKY_3: index = eBone_PinkyFinger2; break;
case BONE_PINKY_4: index = eBone_PinkyFinger3; break;
case BONE_PINKY: index = eBone_PinkyFinger4; break;
default: return false;
}
VRBoneTransform_t* b = &bones[index];
mat4_translate(transform, b->position.v[0], b->position.v[1], b->position.v[2]);
mat4_rotateQuat(transform, (float[4]) { b->orientation.x, b->orientation.y, b->orientation.z, b->orientation.w });
mat4_getPosition(transform, position);
mat4_getOrientation(transform, orientation);
return true;
}
static bool openvr_getBonePose(Device device, DeviceBone bone, vec3 position, quat orientation) {
return false;
}
static bool openvr_getVelocity(Device device, vec3 velocity, vec3 angularVelocity) {
TrackedDeviceIndex_t index = getDeviceIndex(device);
TrackedDevicePose_t* pose = &state.poses[device];
if (index == INVALID_DEVICE || !pose->bPoseIsValid || !pose->bDeviceIsConnected) {
if (!state.poseActions[device]) {
return false;
}
vec3_init(velocity, pose->vVelocity.v);
vec3_init(angularVelocity, pose->vAngularVelocity.v);
return true;
InputPoseActionData_t actionData;
state.input->GetPoseActionData(state.poseActions[device], state.compositor->GetTrackingSpace(), 0.f, &actionData, sizeof(actionData), 0);
vec3_init(velocity, actionData.pose.vVelocity.v);
vec3_init(angularVelocity, actionData.pose.vAngularVelocity.v);
return actionData.bActive;
}
static bool openvr_getAcceleration(Device device, vec3 acceleration, vec3 angularAcceleration) {
return false;
}
static bool getButtonState(Device device, DeviceButton button, bool touch, bool* value) {
VRControllerState_t input;
if (device == DEVICE_HEAD && button == BUTTON_PROXIMITY && !touch) {
if (!state.system->GetControllerState(HEADSET, &input, sizeof(input))) {
return false;
}
return *value = (input.ulButtonPressed >> EVRButtonId_k_EButton_ProximitySensor) & 1, true;
static bool getButtonState(Device device, DeviceButton button, VRActionHandle_t actions[2][MAX_BUTTONS], bool* value) {
if (device != DEVICE_HAND_LEFT && device != DEVICE_HAND_RIGHT) {
return false;
}
TrackedDeviceIndex_t index = getDeviceIndex(device);
if (index != INVALID_DEVICE || state.system->GetControllerState(index, &input, sizeof(input))) {
uint64_t mask = touch ? input.ulButtonTouched : input.ulButtonPressed;
if (state.rift) {
switch (button) {
case BUTTON_TRIGGER: return *value = (mask >> EVRButtonId_k_EButton_Axis1) & 1, true;
case BUTTON_GRIP: return *value = (mask >> EVRButtonId_k_EButton_Axis2) & 1, true;
case BUTTON_A: return *value = (mask >> EVRButtonId_k_EButton_A) & 1, device == DEVICE_HAND_RIGHT;
case BUTTON_B: return *value = (mask >> EVRButtonId_k_EButton_ApplicationMenu) & 1, device == DEVICE_HAND_RIGHT;
case BUTTON_X: return *value = (mask >> EVRButtonId_k_EButton_A) & 1, device == DEVICE_HAND_LEFT;
case BUTTON_Y: return *value = (mask >> EVRButtonId_k_EButton_ApplicationMenu) & 1, device == DEVICE_HAND_LEFT;
default: return false;
}
} else {
switch (button) {
case BUTTON_TRIGGER: return *value = (mask >> EVRButtonId_k_EButton_SteamVR_Trigger) & 1, true;
case BUTTON_TOUCHPAD: return *value = (mask >> EVRButtonId_k_EButton_SteamVR_Touchpad) & 1, true;
case BUTTON_MENU: return *value = (mask >> EVRButtonId_k_EButton_ApplicationMenu) & 1, true;
case BUTTON_GRIP: return *value = (mask >> EVRButtonId_k_EButton_Grip) & 1, true;
default: return false;
}
}
}
return false;
InputDigitalActionData_t actionData;
state.input->GetDigitalActionData(actions[device - DEVICE_HAND_LEFT][button], &actionData, sizeof(actionData), 0);
return *value = actionData.bState, actionData.bActive;
}
static bool openvr_isDown(Device device, DeviceButton button, bool* down) {
return getButtonState(device, button, false, down);
return getButtonState(device, button, state.buttonActions, down);
}
static bool openvr_isTouched(Device device, DeviceButton button, bool* touched) {
return getButtonState(device, button, true, touched);
return getButtonState(device, button, state.touchActions, touched);
}
static bool openvr_getAxis(Device device, DeviceAxis axis, float* value) {
TrackedDeviceIndex_t index = getDeviceIndex(device);
VRControllerState_t input;
if (index != INVALID_DEVICE || state.system->GetControllerState(index, &input, sizeof(input))) {
switch (axis) {
case AXIS_TRIGGER: return *value = input.rAxis[1].x, true;
case AXIS_GRIP: return *value = input.rAxis[2].x, state.rift;
case AXIS_TOUCHPAD_X: return *value = input.rAxis[0].x, !state.rift;
case AXIS_TOUCHPAD_Y: return *value = input.rAxis[0].y, !state.rift;
case AXIS_THUMBSTICK_X: return *value = input.rAxis[0].x, state.rift;
case AXIS_THUMBSTICK_Y: return *value = input.rAxis[0].y, state.rift;
default: return false;
}
static bool openvr_getAxis(Device device, DeviceAxis axis, vec3 value) {
if (device != DEVICE_HAND_LEFT && device != DEVICE_HAND_RIGHT) {
return false;
}
return false;
InputAnalogActionData_t actionData;
state.input->GetAnalogActionData(state.axisActions[device - DEVICE_HAND_LEFT][axis], &actionData, sizeof(actionData), 0);
return vec3_set(value, actionData.x, actionData.y, actionData.z), actionData.bActive;
}
static bool openvr_vibrate(Device device, float strength, float duration, float frequency) {
if (duration <= 0) return false;
TrackedDeviceIndex_t index = getDeviceIndex(device);
if (index == INVALID_DEVICE) return false;
unsigned short uSeconds = (unsigned short) (duration * 1e6f + .5f);
state.system->TriggerHapticPulse(index, 0, uSeconds);
if (duration <= 0 || (device != DEVICE_HAND_LEFT && device != DEVICE_HAND_RIGHT)) return false;
state.input->TriggerHapticVibrationAction(state.hapticActions[device - DEVICE_HAND_LEFT], 0.f, duration, frequency, strength, 0);
return true;
}
@ -417,7 +550,7 @@ static void openvr_renderTo(void (*callback)(void*), void* userdata) {
Camera camera = { .canvas = state.canvas, .viewMatrix = { MAT4_IDENTITY, MAT4_IDENTITY } };
float head[16], eye[16];
getTransform(HEADSET, head);
mat4_fromMat34(head, state.renderPose.mDeviceToAbsoluteTracking.m);
for (int i = 0; i < 2; i++) {
EVREye vrEye = (i == 0) ? EVREye_Eye_Left : EVREye_Eye_Right;
@ -443,7 +576,9 @@ static void openvr_renderTo(void (*callback)(void*), void* userdata) {
}
static void openvr_update(float dt) {
state.compositor->WaitGetPoses(state.poses, 16, NULL, 0);
state.compositor->WaitGetPoses(&state.renderPose, 1, NULL, 0);
VRActiveActionSet_t activeActionSet = { .ulActionSet = state.actionSet };
state.input->UpdateActionState(&activeActionSet, sizeof(activeActionSet), 1);
struct VREvent_t vrEvent;
while (state.system->PollNextEvent(&vrEvent, sizeof(vrEvent))) {

View File

@ -60,8 +60,7 @@ typedef enum {
ACTION_TRIGGER_AXIS,
ACTION_TRACKPAD_DOWN,
ACTION_TRACKPAD_TOUCH,
ACTION_TRACKPAD_X,
ACTION_TRACKPAD_Y,
ACTION_TRACKPAD_AXIS,
ACTION_MENU_DOWN,
ACTION_MENU_TOUCH,
ACTION_GRIP_DOWN,
@ -77,8 +76,7 @@ static XrActionCreateInfo defaultActions[MAX_ACTIONS] = {
[ACTION_TRIGGER_DOWN] = action("triggerDown", "Trigger Down", XR_INPUT_ACTION_TYPE_BOOLEAN, 2),
[ACTION_TRIGGER_TOUCH] = action("triggerTouch", "Trigger Touch", XR_INPUT_ACTION_TYPE_BOOLEAN, 2),
[ACTION_TRIGGER_AXIS] = action("triggerAxis", "Trigger Axis", XR_INPUT_ACTION_TYPE_VECTOR1F, 2),
[ACTION_TRACKPAD_X] = action("trackpadX", "Trackpad X", XR_INPUT_ACTION_TYPE_VECTOR1F, 2),
[ACTION_TRACKPAD_Y] = action("trackpadY", "Trackpad Y", XR_INPUT_ACTION_TYPE_VECTOR1F, 2),
[ACTION_TRACKPAD_AXIS] = action("trackpadAxis", "Trackpad Axis", XR_INPUT_ACTION_TYPE_VECTOR2F, 2),
[ACTION_MENU_DOWN] = action("menuDown", "Menu Down", XR_INPUT_ACTION_TYPE_BOOLEAN, 2),
[ACTION_MENU_TOUCH] = action("menuTouch", "Menu Touch", XR_INPUT_ACTION_TYPE_BOOLEAN, 2),
[ACTION_GRIP_DOWN] = action("gripDown", "Grip Down", XR_INPUT_ACTION_TYPE_BOOLEAN, 2),
@ -106,10 +104,8 @@ static const char* defaultBindings[MAX_PROFILES][MAX_ACTIONS][2] = {
[ACTION_TRIGGER_DOWN][1] = "/user/hand/right/input/trigger/click",
[ACTION_TRIGGER_AXIS][0] = "/user/hand/left/input/trigger/value",
[ACTION_TRIGGER_AXIS][1] = "/user/hand/right/input/trigger/value",
[ACTION_TRACKPAD_X][0] = "/user/hand/left/input/trackpad/x",
[ACTION_TRACKPAD_X][1] = "/user/hand/right/input/trackpad/x",
[ACTION_TRACKPAD_Y][0] = "/user/hand/left/input/trackpad/y",
[ACTION_TRACKPAD_Y][1] = "/user/hand/right/input/trackpad/y",
[ACTION_TRACKPAD_AXIS][0] = "/user/hand/left/input/trackpad",
[ACTION_TRACKPAD_AXIS][1] = "/user/hand/right/input/trackpad",
[ACTION_MENU_DOWN][0] = "/user/hand/left/input/menu/click",
[ACTION_MENU_DOWN][1] = "/user/hand/right/input/menu/click",
[ACTION_GRIP_DOWN][0] = "/user/hand/left/input/grip/click",
@ -126,10 +122,8 @@ static const char* defaultBindings[MAX_PROFILES][MAX_ACTIONS][2] = {
[ACTION_TRIGGER_TOUCH][1] = "/user/hand/right/input/trigger/touch",
[ACTION_TRIGGER_AXIS][0] = "/user/hand/left/input/trigger/value",
[ACTION_TRIGGER_AXIS][1] = "/user/hand/right/input/trigger/value",
[ACTION_TRACKPAD_X][0] = "/user/hand/left/input/trackpad/x",
[ACTION_TRACKPAD_X][1] = "/user/hand/right/input/trackpad/x",
[ACTION_TRACKPAD_Y][0] = "/user/hand/left/input/trackpad/y",
[ACTION_TRACKPAD_Y][1] = "/user/hand/right/input/trackpad/y",
[ACTION_TRACKPAD_AXIS][0] = "/user/hand/left/input/trackpad",
[ACTION_TRACKPAD_AXIS][1] = "/user/hand/right/input/trackpad",
[ACTION_MENU_DOWN][0] = "/user/hand/left/input/menu/click",
[ACTION_MENU_DOWN][1] = "/user/hand/right/input/menu/click",
[ACTION_MENU_TOUCH][0] = "/user/hand/left/input/menu/touch",
@ -148,10 +142,8 @@ static const char* defaultBindings[MAX_PROFILES][MAX_ACTIONS][2] = {
[ACTION_HAND_POSE][1] = "/user/hand/right/input/pointer/pose",
[ACTION_TRIGGER_DOWN][0] = "/user/hand/left/input/trigger/click",
[ACTION_TRIGGER_DOWN][1] = "/user/hand/right/input/trigger/click",
[ACTION_TRACKPAD_X][0] = "/user/hand/left/input/trackpad/x",
[ACTION_TRACKPAD_X][1] = "/user/hand/right/input/trackpad/x",
[ACTION_TRACKPAD_Y][0] = "/user/hand/left/input/trackpad/y",
[ACTION_TRACKPAD_Y][1] = "/user/hand/right/input/trackpad/y"
[ACTION_TRACKPAD_AXIS][0] = "/user/hand/left/input/trackpad",
[ACTION_TRACKPAD_AXIS][1] = "/user/hand/right/input/trackpad"
},
[PROFILE_KNUCKLES] = {
[ACTION_HAND_POSE][0] = "/user/hand/left/input/pointer/pose",
@ -162,10 +154,8 @@ static const char* defaultBindings[MAX_PROFILES][MAX_ACTIONS][2] = {
[ACTION_TRIGGER_TOUCH][1] = "/user/hand/right/input/trigger/touch",
[ACTION_TRIGGER_AXIS][0] = "/user/hand/left/input/trigger/value",
[ACTION_TRIGGER_AXIS][1] = "/user/hand/right/input/trigger/value",
[ACTION_TRACKPAD_X][0] = "/user/hand/left/input/trackpad/x",
[ACTION_TRACKPAD_X][1] = "/user/hand/right/input/trackpad/x",
[ACTION_TRACKPAD_Y][0] = "/user/hand/left/input/trackpad/y",
[ACTION_TRACKPAD_Y][1] = "/user/hand/right/input/trackpad/y",
[ACTION_TRACKPAD_AXIS][0] = "/user/hand/left/input/trackpad",
[ACTION_TRACKPAD_AXIS][1] = "/user/hand/right/input/trackpad",
[ACTION_GRIP_AXIS][0] = "/user/hand/left/input/grip/value",
[ACTION_GRIP_AXIS][1] = "/user/hand/right/input/grip/value",
[ACTION_VIBRATE][0] = "/user/hand/left/output/vibrate",
@ -529,8 +519,7 @@ static bool openxr_getAxis(Device device, DeviceAxis axis, float* value) {
Action type;
switch (axis) {
case AXIS_TRIGGER: type = ACTION_TRIGGER_AXIS; break;
case AXIS_TOUCHPAD_X: type = ACTION_TRACKPAD_X; break;
case AXIS_TOUCHPAD_Y: type = ACTION_TRACKPAD_Y; break;
case AXIS_TOUCHPAD: type = ACTION_TRACKPAD_AXIS; break;
case AXIS_GRIP: type = ACTION_GRIP_AXIS; break;
default: return false;
}

118
src/resources/actions.json Normal file
View File

@ -0,0 +1,118 @@
{
"action_sets" : [
{ "name" : "/actions/lovr", "usage" : "leftright" }
],
"actions" : [
{ "name" : "/actions/lovr/in/headPose", "type" : "pose" },
{ "name" : "/actions/lovr/in/leftHandPose", "type" : "pose" },
{ "name" : "/actions/lovr/in/rightHandPose", "type" : "pose" },
{ "name" : "/actions/lovr/in/leftTriggerDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftTriggerTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftTriggerAxis", "type" : "vector1" },
{ "name" : "/actions/lovr/in/leftTouchpadDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftTouchpadTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftTouchpadAxis", "type" : "vector2" },
{ "name" : "/actions/lovr/in/leftThumbstickDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftThumbstickTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftThumbstickAxis", "type" : "vector2" },
{ "name" : "/actions/lovr/in/leftGripDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftGripTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftGripAxis", "type" : "vector1" },
{ "name" : "/actions/lovr/in/leftMenuDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftMenuTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftADown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftATouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftBDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftBTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftXDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftXTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftYDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftYTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightTriggerDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightTriggerTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightTriggerAxis", "type" : "vector1" },
{ "name" : "/actions/lovr/in/rightTouchpadDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightTouchpadTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightTouchpadAxis", "type" : "vector2" },
{ "name" : "/actions/lovr/in/rightThumbstickDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightThumbstickTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightThumbstickAxis", "type" : "vector2" },
{ "name" : "/actions/lovr/in/rightGripDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightGripTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightGripAxis", "type" : "vector1" },
{ "name" : "/actions/lovr/in/rightMenuDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightMenuTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightADown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightATouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightBDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightBTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightXDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightXTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightYDown", "type" : "boolean" },
{ "name" : "/actions/lovr/in/rightYTouch", "type" : "boolean" },
{ "name" : "/actions/lovr/in/leftHandSkeleton", "skeleton" : "/skeleton/hand/left", "type" : "skeleton" },
{ "name" : "/actions/lovr/in/rightHandSkeleton", "skeleton" : "/skeleton/hand/right", "type" : "skeleton" },
{ "name" : "/actions/lovr/out/leftHandBZZ", "type" : "vibration" },
{ "name" : "/actions/lovr/out/rightHandBZZ", "type" : "vibration" }
],
"default_bindings" : [
{ "binding_url" : "bindings_vive.json", "controller_type" : "vive_controller" },
{ "binding_url" : "bindings_knuckles.json", "controller_type" : "knuckles" }
],
"localization" : [
{
"/actions/lovr/in/headPose": "Head Pose",
"/actions/lovr/in/leftHandPose": "Left Hand Pose",
"/actions/lovr/in/rightHandPose": "Right Hand Pose",
"/actions/lovr/in/leftTriggerDown": "Left Trigger Press",
"/actions/lovr/in/leftTriggerTouch": "Left Trigger Touch",
"/actions/lovr/in/leftTriggerAxis": "Left Trigger Axis",
"/actions/lovr/in/leftTouchpadDown": "Left Touchpad Press",
"/actions/lovr/in/leftTouchpadTouch": "Left Touchpad Touch",
"/actions/lovr/in/leftTouchpadAxis": "Left Touchpad Axis",
"/actions/lovr/in/leftThumbstickDown": "Left Thumbstick Press",
"/actions/lovr/in/leftThumbstickTouch": "Left Thumbstick Touch",
"/actions/lovr/in/leftThumbstickAxis": "Left Thumbstick Axis",
"/actions/lovr/in/leftGripDown": "Left Grip Press",
"/actions/lovr/in/leftGripTouch": "Left Grip Touch",
"/actions/lovr/in/leftGripAxis": "Left Grip Axis",
"/actions/lovr/in/leftMenuDown": "Left Menu Press",
"/actions/lovr/in/leftMenuTouch": "Left Menu Touch",
"/actions/lovr/in/leftADown": "Left A Press",
"/actions/lovr/in/leftATouch": "Left A Touch",
"/actions/lovr/in/leftBDown": "Left B Press",
"/actions/lovr/in/leftBTouch": "Left B Touch",
"/actions/lovr/in/leftXDown": "Left X Press",
"/actions/lovr/in/leftXTouch": "Left X Touch",
"/actions/lovr/in/leftYDown": "Left Y Press",
"/actions/lovr/in/leftYTouch": "Left Y Touch",
"/actions/lovr/in/rightTriggerDown": "Right Trigger Press",
"/actions/lovr/in/rightTriggerTouch": "Right Trigger Touch",
"/actions/lovr/in/rightTriggerAxis": "Right Trigger Axis",
"/actions/lovr/in/rightTouchpadDown": "Right Touchpad Press",
"/actions/lovr/in/rightTouchpadTouch": "Right Touchpad Touch",
"/actions/lovr/in/rightTouchpadAxis": "Right Touchpad Axis",
"/actions/lovr/in/rightThumbstickDown": "Right Thumbstick Press",
"/actions/lovr/in/rightThumbstickTouch": "Right Thumbstick Touch",
"/actions/lovr/in/rightThumbstickAxis": "Right Thumbstick Axis",
"/actions/lovr/in/rightGripDown": "Right Grip Press",
"/actions/lovr/in/rightGripTouch": "Right Grip Touch",
"/actions/lovr/in/rightGripAxis": "Right Grip Axis",
"/actions/lovr/in/rightMenuDown": "Right Menu Press",
"/actions/lovr/in/rightMenuTouch": "Right Menu Touch",
"/actions/lovr/in/rightADown": "Right A Press",
"/actions/lovr/in/rightATouch": "Right A Touch",
"/actions/lovr/in/rightBDown": "Right B Press",
"/actions/lovr/in/rightBTouch": "Right B Touch",
"/actions/lovr/in/rightXDown": "Right X Press",
"/actions/lovr/in/rightXTouch": "Right X Touch",
"/actions/lovr/in/rightYDown": "Right Y Press",
"/actions/lovr/in/rightYTouch": "Right Y Touch",
"/actions/lovr/in/leftHandSkeleton": "Left Hand Skeleton",
"/actions/lovr/in/rightHandSkeleton": "Right Hand Skeleton",
"/actions/lovr/out/leftHandBZZ": "Left Hand BZZ",
"/actions/lovr/out/rightHandBZZ": "Right Hand BZZ",
"language_tag" : "en"
}
]
}

View File

@ -0,0 +1,610 @@
unsigned char actions_json[] = {
0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x22, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x5f, 0x73, 0x65, 0x74, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x5b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x22, 0x2c, 0x20, 0x22, 0x75, 0x73, 0x61,
0x67, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x6c, 0x65, 0x66, 0x74, 0x72,
0x69, 0x67, 0x68, 0x74, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x5d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x22, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x22, 0x20, 0x3a, 0x20, 0x5b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76,
0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x50, 0x6f, 0x73,
0x65, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x70, 0x6f, 0x73, 0x65, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66,
0x74, 0x48, 0x61, 0x6e, 0x64, 0x50, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x20,
0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x70, 0x6f,
0x73, 0x65, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76,
0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x48, 0x61,
0x6e, 0x64, 0x50, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79,
0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x65, 0x22,
0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22,
0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69,
0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65,
0x72, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61,
0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b,
0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x72, 0x69, 0x67,
0x67, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x22,
0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f,
0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c,
0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54,
0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x41, 0x78, 0x69, 0x73, 0x22, 0x2c,
0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x76,
0x65, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66,
0x74, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64, 0x44, 0x6f, 0x77,
0x6e, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61,
0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f,
0x6c, 0x65, 0x66, 0x74, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64,
0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61,
0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b,
0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x6f, 0x75, 0x63,
0x68, 0x70, 0x61, 0x64, 0x41, 0x78, 0x69, 0x73, 0x22, 0x2c, 0x20, 0x22,
0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x76, 0x65, 0x63,
0x74, 0x6f, 0x72, 0x32, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c,
0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54,
0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x44, 0x6f, 0x77,
0x6e, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61,
0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f,
0x6c, 0x65, 0x66, 0x74, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69,
0x63, 0x6b, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x22, 0x74,
0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c,
0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x68,
0x75, 0x6d, 0x62, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x41, 0x78, 0x69, 0x73,
0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x22, 0x20, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c,
0x65, 0x66, 0x74, 0x47, 0x72, 0x69, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x22,
0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65,
0x66, 0x74, 0x47, 0x72, 0x69, 0x70, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22,
0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65,
0x66, 0x74, 0x47, 0x72, 0x69, 0x70, 0x41, 0x78, 0x69, 0x73, 0x22, 0x2c,
0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x76,
0x65, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66,
0x74, 0x4d, 0x65, 0x6e, 0x75, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x20,
0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f,
0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74,
0x4d, 0x65, 0x6e, 0x75, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x20,
0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f,
0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74,
0x41, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61,
0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b,
0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x41, 0x54, 0x6f, 0x75,
0x63, 0x68, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20,
0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e,
0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e,
0x2f, 0x6c, 0x65, 0x66, 0x74, 0x42, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x2c,
0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62,
0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66,
0x74, 0x42, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x22, 0x74,
0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c,
0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x58, 0x44,
0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22,
0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22,
0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69,
0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x58, 0x54, 0x6f, 0x75, 0x63, 0x68,
0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c,
0x65, 0x66, 0x74, 0x59, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x20, 0x22,
0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f,
0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c,
0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x59,
0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61,
0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b,
0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x72, 0x69,
0x67, 0x67, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x20, 0x22,
0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f,
0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c,
0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74,
0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63, 0x68,
0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x41,
0x78, 0x69, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x22,
0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22,
0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69,
0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x6f, 0x75, 0x63, 0x68,
0x70, 0x61, 0x64, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x74,
0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c,
0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54,
0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64, 0x54, 0x6f, 0x75, 0x63, 0x68,
0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64,
0x41, 0x78, 0x69, 0x73, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32,
0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20,
0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f,
0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x68, 0x75, 0x6d,
0x62, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x2c,
0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62,
0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69, 0x63, 0x6b,
0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61,
0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b,
0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x68, 0x75,
0x6d, 0x62, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x41, 0x78, 0x69, 0x73, 0x22,
0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x32, 0x22, 0x20, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69,
0x67, 0x68, 0x74, 0x47, 0x72, 0x69, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x22,
0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69,
0x67, 0x68, 0x74, 0x47, 0x72, 0x69, 0x70, 0x54, 0x6f, 0x75, 0x63, 0x68,
0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x47, 0x72, 0x69, 0x70, 0x41, 0x78, 0x69, 0x73,
0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x31, 0x22, 0x20, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x44, 0x6f, 0x77, 0x6e,
0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x54, 0x6f, 0x75, 0x63,
0x68, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61,
0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f,
0x72, 0x69, 0x67, 0x68, 0x74, 0x41, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x2c,
0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62,
0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x41, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x22,
0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f,
0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c,
0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74,
0x42, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61,
0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b,
0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x42, 0x54, 0x6f,
0x75, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22,
0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22,
0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69,
0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x58, 0x44, 0x6f, 0x77, 0x6e,
0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x58, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c,
0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62,
0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x59, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x74,
0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c,
0x65, 0x61, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x59,
0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61,
0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b,
0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x48, 0x61, 0x6e, 0x64,
0x53, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x22,
0x73, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x2f, 0x73, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x2f, 0x68,
0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x22, 0x2c, 0x20, 0x22,
0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x73, 0x6b, 0x65,
0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x48, 0x61, 0x6e, 0x64, 0x53, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f,
0x6e, 0x22, 0x2c, 0x20, 0x22, 0x73, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f,
0x6e, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x73, 0x6b, 0x65, 0x6c, 0x65,
0x74, 0x6f, 0x6e, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x73, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x22,
0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22,
0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x6f,
0x75, 0x74, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x42,
0x5a, 0x5a, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x76, 0x69, 0x62, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20,
0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f,
0x6f, 0x75, 0x74, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x48, 0x61, 0x6e,
0x64, 0x42, 0x5a, 0x5a, 0x22, 0x2c, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x76, 0x69, 0x62, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x5d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x22, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f,
0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x20, 0x3a, 0x20,
0x5b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x62, 0x69,
0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x72, 0x6c, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x5f, 0x76,
0x69, 0x76, 0x65, 0x2e, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x22,
0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x74,
0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x76, 0x69, 0x76, 0x65,
0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x22,
0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22,
0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x75, 0x72, 0x6c, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73,
0x5f, 0x6b, 0x6e, 0x75, 0x63, 0x6b, 0x6c, 0x65, 0x73, 0x2e, 0x6a, 0x73,
0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f,
0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x6b, 0x6e, 0x75, 0x63, 0x6b, 0x6c, 0x65, 0x73, 0x22, 0x20,
0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x5d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x22,
0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x22, 0x20, 0x3a, 0x20, 0x5b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69,
0x6e, 0x2f, 0x68, 0x65, 0x61, 0x64, 0x50, 0x6f, 0x73, 0x65, 0x22, 0x3a,
0x20, 0x22, 0x48, 0x65, 0x61, 0x64, 0x20, 0x50, 0x6f, 0x73, 0x65, 0x22,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f,
0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x50,
0x6f, 0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x65, 0x66, 0x74, 0x20,
0x48, 0x61, 0x6e, 0x64, 0x20, 0x50, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e,
0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x50, 0x6f,
0x73, 0x65, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20,
0x48, 0x61, 0x6e, 0x64, 0x20, 0x50, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e,
0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72,
0x44, 0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x65, 0x66, 0x74,
0x20, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x20, 0x50, 0x72, 0x65,
0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x72,
0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x3a,
0x20, 0x22, 0x4c, 0x65, 0x66, 0x74, 0x20, 0x54, 0x72, 0x69, 0x67, 0x67,
0x65, 0x72, 0x20, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f,
0x6c, 0x65, 0x66, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x41,
0x78, 0x69, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x65, 0x66, 0x74, 0x20,
0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x20, 0x41, 0x78, 0x69, 0x73,
0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x6f, 0x75, 0x63,
0x68, 0x70, 0x61, 0x64, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20, 0x22,
0x4c, 0x65, 0x66, 0x74, 0x20, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61,
0x64, 0x20, 0x50, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c,
0x65, 0x66, 0x74, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64, 0x54,
0x6f, 0x75, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x65, 0x66, 0x74,
0x20, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64, 0x20, 0x54, 0x6f,
0x75, 0x63, 0x68, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c,
0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54,
0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64, 0x41, 0x78, 0x69, 0x73, 0x22,
0x3a, 0x20, 0x22, 0x4c, 0x65, 0x66, 0x74, 0x20, 0x54, 0x6f, 0x75, 0x63,
0x68, 0x70, 0x61, 0x64, 0x20, 0x41, 0x78, 0x69, 0x73, 0x22, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e,
0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74,
0x69, 0x63, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c,
0x65, 0x66, 0x74, 0x20, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69,
0x63, 0x6b, 0x20, 0x50, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f,
0x6c, 0x65, 0x66, 0x74, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69,
0x63, 0x6b, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x4c,
0x65, 0x66, 0x74, 0x20, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69,
0x63, 0x6b, 0x20, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f,
0x6c, 0x65, 0x66, 0x74, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69,
0x63, 0x6b, 0x41, 0x78, 0x69, 0x73, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x65,
0x66, 0x74, 0x20, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69, 0x63,
0x6b, 0x20, 0x41, 0x78, 0x69, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65,
0x66, 0x74, 0x47, 0x72, 0x69, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x3a,
0x20, 0x22, 0x4c, 0x65, 0x66, 0x74, 0x20, 0x47, 0x72, 0x69, 0x70, 0x20,
0x50, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66,
0x74, 0x47, 0x72, 0x69, 0x70, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x3a,
0x20, 0x22, 0x4c, 0x65, 0x66, 0x74, 0x20, 0x47, 0x72, 0x69, 0x70, 0x20,
0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66,
0x74, 0x47, 0x72, 0x69, 0x70, 0x41, 0x78, 0x69, 0x73, 0x22, 0x3a, 0x20,
0x22, 0x4c, 0x65, 0x66, 0x74, 0x20, 0x47, 0x72, 0x69, 0x70, 0x20, 0x41,
0x78, 0x69, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c,
0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x4d,
0x65, 0x6e, 0x75, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c,
0x65, 0x66, 0x74, 0x20, 0x4d, 0x65, 0x6e, 0x75, 0x20, 0x50, 0x72, 0x65,
0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x4d, 0x65,
0x6e, 0x75, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x4c,
0x65, 0x66, 0x74, 0x20, 0x4d, 0x65, 0x6e, 0x75, 0x20, 0x54, 0x6f, 0x75,
0x63, 0x68, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x41, 0x44,
0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x65, 0x66, 0x74, 0x20,
0x41, 0x20, 0x50, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c,
0x65, 0x66, 0x74, 0x41, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x3a, 0x20,
0x22, 0x4c, 0x65, 0x66, 0x74, 0x20, 0x41, 0x20, 0x54, 0x6f, 0x75, 0x63,
0x68, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76,
0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x42, 0x44, 0x6f,
0x77, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x65, 0x66, 0x74, 0x20, 0x42,
0x20, 0x50, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65,
0x66, 0x74, 0x42, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x22,
0x4c, 0x65, 0x66, 0x74, 0x20, 0x42, 0x20, 0x54, 0x6f, 0x75, 0x63, 0x68,
0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x58, 0x44, 0x6f, 0x77,
0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x65, 0x66, 0x74, 0x20, 0x58, 0x20,
0x50, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66,
0x74, 0x58, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x4c,
0x65, 0x66, 0x74, 0x20, 0x58, 0x20, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f,
0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x59, 0x44, 0x6f, 0x77, 0x6e,
0x22, 0x3a, 0x20, 0x22, 0x4c, 0x65, 0x66, 0x74, 0x20, 0x59, 0x20, 0x50,
0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74,
0x59, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x65,
0x66, 0x74, 0x20, 0x59, 0x20, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69,
0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67,
0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x69,
0x67, 0x68, 0x74, 0x20, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x20,
0x50, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x6f, 0x75,
0x63, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20,
0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x20, 0x54, 0x6f, 0x75, 0x63,
0x68, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76,
0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x72,
0x69, 0x67, 0x67, 0x65, 0x72, 0x41, 0x78, 0x69, 0x73, 0x22, 0x3a, 0x20,
0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x54, 0x72, 0x69, 0x67, 0x67,
0x65, 0x72, 0x20, 0x41, 0x78, 0x69, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64,
0x44, 0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x69, 0x67, 0x68,
0x74, 0x20, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64, 0x20, 0x50,
0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64, 0x54, 0x6f, 0x75,
0x63, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20,
0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64, 0x20, 0x54, 0x6f, 0x75,
0x63, 0x68, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54,
0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64, 0x41, 0x78, 0x69, 0x73, 0x22,
0x3a, 0x20, 0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x54, 0x6f, 0x75,
0x63, 0x68, 0x70, 0x61, 0x64, 0x20, 0x41, 0x78, 0x69, 0x73, 0x22, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69,
0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x68, 0x75, 0x6d, 0x62,
0x73, 0x74, 0x69, 0x63, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20,
0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x54, 0x68, 0x75, 0x6d, 0x62,
0x73, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x50, 0x72, 0x65, 0x73, 0x73, 0x22,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f,
0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x68, 0x75, 0x6d,
0x62, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22,
0x3a, 0x20, 0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x54, 0x68, 0x75,
0x6d, 0x62, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x54, 0x6f, 0x75, 0x63,
0x68, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76,
0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x68,
0x75, 0x6d, 0x62, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x41, 0x78, 0x69, 0x73,
0x22, 0x3a, 0x20, 0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x54, 0x68,
0x75, 0x6d, 0x62, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x20, 0x41, 0x78, 0x69,
0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76,
0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x47, 0x72,
0x69, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x69,
0x67, 0x68, 0x74, 0x20, 0x47, 0x72, 0x69, 0x70, 0x20, 0x50, 0x72, 0x65,
0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x47,
0x72, 0x69, 0x70, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x22,
0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x47, 0x72, 0x69, 0x70, 0x20, 0x54,
0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x47, 0x72, 0x69, 0x70, 0x41, 0x78, 0x69, 0x73, 0x22, 0x3a, 0x20,
0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x47, 0x72, 0x69, 0x70, 0x20,
0x41, 0x78, 0x69, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x4d, 0x65, 0x6e, 0x75, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20,
0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x4d, 0x65, 0x6e, 0x75, 0x20,
0x50, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22,
0x3a, 0x20, 0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x4d, 0x65, 0x6e,
0x75, 0x20, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x41, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20,
0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x41, 0x20, 0x50, 0x72, 0x65,
0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x41,
0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x69, 0x67,
0x68, 0x74, 0x20, 0x41, 0x20, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69,
0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x42, 0x44, 0x6f, 0x77, 0x6e,
0x22, 0x3a, 0x20, 0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x42, 0x20,
0x50, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x42, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x3a, 0x20, 0x22,
0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x42, 0x20, 0x54, 0x6f, 0x75, 0x63,
0x68, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76,
0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x58, 0x44,
0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x69, 0x67, 0x68, 0x74,
0x20, 0x58, 0x20, 0x50, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f,
0x72, 0x69, 0x67, 0x68, 0x74, 0x58, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22,
0x3a, 0x20, 0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x58, 0x20, 0x54,
0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x59, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x69,
0x67, 0x68, 0x74, 0x20, 0x59, 0x20, 0x50, 0x72, 0x65, 0x73, 0x73, 0x22,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f,
0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x59, 0x54, 0x6f, 0x75,
0x63, 0x68, 0x22, 0x3a, 0x20, 0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20,
0x59, 0x20, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c,
0x65, 0x66, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x53, 0x6b, 0x65, 0x6c, 0x65,
0x74, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x65, 0x66, 0x74, 0x20,
0x48, 0x61, 0x6e, 0x64, 0x20, 0x53, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f,
0x6e, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76,
0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x48, 0x61,
0x6e, 0x64, 0x53, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x22, 0x3a,
0x20, 0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x48, 0x61, 0x6e, 0x64,
0x20, 0x53, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x22, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x6f, 0x75,
0x74, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x42, 0x5a,
0x5a, 0x22, 0x3a, 0x20, 0x22, 0x4c, 0x65, 0x66, 0x74, 0x20, 0x48, 0x61,
0x6e, 0x64, 0x20, 0x42, 0x5a, 0x5a, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x6f, 0x75, 0x74, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x42, 0x5a, 0x5a, 0x22,
0x3a, 0x20, 0x22, 0x52, 0x69, 0x67, 0x68, 0x74, 0x20, 0x48, 0x61, 0x6e,
0x64, 0x20, 0x42, 0x5a, 0x5a, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,
0x5f, 0x74, 0x61, 0x67, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x65, 0x6e, 0x22,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x5d,
0x0d, 0x0a, 0x7d, 0x0d, 0x0a
};
unsigned int actions_json_len = 7277;

View File

@ -0,0 +1,155 @@
{
"action_manifest_version" : 0,
"alias_info" : {},
"bindings" : {
"/actions/lovr" : {
"haptics" : [
{ "output" : "/actions/lovr/out/leftHandBZZ", "path" : "/user/hand/left/output/haptic" },
{ "output" : "/actions/lovr/out/rightHandBZZ", "path" : "/user/hand/right/output/haptic" }
],
"poses" : [
{ "output" : "/actions/lovr/in/leftHandPose", "path" : "/user/hand/left/pose/raw" },
{ "output" : "/actions/lovr/in/rightHandPose", "path" : "/user/hand/right/pose/raw" }
],
"skeleton" : [
{ "output" : "/actions/lovr/in/leftHandSkeleton", "path" : "/user/hand/left/input/skeleton/left" },
{ "output" : "/actions/lovr/in/rightHandSkeleton", "path" : "/user/hand/right/input/skeleton/right" }
],
"sources" : [
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/leftTriggerDown" },
"pull" : { "output" : "/actions/lovr/in/leftTriggerAxis" },
"touch" : { "output" : "/actions/lovr/in/leftTriggerTouch" }
},
"mode" : "trigger",
"path" : "/user/hand/left/input/trigger"
},
{
"inputs" : {
"position" : { "output" : "/actions/lovr/in/leftTouchpadAxis" },
"touch" : { "output" : "/actions/lovr/in/leftTouchpadTouch" }
},
"mode" : "trackpad",
"path" : "/user/hand/left/input/trackpad"
},
{
"inputs" : {
"pull" : { "output" : "/actions/lovr/in/leftGripAxis" },
"touch" : { "output" : "/actions/lovr/in/leftGripTouch" }
},
"mode" : "trigger",
"path" : "/user/hand/left/input/grip"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/rightTriggerDown" },
"pull" : { "output" : "/actions/lovr/in/rightTriggerAxis" },
"touch" : { "output" : "/actions/lovr/in/rightTriggerTouch" }
},
"mode" : "trigger",
"path" : "/user/hand/right/input/trigger"
},
{
"inputs" : {
"position" : { "output" : "/actions/lovr/in/rightTouchpadAxis" },
"touch" : { "output" : "/actions/lovr/in/rightTouchpadTouch" }
},
"mode" : "trackpad",
"path" : "/user/hand/right/input/trackpad"
},
{
"inputs" : {
"pull" : { "output" : "/actions/lovr/in/rightGripAxis" },
"touch" : { "output" : "/actions/lovr/in/rightGripTouch" }
},
"mode" : "trigger",
"path" : "/user/hand/right/input/grip"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/leftThumbstickDown" },
"position" : { "output" : "/actions/lovr/in/leftThumbstickAxis" },
"touch" : { "output" : "/actions/lovr/in/leftThumbstickTouch" }
},
"mode" : "joystick",
"path" : "/user/hand/left/input/thumbstick"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/leftBDown" },
"touch" : { "output" : "/actions/lovr/in/leftBTouch" }
},
"mode" : "button",
"path" : "/user/hand/left/input/b"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/leftADown" },
"touch" : { "output" : "/actions/lovr/in/leftATouch" }
},
"mode" : "button",
"path" : "/user/hand/left/input/a"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/rightThumbstickDown" },
"position" : { "output" : "/actions/lovr/in/rightThumbstickAxis" },
"touch" : { "output" : "/actions/lovr/in/rightThumbstickTouch" }
},
"mode" : "joystick",
"path" : "/user/hand/right/input/thumbstick"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/rightBDown" },
"touch" : { "output" : "/actions/lovr/in/rightBTouch" }
},
"mode" : "button",
"path" : "/user/hand/right/input/b"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/rightADown" },
"touch" : { "output" : "/actions/lovr/in/rightATouch" }
},
"mode" : "button",
"path" : "/user/hand/right/input/a"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/leftTouchpadDown" }
},
"mode" : "button",
"path" : "/user/hand/left/input/trackpad"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/rightTouchpadDown" }
},
"mode" : "button",
"path" : "/user/hand/right/input/trackpad"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/leftGripDown" }
},
"mode" : "button",
"path" : "/user/hand/left/input/grip"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/rightGripDown" }
},
"mode" : "button",
"path" : "/user/hand/right/input/grip"
}
]
}
},
"controller_type" : "knuckles",
"description" : "",
"name" : "Index Controller Bindings",
"options" : {},
"simulated_actions" : []
}

View File

@ -0,0 +1,530 @@
unsigned char bindings_knuckles_json[] = {
0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x22, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f, 0x76,
0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x3a, 0x20, 0x30, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x22, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f,
0x69, 0x6e, 0x66, 0x6f, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x22, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67,
0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x61, 0x70,
0x74, 0x69, 0x63, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x5b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b,
0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x6f, 0x75, 0x74, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x48,
0x61, 0x6e, 0x64, 0x42, 0x5a, 0x5a, 0x22, 0x2c, 0x20, 0x22, 0x70, 0x61,
0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72,
0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f, 0x6f,
0x75, 0x74, 0x70, 0x75, 0x74, 0x2f, 0x68, 0x61, 0x70, 0x74, 0x69, 0x63,
0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74,
0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x6f, 0x75,
0x74, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x42,
0x5a, 0x5a, 0x22, 0x2c, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e,
0x64, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x6f, 0x75, 0x74, 0x70,
0x75, 0x74, 0x2f, 0x68, 0x61, 0x70, 0x74, 0x69, 0x63, 0x22, 0x20, 0x7d,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x70, 0x6f, 0x73, 0x65, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x5b, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74,
0x48, 0x61, 0x6e, 0x64, 0x50, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x22,
0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73,
0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74,
0x2f, 0x70, 0x6f, 0x73, 0x65, 0x2f, 0x72, 0x61, 0x77, 0x22, 0x20, 0x7d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69,
0x67, 0x68, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x50, 0x6f, 0x73, 0x65, 0x22,
0x2c, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x2f, 0x70, 0x6f, 0x73, 0x65, 0x2f, 0x72, 0x61,
0x77, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x5d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f,
0x6e, 0x22, 0x20, 0x3a, 0x20, 0x5b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6f,
0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f,
0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x53,
0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x70,
0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65,
0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f,
0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x73, 0x6b, 0x65, 0x6c, 0x65, 0x74,
0x6f, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x22, 0x20, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x48, 0x61, 0x6e, 0x64, 0x53, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f,
0x6e, 0x22, 0x2c, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64,
0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x69, 0x6e, 0x70, 0x75, 0x74,
0x2f, 0x73, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x2f, 0x72, 0x69,
0x67, 0x68, 0x74, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63,
0x65, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x5b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x22, 0x20,
0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22,
0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x72, 0x69, 0x67,
0x67, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x6c, 0x6c,
0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75,
0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c,
0x65, 0x66, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x41, 0x78,
0x69, 0x73, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20, 0x3a, 0x20,
0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c,
0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54,
0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22,
0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x6c,
0x65, 0x66, 0x74, 0x2f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x74, 0x72,
0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74,
0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22,
0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65,
0x66, 0x74, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64, 0x41, 0x78,
0x69, 0x73, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20, 0x3a, 0x20,
0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c,
0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54,
0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64, 0x54, 0x6f, 0x75, 0x63, 0x68,
0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x70, 0x61, 0x64, 0x22, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64,
0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f,
0x74, 0x72, 0x61, 0x63, 0x6b, 0x70, 0x61, 0x64, 0x22, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e,
0x70, 0x75, 0x74, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x6c, 0x6c, 0x22, 0x20,
0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66,
0x74, 0x47, 0x72, 0x69, 0x70, 0x41, 0x78, 0x69, 0x73, 0x22, 0x20, 0x7d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f,
0x75, 0x63, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75,
0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69,
0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x47, 0x72, 0x69, 0x70, 0x54, 0x6f,
0x75, 0x63, 0x68, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61,
0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f, 0x69, 0x6e, 0x70, 0x75,
0x74, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75,
0x74, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20, 0x3a,
0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e,
0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x70, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22,
0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x72, 0x69,
0x67, 0x67, 0x65, 0x72, 0x41, 0x78, 0x69, 0x73, 0x22, 0x20, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x75,
0x63, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74,
0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e,
0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65,
0x72, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f,
0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x74, 0x72, 0x69, 0x67, 0x67,
0x65, 0x72, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61,
0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72,
0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2f,
0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65,
0x72, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x22, 0x20, 0x3a,
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70,
0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x3a, 0x20, 0x7b,
0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54,
0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64, 0x41, 0x78, 0x69, 0x73, 0x22,
0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x74, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22,
0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x6f, 0x75,
0x63, 0x68, 0x70, 0x61, 0x64, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20,
0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x74,
0x72, 0x61, 0x63, 0x6b, 0x70, 0x61, 0x64, 0x22, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x2f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x74,
0x72, 0x61, 0x63, 0x6b, 0x70, 0x61, 0x64, 0x22, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x3a,
0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x47, 0x72, 0x69, 0x70, 0x41, 0x78, 0x69, 0x73, 0x22, 0x20, 0x7d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f,
0x75, 0x63, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75,
0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69,
0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x47, 0x72, 0x69, 0x70, 0x54,
0x6f, 0x75, 0x63, 0x68, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x65,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72,
0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68,
0x61, 0x6e, 0x64, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x69, 0x6e,
0x70, 0x75, 0x74, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x22, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e,
0x70, 0x75, 0x74, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22,
0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65,
0x66, 0x74, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69, 0x63, 0x6b,
0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
0x6e, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70,
0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f,
0x6c, 0x65, 0x66, 0x74, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69,
0x63, 0x6b, 0x41, 0x78, 0x69, 0x73, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68,
0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75,
0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c,
0x65, 0x66, 0x74, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69, 0x63,
0x6b, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f,
0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x6a, 0x6f, 0x79, 0x73, 0x74,
0x69, 0x63, 0x6b, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70,
0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65,
0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f,
0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x74, 0x68, 0x75, 0x6d, 0x62, 0x73,
0x74, 0x69, 0x63, 0x6b, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73,
0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20, 0x3a, 0x20, 0x7b,
0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x42, 0x44,
0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20, 0x3a,
0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74,
0x42, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f,
0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f,
0x6e, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74,
0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f,
0x68, 0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f, 0x69, 0x6e,
0x70, 0x75, 0x74, 0x2f, 0x62, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74,
0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20, 0x3a, 0x20,
0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c,
0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x41,
0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20,
0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66,
0x74, 0x41, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20, 0x7d, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d,
0x6f, 0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74,
0x6f, 0x6e, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61,
0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72,
0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f, 0x69,
0x6e, 0x70, 0x75, 0x74, 0x2f, 0x61, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75,
0x74, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20, 0x3a,
0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x44,
0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e,
0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75,
0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69,
0x63, 0x6b, 0x41, 0x78, 0x69, 0x73, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68,
0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75,
0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x54, 0x68, 0x75, 0x6d, 0x62, 0x73, 0x74, 0x69,
0x63, 0x6b, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20, 0x7d, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d,
0x6f, 0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x6a, 0x6f, 0x79, 0x73,
0x74, 0x69, 0x63, 0x6b, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73,
0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x2f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x74, 0x68, 0x75, 0x6d,
0x62, 0x73, 0x74, 0x69, 0x63, 0x6b, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75,
0x74, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20, 0x3a,
0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f,
0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x42, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68,
0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75,
0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x42, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20,
0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62,
0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75,
0x73, 0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x2f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x62, 0x22, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x63,
0x6b, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70,
0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f,
0x72, 0x69, 0x67, 0x68, 0x74, 0x41, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20,
0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74,
0x6f, 0x75, 0x63, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f,
0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f,
0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x41, 0x54, 0x6f, 0x75,
0x63, 0x68, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64,
0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x69, 0x6e, 0x70, 0x75, 0x74,
0x2f, 0x61, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x22, 0x20,
0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22,
0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x6f, 0x75, 0x63,
0x68, 0x70, 0x61, 0x64, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x6d, 0x6f, 0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x75, 0x74,
0x74, 0x6f, 0x6e, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70,
0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65,
0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f,
0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x70,
0x61, 0x64, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x22, 0x20,
0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22,
0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x6f, 0x75,
0x63, 0x68, 0x70, 0x61, 0x64, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x75,
0x74, 0x74, 0x6f, 0x6e, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73,
0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x2f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x63,
0x6b, 0x70, 0x61, 0x64, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73,
0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20, 0x3a, 0x20, 0x7b,
0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f,
0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x47, 0x72,
0x69, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f,
0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f,
0x6e, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74,
0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f,
0x68, 0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f, 0x69, 0x6e,
0x70, 0x75, 0x74, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x22, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e,
0x70, 0x75, 0x74, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22,
0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69,
0x67, 0x68, 0x74, 0x47, 0x72, 0x69, 0x70, 0x44, 0x6f, 0x77, 0x6e, 0x22,
0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x72, 0x69,
0x67, 0x68, 0x74, 0x2f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x67, 0x72,
0x69, 0x70, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c,
0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x6b, 0x6e, 0x75, 0x63, 0x6b, 0x6c, 0x65, 0x73, 0x22, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x22, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74,
0x69, 0x6f, 0x6e, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x22, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72,
0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x20, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e,
0x67, 0x73, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x70,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x22, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61,
0x74, 0x65, 0x64, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22,
0x20, 0x3a, 0x20, 0x5b, 0x5d, 0x0d, 0x0a, 0x7d, 0x0d, 0x0a
};
unsigned int bindings_knuckles_json_len = 6322;

View File

@ -0,0 +1,90 @@
{
"action_manifest_version" : 0,
"alias_info" : {},
"app_key" : "system.generated.lovr.exe",
"bindings" : {
"/actions/lovr" : {
"haptics" : [
{ "output" : "/actions/lovr/out/leftHandBZZ", "path" : "/user/hand/left/output/haptic" },
{ "output" : "/actions/lovr/out/rightHandBZZ", "path" : "/user/hand/right/output/haptic" }
],
"poses" : [
{ "output" : "/actions/lovr/in/leftHandPose", "path" : "/user/hand/left/pose/raw" },
{ "output" : "/actions/lovr/in/rightHandPose", "path" : "/user/hand/right/pose/raw" }
],
"skeleton" : [
{ "output" : "/actions/lovr/in/leftHandSkeleton", "path" : "/user/hand/left/input/skeleton/left" },
{ "output" : "/actions/lovr/in/rightHandSkeleton", "path" : "/user/hand/right/input/skeleton/right" }
],
"sources" : [
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/leftGripDown" }
},
"mode" : "button",
"path" : "/user/hand/left/input/grip"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/leftMenuDown" }
},
"mode" : "button",
"path" : "/user/hand/left/input/application_menu"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/leftTriggerDown" },
"pull" : { "output" : "/actions/lovr/in/leftTriggerAxis" }
},
"mode" : "trigger",
"path" : "/user/hand/left/input/trigger"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/leftTouchpadDown" },
"position" : { "output" : "/actions/lovr/in/leftTouchpadAxis" },
"touch" : { "output" : "/actions/lovr/in/leftTouchpadTouch" }
},
"mode" : "trackpad",
"path" : "/user/hand/left/input/trackpad"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/rightGripDown" }
},
"mode" : "button",
"path" : "/user/hand/right/input/grip"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/rightMenuDown" }
},
"mode" : "button",
"path" : "/user/hand/right/input/application_menu"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/rightTriggerDown" },
"pull" : { "output" : "/actions/lovr/in/rightTriggerAxis" }
},
"mode" : "trigger",
"path" : "/user/hand/right/input/trigger"
},
{
"inputs" : {
"click" : { "output" : "/actions/lovr/in/rightTouchpadDown" },
"position" : { "output" : "/actions/lovr/in/rightTouchpadAxis" },
"touch" : { "output" : "/actions/lovr/in/rightTouchpadTouch" }
},
"mode" : "trackpad",
"path" : "/user/hand/right/input/trackpad"
}
]
}
},
"controller_type" : "vive_controller",
"description" : "",
"name" : "Vive Bindings",
"options" : {},
"simulated_actions" : []
}

View File

@ -0,0 +1,304 @@
unsigned char bindings_vive_json[] = {
0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x22, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f, 0x76,
0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x3a, 0x20, 0x30, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x22, 0x61, 0x6c, 0x69, 0x61, 0x73, 0x5f,
0x69, 0x6e, 0x66, 0x6f, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x22, 0x61, 0x70, 0x70, 0x5f, 0x6b, 0x65, 0x79,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x2e,
0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x2e, 0x6c, 0x6f,
0x76, 0x72, 0x2e, 0x65, 0x78, 0x65, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x22, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x20,
0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76,
0x72, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x68, 0x61, 0x70, 0x74, 0x69, 0x63,
0x73, 0x22, 0x20, 0x3a, 0x20, 0x5b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6f,
0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f,
0x6f, 0x75, 0x74, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x48, 0x61, 0x6e, 0x64,
0x42, 0x5a, 0x5a, 0x22, 0x2c, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61,
0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f, 0x6f, 0x75, 0x74, 0x70,
0x75, 0x74, 0x2f, 0x68, 0x61, 0x70, 0x74, 0x69, 0x63, 0x22, 0x20, 0x7d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e,
0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x6f, 0x75, 0x74, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x42, 0x5a, 0x5a, 0x22,
0x2c, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x2f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x2f,
0x68, 0x61, 0x70, 0x74, 0x69, 0x63, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f,
0x73, 0x65, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x5b, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20,
0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76,
0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x48, 0x61, 0x6e,
0x64, 0x50, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x22, 0x70, 0x61, 0x74,
0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f,
0x68, 0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f, 0x70, 0x6f,
0x73, 0x65, 0x2f, 0x72, 0x61, 0x77, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c,
0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74,
0x48, 0x61, 0x6e, 0x64, 0x50, 0x6f, 0x73, 0x65, 0x22, 0x2c, 0x20, 0x22,
0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73,
0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x72, 0x69, 0x67, 0x68,
0x74, 0x2f, 0x70, 0x6f, 0x73, 0x65, 0x2f, 0x72, 0x61, 0x77, 0x22, 0x20,
0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x5d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x73, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x22, 0x20,
0x3a, 0x20, 0x5b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70,
0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f,
0x6c, 0x65, 0x66, 0x74, 0x48, 0x61, 0x6e, 0x64, 0x53, 0x6b, 0x65, 0x6c,
0x65, 0x74, 0x6f, 0x6e, 0x22, 0x2c, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68,
0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x2f, 0x73, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x2f,
0x6c, 0x65, 0x66, 0x74, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x20,
0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76,
0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x48, 0x61,
0x6e, 0x64, 0x53, 0x6b, 0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x22, 0x2c,
0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x72, 0x69,
0x67, 0x68, 0x74, 0x2f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x73, 0x6b,
0x65, 0x6c, 0x65, 0x74, 0x6f, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74,
0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x5d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x22,
0x20, 0x3a, 0x20, 0x5b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69,
0x63, 0x6b, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74,
0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e,
0x2f, 0x6c, 0x65, 0x66, 0x74, 0x47, 0x72, 0x69, 0x70, 0x44, 0x6f, 0x77,
0x6e, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x20, 0x3a,
0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20,
0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f,
0x6c, 0x65, 0x66, 0x74, 0x2f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x67,
0x72, 0x69, 0x70, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x22,
0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20,
0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76,
0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x4d, 0x65, 0x6e,
0x75, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e,
0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68,
0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x2f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x6e, 0x75, 0x22, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20,
0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66,
0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e,
0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x70, 0x75, 0x6c, 0x6c, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22,
0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f,
0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72,
0x2f, 0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x72, 0x69, 0x67,
0x67, 0x65, 0x72, 0x41, 0x78, 0x69, 0x73, 0x22, 0x20, 0x7d, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d,
0x6f, 0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x74, 0x72, 0x69, 0x67,
0x67, 0x65, 0x72, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70,
0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65,
0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f,
0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65,
0x72, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x22, 0x20, 0x3a,
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63,
0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f,
0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f,
0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x6f, 0x75, 0x63, 0x68,
0x70, 0x61, 0x64, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x69,
0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f,
0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f,
0x69, 0x6e, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x54, 0x6f, 0x75, 0x63, 0x68,
0x70, 0x61, 0x64, 0x41, 0x78, 0x69, 0x73, 0x22, 0x20, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x75, 0x63,
0x68, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70,
0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f,
0x6c, 0x65, 0x66, 0x74, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64,
0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x70,
0x61, 0x64, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61,
0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72,
0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x6c, 0x65, 0x66, 0x74, 0x2f, 0x69,
0x6e, 0x70, 0x75, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x70, 0x61,
0x64, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x22, 0x20, 0x3a,
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63,
0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f,
0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f,
0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x47, 0x72, 0x69, 0x70,
0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x65,
0x22, 0x20, 0x3a, 0x20, 0x22, 0x62, 0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61,
0x6e, 0x64, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x2f, 0x67, 0x72, 0x69, 0x70, 0x22, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c,
0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20,
0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x4d, 0x65, 0x6e, 0x75, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20,
0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x62,
0x75, 0x74, 0x74, 0x6f, 0x6e, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x22, 0x70, 0x61, 0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75,
0x73, 0x65, 0x72, 0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x72, 0x69, 0x67,
0x68, 0x74, 0x2f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x61, 0x70, 0x70,
0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x6e,
0x75, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x22, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x22, 0x20, 0x3a,
0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63,
0x6c, 0x69, 0x63, 0x6b, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f,
0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f,
0x69, 0x6e, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x72, 0x69, 0x67,
0x67, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x75, 0x6c, 0x6c,
0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75,
0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x41,
0x78, 0x69, 0x73, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64, 0x65, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22,
0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61, 0x74, 0x68, 0x22,
0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x68, 0x61,
0x6e, 0x64, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x69, 0x6e, 0x70,
0x75, 0x74, 0x2f, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x22, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22,
0x69, 0x6e, 0x70, 0x75, 0x74, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6c, 0x69, 0x63,
0x6b, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70,
0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f,
0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61,
0x64, 0x44, 0x6f, 0x77, 0x6e, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69,
0x6f, 0x6e, 0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74,
0x70, 0x75, 0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74,
0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e,
0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70,
0x61, 0x64, 0x41, 0x78, 0x69, 0x73, 0x22, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x6f, 0x75, 0x63, 0x68,
0x22, 0x20, 0x3a, 0x20, 0x7b, 0x20, 0x22, 0x6f, 0x75, 0x74, 0x70, 0x75,
0x74, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x2f, 0x6c, 0x6f, 0x76, 0x72, 0x2f, 0x69, 0x6e, 0x2f, 0x72,
0x69, 0x67, 0x68, 0x74, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x70, 0x61, 0x64,
0x54, 0x6f, 0x75, 0x63, 0x68, 0x22, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6d, 0x6f, 0x64,
0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x70,
0x61, 0x64, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x70, 0x61,
0x74, 0x68, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x2f, 0x75, 0x73, 0x65, 0x72,
0x2f, 0x68, 0x61, 0x6e, 0x64, 0x2f, 0x72, 0x69, 0x67, 0x68, 0x74, 0x2f,
0x69, 0x6e, 0x70, 0x75, 0x74, 0x2f, 0x74, 0x72, 0x61, 0x63, 0x6b, 0x70,
0x61, 0x64, 0x22, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x20,
0x20, 0x20, 0x7d, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0d, 0x0a,
0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c,
0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22,
0x76, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c,
0x6c, 0x65, 0x72, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x22, 0x64,
0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20,
0x3a, 0x20, 0x22, 0x22, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20, 0x22, 0x6e,
0x61, 0x6d, 0x65, 0x22, 0x20, 0x3a, 0x20, 0x22, 0x56, 0x69, 0x76, 0x65,
0x20, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x2c, 0x0d,
0x0a, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x22, 0x20, 0x3a, 0x20, 0x7b, 0x7d, 0x2c, 0x0d, 0x0a, 0x20, 0x20, 0x20,
0x22, 0x73, 0x69, 0x6d, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61,
0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x20, 0x3a, 0x20, 0x5b, 0x5d,
0x0d, 0x0a, 0x7d, 0x0d, 0x0a
};
unsigned int bindings_vive_json_len = 3605;

View File

@ -252,25 +252,33 @@ var LibraryLOVR = {
if (gamepad.id.startsWith('OpenVR')) {
switch (axis) {
case C.AXIS_TRIGGER: HEAPF32[value >> 2] = gamepad.buttons[1].value; return true;
case C.AXIS_TRACKPAD_X: HEAPF32[value >> 2] = gamepad.axes[0]; return true;
case C.AXIS_TRACKPAD_Y: HEAPF32[value >> 2] = gamepad.axes[1]; return true;
case C.AXIS_TRACKPAD:
HEAPF32[value >> 2 + 0] = gamepad.axes[0];
HEAPF32[value >> 2 + 1] = gamepad.axes[1];
return true;
default: return false;
}
} else if (gamepad.id.startsWith('Oculus')) {
switch (axis) {
case C.AXIS_TRIGGER: HEAPF32[value >> 2] = gamepad.buttons[1].value; return true;
case C.AXIS_GRIP: HEAPF32[value >> 2] = gamepad.buttons[2].value; return true;
case C.AXIS_THUMBSTICK_X: HEAPF32[value >> 2] = gamepad.axes[0]; return true;
case C.AXIS_THUMBSTICK_Y: HEAPF32[value >> 2] = gamepad.axes[1]; return true;
case C.AXIS_THUMBSTICK:
HEAPF32[value >> 2 + 0] = gamepad.axes[0];
HEAPF32[value >> 2 + 1] = gamepad.axes[1];
return true;
default: return false;
}
} else if (gamepad.id.startsWith('Spatial Controller')) {
switch (axis) {
case C.AXIS_TRIGGER: HEAPF32[value >> 2] = gamepad.buttons[0].value; return true;
case C.AXIS_THUMBSTICK_X: HEAPF32[value >> 2] = gamepad.axes[0]; return true;
case C.AXIS_THUMBSTICK_Y: HEAPF32[value >> 2] = gamepad.axes[1]; return true;
case C.AXIS_TRACKPAD_X: HEAPF32[value >> 2] = gamepad.axes[2]; return true;
case C.AXIS_TRACKPAD_Y: HEAPF32[value >> 2] = gamepad.axes[3]; return true;
case C.AXIS_THUMBSTICK:
HEAPF32[value >> 2 + 0] = gamepad.axes[0];
HEAPF32[value >> 2 + 1] = gamepad.axes[1];
return true;
case C.AXIS_TRACKPAD:
HEAPF32[value >> 2 + 0] = gamepad.axes[2];
HEAPF32[value >> 2 + 1] = gamepad.axes[3];
return true;
default: return false;
}
}
@ -306,10 +314,8 @@ var LibraryLOVR = {
// DeviceAxis
AXIS_TRIGGER: 0,
AXIS_THUMBSTICK_X: 1,
AXIS_THUMBSTICK_Y: 2,
AXIS_TRACKPAD_X: 3,
AXIS_TRACKPAD_Y: 4,
AXIS_THUMBSTICK: 1,
AXIS_TRACKPAD: 2,
AXIS_PINCH: 5,
AXIS_GRIP: 6
}