diff --git a/mediapipe/tasks/cc/vision/face_detector/face_detector_graph.cc b/mediapipe/tasks/cc/vision/face_detector/face_detector_graph.cc index ee71a7fbe..bf62d2988 100644 --- a/mediapipe/tasks/cc/vision/face_detector/face_detector_graph.cc +++ b/mediapipe/tasks/cc/vision/face_detector/face_detector_graph.cc @@ -322,10 +322,8 @@ class FaceDetectorGraph : public core::ModelTaskGraph { // detection bounding boxes. auto& detection_transformation = graph.AddNode("DetectionTransformationCalculator"); - detection_projection.Out(kDetectionsTag) >> - detection_transformation.In(kDetectionsTag); - preprocessing.Out(kImageSizeTag) >> - detection_transformation.In(kImageSizeTag); + face_detections >> detection_transformation.In(kDetectionsTag); + image_size >> detection_transformation.In(kImageSizeTag); auto face_pixel_detections = detection_transformation.Out(kPixelDetectionsTag) .Cast>(); diff --git a/mediapipe/tasks/cc/vision/face_geometry/face_geometry_from_landmarks_graph.cc b/mediapipe/tasks/cc/vision/face_geometry/face_geometry_from_landmarks_graph.cc index 5b8729560..08b3d1bf4 100644 --- a/mediapipe/tasks/cc/vision/face_geometry/face_geometry_from_landmarks_graph.cc +++ b/mediapipe/tasks/cc/vision/face_geometry/face_geometry_from_landmarks_graph.cc @@ -97,7 +97,8 @@ void ConfigureFaceGeometryEnvGeneratorCalculator( // SideInputs: // ENVIRONMENT - ENVIRONMENT // Environment that describes the current virtual scene. If not provided, a -// default environment will be used which can be applied to common webcam. +// default environment will be used which is good enough for most general +// use cases. // // // Outputs: @@ -142,7 +143,7 @@ class FaceGeometryFromLandmarksGraph : public Subgraph { std::optional> environment, Graph& graph) { if (!environment.has_value()) { // If there is no provided Environment, use a a default environment which - // is good enough for most general use case. + // is good enough for most general use cases. auto& env_generator = graph.AddNode( "mediapipe.tasks.vision.face_geometry." "FaceGeometryEnvGeneratorCalculator"); diff --git a/mediapipe/tasks/cc/vision/face_landmarker/BUILD b/mediapipe/tasks/cc/vision/face_landmarker/BUILD index 7b0994dbe..7ecc93b21 100644 --- a/mediapipe/tasks/cc/vision/face_landmarker/BUILD +++ b/mediapipe/tasks/cc/vision/face_landmarker/BUILD @@ -142,3 +142,50 @@ cc_library( "//mediapipe/tasks/cc/components/containers:landmark", ], ) + +cc_library( + name = "face_landmarker_graph", + srcs = ["face_landmarker_graph.cc"], + deps = [ + ":face_landmarks_detector_graph", + "//mediapipe/calculators/core:begin_loop_calculator", + "//mediapipe/calculators/core:clip_vector_size_calculator_cc_proto", + "//mediapipe/calculators/core:end_loop_calculator", + "//mediapipe/calculators/core:gate_calculator", + "//mediapipe/calculators/core:gate_calculator_cc_proto", + "//mediapipe/calculators/core:pass_through_calculator", + "//mediapipe/calculators/core:previous_loopback_calculator", + "//mediapipe/calculators/image:image_properties_calculator", + "//mediapipe/calculators/util:association_calculator_cc_proto", + "//mediapipe/calculators/util:association_norm_rect_calculator", + "//mediapipe/calculators/util:collection_has_min_size_calculator", + "//mediapipe/calculators/util:collection_has_min_size_calculator_cc_proto", + "//mediapipe/framework/api2:builder", + "//mediapipe/framework/api2:port", + "//mediapipe/framework/formats:classification_cc_proto", + "//mediapipe/framework/formats:detection_cc_proto", + "//mediapipe/framework/formats:image", + "//mediapipe/framework/formats:landmark_cc_proto", + "//mediapipe/framework/formats:rect_cc_proto", + "//mediapipe/framework/formats:tensor", + "//mediapipe/framework/port:status", + "//mediapipe/tasks/cc:common", + "//mediapipe/tasks/cc/components/utils:gate", + "//mediapipe/tasks/cc/core:model_asset_bundle_resources", + "//mediapipe/tasks/cc/core:model_resources_cache", + "//mediapipe/tasks/cc/core:model_task_graph", + "//mediapipe/tasks/cc/core:utils", + "//mediapipe/tasks/cc/metadata/utils:zip_utils", + "//mediapipe/tasks/cc/vision/face_detector:face_detector_graph", + "//mediapipe/tasks/cc/vision/face_detector/proto:face_detector_graph_options_cc_proto", + "//mediapipe/tasks/cc/vision/face_geometry:face_geometry_from_landmarks_graph", + "//mediapipe/tasks/cc/vision/face_geometry/proto:environment_cc_proto", + "//mediapipe/tasks/cc/vision/face_geometry/proto:face_geometry_cc_proto", + "//mediapipe/tasks/cc/vision/face_landmarker/proto:face_blendshapes_graph_options_cc_proto", + "//mediapipe/tasks/cc/vision/face_landmarker/proto:face_landmarker_graph_options_cc_proto", + "//mediapipe/tasks/cc/vision/face_landmarker/proto:face_landmarks_detector_graph_options_cc_proto", + "//mediapipe/util:graph_builder_utils", + "@com_google_absl//absl/strings:str_format", + ], + alwayslink = 1, +) diff --git a/mediapipe/tasks/cc/vision/face_landmarker/face_landmarker_graph.cc b/mediapipe/tasks/cc/vision/face_landmarker/face_landmarker_graph.cc new file mode 100644 index 000000000..52c8b08a0 --- /dev/null +++ b/mediapipe/tasks/cc/vision/face_landmarker/face_landmarker_graph.cc @@ -0,0 +1,520 @@ +/* Copyright 2023 The MediaPipe Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include +#include +#include +#include + +#include "absl/strings/str_format.h" +#include "mediapipe/calculators/core/clip_vector_size_calculator.pb.h" +#include "mediapipe/calculators/core/gate_calculator.pb.h" +#include "mediapipe/calculators/util/association_calculator.pb.h" +#include "mediapipe/calculators/util/collection_has_min_size_calculator.pb.h" +#include "mediapipe/framework/api2/builder.h" +#include "mediapipe/framework/api2/port.h" +#include "mediapipe/framework/formats/classification.pb.h" +#include "mediapipe/framework/formats/detection.pb.h" +#include "mediapipe/framework/formats/image.h" +#include "mediapipe/framework/formats/landmark.pb.h" +#include "mediapipe/framework/formats/rect.pb.h" +#include "mediapipe/framework/formats/tensor.h" +#include "mediapipe/framework/port/status_macros.h" +#include "mediapipe/tasks/cc/common.h" +#include "mediapipe/tasks/cc/components/utils/gate.h" +#include "mediapipe/tasks/cc/core/model_asset_bundle_resources.h" +#include "mediapipe/tasks/cc/core/model_resources_cache.h" +#include "mediapipe/tasks/cc/core/model_task_graph.h" +#include "mediapipe/tasks/cc/core/utils.h" +#include "mediapipe/tasks/cc/metadata/utils/zip_utils.h" +#include "mediapipe/tasks/cc/vision/face_detector/proto/face_detector_graph_options.pb.h" +#include "mediapipe/tasks/cc/vision/face_geometry/proto/environment.pb.h" +#include "mediapipe/tasks/cc/vision/face_geometry/proto/face_geometry.pb.h" +#include "mediapipe/tasks/cc/vision/face_landmarker/proto/face_blendshapes_graph_options.pb.h" +#include "mediapipe/tasks/cc/vision/face_landmarker/proto/face_landmarker_graph_options.pb.h" +#include "mediapipe/tasks/cc/vision/face_landmarker/proto/face_landmarks_detector_graph_options.pb.h" +#include "mediapipe/util/graph_builder_utils.h" + +namespace mediapipe { +namespace tasks { +namespace vision { +namespace face_landmarker { + +namespace { + +using ::mediapipe::NormalizedRect; +using ::mediapipe::api2::Input; +using ::mediapipe::api2::Output; +using ::mediapipe::api2::builder::Graph; +using ::mediapipe::api2::builder::SidePacket; +using ::mediapipe::api2::builder::Source; +using ::mediapipe::tasks::components::utils::DisallowIf; +using ::mediapipe::tasks::core::ModelAssetBundleResources; +using ::mediapipe::tasks::metadata::SetExternalFile; +using ::mediapipe::tasks::vision::face_detector::proto:: + FaceDetectorGraphOptions; +using ::mediapipe::tasks::vision::face_geometry::proto::Environment; +using ::mediapipe::tasks::vision::face_geometry::proto::FaceGeometry; +using ::mediapipe::tasks::vision::face_landmarker::proto:: + FaceLandmarkerGraphOptions; +using ::mediapipe::tasks::vision::face_landmarker::proto:: + FaceLandmarksDetectorGraphOptions; + +constexpr char kImageTag[] = "IMAGE"; +constexpr char kNormRectTag[] = "NORM_RECT"; +constexpr char kNormLandmarksTag[] = "NORM_LANDMARKS"; +constexpr char kFaceRectsTag[] = "FACE_RECTS"; +constexpr char kFaceRectsNextFrameTag[] = "FACE_RECTS_NEXT_FRAME"; +constexpr char kExpandedFaceRectsTag[] = "EXPANDED_FACE_RECTS"; +constexpr char kDetectionsTag[] = "DETECTIONS"; +constexpr char kLoopTag[] = "LOOP"; +constexpr char kPrevLoopTag[] = "PREV_LOOP"; +constexpr char kMainTag[] = "MAIN"; +constexpr char kIterableTag[] = "ITERABLE"; +constexpr char kFaceLandmarksTag[] = "FACE_LANDMARKS"; +constexpr char kFaceGeometryTag[] = "FACE_GEOMETRY"; +constexpr char kEnvironmentTag[] = "ENVIRONMENT"; +constexpr char kBlendshapesTag[] = "BLENDSHAPES"; +constexpr char kImageSizeTag[] = "IMAGE_SIZE"; +constexpr char kSizeTag[] = "SIZE"; +constexpr char kFaceDetectorTFLiteName[] = "face_detector.tflite"; +constexpr char kFaceLandmarksDetectorTFLiteName[] = + "face_landmarks_detector.tflite"; +constexpr char kFaceBlendshapeTFLiteName[] = "face_blendshapes.tflite"; + +struct FaceLandmarkerOutputs { + Source> landmark_lists; + Source> face_rects_next_frame; + Source> face_rects; + Source> detections; + std::optional>> face_blendshapes; + std::optional>> face_geometry; + Source image; +}; + +// Sets the base options in the sub tasks. +absl::Status SetSubTaskBaseOptions(const ModelAssetBundleResources& resources, + FaceLandmarkerGraphOptions* options, + bool is_copy) { + auto* face_detector_graph_options = + options->mutable_face_detector_graph_options(); + if (!face_detector_graph_options->base_options().has_model_asset()) { + ASSIGN_OR_RETURN(const auto face_detector_file, + resources.GetModelFile(kFaceDetectorTFLiteName)); + SetExternalFile(face_detector_file, + face_detector_graph_options->mutable_base_options() + ->mutable_model_asset(), + is_copy); + } + face_detector_graph_options->mutable_base_options() + ->mutable_acceleration() + ->CopyFrom(options->base_options().acceleration()); + face_detector_graph_options->mutable_base_options()->set_use_stream_mode( + options->base_options().use_stream_mode()); + auto* face_landmarks_detector_graph_options = + options->mutable_face_landmarks_detector_graph_options(); + if (!face_landmarks_detector_graph_options->base_options() + .has_model_asset()) { + ASSIGN_OR_RETURN(const auto face_landmarks_detector_file, + resources.GetModelFile(kFaceLandmarksDetectorTFLiteName)); + SetExternalFile( + face_landmarks_detector_file, + face_landmarks_detector_graph_options->mutable_base_options() + ->mutable_model_asset(), + is_copy); + } + face_landmarks_detector_graph_options->mutable_base_options() + ->mutable_acceleration() + ->CopyFrom(options->base_options().acceleration()); + face_landmarks_detector_graph_options->mutable_base_options() + ->set_use_stream_mode(options->base_options().use_stream_mode()); + + absl::StatusOr face_blendshape_model = + resources.GetModelFile(kFaceBlendshapeTFLiteName); + if (face_blendshape_model.ok()) { + SetExternalFile(*face_blendshape_model, + face_landmarks_detector_graph_options + ->mutable_face_blendshapes_graph_options() + ->mutable_base_options() + ->mutable_model_asset(), + is_copy); + face_landmarks_detector_graph_options + ->mutable_face_blendshapes_graph_options() + ->mutable_base_options() + ->mutable_acceleration() + ->mutable_xnnpack(); + LOG(WARNING) << "Face blendshape model contains CPU only ops. Sets " + << "FaceBlendshapesGraph acceleartion to Xnnpack."; + } + + return absl::OkStatus(); +} + +} // namespace + +// A "mediapipe.tasks.vision.face_landmarker.FaceLandmarkerGraph" performs face +// landmarks detection. The FaceLandmarkerGraph consists of three subgraphs: +// FaceDetectorGraph, MultipleFaceLandmarksDetectorGraph and +// FaceGeometryFromLandmarksGraph. +// +// MultipleFaceLandmarksDetectorGraph detects landmarks from bounding boxes +// produced by FaceDetectorGraph. FaceLandmarkerGraph tracks the landmarks over +// time, and skips the FaceDetectorGraph. If the tracking is lost or the +// detected faces are less than configured max number faces, FaceDetectorGraph +// would be triggered to detect faces. +// +// FaceGeometryFromLandmarksGraph finds the transformation from canonical face +// to the detected faces. This transformation is useful for renderring face +// effects on the detected faces. This subgraph is added if users request a +// FaceGeometry Tag. +// +// +// Inputs: +// IMAGE - Image +// Image to perform face landmarks detection on. +// NORM_RECT - NormalizedRect @Optional +// Describes image rotation and region of image to perform landmarks +// detection on. If not provided, whole image is used for face landmarks +// detection. +// +// SideInputs: +// ENVIRONMENT - ENVIRONMENT @optional +// Environment that describes the current virtual scene. If not provided, a +// default environment will be used which is good enough for most general +// use case +// +// Outputs: +// NORM_LANDMARKS: - std::vector +// Vector of detected face landmarks. +// BLENDSHAPES: - std::vector @optional +// Blendshape classification, available when the given model asset contains +// blendshapes model. +// All 52 blendshape coefficients: +// 0 - _neutral (ignore it) +// 1 - browDownLeft +// 2 - browDownRight +// 3 - browInnerUp +// 4 - browOuterUpLeft +// 5 - browOuterUpRight +// 6 - cheekPuff +// 7 - cheekSquintLeft +// 8 - cheekSquintRight +// 9 - eyeBlinkLeft +// 10 - eyeBlinkRight +// 11 - eyeLookDownLeft +// 12 - eyeLookDownRight +// 13 - eyeLookInLeft +// 14 - eyeLookInRight +// 15 - eyeLookOutLeft +// 16 - eyeLookOutRight +// 17 - eyeLookUpLeft +// 18 - eyeLookUpRight +// 19 - eyeSquintLeft +// 20 - eyeSquintRight +// 21 - eyeWideLeft +// 22 - eyeWideRight +// 23 - jawForward +// 24 - jawLeft +// 25 - jawOpen +// 26 - jawRight +// 27 - mouthClose +// 28 - mouthDimpleLeft +// 29 - mouthDimpleRight +// 30 - mouthFrownLeft +// 31 - mouthFrownRight +// 32 - mouthFunnel +// 33 - mouthLeft +// 34 - mouthLowerDownLeft +// 35 - mouthLowerDownRight +// 36 - mouthPressLeft +// 37 - mouthPressRight +// 38 - mouthPucker +// 39 - mouthRight +// 40 - mouthRollLower +// 41 - mouthRollUpper +// 42 - mouthShrugLower +// 43 - mouthShrugUpper +// 44 - mouthSmileLeft +// 45 - mouthSmileRight +// 46 - mouthStretchLeft +// 47 - mouthStretchRight +// 48 - mouthUpperUpLeft +// 49 - mouthUpperUpRight +// 50 - noseSneerLeft +// 51 - noseSneerRight +// FACE_GEOMETRY - std::vector @optional +// A vector of 3D transform data for each detected face. +// FACE_RECTS_NEXT_FRAME - std::vector +// Vector of the expanded rects enclosing the whole face RoI for landmark +// detection on the next frame. +// FACE_RECTS - std::vector +// Detected face bounding boxes in normalized coordinates from face +// detection. +// DETECTIONS - std::vector +// Detected faces with maximum `num_faces` specified in options. +// IMAGE - Image +// The input image that the face landmarker runs on and has the pixel data +// stored on the target storage (CPU vs GPU). +// All returned coordinates are in the unrotated and uncropped input image +// coordinates system. +// +// Example: +// node { +// calculator: "mediapipe.tasks.vision.face_landmarker.FaceLandmarkerGraph" +// input_stream: "IMAGE:image_in" +// input_stream: "NORM_RECT:norm_rect" +// output_stream: "NORM_LANDMARKS:face_landmarks" +// output_stream: "BLENDSHAPES:face_blendshapes" +// output_stream: "FACE_GEOMETRY:face_geometry" +// output_stream: "FACE_RECTS_NEXT_FRAME:face_rects_next_frame" +// output_stream: "FACE_RECTS:face_rects" +// output_stream: "DETECTIONS:detections" +// output_stream: "IMAGE:image_out" +// options { +// [mediapipe.tasks.vision.face_landmarker.proto.FaceLandmarkerGraphOptions.ext] +// { +// base_options { +// model_asset { +// file_name: "face_landmarker.task" +// } +// } +// face_detector_graph_options { +// min_detection_confidence: 0.5 +// num_faces: 2 +// } +// face_landmarks_detector_graph_options { +// min_detection_confidence: 0.5 +// } +// } +// } +// } +class FaceLandmarkerGraph : public core::ModelTaskGraph { + public: + absl::StatusOr GetConfig( + SubgraphContext* sc) override { + Graph graph; + if (sc->Options() + .base_options() + .has_model_asset()) { + ASSIGN_OR_RETURN( + const auto* model_asset_bundle_resources, + CreateModelAssetBundleResources(sc)); + // Copies the file content instead of passing the pointer of file in + // memory if the subgraph model resource service is not available. + MP_RETURN_IF_ERROR(SetSubTaskBaseOptions( + *model_asset_bundle_resources, + sc->MutableOptions(), + !sc->Service(::mediapipe::tasks::core::kModelResourcesCacheService) + .IsAvailable())); + } + std::optional> environment; + if (HasSideInput(sc->OriginalNode(), kEnvironmentTag)) { + environment = std::make_optional<>( + graph.SideIn(kEnvironmentTag).Cast()); + } + bool output_blendshapes = HasOutput(sc->OriginalNode(), kBlendshapesTag); + if (output_blendshapes && !sc->Options() + .face_landmarks_detector_graph_options() + .has_face_blendshapes_graph_options()) { + return absl::InvalidArgumentError(absl::StrFormat( + "BLENDSHAPES Tag and blendshapes model must be both set. Get " + "BLENDSHAPES is set: %v, blendshapes " + "model " + "is set: %v", + output_blendshapes, + sc->Options() + .face_landmarks_detector_graph_options() + .has_face_blendshapes_graph_options())); + } + bool output_geometry = HasOutput(sc->OriginalNode(), kFaceGeometryTag); + ASSIGN_OR_RETURN( + auto outs, + BuildFaceLandmarkerGraph( + *sc->MutableOptions(), + graph[Input(kImageTag)], + graph[Input::Optional(kNormRectTag)], environment, + output_blendshapes, output_geometry, graph)); + outs.landmark_lists >> + graph[Output>(kNormLandmarksTag)]; + outs.face_rects_next_frame >> + graph[Output>(kFaceRectsNextFrameTag)]; + outs.face_rects >> + graph[Output>(kFaceRectsTag)]; + outs.detections >> graph[Output>(kDetectionsTag)]; + outs.image >> graph[Output(kImageTag)]; + if (outs.face_blendshapes) { + *outs.face_blendshapes >> + graph[Output>(kBlendshapesTag)]; + } + if (outs.face_geometry) { + *outs.face_geometry >> + graph[Output>(kFaceGeometryTag)]; + } + + // TODO remove when support is fixed. + // As mediapipe GraphBuilder currently doesn't support configuring + // InputStreamInfo, modifying the CalculatorGraphConfig proto directly. + CalculatorGraphConfig config = graph.GetConfig(); + for (int i = 0; i < config.node_size(); ++i) { + if (config.node(i).calculator() == "PreviousLoopbackCalculator") { + auto* info = config.mutable_node(i)->add_input_stream_info(); + info->set_tag_index(kLoopTag); + info->set_back_edge(true); + break; + } + } + return config; + } + + private: + // Adds a mediapipe face landmarker graph into the provided builder::Graph + // instance. + // + // tasks_options: the mediapipe tasks module FaceLandmarkerGraphOptions. + // image_in: (mediapipe::Image) stream to run face landmark detection on. + // graph: the mediapipe graph instance to be updated. + absl::StatusOr BuildFaceLandmarkerGraph( + FaceLandmarkerGraphOptions& tasks_options, Source image_in, + Source norm_rect_in, + std::optional> environment, + bool output_blendshapes, bool output_geometry, Graph& graph) { + const int max_num_faces = + tasks_options.face_detector_graph_options().num_faces(); + + auto& face_detector = + graph.AddNode("mediapipe.tasks.vision.face_detector.FaceDetectorGraph"); + face_detector.GetOptions().Swap( + tasks_options.mutable_face_detector_graph_options()); + auto& clip_face_rects = + graph.AddNode("ClipNormalizedRectVectorSizeCalculator"); + clip_face_rects.GetOptions() + .set_max_vec_size(max_num_faces); + auto clipped_face_rects = clip_face_rects.Out(""); + + auto& face_landmarks_detector_graph = graph.AddNode( + "mediapipe.tasks.vision.face_landmarker." + "MultiFaceLandmarksDetectorGraph"); + face_landmarks_detector_graph + .GetOptions() + .Swap(tasks_options.mutable_face_landmarks_detector_graph_options()); + image_in >> face_landmarks_detector_graph.In(kImageTag); + clipped_face_rects >> face_landmarks_detector_graph.In(kNormRectTag); + + // TODO: add landmarks smoothing calculators. + auto landmarks = face_landmarks_detector_graph.Out(kNormLandmarksTag) + .Cast>(); + auto face_rects_for_next_frame = + face_landmarks_detector_graph.Out(kFaceRectsNextFrameTag) + .Cast>(); + + if (tasks_options.base_options().use_stream_mode()) { + auto& previous_loopback = graph.AddNode("PreviousLoopbackCalculator"); + image_in >> previous_loopback.In(kMainTag); + auto prev_face_rects_from_landmarks = + previous_loopback[Output>(kPrevLoopTag)]; + + auto& min_size_node = + graph.AddNode("NormalizedRectVectorHasMinSizeCalculator"); + prev_face_rects_from_landmarks >> min_size_node.In(kIterableTag); + min_size_node.GetOptions() + .set_min_size(max_num_faces); + auto has_enough_faces = min_size_node.Out("").Cast(); + + // While in stream mode, skip face detector graph when we successfully + // track the faces from the last frame. + auto image_for_face_detector = + DisallowIf(image_in, has_enough_faces, graph); + auto norm_rect_in_for_face_detector = + DisallowIf(norm_rect_in, has_enough_faces, graph); + image_for_face_detector >> face_detector.In(kImageTag); + norm_rect_in_for_face_detector >> face_detector.In(kNormRectTag); + auto expanded_face_rects_from_face_detector = + face_detector.Out(kExpandedFaceRectsTag); + auto& face_association = graph.AddNode("AssociationNormRectCalculator"); + face_association.GetOptions() + .set_min_similarity_threshold( + tasks_options.min_tracking_confidence()); + prev_face_rects_from_landmarks >> + face_association[Input>::Multiple("")][0]; + expanded_face_rects_from_face_detector >> + face_association[Input>::Multiple("")][1]; + auto face_rects = face_association.Out(""); + face_rects >> clip_face_rects.In(""); + // Back edge. + face_rects_for_next_frame >> previous_loopback.In(kLoopTag); + } else { + // While not in stream mode, the input images are not guaranteed to be in + // series, and we don't want to enable the tracking and rect associations + // between input images. Always use the face detector graph. + image_in >> face_detector.In(kImageTag); + norm_rect_in >> face_detector.In(kNormRectTag); + auto face_rects = face_detector.Out(kExpandedFaceRectsTag); + face_rects >> clip_face_rects.In(""); + } + + // Optional blendshape output. + std::optional>> blendshapes; + if (output_blendshapes) { + blendshapes = std::make_optional<>( + face_landmarks_detector_graph.Out(kBlendshapesTag) + .Cast>()); + } + + // Optional face geometry output. + std::optional>> face_geometry; + if (output_geometry) { + auto& image_properties = graph.AddNode("ImagePropertiesCalculator"); + image_in >> image_properties.In(kImageTag); + auto image_size = image_properties.Out(kSizeTag); + auto& face_geometry_from_landmarks = graph.AddNode( + "mediapipe.tasks.vision.face_geometry." + "FaceGeometryFromLandmarksGraph"); + if (environment.has_value()) { + *environment >> face_geometry_from_landmarks.SideIn(kEnvironmentTag); + } + landmarks >> face_geometry_from_landmarks.In(kFaceLandmarksTag); + image_size >> face_geometry_from_landmarks.In(kImageSizeTag); + face_geometry = face_geometry_from_landmarks.Out(kFaceGeometryTag) + .Cast>(); + } + + // TODO: Replace PassThroughCalculator with a calculator that + // converts the pixel data to be stored on the target storage (CPU vs GPU). + auto& pass_through = graph.AddNode("PassThroughCalculator"); + image_in >> pass_through.In(""); + + return {{ + /* landmark_lists= */ landmarks, + /* face_rects_next_frame= */ + face_rects_for_next_frame, + /* face_rects= */ + face_detector.Out(kFaceRectsTag).Cast>(), + /* face_detections */ + face_detector.Out(kDetectionsTag).Cast>(), + /* face_blendshapes= */ blendshapes, + /* face_geometry= */ face_geometry, + /* image= */ + pass_through[Output("")], + }}; + } +}; + +REGISTER_MEDIAPIPE_GRAPH( + ::mediapipe::tasks::vision::face_landmarker::FaceLandmarkerGraph); + +} // namespace face_landmarker +} // namespace vision +} // namespace tasks +} // namespace mediapipe diff --git a/mediapipe/tasks/cc/vision/face_landmarker/face_landmarker_graph_test.cc b/mediapipe/tasks/cc/vision/face_landmarker/face_landmarker_graph_test.cc new file mode 100644 index 000000000..251f788ac --- /dev/null +++ b/mediapipe/tasks/cc/vision/face_landmarker/face_landmarker_graph_test.cc @@ -0,0 +1,311 @@ +/* Copyright 2023 The MediaPipe Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +#include + +#include "absl/flags/flag.h" +#include "absl/status/statusor.h" +#include "absl/strings/str_format.h" +#include "absl/strings/string_view.h" +#include "mediapipe/framework/api2/builder.h" +#include "mediapipe/framework/api2/port.h" +#include "mediapipe/framework/calculator_framework.h" +#include "mediapipe/framework/deps/file_path.h" +#include "mediapipe/framework/formats/classification.pb.h" +#include "mediapipe/framework/formats/image.h" +#include "mediapipe/framework/formats/landmark.pb.h" +#include "mediapipe/framework/formats/rect.pb.h" +#include "mediapipe/framework/packet.h" +#include "mediapipe/framework/port/file_helpers.h" +#include "mediapipe/framework/port/gmock.h" +#include "mediapipe/framework/port/gtest.h" +#include "mediapipe/tasks/cc/core/mediapipe_builtin_op_resolver.h" +#include "mediapipe/tasks/cc/core/proto/base_options.pb.h" +#include "mediapipe/tasks/cc/core/proto/external_file.pb.h" +#include "mediapipe/tasks/cc/core/task_runner.h" +#include "mediapipe/tasks/cc/vision/face_detector/proto/face_detector_graph_options.pb.h" +#include "mediapipe/tasks/cc/vision/face_geometry/proto/face_geometry.pb.h" +#include "mediapipe/tasks/cc/vision/face_landmarker/proto/face_landmarker_graph_options.pb.h" +#include "mediapipe/tasks/cc/vision/face_landmarker/proto/face_landmarks_detector_graph_options.pb.h" +#include "mediapipe/tasks/cc/vision/utils/image_utils.h" + +namespace mediapipe { +namespace tasks { +namespace vision { +namespace face_landmarker { +namespace { + +using ::file::Defaults; +using ::file::GetTextProto; +using ::mediapipe::api2::Input; +using ::mediapipe::api2::Output; +using ::mediapipe::api2::builder::Graph; +using ::mediapipe::api2::builder::Source; +using ::mediapipe::file::JoinPath; +using ::mediapipe::tasks::core::TaskRunner; +using ::mediapipe::tasks::vision::DecodeImageFromFile; +using ::mediapipe::tasks::vision::face_geometry::proto::FaceGeometry; +using ::mediapipe::tasks::vision::face_landmarker::proto:: + FaceLandmarkerGraphOptions; +using ::testing::EqualsProto; +using ::testing::Pointwise; +using ::testing::TestParamInfo; +using ::testing::TestWithParam; +using ::testing::Values; +using ::testing::proto::Approximately; +using ::testing::proto::Partially; + +constexpr char kTestDataDirectory[] = "/mediapipe/tasks/testdata/vision/"; +constexpr char kFaceLandmarkerModelBundleName[] = "face_landmarker.task"; +constexpr char kFaceLandmarkerWithBlendshapesModelBundleName[] = + "face_landmarker_with_blendshapes.task"; +constexpr char kPortraitImageName[] = "portrait.jpg"; +constexpr char kCatImageName[] = "cat.jpg"; +constexpr char kPortraitExpectedFaceLandamrksName[] = + "portrait_expected_face_landmarks.pbtxt"; +constexpr char kPortraitExpectedFaceLandamrksWithAttentionName[] = + "portrait_expected_face_landmarks_with_attention.pbtxt"; +constexpr char kPortraitExpectedBlendshapesName[] = + "portrait_expected_blendshapes_with_attention.pbtxt"; +constexpr char kPortraitExpectedFaceGeometryName[] = + "portrait_expected_face_geometry_with_attention.pbtxt"; + +constexpr char kImageTag[] = "IMAGE"; +constexpr char kImageName[] = "image"; +constexpr char kNormRectTag[] = "NORM_RECT"; +constexpr char kNormRectName[] = "norm_rect"; +constexpr char kNormLandmarksTag[] = "NORM_LANDMARKS"; +constexpr char kNormLandmarksName[] = "norm_landmarks"; +constexpr char kBlendshapesTag[] = "BLENDSHAPES"; +constexpr char kBlendshapesName[] = "blendshapes"; +constexpr char kFaceGeometryTag[] = "FACE_GEOMETRY"; +constexpr char kFaceGeometryName[] = "face_geometry"; + +constexpr float kLandmarksDiffMargin = 0.03; +constexpr float kBlendshapesDiffMargin = 0.1; +constexpr float kFaceGeometryDiffMargin = 0.01; + +template +ProtoT GetExpectedProto(absl::string_view filename) { + ProtoT expected_proto; + MP_EXPECT_OK(GetTextProto(file::JoinPath("./", kTestDataDirectory, filename), + &expected_proto, Defaults())); + return expected_proto; +} + +// Struct holding the parameters for parameterized FaceLandmarkerGraphTest +// class. +struct FaceLandmarkerGraphTestParams { + // The name of this test, for convenience when displaying test results. + std::string test_name; + // The filename of the model to test. + std::string input_model_name; + // The filename of the test image. + std::string test_image_name; + // The expected output landmarks positions. + std::optional> expected_landmarks_list; + // The expected output blendshape classification. + std::optional> expected_blendshapes; + // The expected output face geometry. + std::optional> expected_face_geometry; + // The max value difference between expected_positions and detected positions. + float landmarks_diff_threshold; + // The max value difference between expected blendshapes and actual + // blendshapes. + float blendshapes_diff_threshold; + // The max value difference between expected blendshape and actual face + // geometry. + float face_geometry_diff_threshold; +}; + +// Helper function to create a FaceLandmarkerGraph TaskRunner. +absl::StatusOr> CreateFaceLandmarkerGraphTaskRunner( + absl::string_view model_name, bool output_blendshape, + bool output_face_geometry) { + Graph graph; + + auto& face_landmarker = graph.AddNode( + "mediapipe.tasks.vision.face_landmarker." + "FaceLandmarkerGraph"); + + auto* options = &face_landmarker.GetOptions(); + options->mutable_base_options()->mutable_model_asset()->set_file_name( + JoinPath("./", kTestDataDirectory, model_name)); + options->mutable_face_detector_graph_options()->set_num_faces(1); + options->mutable_base_options()->set_use_stream_mode(true); + + graph[Input(kImageTag)].SetName(kImageName) >> + face_landmarker.In(kImageTag); + graph[Input(kNormRectTag)].SetName(kNormRectName) >> + face_landmarker.In(kNormRectTag); + + face_landmarker.Out(kNormLandmarksTag).SetName(kNormLandmarksName) >> + graph[Output>(kNormLandmarksTag)]; + if (output_blendshape) { + face_landmarker.Out(kBlendshapesTag).SetName(kBlendshapesName) >> + graph[Output>(kBlendshapesTag)]; + } + if (output_face_geometry) { + face_landmarker.Out(kFaceGeometryTag).SetName(kFaceGeometryName) >> + graph[Output>(kFaceGeometryTag)]; + } + + return TaskRunner::Create( + graph.GetConfig(), + absl::make_unique()); +} + +// Helper function to construct NormalizeRect proto. +NormalizedRect MakeNormRect(float x_center, float y_center, float width, + float height, float rotation) { + NormalizedRect face_rect; + face_rect.set_x_center(x_center); + face_rect.set_y_center(y_center); + face_rect.set_width(width); + face_rect.set_height(height); + face_rect.set_rotation(rotation); + return face_rect; +} + +class FaceLandmarkerGraphTest + : public testing::TestWithParam {}; + +TEST(FaceLandmarkerGraphTest, FailsWithNoBlendshapesModel) { + MP_ASSERT_OK_AND_ASSIGN( + Image image, DecodeImageFromFile( + JoinPath("./", kTestDataDirectory, kPortraitImageName))); + auto result = + CreateFaceLandmarkerGraphTaskRunner(kFaceLandmarkerModelBundleName, + /*output_blendshape=*/true, + /*output_face_geometry=*/false); + EXPECT_EQ(result.status().code(), absl::StatusCode::kInvalidArgument); + EXPECT_THAT(result.status().message(), + testing::HasSubstr( + "BLENDSHAPES Tag and blendshapes model must be both set.")); +} + +TEST_P(FaceLandmarkerGraphTest, Succeeds) { + MP_ASSERT_OK_AND_ASSIGN( + Image image, DecodeImageFromFile(JoinPath("./", kTestDataDirectory, + GetParam().test_image_name))); + MP_ASSERT_OK_AND_ASSIGN(auto task_runner, + CreateFaceLandmarkerGraphTaskRunner( + GetParam().input_model_name, + GetParam().expected_blendshapes.has_value(), + GetParam().expected_face_geometry.has_value())); + + auto output_packets = task_runner->Process( + {{kImageName, MakePacket(std::move(image))}, + {kNormRectName, + MakePacket(MakeNormRect(0.5, 0.5, 1.0, 1.0, 0))}}); + MP_ASSERT_OK(output_packets); + + if (GetParam().expected_landmarks_list) { + const std::vector& landmarks_lists = + (*output_packets)[kNormLandmarksName] + .Get>(); + EXPECT_THAT(landmarks_lists, + Pointwise(Approximately(Partially(EqualsProto()), + GetParam().landmarks_diff_threshold), + *GetParam().expected_landmarks_list)); + } + + if (GetParam().expected_blendshapes) { + const std::vector& blendshapes = + (*output_packets)[kBlendshapesName] + .Get>(); + EXPECT_THAT(blendshapes, + Pointwise(Approximately(Partially(EqualsProto()), + GetParam().blendshapes_diff_threshold), + *GetParam().expected_blendshapes)); + } + if (GetParam().expected_face_geometry) { + const std::vector& face_geometry = + (*output_packets)[kFaceGeometryName].Get>(); + EXPECT_THAT( + face_geometry, + Pointwise(Approximately(Partially(EqualsProto()), + GetParam().face_geometry_diff_threshold), + *GetParam().expected_face_geometry)); + } +} + +INSTANTIATE_TEST_SUITE_P( + FaceLandmarkerGraphTests, FaceLandmarkerGraphTest, + Values(FaceLandmarkerGraphTestParams{ + /* test_name= */ "Portrait", + /* input_model_name= */ kFaceLandmarkerModelBundleName, + /* test_image_name= */ kPortraitImageName, + /* expected_landmarks_list= */ + {{GetExpectedProto( + kPortraitExpectedFaceLandamrksName)}}, + /* expected_blendshapes= */ std::nullopt, + /* expected_face_geometry= */ std::nullopt, + /* landmarks_diff_threshold= */ kLandmarksDiffMargin, + /* blendshapes_diff_threshold= */ kBlendshapesDiffMargin, + /* face_geometry_diff_threshold= */ + kFaceGeometryDiffMargin}, + FaceLandmarkerGraphTestParams{ + /* test_name= */ "NoFace", + /* input_model_name= */ kFaceLandmarkerModelBundleName, + /* test_image_name= */ kCatImageName, + /* expected_landmarks_list= */ std::nullopt, + /* expected_blendshapes= */ std::nullopt, + /* expected_face_geometry= */ std::nullopt, + /* landmarks_diff_threshold= */ kLandmarksDiffMargin, + /* blendshapes_diff_threshold= */ kBlendshapesDiffMargin, + /* face_geometry_diff_threshold= */ + kFaceGeometryDiffMargin}, + FaceLandmarkerGraphTestParams{ + /* test_name= */ "PortraitWithBlendshape", + /* input_model_name= */ + kFaceLandmarkerWithBlendshapesModelBundleName, + /* test_image_name= */ kPortraitImageName, + /* expected_landmarks_list= */ + {{GetExpectedProto( + kPortraitExpectedFaceLandamrksWithAttentionName)}}, + /* expected_blendshapes= */ + {{GetExpectedProto( + kPortraitExpectedBlendshapesName)}}, + /* expected_face_geometry= */ std::nullopt, + /*landmarks_diff_threshold= */ kLandmarksDiffMargin, + /*blendshapes_diff_threshold= */ kBlendshapesDiffMargin, + /*face_geometry_diff_threshold= */ kFaceGeometryDiffMargin}, + FaceLandmarkerGraphTestParams{ + /* test_name= */ "PortraitWithBlendshapeWithFaceGeometry", + /* input_model_name= */ + kFaceLandmarkerWithBlendshapesModelBundleName, + /* test_image_name= */ kPortraitImageName, + /* expected_landmarks_list= */ + {{GetExpectedProto( + kPortraitExpectedFaceLandamrksWithAttentionName)}}, + /* expected_blendshapes= */ + {{GetExpectedProto( + kPortraitExpectedBlendshapesName)}}, + /* expected_face_geometry= */ + {{GetExpectedProto( + kPortraitExpectedFaceGeometryName)}}, + /*landmarks_diff_threshold= */ kLandmarksDiffMargin, + /*blendshapes_diff_threshold= */ kBlendshapesDiffMargin, + /*face_geometry_diff_threshold= */ kFaceGeometryDiffMargin}), + [](const TestParamInfo& info) { + return info.param.test_name; + }); + +} // namespace +} // namespace face_landmarker +} // namespace vision +} // namespace tasks +} // namespace mediapipe diff --git a/mediapipe/tasks/cc/vision/face_landmarker/face_landmarks_detector_graph_test.cc b/mediapipe/tasks/cc/vision/face_landmarker/face_landmarks_detector_graph_test.cc index 9853e1548..72e92be9d 100644 --- a/mediapipe/tasks/cc/vision/face_landmarker/face_landmarks_detector_graph_test.cc +++ b/mediapipe/tasks/cc/vision/face_landmarker/face_landmarks_detector_graph_test.cc @@ -214,13 +214,13 @@ ClassificationList GetBlendshapes(absl::string_view filename) { // Helper function to construct NormalizeRect proto. NormalizedRect MakeNormRect(float x_center, float y_center, float width, float height, float rotation) { - NormalizedRect hand_rect; - hand_rect.set_x_center(x_center); - hand_rect.set_y_center(y_center); - hand_rect.set_width(width); - hand_rect.set_height(height); - hand_rect.set_rotation(rotation); - return hand_rect; + NormalizedRect face_rect; + face_rect.set_x_center(x_center); + face_rect.set_y_center(y_center); + face_rect.set_width(width); + face_rect.set_height(height); + face_rect.set_rotation(rotation); + return face_rect; } // Struct holding the parameters for parameterized FaceLandmarksDetectionTest @@ -234,9 +234,9 @@ struct SingeFaceTestParams { std::optional blendshape_model_name; // The filename of the test image. std::string test_image_name; - // RoI on image to detect hands. + // RoI on image to detect faces. NormalizedRect norm_rect; - // Expected hand presence value. + // Expected face presence value. bool expected_presence; // The expected output landmarks positions. NormalizedLandmarkList expected_landmarks; @@ -258,9 +258,9 @@ struct MultiFaceTestParams { std::optional blendshape_model_name; // The filename of the test image. std::string test_image_name; - // RoI on image to detect hands. + // RoI on image to detect faces. std::vector norm_rects; - // Expected hand presence value. + // Expected face presence value. std::vector expected_presence; // The expected output landmarks positions. std::optional> expected_landmarks_lists; @@ -299,7 +299,6 @@ TEST_P(SingleFaceLandmarksDetectionTest, Succeeds) { (*output_packets)[kNormLandmarksName].Get(); const NormalizedLandmarkList& expected_landmarks = GetParam().expected_landmarks; - EXPECT_THAT( landmarks, Approximately(Partially(EqualsProto(expected_landmarks)), @@ -395,7 +394,9 @@ INSTANTIATE_TEST_SUITE_P( kFaceLandmarksDetectionWithAttentionModel, /* blendshape_model_name= */ kFaceBlendshapesModel, /* test_image_name= */ kPortraitImageName, - /* norm_rect= */ MakeNormRect(0.4987, 0.2211, 0.2877, 0.2303, 0), + /* norm_rect= */ + MakeNormRect(0.48906386, 0.22731927, 0.42905223, 0.34357703, + 0.008304443), /* expected_presence= */ true, /* expected_landmarks= */ GetExpectedLandmarkList( @@ -444,7 +445,9 @@ INSTANTIATE_TEST_SUITE_P( kFaceLandmarksDetectionWithAttentionModel, /* blendshape_model_name= */ kFaceBlendshapesModel, /* test_image_name= */ kPortraitImageName, - /* norm_rects= */ {MakeNormRect(0.4987, 0.2211, 0.2877, 0.2303, 0)}, + /* norm_rects= */ + {MakeNormRect(0.48906386, 0.22731927, 0.42905223, 0.34357703, + 0.008304443)}, /* expected_presence= */ {true}, /* expected_landmarks_list= */ {{GetExpectedLandmarkList( diff --git a/mediapipe/tasks/cc/vision/face_landmarker/proto/BUILD b/mediapipe/tasks/cc/vision/face_landmarker/proto/BUILD index d68207b9e..f943420c6 100644 --- a/mediapipe/tasks/cc/vision/face_landmarker/proto/BUILD +++ b/mediapipe/tasks/cc/vision/face_landmarker/proto/BUILD @@ -50,3 +50,15 @@ mediapipe_proto_library( "//mediapipe/framework:calculator_proto", ], ) + +mediapipe_proto_library( + name = "face_landmarker_graph_options_proto", + srcs = ["face_landmarker_graph_options.proto"], + deps = [ + ":face_landmarks_detector_graph_options_proto", + "//mediapipe/framework:calculator_options_proto", + "//mediapipe/framework:calculator_proto", + "//mediapipe/tasks/cc/core/proto:base_options_proto", + "//mediapipe/tasks/cc/vision/face_detector/proto:face_detector_graph_options_proto", + ], +) diff --git a/mediapipe/tasks/cc/vision/face_landmarker/proto/face_landmarker_graph_options.proto b/mediapipe/tasks/cc/vision/face_landmarker/proto/face_landmarker_graph_options.proto new file mode 100644 index 000000000..67599295e --- /dev/null +++ b/mediapipe/tasks/cc/vision/face_landmarker/proto/face_landmarker_graph_options.proto @@ -0,0 +1,48 @@ +/* Copyright 2023 The MediaPipe Authors. All Rights Reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +==============================================================================*/ + +syntax = "proto2"; + +package mediapipe.tasks.vision.face_landmarker.proto; + +import "mediapipe/framework/calculator.proto"; +import "mediapipe/framework/calculator_options.proto"; +import "mediapipe/tasks/cc/core/proto/base_options.proto"; +import "mediapipe/tasks/cc/vision/face_detector/proto/face_detector_graph_options.proto"; +import "mediapipe/tasks/cc/vision/face_landmarker/proto/face_landmarks_detector_graph_options.proto"; + +option java_package = "com.google.mediapipe.tasks.vision.facelandmarker.proto"; +option java_outer_classname = "FaceLandmarkerGraphOptionsProto"; + +message FaceLandmarkerGraphOptions { + extend mediapipe.CalculatorOptions { + optional FaceLandmarkerGraphOptions ext = 508968150; + } + // Base options for configuring Task library, such as specifying the TfLite + // model file with metadata, accelerator options, etc. + optional core.proto.BaseOptions base_options = 1; + + // Options for face detector graph. + optional face_detector.proto.FaceDetectorGraphOptions + face_detector_graph_options = 2; + + // Options for face landmarks detector graph. + optional FaceLandmarksDetectorGraphOptions + face_landmarks_detector_graph_options = 3; + + // Minimum confidence for face landmarks tracking to be considered + // successfully. + optional float min_tracking_confidence = 4 [default = 0.5]; +} diff --git a/mediapipe/tasks/testdata/vision/BUILD b/mediapipe/tasks/testdata/vision/BUILD index 8e8ca2b91..63e3613e6 100644 --- a/mediapipe/tasks/testdata/vision/BUILD +++ b/mediapipe/tasks/testdata/vision/BUILD @@ -44,6 +44,7 @@ mediapipe_files(srcs = [ "face_detection_short_range.tflite", "face_landmark.tflite", "face_landmark_with_attention.tflite", + "face_landmarker.task", "fist.jpg", "fist.png", "hair_segmentation.tflite", @@ -92,6 +93,7 @@ exports_files( "face_geometry_expected_out.pbtxt", "gesture_recognizer.task", "portrait_expected_detection.pbtxt", + "portrait_expected_face_geometry_with_attention.pbtxt", "portrait_rotated_expected_detection.pbtxt", ], ) @@ -153,6 +155,7 @@ filegroup( "face_detection_short_range.tflite", "face_landmark.tflite", "face_landmark_with_attention.tflite", + "face_landmarker.task", "hair_segmentation.tflite", "hand_landmark_full.tflite", "hand_landmark_lite.tflite", @@ -166,7 +169,6 @@ filegroup( "mobilenet_v2_1.0_224.tflite", "mobilenet_v3_small_100_224_embedder.tflite", "palm_detection_full.tflite", - "portrait_expected_face_landmarks.pbtxt", "selfie_segm_128_128_3.tflite", "selfie_segm_144_256_3.tflite", ], @@ -189,6 +191,7 @@ filegroup( "pointing_up_landmarks.pbtxt", "pointing_up_rotated_landmarks.pbtxt", "portrait_expected_detection.pbtxt", + "portrait_expected_face_geometry_with_attention.pbtxt", "portrait_expected_face_landmarks.pbtxt", "portrait_expected_face_landmarks_with_attention.pbtxt", "portrait_rotated_expected_detection.pbtxt", diff --git a/mediapipe/tasks/testdata/vision/face_geometry_expected_out.pbtxt b/mediapipe/tasks/testdata/vision/face_geometry_expected_out.pbtxt index cc376a8f9..d7e8652f4 100644 --- a/mediapipe/tasks/testdata/vision/face_geometry_expected_out.pbtxt +++ b/mediapipe/tasks/testdata/vision/face_geometry_expected_out.pbtxt @@ -1,5 +1,5 @@ -# proto-file: mediapipe/tasks/cc/vision/face_geometry/proto/environment.proto -# proto-message: Environment +# proto-file: mediapipe/tasks/cc/vision/face_geometry/proto/face_geometry.proto +# proto-message: FaceGeometry mesh { vertex_type: VERTEX_PT primitive_type: TRIANGLE diff --git a/mediapipe/tasks/testdata/vision/face_landmarker.task b/mediapipe/tasks/testdata/vision/face_landmarker.task new file mode 100644 index 000000000..d6b5f8835 Binary files /dev/null and b/mediapipe/tasks/testdata/vision/face_landmarker.task differ diff --git a/mediapipe/tasks/testdata/vision/face_landmarker_with_blendshapes.task b/mediapipe/tasks/testdata/vision/face_landmarker_with_blendshapes.task new file mode 100644 index 000000000..d20846326 Binary files /dev/null and b/mediapipe/tasks/testdata/vision/face_landmarker_with_blendshapes.task differ diff --git a/mediapipe/tasks/testdata/vision/portrait_expected_blendshapes_with_attention.pbtxt b/mediapipe/tasks/testdata/vision/portrait_expected_blendshapes_with_attention.pbtxt index 777756f6c..7e9a8ad0b 100644 --- a/mediapipe/tasks/testdata/vision/portrait_expected_blendshapes_with_attention.pbtxt +++ b/mediapipe/tasks/testdata/vision/portrait_expected_blendshapes_with_attention.pbtxt @@ -2,261 +2,261 @@ # proto-message: ClassificationList classification { index: 0 - score: 4.9559007e-06 + score: 2.922153e-05 label: "_neutral" } classification { index: 1 - score: 0.22943014 + score: 0.7923543 label: "browDownLeft" } classification { index: 2 - score: 0.22297752 + score: 0.81483257 label: "browDownRight" } classification { index: 3 - score: 0.015948873 + score: 0.0002845049 label: "browInnerUp" } classification { index: 4 - score: 0.006946607 + score: 0.00049632485 label: "browOuterUpLeft" } classification { index: 5 - score: 0.0070318673 + score: 0.00050830405 label: "browOuterUpRight" } classification { index: 6 - score: 0.0013679645 + score: 0.0014010799 label: "cheekPuff" } classification { index: 7 - score: 7.1003383e-06 + score: 3.1523705e-06 label: "cheekSquintLeft" } classification { index: 8 - score: 5.78299e-06 + score: 4.7487533e-06 label: "cheekSquintRight" } classification { index: 9 - score: 0.20132238 + score: 0.2633514 label: "eyeBlinkLeft" } classification { index: 10 - score: 0.16521452 + score: 0.29687604 label: "eyeBlinkRight" } classification { index: 11 - score: 0.03764786 + score: 0.15565884 label: "eyeLookDownLeft" } classification { index: 12 - score: 0.04828824 + score: 0.18480143 label: "eyeLookDownRight" } classification { index: 13 - score: 0.016539993 + score: 0.054997284 label: "eyeLookInLeft" } classification { index: 14 - score: 0.20026363 + score: 0.10678173 label: "eyeLookInRight" } classification { index: 15 - score: 0.21363346 + score: 0.099223085 label: "eyeLookOutLeft" } classification { index: 16 - score: 0.024430025 + score: 0.06485316 label: "eyeLookOutRight" } classification { index: 17 - score: 0.30147508 + score: 0.09108365 label: "eyeLookUpLeft" } classification { index: 18 - score: 0.28701693 + score: 0.090983614 label: "eyeLookUpRight" } classification { index: 19 - score: 0.67143106 + score: 0.7040458 label: "eyeSquintLeft" } classification { index: 20 - score: 0.5306328 + score: 0.5759947 label: "eyeSquintRight" } classification { index: 21 - score: 0.0041342233 + score: 0.002923721 label: "eyeWideLeft" } classification { index: 22 - score: 0.005231879 + score: 0.0027232585 label: "eyeWideRight" } classification { index: 23 - score: 0.009427094 + score: 0.0028721786 label: "jawForward" } classification { index: 24 - score: 0.0015789346 + score: 0.0014818686 label: "jawLeft" } classification { index: 25 - score: 0.073719256 + score: 0.13099338 label: "jawOpen" } classification { index: 26 - score: 0.00046979196 + score: 0.00025238062 label: "jawRight" } classification { index: 27 - score: 0.0011400756 + score: 0.013557238 label: "mouthClose" } classification { index: 28 - score: 0.0060502808 + score: 0.040049534 label: "mouthDimpleLeft" } classification { index: 29 - score: 0.013351685 + score: 0.017489946 label: "mouthDimpleRight" } classification { index: 30 - score: 0.09859665 + score: 0.00069562776 label: "mouthFrownLeft" } classification { index: 31 - score: 0.08897466 + score: 0.00082510535 label: "mouthFrownRight" } classification { index: 32 - score: 0.0020718675 + score: 0.008079494 label: "mouthFunnel" } classification { index: 33 - score: 6.42887e-06 + score: 0.000491791 label: "mouthLeft" } classification { index: 34 - score: 0.68950605 + score: 0.067228556 label: "mouthLowerDownLeft" } classification { index: 35 - score: 0.7864029 + score: 0.17653553 label: "mouthLowerDownRight" } classification { index: 36 - score: 0.056456964 + score: 0.14764099 label: "mouthPressLeft" } classification { index: 37 - score: 0.037348792 + score: 0.11692603 label: "mouthPressRight" } classification { index: 38 - score: 0.00067001814 + score: 0.0016829089 label: "mouthPucker" } classification { index: 39 - score: 0.005189785 + score: 0.0010300461 label: "mouthRight" } classification { index: 40 - score: 0.018723497 + score: 0.01507229 label: "mouthRollLower" } classification { index: 41 - score: 0.052819636 + score: 0.11626337 label: "mouthRollUpper" } classification { index: 42 - score: 0.0033772716 + score: 0.004975724 label: "mouthShrugLower" } classification { index: 43 - score: 0.0031609535 + score: 0.004570691 label: "mouthShrugUpper" } classification { index: 44 - score: 0.49639142 + score: 0.9271871 label: "mouthSmileLeft" } classification { index: 45 - score: 0.4014515 + score: 0.9062751 label: "mouthSmileRight" } classification { index: 46 - score: 0.5825701 + score: 0.037454817 label: "mouthStretchLeft" } classification { index: 47 - score: 0.73058575 + score: 0.1777958 label: "mouthStretchRight" } classification { index: 48 - score: 0.13561466 + score: 0.8198947 label: "mouthUpperUpLeft" } classification { index: 49 - score: 0.20078722 + score: 0.769086 label: "mouthUpperUpRight" } classification { index: 50 - score: 3.3396598e-06 + score: 7.096563e-07 label: "noseSneerLeft" } classification { index: 51 - score: 1.3096546e-05 + score: 9.818824e-06 label: "noseSneerRight" } diff --git a/mediapipe/tasks/testdata/vision/portrait_expected_face_geometry_with_attention.pbtxt b/mediapipe/tasks/testdata/vision/portrait_expected_face_geometry_with_attention.pbtxt new file mode 100644 index 000000000..7838a0fa9 --- /dev/null +++ b/mediapipe/tasks/testdata/vision/portrait_expected_face_geometry_with_attention.pbtxt @@ -0,0 +1,5060 @@ +# proto-file: mediapipe/tasks/cc/vision/face_geometry/proto/face_geometry.proto +# proto-message: FaceGeometry +mesh { + vertex_type: VERTEX_PT + primitive_type: TRIANGLE + vertex_buffer: -0.03799689 + vertex_buffer: -3.8048906 + vertex_buffer: 6.2514343 + vertex_buffer: 0.499977 + vertex_buffer: 0.652534 + vertex_buffer: -0.07643819 + vertex_buffer: -2.4758358 + vertex_buffer: 7.994301 + vertex_buffer: 0.500026 + vertex_buffer: 0.547487 + vertex_buffer: -0.06894338 + vertex_buffer: -2.574645 + vertex_buffer: 6.3893433 + vertex_buffer: 0.499974 + vertex_buffer: 0.602372 + vertex_buffer: -0.5520295 + vertex_buffer: -0.112586975 + vertex_buffer: 6.816284 + vertex_buffer: 0.482113 + vertex_buffer: 0.471979 + vertex_buffer: -0.07613778 + vertex_buffer: -1.8722029 + vertex_buffer: 8.131023 + vertex_buffer: 0.500151 + vertex_buffer: 0.527156 + vertex_buffer: -0.06940973 + vertex_buffer: -0.9594631 + vertex_buffer: 7.760021 + vertex_buffer: 0.49991 + vertex_buffer: 0.498253 + vertex_buffer: -0.02845478 + vertex_buffer: 1.6114273 + vertex_buffer: 5.7014885 + vertex_buffer: 0.499523 + vertex_buffer: 0.401062 + vertex_buffer: -4.1439614 + vertex_buffer: 2.59441 + vertex_buffer: 2.9143295 + vertex_buffer: 0.289712 + vertex_buffer: 0.380764 + vertex_buffer: -0.009713292 + vertex_buffer: 3.043995 + vertex_buffer: 5.0216713 + vertex_buffer: 0.499955 + vertex_buffer: 0.312398 + vertex_buffer: -9.417534e-05 + vertex_buffer: 3.827322 + vertex_buffer: 5.0039177 + vertex_buffer: 0.499987 + vertex_buffer: 0.269919 + vertex_buffer: 0.028620958 + vertex_buffer: 7.657343 + vertex_buffer: 3.8082962 + vertex_buffer: 0.500023 + vertex_buffer: 0.10705 + vertex_buffer: -0.02941966 + vertex_buffer: -3.9522038 + vertex_buffer: 6.193901 + vertex_buffer: 0.500023 + vertex_buffer: 0.666234 + vertex_buffer: -0.02399075 + vertex_buffer: -4.0650377 + vertex_buffer: 6.059799 + vertex_buffer: 0.500016 + vertex_buffer: 0.679224 + vertex_buffer: -0.013843775 + vertex_buffer: -4.092946 + vertex_buffer: 5.8469276 + vertex_buffer: 0.500023 + vertex_buffer: 0.692348 + vertex_buffer: -0.0161618 + vertex_buffer: -5.430666 + vertex_buffer: 5.304981 + vertex_buffer: 0.499977 + vertex_buffer: 0.695278 + vertex_buffer: 0.0042533875 + vertex_buffer: -5.682453 + vertex_buffer: 5.492058 + vertex_buffer: 0.499977 + vertex_buffer: 0.705934 + vertex_buffer: 0.013091445 + vertex_buffer: -6.0028114 + vertex_buffer: 5.7031136 + vertex_buffer: 0.499977 + vertex_buffer: 0.719385 + vertex_buffer: 0.026088238 + vertex_buffer: -6.3237896 + vertex_buffer: 5.6544724 + vertex_buffer: 0.499977 + vertex_buffer: 0.737019 + vertex_buffer: -0.10522008 + vertex_buffer: -7.259756 + vertex_buffer: 5.2669945 + vertex_buffer: 0.499968 + vertex_buffer: 0.781371 + vertex_buffer: -0.076699376 + vertex_buffer: -2.7312012 + vertex_buffer: 7.7023125 + vertex_buffer: 0.499816 + vertex_buffer: 0.562981 + vertex_buffer: -0.72562504 + vertex_buffer: -2.4384737 + vertex_buffer: 6.7941895 + vertex_buffer: 0.473773 + vertex_buffer: 0.57391 + vertex_buffer: -7.2414055 + vertex_buffer: 6.0086823 + vertex_buffer: -0.49590302 + vertex_buffer: 0.104907 + vertex_buffer: 0.254141 + vertex_buffer: -2.4818525 + vertex_buffer: 2.006565 + vertex_buffer: 3.6005325 + vertex_buffer: 0.36593 + vertex_buffer: 0.409576 + vertex_buffer: -3.0657644 + vertex_buffer: 1.9544983 + vertex_buffer: 3.5882378 + vertex_buffer: 0.338758 + vertex_buffer: 0.413025 + vertex_buffer: -3.656791 + vertex_buffer: 1.9923954 + vertex_buffer: 3.433567 + vertex_buffer: 0.31112 + vertex_buffer: 0.40946 + vertex_buffer: -4.474508 + vertex_buffer: 2.3802433 + vertex_buffer: 2.8627968 + vertex_buffer: 0.274658 + vertex_buffer: 0.389131 + vertex_buffer: -1.9909923 + vertex_buffer: 2.1325722 + vertex_buffer: 3.5453758 + vertex_buffer: 0.393362 + vertex_buffer: 0.403706 + vertex_buffer: -3.4037266 + vertex_buffer: 3.2731247 + vertex_buffer: 3.6838531 + vertex_buffer: 0.345234 + vertex_buffer: 0.344011 + vertex_buffer: -2.742147 + vertex_buffer: 3.2809734 + vertex_buffer: 3.636303 + vertex_buffer: 0.370094 + vertex_buffer: 0.346076 + vertex_buffer: -4.01511 + vertex_buffer: 3.199894 + vertex_buffer: 3.5126534 + vertex_buffer: 0.319322 + vertex_buffer: 0.347265 + vertex_buffer: -4.424138 + vertex_buffer: 3.0624714 + vertex_buffer: 3.2636375 + vertex_buffer: 0.297903 + vertex_buffer: 0.353591 + vertex_buffer: -5.0990915 + vertex_buffer: 2.0961895 + vertex_buffer: 2.5969086 + vertex_buffer: 0.247792 + vertex_buffer: 0.41081 + vertex_buffer: -2.6055574 + vertex_buffer: -7.8491335 + vertex_buffer: 4.469631 + vertex_buffer: 0.396889 + vertex_buffer: 0.842755 + vertex_buffer: -4.399359 + vertex_buffer: 2.7460155 + vertex_buffer: 2.691124 + vertex_buffer: 0.280098 + vertex_buffer: 0.3756 + vertex_buffer: -7.487539 + vertex_buffer: 3.0465317 + vertex_buffer: -0.33402252 + vertex_buffer: 0.10631 + vertex_buffer: 0.399956 + vertex_buffer: -5.9338756 + vertex_buffer: 2.5897903 + vertex_buffer: 1.897171 + vertex_buffer: 0.209925 + vertex_buffer: 0.391353 + vertex_buffer: -3.3796797 + vertex_buffer: -0.83636856 + vertex_buffer: 4.6791306 + vertex_buffer: 0.355808 + vertex_buffer: 0.534406 + vertex_buffer: -1.1431469 + vertex_buffer: -3.6422768 + vertex_buffer: 6.1564445 + vertex_buffer: 0.471751 + vertex_buffer: 0.650404 + vertex_buffer: -1.0587544 + vertex_buffer: -3.9764395 + vertex_buffer: 5.9157333 + vertex_buffer: 0.474155 + vertex_buffer: 0.680192 + vertex_buffer: -2.1564624 + vertex_buffer: -3.6404037 + vertex_buffer: 5.6986084 + vertex_buffer: 0.439785 + vertex_buffer: 0.657229 + vertex_buffer: -2.8564057 + vertex_buffer: -3.6175175 + vertex_buffer: 4.973137 + vertex_buffer: 0.414617 + vertex_buffer: 0.666541 + vertex_buffer: -1.9194821 + vertex_buffer: -3.8669453 + vertex_buffer: 5.5120964 + vertex_buffer: 0.450374 + vertex_buffer: 0.680861 + vertex_buffer: -2.5821285 + vertex_buffer: -3.766097 + vertex_buffer: 4.852501 + vertex_buffer: 0.428771 + vertex_buffer: 0.682691 + vertex_buffer: -3.5917614 + vertex_buffer: -4.703742 + vertex_buffer: 3.7772026 + vertex_buffer: 0.374971 + vertex_buffer: 0.727805 + vertex_buffer: -0.5998187 + vertex_buffer: -2.4482555 + vertex_buffer: 7.9300194 + vertex_buffer: 0.486717 + vertex_buffer: 0.547629 + vertex_buffer: -0.65349257 + vertex_buffer: -1.8527908 + vertex_buffer: 8.052216 + vertex_buffer: 0.485301 + vertex_buffer: 0.527395 + vertex_buffer: -5.32553 + vertex_buffer: 3.3917809 + vertex_buffer: 3.106411 + vertex_buffer: 0.257765 + vertex_buffer: 0.31449 + vertex_buffer: -1.9077028 + vertex_buffer: 0.6526489 + vertex_buffer: 4.574417 + vertex_buffer: 0.401223 + vertex_buffer: 0.455172 + vertex_buffer: -2.2276864 + vertex_buffer: -1.619669 + vertex_buffer: 6.250202 + vertex_buffer: 0.429819 + vertex_buffer: 0.548615 + vertex_buffer: -2.2515945 + vertex_buffer: -1.2013035 + vertex_buffer: 5.9901733 + vertex_buffer: 0.421352 + vertex_buffer: 0.533741 + vertex_buffer: -5.325718 + vertex_buffer: -0.45529175 + vertex_buffer: 3.8242645 + vertex_buffer: 0.276896 + vertex_buffer: 0.532057 + vertex_buffer: -0.6069536 + vertex_buffer: -0.96725845 + vertex_buffer: 7.5633163 + vertex_buffer: 0.48337 + vertex_buffer: 0.499587 + vertex_buffer: -3.726408 + vertex_buffer: 3.6745567 + vertex_buffer: 4.177696 + vertex_buffer: 0.337212 + vertex_buffer: 0.282883 + vertex_buffer: -4.6320176 + vertex_buffer: 3.5891151 + vertex_buffer: 3.7231445 + vertex_buffer: 0.296392 + vertex_buffer: 0.293243 + vertex_buffer: -6.439913 + vertex_buffer: 6.825321 + vertex_buffer: 0.61094666 + vertex_buffer: 0.169295 + vertex_buffer: 0.193814 + vertex_buffer: -1.1220497 + vertex_buffer: 3.1207333 + vertex_buffer: 4.790825 + vertex_buffer: 0.44758 + vertex_buffer: 0.30261 + vertex_buffer: -2.164742 + vertex_buffer: 3.177925 + vertex_buffer: 3.446045 + vertex_buffer: 0.39239 + vertex_buffer: 0.353888 + vertex_buffer: -4.122795 + vertex_buffer: -3.7130547 + vertex_buffer: 3.6384811 + vertex_buffer: 0.35449 + vertex_buffer: 0.696784 + vertex_buffer: -6.8614273 + vertex_buffer: -3.4052105 + vertex_buffer: -1.0797577 + vertex_buffer: 0.067305 + vertex_buffer: 0.730105 + vertex_buffer: -1.7853736 + vertex_buffer: -1.9489326 + vertex_buffer: 6.0244827 + vertex_buffer: 0.442739 + vertex_buffer: 0.572826 + vertex_buffer: -1.2388946 + vertex_buffer: -2.1901503 + vertex_buffer: 6.1651344 + vertex_buffer: 0.457098 + vertex_buffer: 0.584792 + vertex_buffer: -3.7656596 + vertex_buffer: -3.7343445 + vertex_buffer: 3.5817146 + vertex_buffer: 0.381974 + vertex_buffer: 0.694711 + vertex_buffer: -3.5737453 + vertex_buffer: -3.7919788 + vertex_buffer: 3.718319 + vertex_buffer: 0.392389 + vertex_buffer: 0.694203 + vertex_buffer: -5.018292 + vertex_buffer: 4.0599594 + vertex_buffer: 3.309475 + vertex_buffer: 0.277076 + vertex_buffer: 0.271932 + vertex_buffer: -2.3280332 + vertex_buffer: -1.7253447 + vertex_buffer: 5.9079933 + vertex_buffer: 0.422552 + vertex_buffer: 0.563233 + vertex_buffer: -2.5559115 + vertex_buffer: 3.553505 + vertex_buffer: 4.536995 + vertex_buffer: 0.385919 + vertex_buffer: 0.281364 + vertex_buffer: -2.6780252 + vertex_buffer: 3.9824028 + vertex_buffer: 4.611759 + vertex_buffer: 0.383103 + vertex_buffer: 0.25584 + vertex_buffer: -3.5981717 + vertex_buffer: 7.5999775 + vertex_buffer: 2.9387283 + vertex_buffer: 0.331431 + vertex_buffer: 0.119714 + vertex_buffer: -5.7645855 + vertex_buffer: 5.532362 + vertex_buffer: 2.0800781 + vertex_buffer: 0.229924 + vertex_buffer: 0.232003 + vertex_buffer: -3.0987196 + vertex_buffer: 5.958153 + vertex_buffer: 3.7703743 + vertex_buffer: 0.364501 + vertex_buffer: 0.189114 + vertex_buffer: -5.7973075 + vertex_buffer: 3.8512268 + vertex_buffer: 2.486435 + vertex_buffer: 0.229622 + vertex_buffer: 0.299541 + vertex_buffer: -6.581504 + vertex_buffer: 4.970539 + vertex_buffer: 1.0281143 + vertex_buffer: 0.173287 + vertex_buffer: 0.278748 + vertex_buffer: -1.1187562 + vertex_buffer: -3.8459435 + vertex_buffer: 6.082863 + vertex_buffer: 0.472879 + vertex_buffer: 0.666198 + vertex_buffer: -2.0423577 + vertex_buffer: -3.7639866 + vertex_buffer: 5.604889 + vertex_buffer: 0.446828 + vertex_buffer: 0.668527 + vertex_buffer: -2.7212105 + vertex_buffer: -3.706087 + vertex_buffer: 4.9539757 + vertex_buffer: 0.422762 + vertex_buffer: 0.67389 + vertex_buffer: -1.6533456 + vertex_buffer: -2.0141506 + vertex_buffer: 5.9308434 + vertex_buffer: 0.445308 + vertex_buffer: 0.580066 + vertex_buffer: -3.6680121 + vertex_buffer: -3.7637367 + vertex_buffer: 3.6537056 + vertex_buffer: 0.388103 + vertex_buffer: 0.693961 + vertex_buffer: -3.222347 + vertex_buffer: -4.4428825 + vertex_buffer: 4.0160255 + vertex_buffer: 0.403039 + vertex_buffer: 0.70654 + vertex_buffer: -3.4893162 + vertex_buffer: -3.8121357 + vertex_buffer: 3.7417107 + vertex_buffer: 0.403629 + vertex_buffer: 0.693953 + vertex_buffer: -1.3609977 + vertex_buffer: -2.1381302 + vertex_buffer: 6.962082 + vertex_buffer: 0.460042 + vertex_buffer: 0.557139 + vertex_buffer: -2.4507256 + vertex_buffer: -3.808014 + vertex_buffer: 4.801964 + vertex_buffer: 0.431158 + vertex_buffer: 0.692366 + vertex_buffer: -1.7947234 + vertex_buffer: -3.8947744 + vertex_buffer: 5.3141365 + vertex_buffer: 0.452182 + vertex_buffer: 0.692366 + vertex_buffer: -0.9848387 + vertex_buffer: -4.015774 + vertex_buffer: 5.7053223 + vertex_buffer: 0.475387 + vertex_buffer: 0.692366 + vertex_buffer: -1.2047725 + vertex_buffer: -7.1263103 + vertex_buffer: 5.168663 + vertex_buffer: 0.465828 + vertex_buffer: 0.77919 + vertex_buffer: -1.064951 + vertex_buffer: -6.22723 + vertex_buffer: 5.540226 + vertex_buffer: 0.472329 + vertex_buffer: 0.736226 + vertex_buffer: -1.0445962 + vertex_buffer: -5.9030743 + vertex_buffer: 5.554451 + vertex_buffer: 0.473087 + vertex_buffer: 0.717857 + vertex_buffer: -1.0066085 + vertex_buffer: -5.584341 + vertex_buffer: 5.3326263 + vertex_buffer: 0.473122 + vertex_buffer: 0.704626 + vertex_buffer: -0.9515377 + vertex_buffer: -5.351679 + vertex_buffer: 5.1639557 + vertex_buffer: 0.473033 + vertex_buffer: 0.695278 + vertex_buffer: -2.4093351 + vertex_buffer: -4.7844896 + vertex_buffer: 4.3987465 + vertex_buffer: 0.427942 + vertex_buffer: 0.695278 + vertex_buffer: -2.5297885 + vertex_buffer: -4.884144 + vertex_buffer: 4.5233307 + vertex_buffer: 0.426479 + vertex_buffer: 0.70354 + vertex_buffer: -2.6821685 + vertex_buffer: -5.048234 + vertex_buffer: 4.613613 + vertex_buffer: 0.423162 + vertex_buffer: 0.711846 + vertex_buffer: -2.7875483 + vertex_buffer: -5.20553 + vertex_buffer: 4.512268 + vertex_buffer: 0.418309 + vertex_buffer: 0.720063 + vertex_buffer: -3.2743917 + vertex_buffer: -2.9418354 + vertex_buffer: 4.7704964 + vertex_buffer: 0.390095 + vertex_buffer: 0.639573 + vertex_buffer: -7.7813363 + vertex_buffer: 0.47852516 + vertex_buffer: -2.4707718 + vertex_buffer: 0.013954 + vertex_buffer: 0.560034 + vertex_buffer: -0.067145586 + vertex_buffer: -2.6338978 + vertex_buffer: 6.8576508 + vertex_buffer: 0.499914 + vertex_buffer: 0.580147 + vertex_buffer: -2.905652 + vertex_buffer: -4.3900776 + vertex_buffer: 3.96727 + vertex_buffer: 0.4132 + vertex_buffer: 0.6954 + vertex_buffer: -3.0672488 + vertex_buffer: -4.40431 + vertex_buffer: 4.0290527 + vertex_buffer: 0.409626 + vertex_buffer: 0.701823 + vertex_buffer: -1.0340033 + vertex_buffer: -2.4281569 + vertex_buffer: 6.1949463 + vertex_buffer: 0.46808 + vertex_buffer: 0.601535 + vertex_buffer: -2.1638374 + vertex_buffer: -1.9118061 + vertex_buffer: 5.4391975 + vertex_buffer: 0.422729 + vertex_buffer: 0.585985 + vertex_buffer: -1.1306101 + vertex_buffer: -2.32267 + vertex_buffer: 6.2109756 + vertex_buffer: 0.46308 + vertex_buffer: 0.593784 + vertex_buffer: -2.621181 + vertex_buffer: 0.40865707 + vertex_buffer: 4.4073486 + vertex_buffer: 0.37212 + vertex_buffer: 0.473414 + vertex_buffer: -3.70793 + vertex_buffer: 0.10049629 + vertex_buffer: 4.300907 + vertex_buffer: 0.334562 + vertex_buffer: 0.496073 + vertex_buffer: -2.4242415 + vertex_buffer: -1.335453 + vertex_buffer: 5.6347504 + vertex_buffer: 0.411671 + vertex_buffer: 0.546965 + vertex_buffer: -5.2518377 + vertex_buffer: 7.3554096 + vertex_buffer: 1.8238754 + vertex_buffer: 0.242176 + vertex_buffer: 0.147676 + vertex_buffer: -4.6380343 + vertex_buffer: 5.8871956 + vertex_buffer: 2.963272 + vertex_buffer: 0.290777 + vertex_buffer: 0.201446 + vertex_buffer: -3.962061 + vertex_buffer: 4.1839104 + vertex_buffer: 3.9545898 + vertex_buffer: 0.327338 + vertex_buffer: 0.256527 + vertex_buffer: -2.9955587 + vertex_buffer: -5.640915 + vertex_buffer: 4.2104836 + vertex_buffer: 0.39951 + vertex_buffer: 0.748921 + vertex_buffer: -1.3229164 + vertex_buffer: 3.8033943 + vertex_buffer: 4.9257507 + vertex_buffer: 0.441728 + vertex_buffer: 0.261676 + vertex_buffer: -1.6278172 + vertex_buffer: 5.9247894 + vertex_buffer: 4.227154 + vertex_buffer: 0.429765 + vertex_buffer: 0.187834 + vertex_buffer: -1.9196519 + vertex_buffer: 7.665041 + vertex_buffer: 3.6081352 + vertex_buffer: 0.412198 + vertex_buffer: 0.108901 + vertex_buffer: -4.1653175 + vertex_buffer: 2.1381493 + vertex_buffer: 3.1532745 + vertex_buffer: 0.288955 + vertex_buffer: 0.398952 + vertex_buffer: -5.858503 + vertex_buffer: 1.7849693 + vertex_buffer: 2.274994 + vertex_buffer: 0.218937 + vertex_buffer: 0.435411 + vertex_buffer: -1.673856 + vertex_buffer: 2.2758236 + vertex_buffer: 3.444664 + vertex_buffer: 0.412782 + vertex_buffer: 0.39897 + vertex_buffer: -5.111949 + vertex_buffer: 2.958168 + vertex_buffer: 2.7280235 + vertex_buffer: 0.257135 + vertex_buffer: 0.35544 + vertex_buffer: -1.42581 + vertex_buffer: 0.9485493 + vertex_buffer: 4.78524 + vertex_buffer: 0.427685 + vertex_buffer: 0.437961 + vertex_buffer: -1.7371975 + vertex_buffer: -1.6774244 + vertex_buffer: 6.8916054 + vertex_buffer: 0.44834 + vertex_buffer: 0.536936 + vertex_buffer: -6.7993464 + vertex_buffer: 1.4346638 + vertex_buffer: 1.6373291 + vertex_buffer: 0.17856 + vertex_buffer: 0.457554 + vertex_buffer: -5.3350697 + vertex_buffer: 1.2620907 + vertex_buffer: 2.9170685 + vertex_buffer: 0.247308 + vertex_buffer: 0.457194 + vertex_buffer: -4.4774485 + vertex_buffer: 0.9240799 + vertex_buffer: 3.5224838 + vertex_buffer: 0.286267 + vertex_buffer: 0.467675 + vertex_buffer: -3.272394 + vertex_buffer: 0.9214077 + vertex_buffer: 3.8559914 + vertex_buffer: 0.332828 + vertex_buffer: 0.460712 + vertex_buffer: -2.402923 + vertex_buffer: 1.116169 + vertex_buffer: 3.9556198 + vertex_buffer: 0.368756 + vertex_buffer: 0.447207 + vertex_buffer: -1.7723215 + vertex_buffer: 1.320797 + vertex_buffer: 4.1138306 + vertex_buffer: 0.398964 + vertex_buffer: 0.432655 + vertex_buffer: -0.59694576 + vertex_buffer: 1.5314617 + vertex_buffer: 5.4436264 + vertex_buffer: 0.47641 + vertex_buffer: 0.405806 + vertex_buffer: -6.807497 + vertex_buffer: 0.09427452 + vertex_buffer: 1.993454 + vertex_buffer: 0.189241 + vertex_buffer: 0.523924 + vertex_buffer: -5.688405 + vertex_buffer: 3.0851555 + vertex_buffer: 2.4322624 + vertex_buffer: 0.228962 + vertex_buffer: 0.348951 + vertex_buffer: -0.40799594 + vertex_buffer: -2.698841 + vertex_buffer: 7.6618958 + vertex_buffer: 0.490726 + vertex_buffer: 0.562401 + vertex_buffer: -1.9559056 + vertex_buffer: -0.03848648 + vertex_buffer: 4.961746 + vertex_buffer: 0.40467 + vertex_buffer: 0.485133 + vertex_buffer: -7.9506507 + vertex_buffer: 3.688263 + vertex_buffer: -2.4635468 + vertex_buffer: 0.019469 + vertex_buffer: 0.401564 + vertex_buffer: -1.301323 + vertex_buffer: 1.5848694 + vertex_buffer: 4.180687 + vertex_buffer: 0.426243 + vertex_buffer: 0.420431 + vertex_buffer: -2.5181937 + vertex_buffer: -1.1396294 + vertex_buffer: 4.9081573 + vertex_buffer: 0.396993 + vertex_buffer: 0.548797 + vertex_buffer: -4.717085 + vertex_buffer: 2.7280807 + vertex_buffer: 2.5747032 + vertex_buffer: 0.26647 + vertex_buffer: 0.376977 + vertex_buffer: -1.7512667 + vertex_buffer: -1.161972 + vertex_buffer: 6.573883 + vertex_buffer: 0.439121 + vertex_buffer: 0.518958 + vertex_buffer: -7.4564414 + vertex_buffer: -1.3850384 + vertex_buffer: -1.9297485 + vertex_buffer: 0.032314 + vertex_buffer: 0.644357 + vertex_buffer: -1.7117553 + vertex_buffer: 2.5173492 + vertex_buffer: 3.2236977 + vertex_buffer: 0.419054 + vertex_buffer: 0.387155 + vertex_buffer: -1.1572384 + vertex_buffer: -1.0541916 + vertex_buffer: 7.194458 + vertex_buffer: 0.462783 + vertex_buffer: 0.505747 + vertex_buffer: -5.3080835 + vertex_buffer: -5.4942093 + vertex_buffer: 2.0278625 + vertex_buffer: 0.238979 + vertex_buffer: 0.779745 + vertex_buffer: -5.2203856 + vertex_buffer: -6.3661776 + vertex_buffer: 1.2241516 + vertex_buffer: 0.198221 + vertex_buffer: 0.831938 + vertex_buffer: -7.5321417 + vertex_buffer: 0.21560669 + vertex_buffer: -0.2345047 + vertex_buffer: 0.10755 + vertex_buffer: 0.540755 + vertex_buffer: -6.163321 + vertex_buffer: -4.4339294 + vertex_buffer: 1.3331757 + vertex_buffer: 0.18361 + vertex_buffer: 0.740257 + vertex_buffer: -7.080523 + vertex_buffer: 4.197775 + vertex_buffer: 0.14701843 + vertex_buffer: 0.13441 + vertex_buffer: 0.333683 + vertex_buffer: -2.6738625 + vertex_buffer: -8.633281 + vertex_buffer: 4.3044815 + vertex_buffer: 0.385764 + vertex_buffer: 0.883154 + vertex_buffer: -0.34173155 + vertex_buffer: -2.5954218 + vertex_buffer: 6.808529 + vertex_buffer: 0.490967 + vertex_buffer: 0.579378 + vertex_buffer: -2.5923328 + vertex_buffer: -0.3716278 + vertex_buffer: 4.7674904 + vertex_buffer: 0.382385 + vertex_buffer: 0.508573 + vertex_buffer: -6.5916877 + vertex_buffer: 2.6689663 + vertex_buffer: 1.2537537 + vertex_buffer: 0.174399 + vertex_buffer: 0.397671 + vertex_buffer: -3.542273 + vertex_buffer: 2.3885727 + vertex_buffer: 3.3041725 + vertex_buffer: 0.318785 + vertex_buffer: 0.396235 + vertex_buffer: -3.052453 + vertex_buffer: 2.3353252 + vertex_buffer: 3.4632034 + vertex_buffer: 0.343364 + vertex_buffer: 0.400597 + vertex_buffer: -3.346343 + vertex_buffer: -4.4866886 + vertex_buffer: 3.9374275 + vertex_buffer: 0.3961 + vertex_buffer: 0.710217 + vertex_buffer: -6.807934 + vertex_buffer: -1.2851677 + vertex_buffer: 1.9479141 + vertex_buffer: 0.187885 + vertex_buffer: 0.588538 + vertex_buffer: -1.4889712 + vertex_buffer: -9.771776 + vertex_buffer: 4.415016 + vertex_buffer: 0.430987 + vertex_buffer: 0.944065 + vertex_buffer: -3.4319286 + vertex_buffer: -8.430215 + vertex_buffer: 2.9458466 + vertex_buffer: 0.318993 + vertex_buffer: 0.898285 + vertex_buffer: -4.2472696 + vertex_buffer: -7.5399303 + vertex_buffer: 2.1448364 + vertex_buffer: 0.266248 + vertex_buffer: 0.869701 + vertex_buffer: 0.0147150755 + vertex_buffer: 5.8546867 + vertex_buffer: 4.3955994 + vertex_buffer: 0.500023 + vertex_buffer: 0.190576 + vertex_buffer: -0.11078048 + vertex_buffer: -9.957518 + vertex_buffer: 4.615406 + vertex_buffer: 0.499977 + vertex_buffer: 0.954453 + vertex_buffer: -2.5824327 + vertex_buffer: 2.3661919 + vertex_buffer: 3.4847794 + vertex_buffer: 0.36617 + vertex_buffer: 0.398822 + vertex_buffer: -2.1335464 + vertex_buffer: 2.4452934 + vertex_buffer: 3.3880463 + vertex_buffer: 0.393207 + vertex_buffer: 0.395537 + vertex_buffer: -1.8446673 + vertex_buffer: 2.4951591 + vertex_buffer: 3.2513657 + vertex_buffer: 0.410373 + vertex_buffer: 0.39108 + vertex_buffer: -6.2632003 + vertex_buffer: 3.418377 + vertex_buffer: 1.7588425 + vertex_buffer: 0.194993 + vertex_buffer: 0.342102 + vertex_buffer: -2.2793112 + vertex_buffer: 2.8007774 + vertex_buffer: 3.3895226 + vertex_buffer: 0.388665 + vertex_buffer: 0.362284 + vertex_buffer: -2.788294 + vertex_buffer: 2.8749886 + vertex_buffer: 3.5177689 + vertex_buffer: 0.365962 + vertex_buffer: 0.355971 + vertex_buffer: -3.2679257 + vertex_buffer: 2.8848457 + vertex_buffer: 3.5011063 + vertex_buffer: 0.343364 + vertex_buffer: 0.355357 + vertex_buffer: -3.75033 + vertex_buffer: 2.8330956 + vertex_buffer: 3.363533 + vertex_buffer: 0.318785 + vertex_buffer: 0.35834 + vertex_buffer: -4.05932 + vertex_buffer: 2.7713757 + vertex_buffer: 3.1558266 + vertex_buffer: 0.301415 + vertex_buffer: 0.363156 + vertex_buffer: -7.725779 + vertex_buffer: 5.0964622 + vertex_buffer: -1.6472168 + vertex_buffer: 0.058133 + vertex_buffer: 0.319076 + vertex_buffer: -3.8860652 + vertex_buffer: 2.4879436 + vertex_buffer: 3.104107 + vertex_buffer: 0.301415 + vertex_buffer: 0.387449 + vertex_buffer: -0.068289995 + vertex_buffer: -2.8862877 + vertex_buffer: 6.182873 + vertex_buffer: 0.499988 + vertex_buffer: 0.618434 + vertex_buffer: -2.529707 + vertex_buffer: -2.7606153 + vertex_buffer: 5.356552 + vertex_buffer: 0.415838 + vertex_buffer: 0.624196 + vertex_buffer: -1.7543352 + vertex_buffer: -1.9580021 + vertex_buffer: 6.273342 + vertex_buffer: 0.445682 + vertex_buffer: 0.566077 + vertex_buffer: -1.137665 + vertex_buffer: -2.841156 + vertex_buffer: 6.083748 + vertex_buffer: 0.465844 + vertex_buffer: 0.620641 + vertex_buffer: -0.018586874 + vertex_buffer: 2.4397411 + vertex_buffer: 5.096554 + vertex_buffer: 0.499923 + vertex_buffer: 0.351524 + vertex_buffer: -4.41372 + vertex_buffer: -6.6318007 + vertex_buffer: 2.6536865 + vertex_buffer: 0.288719 + vertex_buffer: 0.819946 + vertex_buffer: -3.5631287 + vertex_buffer: -7.6272774 + vertex_buffer: 3.432335 + vertex_buffer: 0.335279 + vertex_buffer: 0.85282 + vertex_buffer: -1.5043874 + vertex_buffer: -9.306334 + vertex_buffer: 5.028805 + vertex_buffer: 0.440512 + vertex_buffer: 0.902419 + vertex_buffer: -6.0455494 + vertex_buffer: -5.1056385 + vertex_buffer: 0.12199402 + vertex_buffer: 0.128294 + vertex_buffer: 0.791941 + vertex_buffer: -1.8965436 + vertex_buffer: 2.6337643 + vertex_buffer: 3.2949944 + vertex_buffer: 0.408772 + vertex_buffer: 0.373894 + vertex_buffer: -1.0134746 + vertex_buffer: 0.47911072 + vertex_buffer: 5.743599 + vertex_buffer: 0.455607 + vertex_buffer: 0.451801 + vertex_buffer: -0.10858607 + vertex_buffer: -9.50358 + vertex_buffer: 5.195923 + vertex_buffer: 0.499877 + vertex_buffer: 0.90899 + vertex_buffer: -2.5527396 + vertex_buffer: -9.227399 + vertex_buffer: 3.8104515 + vertex_buffer: 0.375437 + vertex_buffer: 0.924192 + vertex_buffer: -7.322299 + vertex_buffer: -1.4170494 + vertex_buffer: 0.062187195 + vertex_buffer: 0.11421 + vertex_buffer: 0.615022 + vertex_buffer: -1.746277 + vertex_buffer: -5.1153107 + vertex_buffer: 4.8243637 + vertex_buffer: 0.448662 + vertex_buffer: 0.695278 + vertex_buffer: -1.8590368 + vertex_buffer: -5.290457 + vertex_buffer: 4.960087 + vertex_buffer: 0.44802 + vertex_buffer: 0.704632 + vertex_buffer: -1.953226 + vertex_buffer: -5.547798 + vertex_buffer: 5.076378 + vertex_buffer: 0.447112 + vertex_buffer: 0.715808 + vertex_buffer: -2.0058055 + vertex_buffer: -5.8332253 + vertex_buffer: 5.016693 + vertex_buffer: 0.444832 + vertex_buffer: 0.730794 + vertex_buffer: -2.2421694 + vertex_buffer: -6.518278 + vertex_buffer: 4.7368813 + vertex_buffer: 0.430012 + vertex_buffer: 0.766809 + vertex_buffer: -3.1532464 + vertex_buffer: -3.7426739 + vertex_buffer: 4.2543144 + vertex_buffer: 0.406787 + vertex_buffer: 0.685673 + vertex_buffer: -3.2889338 + vertex_buffer: -3.6873379 + vertex_buffer: 4.223362 + vertex_buffer: 0.400738 + vertex_buffer: 0.681069 + vertex_buffer: -3.399349 + vertex_buffer: -3.6300564 + vertex_buffer: 4.2257233 + vertex_buffer: 0.3924 + vertex_buffer: 0.677703 + vertex_buffer: -3.8676338 + vertex_buffer: -3.2052813 + vertex_buffer: 4.1269035 + vertex_buffer: 0.367856 + vertex_buffer: 0.663919 + vertex_buffer: -5.957941 + vertex_buffer: -1.8351107 + vertex_buffer: 3.251194 + vertex_buffer: 0.247923 + vertex_buffer: 0.601333 + vertex_buffer: -0.98538256 + vertex_buffer: 1.2934608 + vertex_buffer: 5.0585785 + vertex_buffer: 0.45277 + vertex_buffer: 0.42085 + vertex_buffer: -1.236709 + vertex_buffer: 2.790123 + vertex_buffer: 3.647091 + vertex_buffer: 0.436392 + vertex_buffer: 0.359887 + vertex_buffer: -1.6402563 + vertex_buffer: 2.8083496 + vertex_buffer: 3.387001 + vertex_buffer: 0.416164 + vertex_buffer: 0.368714 + vertex_buffer: -3.0210757 + vertex_buffer: -3.7624912 + vertex_buffer: 4.2215805 + vertex_buffer: 0.413386 + vertex_buffer: 0.692366 + vertex_buffer: -6.044824 + vertex_buffer: -3.417676 + vertex_buffer: 2.3530579 + vertex_buffer: 0.228018 + vertex_buffer: 0.683572 + vertex_buffer: -0.7034563 + vertex_buffer: 2.481739 + vertex_buffer: 4.598274 + vertex_buffer: 0.468268 + vertex_buffer: 0.352671 + vertex_buffer: -2.4172258 + vertex_buffer: -7.0839663 + vertex_buffer: 4.5690536 + vertex_buffer: 0.411362 + vertex_buffer: 0.804327 + vertex_buffer: -0.053602815 + vertex_buffer: -0.085926056 + vertex_buffer: 7.0314903 + vertex_buffer: 0.499989 + vertex_buffer: 0.469825 + vertex_buffer: -0.5728209 + vertex_buffer: 0.6627121 + vertex_buffer: 6.1756134 + vertex_buffer: 0.479154 + vertex_buffer: 0.442654 + vertex_buffer: -0.039252996 + vertex_buffer: 0.74731255 + vertex_buffer: 6.3245316 + vertex_buffer: 0.499974 + vertex_buffer: 0.439637 + vertex_buffer: -1.5397743 + vertex_buffer: -0.4629135 + vertex_buffer: 5.876644 + vertex_buffer: 0.432112 + vertex_buffer: 0.493589 + vertex_buffer: -0.10573149 + vertex_buffer: -8.7806015 + vertex_buffer: 5.383419 + vertex_buffer: 0.499886 + vertex_buffer: 0.866917 + vertex_buffer: -0.10243821 + vertex_buffer: -7.9327793 + vertex_buffer: 5.2961617 + vertex_buffer: 0.499913 + vertex_buffer: 0.821729 + vertex_buffer: -1.3123782 + vertex_buffer: -7.7697506 + vertex_buffer: 5.110512 + vertex_buffer: 0.456549 + vertex_buffer: 0.819201 + vertex_buffer: -3.8985724 + vertex_buffer: -5.0138264 + vertex_buffer: 3.5379639 + vertex_buffer: 0.344549 + vertex_buffer: 0.745439 + vertex_buffer: -3.0391204 + vertex_buffer: -1.6071129 + vertex_buffer: 4.7367287 + vertex_buffer: 0.378909 + vertex_buffer: 0.57401 + vertex_buffer: -3.2300706 + vertex_buffer: -6.132518 + vertex_buffer: 3.9983292 + vertex_buffer: 0.374293 + vertex_buffer: 0.780185 + vertex_buffer: -4.47145 + vertex_buffer: -1.517004 + vertex_buffer: 4.4405327 + vertex_buffer: 0.319688 + vertex_buffer: 0.570738 + vertex_buffer: -3.6752357 + vertex_buffer: -2.2029839 + vertex_buffer: 4.505867 + vertex_buffer: 0.357155 + vertex_buffer: 0.60427 + vertex_buffer: -5.072584 + vertex_buffer: -2.404129 + vertex_buffer: 3.8550644 + vertex_buffer: 0.295284 + vertex_buffer: 0.621581 + vertex_buffer: -1.4515126 + vertex_buffer: -8.591642 + vertex_buffer: 5.1889076 + vertex_buffer: 0.44775 + vertex_buffer: 0.862477 + vertex_buffer: -2.0067837 + vertex_buffer: -0.6139889 + vertex_buffer: 5.4322624 + vertex_buffer: 0.410986 + vertex_buffer: 0.508723 + vertex_buffer: -4.294573 + vertex_buffer: -5.6995487 + vertex_buffer: 3.1523552 + vertex_buffer: 0.313951 + vertex_buffer: 0.775308 + vertex_buffer: -3.4505615 + vertex_buffer: -6.802844 + vertex_buffer: 3.7206116 + vertex_buffer: 0.354128 + vertex_buffer: 0.812553 + vertex_buffer: -4.455414 + vertex_buffer: -3.9392204 + vertex_buffer: 3.4970322 + vertex_buffer: 0.324548 + vertex_buffer: 0.703993 + vertex_buffer: -6.65974 + vertex_buffer: -2.4928837 + vertex_buffer: 1.8179779 + vertex_buffer: 0.189096 + vertex_buffer: 0.6463 + vertex_buffer: -5.1688347 + vertex_buffer: -4.2118874 + vertex_buffer: 3.0226898 + vertex_buffer: 0.279777 + vertex_buffer: 0.714658 + vertex_buffer: -6.8918138 + vertex_buffer: -2.9740238 + vertex_buffer: 0.48259735 + vertex_buffer: 0.133823 + vertex_buffer: 0.682701 + vertex_buffer: -4.2832465 + vertex_buffer: -2.7993727 + vertex_buffer: 4.105362 + vertex_buffer: 0.336768 + vertex_buffer: 0.644733 + vertex_buffer: -1.4550091 + vertex_buffer: 0.22772408 + vertex_buffer: 5.3168755 + vertex_buffer: 0.429884 + vertex_buffer: 0.466522 + vertex_buffer: -1.5492352 + vertex_buffer: -2.044715 + vertex_buffer: 7.0732384 + vertex_buffer: 0.455528 + vertex_buffer: 0.548623 + vertex_buffer: -2.0385013 + vertex_buffer: -1.8879633 + vertex_buffer: 6.359207 + vertex_buffer: 0.437114 + vertex_buffer: 0.558896 + vertex_buffer: -1.2055476 + vertex_buffer: -1.782157 + vertex_buffer: 7.53141 + vertex_buffer: 0.467288 + vertex_buffer: 0.529925 + vertex_buffer: -1.6817553 + vertex_buffer: 3.161415 + vertex_buffer: 3.7531128 + vertex_buffer: 0.414712 + vertex_buffer: 0.33522 + vertex_buffer: -2.65212 + vertex_buffer: 3.3945656 + vertex_buffer: 3.8740463 + vertex_buffer: 0.377046 + vertex_buffer: 0.322778 + vertex_buffer: -3.5127957 + vertex_buffer: 3.4177456 + vertex_buffer: 3.8673286 + vertex_buffer: 0.344108 + vertex_buffer: 0.320151 + vertex_buffer: -4.256162 + vertex_buffer: 3.3411217 + vertex_buffer: 3.637352 + vertex_buffer: 0.312876 + vertex_buffer: 0.322332 + vertex_buffer: -4.797553 + vertex_buffer: 3.189003 + vertex_buffer: 3.2503624 + vertex_buffer: 0.283526 + vertex_buffer: 0.33319 + vertex_buffer: -5.2395287 + vertex_buffer: 2.6234646 + vertex_buffer: 2.3437805 + vertex_buffer: 0.241246 + vertex_buffer: 0.382786 + vertex_buffer: -7.588104 + vertex_buffer: 1.6621666 + vertex_buffer: -0.3259201 + vertex_buffer: 0.102986 + vertex_buffer: 0.468763 + vertex_buffer: -4.6933327 + vertex_buffer: 1.7944946 + vertex_buffer: 2.9396133 + vertex_buffer: 0.267612 + vertex_buffer: 0.42456 + vertex_buffer: -4.0286894 + vertex_buffer: 1.5538483 + vertex_buffer: 3.353485 + vertex_buffer: 0.297879 + vertex_buffer: 0.433176 + vertex_buffer: -3.1896048 + vertex_buffer: 1.4963799 + vertex_buffer: 3.6274948 + vertex_buffer: 0.333434 + vertex_buffer: 0.433878 + vertex_buffer: -2.428552 + vertex_buffer: 1.6123905 + vertex_buffer: 3.6880531 + vertex_buffer: 0.366427 + vertex_buffer: 0.426116 + vertex_buffer: -1.8497058 + vertex_buffer: 1.7676811 + vertex_buffer: 3.7345886 + vertex_buffer: 0.396012 + vertex_buffer: 0.416696 + vertex_buffer: -1.4545896 + vertex_buffer: 1.9336929 + vertex_buffer: 3.7442856 + vertex_buffer: 0.420121 + vertex_buffer: 0.410228 + vertex_buffer: -7.920671 + vertex_buffer: 2.1578693 + vertex_buffer: -2.7011337 + vertex_buffer: 0.007561 + vertex_buffer: 0.480777 + vertex_buffer: -2.0727477 + vertex_buffer: -1.905199 + vertex_buffer: 6.041214 + vertex_buffer: 0.432949 + vertex_buffer: 0.569518 + vertex_buffer: -1.037884 + vertex_buffer: -0.2524376 + vertex_buffer: 6.3738823 + vertex_buffer: 0.458639 + vertex_buffer: 0.479089 + vertex_buffer: -1.0600916 + vertex_buffer: -2.2755394 + vertex_buffer: 7.6019936 + vertex_buffer: 0.473466 + vertex_buffer: 0.545744 + vertex_buffer: -0.74996364 + vertex_buffer: -2.5196075 + vertex_buffer: 7.377384 + vertex_buffer: 0.476088 + vertex_buffer: 0.56383 + vertex_buffer: -1.0860909 + vertex_buffer: -2.2917194 + vertex_buffer: 7.290821 + vertex_buffer: 0.468472 + vertex_buffer: 0.555057 + vertex_buffer: -1.938976 + vertex_buffer: -1.9958782 + vertex_buffer: 5.827629 + vertex_buffer: 0.433991 + vertex_buffer: 0.582362 + vertex_buffer: -0.6154846 + vertex_buffer: -2.6306448 + vertex_buffer: 7.5621567 + vertex_buffer: 0.483518 + vertex_buffer: 0.562984 + vertex_buffer: -0.56451 + vertex_buffer: -2.5417213 + vertex_buffer: 6.8001595 + vertex_buffer: 0.482483 + vertex_buffer: 0.577849 + vertex_buffer: -1.4861419 + vertex_buffer: 2.4621181 + vertex_buffer: 3.349533 + vertex_buffer: 0.42645 + vertex_buffer: 0.389799 + vertex_buffer: -1.156236 + vertex_buffer: 2.2130127 + vertex_buffer: 3.7922173 + vertex_buffer: 0.438999 + vertex_buffer: 0.396495 + vertex_buffer: -0.9582304 + vertex_buffer: 1.9468021 + vertex_buffer: 4.345352 + vertex_buffer: 0.450067 + vertex_buffer: 0.400434 + vertex_buffer: -4.244197 + vertex_buffer: 2.7366695 + vertex_buffer: 2.960125 + vertex_buffer: 0.289712 + vertex_buffer: 0.368253 + vertex_buffer: -4.7106714 + vertex_buffer: 2.9214668 + vertex_buffer: 2.9095612 + vertex_buffer: 0.27667 + vertex_buffer: 0.363373 + vertex_buffer: 0.4557233 + vertex_buffer: -0.09976578 + vertex_buffer: 6.807411 + vertex_buffer: 0.517862 + vertex_buffer: 0.471948 + vertex_buffer: 4.4233675 + vertex_buffer: 2.7335339 + vertex_buffer: 2.873291 + vertex_buffer: 0.710288 + vertex_buffer: 0.380764 + vertex_buffer: 0.5896871 + vertex_buffer: -2.4311037 + vertex_buffer: 6.803581 + vertex_buffer: 0.526227 + vertex_buffer: 0.57391 + vertex_buffer: 7.1104274 + vertex_buffer: 6.1066265 + vertex_buffer: -0.524765 + vertex_buffer: 0.895093 + vertex_buffer: 0.254141 + vertex_buffer: 2.6855998 + vertex_buffer: 2.1231346 + vertex_buffer: 3.5657158 + vertex_buffer: 0.63407 + vertex_buffer: 0.409576 + vertex_buffer: 3.3005595 + vertex_buffer: 2.09943 + vertex_buffer: 3.5472717 + vertex_buffer: 0.661242 + vertex_buffer: 0.413025 + vertex_buffer: 3.9086227 + vertex_buffer: 2.1380157 + vertex_buffer: 3.3940887 + vertex_buffer: 0.68888 + vertex_buffer: 0.40946 + vertex_buffer: 4.713306 + vertex_buffer: 2.4999008 + vertex_buffer: 2.8279686 + vertex_buffer: 0.725342 + vertex_buffer: 0.389131 + vertex_buffer: 2.1501455 + vertex_buffer: 2.2178802 + vertex_buffer: 3.5230026 + vertex_buffer: 0.60663 + vertex_buffer: 0.403705 + vertex_buffer: 3.6217146 + vertex_buffer: 3.4120636 + vertex_buffer: 3.653984 + vertex_buffer: 0.654766 + vertex_buffer: 0.344011 + vertex_buffer: 2.893744 + vertex_buffer: 3.3937721 + vertex_buffer: 3.6192245 + vertex_buffer: 0.629906 + vertex_buffer: 0.346076 + vertex_buffer: 4.2891564 + vertex_buffer: 3.3539772 + vertex_buffer: 3.4819374 + vertex_buffer: 0.680678 + vertex_buffer: 0.347265 + vertex_buffer: 4.717091 + vertex_buffer: 3.2154942 + vertex_buffer: 3.237156 + vertex_buffer: 0.702097 + vertex_buffer: 0.353591 + vertex_buffer: 5.3257637 + vertex_buffer: 2.217041 + vertex_buffer: 2.572815 + vertex_buffer: 0.752212 + vertex_buffer: 0.410805 + vertex_buffer: 2.4353065 + vertex_buffer: -7.807514 + vertex_buffer: 4.480995 + vertex_buffer: 0.602918 + vertex_buffer: 0.842863 + vertex_buffer: 4.6661816 + vertex_buffer: 2.8710518 + vertex_buffer: 2.65345 + vertex_buffer: 0.719902 + vertex_buffer: 0.3756 + vertex_buffer: 7.440019 + vertex_buffer: 3.131775 + vertex_buffer: -0.3580017 + vertex_buffer: 0.893693 + vertex_buffer: 0.39996 + vertex_buffer: 6.0832314 + vertex_buffer: 2.7290764 + vertex_buffer: 1.875206 + vertex_buffer: 0.790082 + vertex_buffer: 0.391354 + vertex_buffer: 3.320528 + vertex_buffer: -0.79992485 + vertex_buffer: 4.691944 + vertex_buffer: 0.643998 + vertex_buffer: 0.534488 + vertex_buffer: 1.0343971 + vertex_buffer: -3.5772133 + vertex_buffer: 6.173771 + vertex_buffer: 0.528249 + vertex_buffer: 0.650404 + vertex_buffer: 0.9751768 + vertex_buffer: -3.9168758 + vertex_buffer: 5.932743 + vertex_buffer: 0.52585 + vertex_buffer: 0.680191 + vertex_buffer: 2.0198758 + vertex_buffer: -3.497593 + vertex_buffer: 5.724884 + vertex_buffer: 0.560215 + vertex_buffer: 0.657229 + vertex_buffer: 2.6891446 + vertex_buffer: -3.419303 + vertex_buffer: 4.9991264 + vertex_buffer: 0.585384 + vertex_buffer: 0.666541 + vertex_buffer: 1.801127 + vertex_buffer: -3.7446804 + vertex_buffer: 5.539379 + vertex_buffer: 0.549626 + vertex_buffer: 0.680861 + vertex_buffer: 2.4278598 + vertex_buffer: -3.5954514 + vertex_buffer: 4.8850937 + vertex_buffer: 0.571228 + vertex_buffer: 0.682692 + vertex_buffer: 3.4538455 + vertex_buffer: -4.6567383 + vertex_buffer: 3.8188782 + vertex_buffer: 0.624852 + vertex_buffer: 0.728099 + vertex_buffer: 0.44568062 + vertex_buffer: -2.4389172 + vertex_buffer: 7.936165 + vertex_buffer: 0.51305 + vertex_buffer: 0.547282 + vertex_buffer: 0.500227 + vertex_buffer: -1.8438797 + vertex_buffer: 8.057892 + vertex_buffer: 0.515097 + vertex_buffer: 0.527252 + vertex_buffer: 5.563794 + vertex_buffer: 3.5847569 + vertex_buffer: 3.0730896 + vertex_buffer: 0.742247 + vertex_buffer: 0.314507 + vertex_buffer: 1.8687227 + vertex_buffer: 0.68432045 + vertex_buffer: 4.5661697 + vertex_buffer: 0.598631 + vertex_buffer: 0.454979 + vertex_buffer: 2.1151233 + vertex_buffer: -1.6004467 + vertex_buffer: 6.266529 + vertex_buffer: 0.570338 + vertex_buffer: 0.548575 + vertex_buffer: 2.1468282 + vertex_buffer: -1.1814651 + vertex_buffer: 6.0051003 + vertex_buffer: 0.578632 + vertex_buffer: 0.533623 + vertex_buffer: 5.3009615 + vertex_buffer: -0.39289856 + vertex_buffer: 3.829239 + vertex_buffer: 0.723087 + vertex_buffer: 0.532054 + vertex_buffer: 0.47490668 + vertex_buffer: -0.954937 + vertex_buffer: 7.5581512 + vertex_buffer: 0.516446 + vertex_buffer: 0.499639 + vertex_buffer: 4.010097 + vertex_buffer: 3.8255272 + vertex_buffer: 4.158489 + vertex_buffer: 0.662801 + vertex_buffer: 0.282918 + vertex_buffer: 4.913331 + vertex_buffer: 3.769619 + vertex_buffer: 3.696968 + vertex_buffer: 0.703624 + vertex_buffer: 0.293271 + vertex_buffer: 6.364388 + vertex_buffer: 6.910389 + vertex_buffer: 0.5906296 + vertex_buffer: 0.830705 + vertex_buffer: 0.193814 + vertex_buffer: 1.2539544 + vertex_buffer: 3.2268982 + vertex_buffer: 4.77668 + vertex_buffer: 0.552386 + vertex_buffer: 0.302568 + vertex_buffer: 2.2652593 + vertex_buffer: 3.2619667 + vertex_buffer: 3.4299316 + vertex_buffer: 0.60761 + vertex_buffer: 0.353888 + vertex_buffer: 4.0082717 + vertex_buffer: -3.6588259 + vertex_buffer: 3.673111 + vertex_buffer: 0.645429 + vertex_buffer: 0.696707 + vertex_buffer: 6.7817683 + vertex_buffer: -3.3016567 + vertex_buffer: -1.115593 + vertex_buffer: 0.932695 + vertex_buffer: 0.730105 + vertex_buffer: 1.6774135 + vertex_buffer: -1.9343586 + vertex_buffer: 6.045189 + vertex_buffer: 0.557261 + vertex_buffer: 0.572826 + vertex_buffer: 1.1181836 + vertex_buffer: -2.1948853 + vertex_buffer: 6.1964493 + vertex_buffer: 0.542902 + vertex_buffer: 0.584792 + vertex_buffer: 3.5379481 + vertex_buffer: -3.4544334 + vertex_buffer: 3.6014824 + vertex_buffer: 0.618026 + vertex_buffer: 0.694711 + vertex_buffer: 3.3265133 + vertex_buffer: -3.5294476 + vertex_buffer: 3.7494392 + vertex_buffer: 0.607591 + vertex_buffer: 0.694203 + vertex_buffer: 5.2492943 + vertex_buffer: 4.239422 + vertex_buffer: 3.282959 + vertex_buffer: 0.722943 + vertex_buffer: 0.271963 + vertex_buffer: 2.2147388 + vertex_buffer: -1.7126923 + vertex_buffer: 5.9330673 + vertex_buffer: 0.577414 + vertex_buffer: 0.563167 + vertex_buffer: 2.8107052 + vertex_buffer: 3.6788368 + vertex_buffer: 4.5267143 + vertex_buffer: 0.614083 + vertex_buffer: 0.281387 + vertex_buffer: 2.9189334 + vertex_buffer: 4.098074 + vertex_buffer: 4.600418 + vertex_buffer: 0.616907 + vertex_buffer: 0.255886 + vertex_buffer: 3.6443458 + vertex_buffer: 7.6457596 + vertex_buffer: 2.9261513 + vertex_buffer: 0.668509 + vertex_buffer: 0.119914 + vertex_buffer: 5.719919 + vertex_buffer: 5.626848 + vertex_buffer: 2.0564346 + vertex_buffer: 0.770092 + vertex_buffer: 0.232021 + vertex_buffer: 3.1327949 + vertex_buffer: 6.0055923 + vertex_buffer: 3.753868 + vertex_buffer: 0.635536 + vertex_buffer: 0.189249 + vertex_buffer: 5.9548945 + vertex_buffer: 4.0332947 + vertex_buffer: 2.4511032 + vertex_buffer: 0.770391 + vertex_buffer: 0.299556 + vertex_buffer: 6.5107217 + vertex_buffer: 5.0730724 + vertex_buffer: 1.0034714 + vertex_buffer: 0.826722 + vertex_buffer: 0.278755 + vertex_buffer: 1.0199723 + vertex_buffer: -3.7844124 + vertex_buffer: 6.102539 + vertex_buffer: 0.527121 + vertex_buffer: 0.666198 + vertex_buffer: 1.9127924 + vertex_buffer: -3.6357756 + vertex_buffer: 5.633663 + vertex_buffer: 0.553172 + vertex_buffer: 0.668527 + vertex_buffer: 2.56253 + vertex_buffer: -3.5202847 + vertex_buffer: 4.9860764 + vertex_buffer: 0.577238 + vertex_buffer: 0.67389 + vertex_buffer: 1.5427475 + vertex_buffer: -2.0056324 + vertex_buffer: 5.9561844 + vertex_buffer: 0.554692 + vertex_buffer: 0.580066 + vertex_buffer: 3.433651 + vertex_buffer: -3.4927368 + vertex_buffer: 3.6841927 + vertex_buffer: 0.611897 + vertex_buffer: 0.693961 + vertex_buffer: 3.039651 + vertex_buffer: -4.220401 + vertex_buffer: 4.04813 + vertex_buffer: 0.596961 + vertex_buffer: 0.70654 + vertex_buffer: 3.2336345 + vertex_buffer: -3.5586157 + vertex_buffer: 3.7713776 + vertex_buffer: 0.596371 + vertex_buffer: 0.693953 + vertex_buffer: 1.2306843 + vertex_buffer: -2.1179 + vertex_buffer: 6.9610977 + vertex_buffer: 0.539958 + vertex_buffer: 0.557139 + vertex_buffer: 2.3038955 + vertex_buffer: -3.6402588 + vertex_buffer: 4.8297653 + vertex_buffer: 0.568842 + vertex_buffer: 0.692366 + vertex_buffer: 1.6892781 + vertex_buffer: -3.7778206 + vertex_buffer: 5.3365936 + vertex_buffer: 0.547818 + vertex_buffer: 0.692366 + vertex_buffer: 0.9177649 + vertex_buffer: -3.9602928 + vertex_buffer: 5.717106 + vertex_buffer: 0.524613 + vertex_buffer: 0.692366 + vertex_buffer: 1.0025139 + vertex_buffer: -7.1202345 + vertex_buffer: 5.192562 + vertex_buffer: 0.53409 + vertex_buffer: 0.779141 + vertex_buffer: 1.0766866 + vertex_buffer: -6.1921215 + vertex_buffer: 5.555439 + vertex_buffer: 0.527671 + vertex_buffer: 0.736226 + vertex_buffer: 1.0306296 + vertex_buffer: -5.857276 + vertex_buffer: 5.5664825 + vertex_buffer: 0.526913 + vertex_buffer: 0.717857 + vertex_buffer: 0.9698453 + vertex_buffer: -5.5317726 + vertex_buffer: 5.3419876 + vertex_buffer: 0.526878 + vertex_buffer: 0.704626 + vertex_buffer: 0.8837676 + vertex_buffer: -5.2959585 + vertex_buffer: 5.172344 + vertex_buffer: 0.526967 + vertex_buffer: 0.695278 + vertex_buffer: 2.24453 + vertex_buffer: -4.622444 + vertex_buffer: 4.4214935 + vertex_buffer: 0.572058 + vertex_buffer: 0.695278 + vertex_buffer: 2.3852797 + vertex_buffer: -4.7262135 + vertex_buffer: 4.552891 + vertex_buffer: 0.573521 + vertex_buffer: 0.70354 + vertex_buffer: 2.5520854 + vertex_buffer: -4.888693 + vertex_buffer: 4.64587 + vertex_buffer: 0.576838 + vertex_buffer: 0.711846 + vertex_buffer: 2.6840568 + vertex_buffer: -5.0542088 + vertex_buffer: 4.5449486 + vertex_buffer: 0.581691 + vertex_buffer: 0.720063 + vertex_buffer: 3.1587934 + vertex_buffer: -2.9152546 + vertex_buffer: 4.8155594 + vertex_buffer: 0.609945 + vertex_buffer: 0.63991 + vertex_buffer: 7.688642 + vertex_buffer: 0.5722141 + vertex_buffer: -2.497551 + vertex_buffer: 0.986046 + vertex_buffer: 0.560034 + vertex_buffer: 2.7035184 + vertex_buffer: -4.1863203 + vertex_buffer: 3.9877663 + vertex_buffer: 0.5868 + vertex_buffer: 0.6954 + vertex_buffer: 2.8748584 + vertex_buffer: -4.191183 + vertex_buffer: 4.058277 + vertex_buffer: 0.590372 + vertex_buffer: 0.701823 + vertex_buffer: 0.90896845 + vertex_buffer: -2.4329576 + vertex_buffer: 6.2138214 + vertex_buffer: 0.531915 + vertex_buffer: 0.601537 + vertex_buffer: 2.0642586 + vertex_buffer: -1.9124699 + vertex_buffer: 5.478153 + vertex_buffer: 0.577268 + vertex_buffer: 0.585935 + vertex_buffer: 1.006985 + vertex_buffer: -2.3283577 + vertex_buffer: 6.23695 + vertex_buffer: 0.536915 + vertex_buffer: 0.593786 + vertex_buffer: 2.5759187 + vertex_buffer: 0.44814682 + vertex_buffer: 4.3974953 + vertex_buffer: 0.627543 + vertex_buffer: 0.473352 + vertex_buffer: 3.6742215 + vertex_buffer: 0.14735794 + vertex_buffer: 4.300823 + vertex_buffer: 0.665586 + vertex_buffer: 0.495951 + vertex_buffer: 2.324253 + vertex_buffer: -1.3221512 + vertex_buffer: 5.6560364 + vertex_buffer: 0.588354 + vertex_buffer: 0.546862 + vertex_buffer: 5.2519984 + vertex_buffer: 7.422056 + vertex_buffer: 1.8106079 + vertex_buffer: 0.757824 + vertex_buffer: 0.147676 + vertex_buffer: 4.632069 + vertex_buffer: 5.958935 + vertex_buffer: 2.947197 + vertex_buffer: 0.70925 + vertex_buffer: 0.201508 + vertex_buffer: 4.2187295 + vertex_buffer: 4.326639 + vertex_buffer: 3.937294 + vertex_buffer: 0.672684 + vertex_buffer: 0.256581 + vertex_buffer: 2.8333287 + vertex_buffer: -5.604254 + vertex_buffer: 4.244461 + vertex_buffer: 0.600409 + vertex_buffer: 0.749005 + vertex_buffer: 1.4679971 + vertex_buffer: 3.8951092 + vertex_buffer: 4.917988 + vertex_buffer: 0.558266 + vertex_buffer: 0.261672 + vertex_buffer: 1.6675885 + vertex_buffer: 5.9459534 + vertex_buffer: 4.220398 + vertex_buffer: 0.570304 + vertex_buffer: 0.187871 + vertex_buffer: 1.9772725 + vertex_buffer: 7.685417 + vertex_buffer: 3.608265 + vertex_buffer: 0.588166 + vertex_buffer: 0.109044 + vertex_buffer: 4.4115176 + vertex_buffer: 2.277008 + vertex_buffer: 3.1165123 + vertex_buffer: 0.711045 + vertex_buffer: 0.398952 + vertex_buffer: 6.066839 + vertex_buffer: 1.9197044 + vertex_buffer: 2.2571068 + vertex_buffer: 0.78107 + vertex_buffer: 0.435405 + vertex_buffer: 1.7979245 + vertex_buffer: 2.3505611 + vertex_buffer: 3.4173965 + vertex_buffer: 0.587247 + vertex_buffer: 0.398932 + vertex_buffer: 5.3594832 + vertex_buffer: 3.1186295 + vertex_buffer: 2.6962051 + vertex_buffer: 0.74287 + vertex_buffer: 0.355446 + vertex_buffer: 1.3922458 + vertex_buffer: 0.97599983 + vertex_buffer: 4.775028 + vertex_buffer: 0.572156 + vertex_buffer: 0.437652 + vertex_buffer: 1.616169 + vertex_buffer: -1.6582394 + vertex_buffer: 6.8999977 + vertex_buffer: 0.551868 + vertex_buffer: 0.53657 + vertex_buffer: 6.78416 + vertex_buffer: 1.5186348 + vertex_buffer: 1.618866 + vertex_buffer: 0.821442 + vertex_buffer: 0.457556 + vertex_buffer: 5.6282315 + vertex_buffer: 1.388504 + vertex_buffer: 2.893032 + vertex_buffer: 0.752702 + vertex_buffer: 0.457182 + vertex_buffer: 4.798031 + vertex_buffer: 1.0380936 + vertex_buffer: 3.5061264 + vertex_buffer: 0.713757 + vertex_buffer: 0.467627 + vertex_buffer: 3.5390134 + vertex_buffer: 1.0216026 + vertex_buffer: 3.8351288 + vertex_buffer: 0.667113 + vertex_buffer: 0.460673 + vertex_buffer: 2.609848 + vertex_buffer: 1.2015228 + vertex_buffer: 3.9345818 + vertex_buffer: 0.631101 + vertex_buffer: 0.447154 + vertex_buffer: 1.9195385 + vertex_buffer: 1.3872204 + vertex_buffer: 4.096855 + vertex_buffer: 0.600862 + vertex_buffer: 0.432473 + vertex_buffer: 0.55275345 + vertex_buffer: 1.5423336 + vertex_buffer: 5.437954 + vertex_buffer: 0.523481 + vertex_buffer: 0.405627 + vertex_buffer: 6.806109 + vertex_buffer: 0.1703682 + vertex_buffer: 1.9784393 + vertex_buffer: 0.810748 + vertex_buffer: 0.523926 + vertex_buffer: 5.872286 + vertex_buffer: 3.2484322 + vertex_buffer: 2.3980637 + vertex_buffer: 0.771046 + vertex_buffer: 0.348959 + vertex_buffer: 0.25344086 + vertex_buffer: -2.692729 + vertex_buffer: 7.660309 + vertex_buffer: 0.509127 + vertex_buffer: 0.562718 + vertex_buffer: 1.89399 + vertex_buffer: -0.009780884 + vertex_buffer: 4.9561996 + vertex_buffer: 0.595293 + vertex_buffer: 0.485024 + vertex_buffer: 7.8352485 + vertex_buffer: 3.7826881 + vertex_buffer: -2.4868622 + vertex_buffer: 0.980531 + vertex_buffer: 0.401564 + vertex_buffer: 1.4199667 + vertex_buffer: 1.6500931 + vertex_buffer: 4.163162 + vertex_buffer: 0.5735 + vertex_buffer: 0.42 + vertex_buffer: 2.436627 + vertex_buffer: -1.1298904 + vertex_buffer: 4.9345818 + vertex_buffer: 0.602995 + vertex_buffer: 0.548688 + vertex_buffer: 4.974197 + vertex_buffer: 2.8475647 + vertex_buffer: 2.539547 + vertex_buffer: 0.73353 + vertex_buffer: 0.376977 + vertex_buffer: 1.6374424 + vertex_buffer: -1.1410618 + vertex_buffer: 6.5802727 + vertex_buffer: 0.560611 + vertex_buffer: 0.519017 + vertex_buffer: 7.3761964 + vertex_buffer: -1.2901726 + vertex_buffer: -1.9598465 + vertex_buffer: 0.967686 + vertex_buffer: 0.644357 + vertex_buffer: 1.7877736 + vertex_buffer: 2.6136627 + vertex_buffer: 3.1872444 + vertex_buffer: 0.580985 + vertex_buffer: 0.38716 + vertex_buffer: 1.0308688 + vertex_buffer: -1.0347443 + vertex_buffer: 7.191269 + vertex_buffer: 0.537728 + vertex_buffer: 0.505385 + vertex_buffer: 5.220964 + vertex_buffer: -5.4038334 + vertex_buffer: 2.025116 + vertex_buffer: 0.760966 + vertex_buffer: 0.779753 + vertex_buffer: 5.092406 + vertex_buffer: -6.2497435 + vertex_buffer: 1.2104645 + vertex_buffer: 0.801779 + vertex_buffer: 0.831938 + vertex_buffer: 7.5058455 + vertex_buffer: 0.29886246 + vertex_buffer: -0.2566986 + vertex_buffer: 0.892441 + vertex_buffer: 0.540761 + vertex_buffer: 6.095238 + vertex_buffer: -4.3407555 + vertex_buffer: 1.3235703 + vertex_buffer: 0.816351 + vertex_buffer: 0.74026 + vertex_buffer: 7.013057 + vertex_buffer: 4.291136 + vertex_buffer: 0.12023926 + vertex_buffer: 0.865595 + vertex_buffer: 0.333687 + vertex_buffer: 2.4846048 + vertex_buffer: -8.586898 + vertex_buffer: 4.309025 + vertex_buffer: 0.614074 + vertex_buffer: 0.883246 + vertex_buffer: 0.20751572 + vertex_buffer: -2.593811 + vertex_buffer: 6.8122063 + vertex_buffer: 0.508953 + vertex_buffer: 0.579438 + vertex_buffer: 2.5229864 + vertex_buffer: -0.34407425 + vertex_buffer: 4.7728615 + vertex_buffer: 0.617942 + vertex_buffer: 0.508316 + vertex_buffer: 6.6616683 + vertex_buffer: 2.8089104 + vertex_buffer: 1.2291412 + vertex_buffer: 0.825608 + vertex_buffer: 0.397675 + vertex_buffer: 3.8336496 + vertex_buffer: 2.551447 + vertex_buffer: 3.2623215 + vertex_buffer: 0.681215 + vertex_buffer: 0.396235 + vertex_buffer: 3.3227315 + vertex_buffer: 2.4893188 + vertex_buffer: 3.4235725 + vertex_buffer: 0.656636 + vertex_buffer: 0.400597 + vertex_buffer: 3.1810913 + vertex_buffer: -4.26198 + vertex_buffer: 3.9673576 + vertex_buffer: 0.6039 + vertex_buffer: 0.710217 + vertex_buffer: 6.807468 + vertex_buffer: -1.2095566 + vertex_buffer: 1.9433289 + vertex_buffer: 0.812086 + vertex_buffer: 0.588539 + vertex_buffer: 1.2670469 + vertex_buffer: -9.749025 + vertex_buffer: 4.4164047 + vertex_buffer: 0.568013 + vertex_buffer: 0.944565 + vertex_buffer: 3.2559943 + vertex_buffer: -8.344362 + vertex_buffer: 2.9486008 + vertex_buffer: 0.681008 + vertex_buffer: 0.898285 + vertex_buffer: 4.0997066 + vertex_buffer: -7.4360237 + vertex_buffer: 2.1424332 + vertex_buffer: 0.733752 + vertex_buffer: 0.869701 + vertex_buffer: 2.8072643 + vertex_buffer: 2.4953976 + vertex_buffer: 3.4504585 + vertex_buffer: 0.63383 + vertex_buffer: 0.398822 + vertex_buffer: 2.3031783 + vertex_buffer: 2.5451431 + vertex_buffer: 3.3544083 + vertex_buffer: 0.606793 + vertex_buffer: 0.395537 + vertex_buffer: 1.9620697 + vertex_buffer: 2.5812283 + vertex_buffer: 3.2158203 + vertex_buffer: 0.58966 + vertex_buffer: 0.391062 + vertex_buffer: 6.343782 + vertex_buffer: 3.5758362 + vertex_buffer: 1.7260437 + vertex_buffer: 0.805016 + vertex_buffer: 0.342108 + vertex_buffer: 2.3830261 + vertex_buffer: 2.9088554 + vertex_buffer: 3.3566208 + vertex_buffer: 0.611335 + vertex_buffer: 0.362284 + vertex_buffer: 2.917768 + vertex_buffer: 3.0079918 + vertex_buffer: 3.4865303 + vertex_buffer: 0.634038 + vertex_buffer: 0.355971 + vertex_buffer: 3.462892 + vertex_buffer: 3.034853 + vertex_buffer: 3.4687576 + vertex_buffer: 0.656636 + vertex_buffer: 0.355357 + vertex_buffer: 3.9937234 + vertex_buffer: 2.9874744 + vertex_buffer: 3.3298378 + vertex_buffer: 0.681215 + vertex_buffer: 0.35834 + vertex_buffer: 4.324596 + vertex_buffer: 2.9143276 + vertex_buffer: 3.1229668 + vertex_buffer: 0.698585 + vertex_buffer: 0.363156 + vertex_buffer: 7.5897536 + vertex_buffer: 5.1937504 + vertex_buffer: -1.6748581 + vertex_buffer: 0.941867 + vertex_buffer: 0.319076 + vertex_buffer: 4.176949 + vertex_buffer: 2.643118 + vertex_buffer: 3.0604668 + vertex_buffer: 0.698585 + vertex_buffer: 0.387449 + vertex_buffer: 2.4141445 + vertex_buffer: -2.7459955 + vertex_buffer: 5.3888016 + vertex_buffer: 0.584177 + vertex_buffer: 0.624107 + vertex_buffer: 1.6416874 + vertex_buffer: -1.9416342 + vertex_buffer: 6.295185 + vertex_buffer: 0.554318 + vertex_buffer: 0.566077 + vertex_buffer: 1.0087769 + vertex_buffer: -2.840191 + vertex_buffer: 6.102688 + vertex_buffer: 0.534154 + vertex_buffer: 0.62064 + vertex_buffer: 4.289112 + vertex_buffer: -6.5526133 + vertex_buffer: 2.6577988 + vertex_buffer: 0.711218 + vertex_buffer: 0.819975 + vertex_buffer: 3.4042568 + vertex_buffer: -7.559433 + vertex_buffer: 3.4406357 + vertex_buffer: 0.66463 + vertex_buffer: 0.852871 + vertex_buffer: 1.2947857 + vertex_buffer: -9.286485 + vertex_buffer: 5.0353165 + vertex_buffer: 0.5591 + vertex_buffer: 0.902632 + vertex_buffer: 5.9471974 + vertex_buffer: -4.984972 + vertex_buffer: 0.09233856 + vertex_buffer: 0.871706 + vertex_buffer: 0.791941 + vertex_buffer: 1.9832087 + vertex_buffer: 2.73312 + vertex_buffer: 3.2576714 + vertex_buffer: 0.591234 + vertex_buffer: 0.373894 + vertex_buffer: 0.95362043 + vertex_buffer: 0.49827957 + vertex_buffer: 5.738617 + vertex_buffer: 0.544341 + vertex_buffer: 0.451584 + vertex_buffer: 2.348618 + vertex_buffer: -9.16965 + vertex_buffer: 3.812458 + vertex_buffer: 0.624563 + vertex_buffer: 0.924192 + vertex_buffer: 7.2856383 + vertex_buffer: -1.3335323 + vertex_buffer: 0.041618347 + vertex_buffer: 0.88577 + vertex_buffer: 0.615029 + vertex_buffer: 1.6341136 + vertex_buffer: -5.0043964 + vertex_buffer: 4.8374176 + vertex_buffer: 0.551338 + vertex_buffer: 0.695278 + vertex_buffer: 1.7723927 + vertex_buffer: -5.183873 + vertex_buffer: 4.978321 + vertex_buffer: 0.55198 + vertex_buffer: 0.704632 + vertex_buffer: 1.8914657 + vertex_buffer: -5.4476795 + vertex_buffer: 5.0997543 + vertex_buffer: 0.552888 + vertex_buffer: 0.715808 + vertex_buffer: 1.9841194 + vertex_buffer: -5.7491245 + vertex_buffer: 5.0392456 + vertex_buffer: 0.555168 + vertex_buffer: 0.730794 + vertex_buffer: 2.0544014 + vertex_buffer: -6.491598 + vertex_buffer: 4.7624855 + vertex_buffer: 0.569944 + vertex_buffer: 0.767035 + vertex_buffer: 2.9393597 + vertex_buffer: -3.522482 + vertex_buffer: 4.2850266 + vertex_buffer: 0.593203 + vertex_buffer: 0.685676 + vertex_buffer: 3.0785394 + vertex_buffer: -3.453843 + vertex_buffer: 4.248329 + vertex_buffer: 0.599262 + vertex_buffer: 0.681069 + vertex_buffer: 3.1967435 + vertex_buffer: -3.386362 + vertex_buffer: 4.2470284 + vertex_buffer: 0.6076 + vertex_buffer: 0.677703 + vertex_buffer: 3.7540083 + vertex_buffer: -3.1633282 + vertex_buffer: 4.1661224 + vertex_buffer: 0.631938 + vertex_buffer: 0.6635 + vertex_buffer: 5.93453 + vertex_buffer: -1.7686176 + vertex_buffer: 3.264721 + vertex_buffer: 0.752033 + vertex_buffer: 0.601315 + vertex_buffer: 0.94711924 + vertex_buffer: 1.3090687 + vertex_buffer: 5.052105 + vertex_buffer: 0.547226 + vertex_buffer: 0.420395 + vertex_buffer: 1.3162496 + vertex_buffer: 2.8615913 + vertex_buffer: 3.6331177 + vertex_buffer: 0.563544 + vertex_buffer: 0.359828 + vertex_buffer: 1.7124534 + vertex_buffer: 2.8893852 + vertex_buffer: 3.3580093 + vertex_buffer: 0.583841 + vertex_buffer: 0.368714 + vertex_buffer: 2.8105187 + vertex_buffer: -3.555643 + vertex_buffer: 4.2489166 + vertex_buffer: 0.586614 + vertex_buffer: 0.692366 + vertex_buffer: 5.993731 + vertex_buffer: -3.337038 + vertex_buffer: 2.3597908 + vertex_buffer: 0.771915 + vertex_buffer: 0.683578 + vertex_buffer: 0.7608588 + vertex_buffer: 2.5553684 + vertex_buffer: 4.583893 + vertex_buffer: 0.531597 + vertex_buffer: 0.352483 + vertex_buffer: 2.2462287 + vertex_buffer: -7.0484695 + vertex_buffer: 4.592827 + vertex_buffer: 0.588371 + vertex_buffer: 0.804441 + vertex_buffer: 0.50066924 + vertex_buffer: 0.6745777 + vertex_buffer: 6.1747093 + vertex_buffer: 0.520797 + vertex_buffer: 0.442565 + vertex_buffer: 1.4513397 + vertex_buffer: -0.444582 + vertex_buffer: 5.8784103 + vertex_buffer: 0.567985 + vertex_buffer: 0.493479 + vertex_buffer: 1.1203933 + vertex_buffer: -7.7541027 + vertex_buffer: 5.1280556 + vertex_buffer: 0.543283 + vertex_buffer: 0.819255 + vertex_buffer: 3.7757673 + vertex_buffer: -4.9577837 + vertex_buffer: 3.566677 + vertex_buffer: 0.655317 + vertex_buffer: 0.745515 + vertex_buffer: 2.9468074 + vertex_buffer: -1.58498 + vertex_buffer: 4.765045 + vertex_buffer: 0.621009 + vertex_buffer: 0.574018 + vertex_buffer: 3.0801969 + vertex_buffer: -6.0835094 + vertex_buffer: 4.0283394 + vertex_buffer: 0.62556 + vertex_buffer: 0.780312 + vertex_buffer: 4.4224896 + vertex_buffer: -1.4665394 + vertex_buffer: 4.466465 + vertex_buffer: 0.680198 + vertex_buffer: 0.570719 + vertex_buffer: 3.5888743 + vertex_buffer: -2.1662998 + vertex_buffer: 4.537586 + vertex_buffer: 0.642764 + vertex_buffer: 0.604338 + vertex_buffer: 5.022297 + vertex_buffer: -2.3471308 + vertex_buffer: 3.8825302 + vertex_buffer: 0.704663 + vertex_buffer: 0.62153 + vertex_buffer: 1.2537675 + vertex_buffer: -8.574284 + vertex_buffer: 5.1977158 + vertex_buffer: 0.552012 + vertex_buffer: 0.862592 + vertex_buffer: 1.9177177 + vertex_buffer: -0.5924988 + vertex_buffer: 5.4403877 + vertex_buffer: 0.589072 + vertex_buffer: 0.508637 + vertex_buffer: 4.1807027 + vertex_buffer: -5.626442 + vertex_buffer: 3.1657333 + vertex_buffer: 0.685945 + vertex_buffer: 0.775357 + vertex_buffer: 3.3077898 + vertex_buffer: -6.7432594 + vertex_buffer: 3.7402344 + vertex_buffer: 0.645735 + vertex_buffer: 0.81264 + vertex_buffer: 4.3587117 + vertex_buffer: -3.8801908 + vertex_buffer: 3.5149689 + vertex_buffer: 0.675343 + vertex_buffer: 0.703978 + vertex_buffer: 6.6362424 + vertex_buffer: -2.4115467 + vertex_buffer: 1.8154602 + vertex_buffer: 0.810858 + vertex_buffer: 0.646305 + vertex_buffer: 5.0882487 + vertex_buffer: -4.1371374 + vertex_buffer: 3.03656 + vertex_buffer: 0.720122 + vertex_buffer: 0.714667 + vertex_buffer: 6.842526 + vertex_buffer: -2.884512 + vertex_buffer: 0.46212006 + vertex_buffer: 0.866152 + vertex_buffer: 0.682705 + vertex_buffer: 4.197099 + vertex_buffer: -2.7548609 + vertex_buffer: 4.1411285 + vertex_buffer: 0.663187 + vertex_buffer: 0.644597 + vertex_buffer: 1.3943658 + vertex_buffer: 0.25190163 + vertex_buffer: 5.307583 + vertex_buffer: 0.570082 + vertex_buffer: 0.466326 + vertex_buffer: 1.4165089 + vertex_buffer: -2.0220451 + vertex_buffer: 7.0775795 + vertex_buffer: 0.544562 + vertex_buffer: 0.548376 + vertex_buffer: 1.9184732 + vertex_buffer: -1.8711452 + vertex_buffer: 6.3833427 + vertex_buffer: 0.562759 + vertex_buffer: 0.558785 + vertex_buffer: 1.0660238 + vertex_buffer: -1.7642956 + vertex_buffer: 7.5344887 + vertex_buffer: 0.531987 + vertex_buffer: 0.53014 + vertex_buffer: 1.8054094 + vertex_buffer: 3.257948 + vertex_buffer: 3.7310677 + vertex_buffer: 0.585271 + vertex_buffer: 0.335177 + vertex_buffer: 2.8506107 + vertex_buffer: 3.5157185 + vertex_buffer: 3.8552284 + vertex_buffer: 0.622953 + vertex_buffer: 0.322779 + vertex_buffer: 3.7822433 + vertex_buffer: 3.557045 + vertex_buffer: 3.846302 + vertex_buffer: 0.655896 + vertex_buffer: 0.320163 + vertex_buffer: 4.55426 + vertex_buffer: 3.5012798 + vertex_buffer: 3.6076927 + vertex_buffer: 0.687132 + vertex_buffer: 0.322346 + vertex_buffer: 5.085729 + vertex_buffer: 3.3591957 + vertex_buffer: 3.2199326 + vertex_buffer: 0.716482 + vertex_buffer: 0.333201 + vertex_buffer: 5.446197 + vertex_buffer: 2.7545853 + vertex_buffer: 2.313713 + vertex_buffer: 0.758757 + vertex_buffer: 0.382787 + vertex_buffer: 7.550202 + vertex_buffer: 1.7485847 + vertex_buffer: -0.35203552 + vertex_buffer: 0.897013 + vertex_buffer: 0.468769 + vertex_buffer: 4.963579 + vertex_buffer: 1.9143791 + vertex_buffer: 2.916401 + vertex_buffer: 0.732392 + vertex_buffer: 0.424547 + vertex_buffer: 4.3016167 + vertex_buffer: 1.6754131 + vertex_buffer: 3.329319 + vertex_buffer: 0.702114 + vertex_buffer: 0.433163 + vertex_buffer: 3.4342122 + vertex_buffer: 1.6129818 + vertex_buffer: 3.599598 + vertex_buffer: 0.666525 + vertex_buffer: 0.433866 + vertex_buffer: 2.6241937 + vertex_buffer: 1.7090282 + vertex_buffer: 3.6612968 + vertex_buffer: 0.633505 + vertex_buffer: 0.426088 + vertex_buffer: 1.9926751 + vertex_buffer: 1.8377647 + vertex_buffer: 3.716549 + vertex_buffer: 0.603876 + vertex_buffer: 0.416587 + vertex_buffer: 1.5628262 + vertex_buffer: 1.9998207 + vertex_buffer: 3.7271843 + vertex_buffer: 0.579658 + vertex_buffer: 0.409945 + vertex_buffer: 7.8194213 + vertex_buffer: 2.25379 + vertex_buffer: -2.7251205 + vertex_buffer: 0.99244 + vertex_buffer: 0.480777 + vertex_buffer: 1.9533112 + vertex_buffer: -1.8923721 + vertex_buffer: 6.0685997 + vertex_buffer: 0.567192 + vertex_buffer: 0.56942 + vertex_buffer: 0.9480729 + vertex_buffer: -0.23205566 + vertex_buffer: 6.3663063 + vertex_buffer: 0.541366 + vertex_buffer: 0.478899 + vertex_buffer: 0.9139075 + vertex_buffer: -2.2588863 + vertex_buffer: 7.606819 + vertex_buffer: 0.526564 + vertex_buffer: 0.546118 + vertex_buffer: 0.5974233 + vertex_buffer: -2.510827 + vertex_buffer: 7.3850365 + vertex_buffer: 0.523913 + vertex_buffer: 0.56383 + vertex_buffer: 0.9423697 + vertex_buffer: -2.27847 + vertex_buffer: 7.2961197 + vertex_buffer: 0.531529 + vertex_buffer: 0.555057 + vertex_buffer: 1.8264418 + vertex_buffer: -1.9903765 + vertex_buffer: 5.862221 + vertex_buffer: 0.566036 + vertex_buffer: 0.582329 + vertex_buffer: 0.46178865 + vertex_buffer: -2.623661 + vertex_buffer: 7.5694656 + vertex_buffer: 0.516311 + vertex_buffer: 0.563054 + vertex_buffer: 0.42428088 + vertex_buffer: -2.5358152 + vertex_buffer: 6.8074875 + vertex_buffer: 0.517472 + vertex_buffer: 0.577877 + vertex_buffer: 1.568306 + vertex_buffer: 2.541376 + vertex_buffer: 3.3240814 + vertex_buffer: 0.573595 + vertex_buffer: 0.389807 + vertex_buffer: 1.228097 + vertex_buffer: 2.277542 + vertex_buffer: 3.7770844 + vertex_buffer: 0.560698 + vertex_buffer: 0.395332 + vertex_buffer: 1.0377004 + vertex_buffer: 2.0087395 + vertex_buffer: 4.333065 + vertex_buffer: 0.549756 + vertex_buffer: 0.399751 + vertex_buffer: 4.516618 + vertex_buffer: 2.8700428 + vertex_buffer: 2.9251366 + vertex_buffer: 0.710288 + vertex_buffer: 0.368253 + vertex_buffer: 4.9874473 + vertex_buffer: 3.0667686 + vertex_buffer: 2.8806343 + vertex_buffer: 0.72333 + vertex_buffer: 0.363373 + index_buffer: 173 + index_buffer: 155 + index_buffer: 133 + index_buffer: 246 + index_buffer: 33 + index_buffer: 7 + index_buffer: 382 + index_buffer: 398 + index_buffer: 362 + index_buffer: 263 + index_buffer: 466 + index_buffer: 249 + index_buffer: 308 + index_buffer: 415 + index_buffer: 324 + index_buffer: 78 + index_buffer: 95 + index_buffer: 191 + index_buffer: 356 + index_buffer: 389 + index_buffer: 264 + index_buffer: 127 + index_buffer: 34 + index_buffer: 162 + index_buffer: 368 + index_buffer: 264 + index_buffer: 389 + index_buffer: 139 + index_buffer: 162 + index_buffer: 34 + index_buffer: 267 + index_buffer: 0 + index_buffer: 302 + index_buffer: 37 + index_buffer: 72 + index_buffer: 0 + index_buffer: 11 + index_buffer: 302 + index_buffer: 0 + index_buffer: 11 + index_buffer: 0 + index_buffer: 72 + index_buffer: 349 + index_buffer: 451 + index_buffer: 350 + index_buffer: 120 + index_buffer: 121 + index_buffer: 231 + index_buffer: 452 + index_buffer: 350 + index_buffer: 451 + index_buffer: 232 + index_buffer: 231 + index_buffer: 121 + index_buffer: 267 + index_buffer: 302 + index_buffer: 269 + index_buffer: 37 + index_buffer: 39 + index_buffer: 72 + index_buffer: 303 + index_buffer: 269 + index_buffer: 302 + index_buffer: 73 + index_buffer: 72 + index_buffer: 39 + index_buffer: 357 + index_buffer: 343 + index_buffer: 350 + index_buffer: 128 + index_buffer: 121 + index_buffer: 114 + index_buffer: 277 + index_buffer: 350 + index_buffer: 343 + index_buffer: 47 + index_buffer: 114 + index_buffer: 121 + index_buffer: 350 + index_buffer: 452 + index_buffer: 357 + index_buffer: 121 + index_buffer: 128 + index_buffer: 232 + index_buffer: 453 + index_buffer: 357 + index_buffer: 452 + index_buffer: 233 + index_buffer: 232 + index_buffer: 128 + index_buffer: 299 + index_buffer: 333 + index_buffer: 297 + index_buffer: 69 + index_buffer: 67 + index_buffer: 104 + index_buffer: 332 + index_buffer: 297 + index_buffer: 333 + index_buffer: 103 + index_buffer: 104 + index_buffer: 67 + index_buffer: 175 + index_buffer: 152 + index_buffer: 396 + index_buffer: 175 + index_buffer: 171 + index_buffer: 152 + index_buffer: 377 + index_buffer: 396 + index_buffer: 152 + index_buffer: 148 + index_buffer: 152 + index_buffer: 171 + index_buffer: 381 + index_buffer: 384 + index_buffer: 382 + index_buffer: 154 + index_buffer: 155 + index_buffer: 157 + index_buffer: 398 + index_buffer: 382 + index_buffer: 384 + index_buffer: 173 + index_buffer: 157 + index_buffer: 155 + index_buffer: 280 + index_buffer: 347 + index_buffer: 330 + index_buffer: 50 + index_buffer: 101 + index_buffer: 118 + index_buffer: 348 + index_buffer: 330 + index_buffer: 347 + index_buffer: 119 + index_buffer: 118 + index_buffer: 101 + index_buffer: 269 + index_buffer: 303 + index_buffer: 270 + index_buffer: 39 + index_buffer: 40 + index_buffer: 73 + index_buffer: 304 + index_buffer: 270 + index_buffer: 303 + index_buffer: 74 + index_buffer: 73 + index_buffer: 40 + index_buffer: 9 + index_buffer: 336 + index_buffer: 151 + index_buffer: 9 + index_buffer: 151 + index_buffer: 107 + index_buffer: 337 + index_buffer: 151 + index_buffer: 336 + index_buffer: 108 + index_buffer: 107 + index_buffer: 151 + index_buffer: 344 + index_buffer: 278 + index_buffer: 360 + index_buffer: 115 + index_buffer: 131 + index_buffer: 48 + index_buffer: 279 + index_buffer: 360 + index_buffer: 278 + index_buffer: 49 + index_buffer: 48 + index_buffer: 131 + index_buffer: 262 + index_buffer: 431 + index_buffer: 418 + index_buffer: 32 + index_buffer: 194 + index_buffer: 211 + index_buffer: 424 + index_buffer: 418 + index_buffer: 431 + index_buffer: 204 + index_buffer: 211 + index_buffer: 194 + index_buffer: 304 + index_buffer: 408 + index_buffer: 270 + index_buffer: 74 + index_buffer: 40 + index_buffer: 184 + index_buffer: 409 + index_buffer: 270 + index_buffer: 408 + index_buffer: 185 + index_buffer: 184 + index_buffer: 40 + index_buffer: 272 + index_buffer: 310 + index_buffer: 407 + index_buffer: 42 + index_buffer: 183 + index_buffer: 80 + index_buffer: 415 + index_buffer: 407 + index_buffer: 310 + index_buffer: 191 + index_buffer: 80 + index_buffer: 183 + index_buffer: 322 + index_buffer: 270 + index_buffer: 410 + index_buffer: 92 + index_buffer: 186 + index_buffer: 40 + index_buffer: 409 + index_buffer: 410 + index_buffer: 270 + index_buffer: 185 + index_buffer: 40 + index_buffer: 186 + index_buffer: 347 + index_buffer: 449 + index_buffer: 348 + index_buffer: 118 + index_buffer: 119 + index_buffer: 229 + index_buffer: 450 + index_buffer: 348 + index_buffer: 449 + index_buffer: 230 + index_buffer: 229 + index_buffer: 119 + index_buffer: 434 + index_buffer: 432 + index_buffer: 430 + index_buffer: 214 + index_buffer: 210 + index_buffer: 212 + index_buffer: 422 + index_buffer: 430 + index_buffer: 432 + index_buffer: 202 + index_buffer: 212 + index_buffer: 210 + index_buffer: 313 + index_buffer: 314 + index_buffer: 18 + index_buffer: 83 + index_buffer: 18 + index_buffer: 84 + index_buffer: 17 + index_buffer: 18 + index_buffer: 314 + index_buffer: 17 + index_buffer: 84 + index_buffer: 18 + index_buffer: 307 + index_buffer: 375 + index_buffer: 306 + index_buffer: 77 + index_buffer: 76 + index_buffer: 146 + index_buffer: 291 + index_buffer: 306 + index_buffer: 375 + index_buffer: 61 + index_buffer: 146 + index_buffer: 76 + index_buffer: 259 + index_buffer: 387 + index_buffer: 260 + index_buffer: 29 + index_buffer: 30 + index_buffer: 160 + index_buffer: 388 + index_buffer: 260 + index_buffer: 387 + index_buffer: 161 + index_buffer: 160 + index_buffer: 30 + index_buffer: 286 + index_buffer: 414 + index_buffer: 384 + index_buffer: 56 + index_buffer: 157 + index_buffer: 190 + index_buffer: 398 + index_buffer: 384 + index_buffer: 414 + index_buffer: 173 + index_buffer: 190 + index_buffer: 157 + index_buffer: 418 + index_buffer: 424 + index_buffer: 406 + index_buffer: 194 + index_buffer: 182 + index_buffer: 204 + index_buffer: 335 + index_buffer: 406 + index_buffer: 424 + index_buffer: 106 + index_buffer: 204 + index_buffer: 182 + index_buffer: 367 + index_buffer: 416 + index_buffer: 364 + index_buffer: 138 + index_buffer: 135 + index_buffer: 192 + index_buffer: 434 + index_buffer: 364 + index_buffer: 416 + index_buffer: 214 + index_buffer: 192 + index_buffer: 135 + index_buffer: 391 + index_buffer: 423 + index_buffer: 327 + index_buffer: 165 + index_buffer: 98 + index_buffer: 203 + index_buffer: 358 + index_buffer: 327 + index_buffer: 423 + index_buffer: 129 + index_buffer: 203 + index_buffer: 98 + index_buffer: 298 + index_buffer: 301 + index_buffer: 284 + index_buffer: 68 + index_buffer: 54 + index_buffer: 71 + index_buffer: 251 + index_buffer: 284 + index_buffer: 301 + index_buffer: 21 + index_buffer: 71 + index_buffer: 54 + index_buffer: 4 + index_buffer: 275 + index_buffer: 5 + index_buffer: 4 + index_buffer: 5 + index_buffer: 45 + index_buffer: 281 + index_buffer: 5 + index_buffer: 275 + index_buffer: 51 + index_buffer: 45 + index_buffer: 5 + index_buffer: 254 + index_buffer: 373 + index_buffer: 253 + index_buffer: 24 + index_buffer: 23 + index_buffer: 144 + index_buffer: 374 + index_buffer: 253 + index_buffer: 373 + index_buffer: 145 + index_buffer: 144 + index_buffer: 23 + index_buffer: 320 + index_buffer: 321 + index_buffer: 307 + index_buffer: 90 + index_buffer: 77 + index_buffer: 91 + index_buffer: 375 + index_buffer: 307 + index_buffer: 321 + index_buffer: 146 + index_buffer: 91 + index_buffer: 77 + index_buffer: 280 + index_buffer: 425 + index_buffer: 411 + index_buffer: 50 + index_buffer: 187 + index_buffer: 205 + index_buffer: 427 + index_buffer: 411 + index_buffer: 425 + index_buffer: 207 + index_buffer: 205 + index_buffer: 187 + index_buffer: 421 + index_buffer: 313 + index_buffer: 200 + index_buffer: 201 + index_buffer: 200 + index_buffer: 83 + index_buffer: 18 + index_buffer: 200 + index_buffer: 313 + index_buffer: 18 + index_buffer: 83 + index_buffer: 200 + index_buffer: 335 + index_buffer: 321 + index_buffer: 406 + index_buffer: 106 + index_buffer: 182 + index_buffer: 91 + index_buffer: 405 + index_buffer: 406 + index_buffer: 321 + index_buffer: 181 + index_buffer: 91 + index_buffer: 182 + index_buffer: 405 + index_buffer: 321 + index_buffer: 404 + index_buffer: 181 + index_buffer: 180 + index_buffer: 91 + index_buffer: 320 + index_buffer: 404 + index_buffer: 321 + index_buffer: 90 + index_buffer: 91 + index_buffer: 180 + index_buffer: 17 + index_buffer: 314 + index_buffer: 16 + index_buffer: 17 + index_buffer: 16 + index_buffer: 84 + index_buffer: 315 + index_buffer: 16 + index_buffer: 314 + index_buffer: 85 + index_buffer: 84 + index_buffer: 16 + index_buffer: 425 + index_buffer: 266 + index_buffer: 426 + index_buffer: 205 + index_buffer: 206 + index_buffer: 36 + index_buffer: 423 + index_buffer: 426 + index_buffer: 266 + index_buffer: 203 + index_buffer: 36 + index_buffer: 206 + index_buffer: 369 + index_buffer: 396 + index_buffer: 400 + index_buffer: 140 + index_buffer: 176 + index_buffer: 171 + index_buffer: 377 + index_buffer: 400 + index_buffer: 396 + index_buffer: 148 + index_buffer: 171 + index_buffer: 176 + index_buffer: 391 + index_buffer: 269 + index_buffer: 322 + index_buffer: 165 + index_buffer: 92 + index_buffer: 39 + index_buffer: 270 + index_buffer: 322 + index_buffer: 269 + index_buffer: 40 + index_buffer: 39 + index_buffer: 92 + index_buffer: 417 + index_buffer: 465 + index_buffer: 413 + index_buffer: 193 + index_buffer: 189 + index_buffer: 245 + index_buffer: 464 + index_buffer: 413 + index_buffer: 465 + index_buffer: 244 + index_buffer: 245 + index_buffer: 189 + index_buffer: 257 + index_buffer: 258 + index_buffer: 386 + index_buffer: 27 + index_buffer: 159 + index_buffer: 28 + index_buffer: 385 + index_buffer: 386 + index_buffer: 258 + index_buffer: 158 + index_buffer: 28 + index_buffer: 159 + index_buffer: 260 + index_buffer: 388 + index_buffer: 467 + index_buffer: 30 + index_buffer: 247 + index_buffer: 161 + index_buffer: 466 + index_buffer: 467 + index_buffer: 388 + index_buffer: 246 + index_buffer: 161 + index_buffer: 247 + index_buffer: 248 + index_buffer: 456 + index_buffer: 419 + index_buffer: 3 + index_buffer: 196 + index_buffer: 236 + index_buffer: 399 + index_buffer: 419 + index_buffer: 456 + index_buffer: 174 + index_buffer: 236 + index_buffer: 196 + index_buffer: 333 + index_buffer: 298 + index_buffer: 332 + index_buffer: 104 + index_buffer: 103 + index_buffer: 68 + index_buffer: 284 + index_buffer: 332 + index_buffer: 298 + index_buffer: 54 + index_buffer: 68 + index_buffer: 103 + index_buffer: 285 + index_buffer: 8 + index_buffer: 417 + index_buffer: 55 + index_buffer: 193 + index_buffer: 8 + index_buffer: 168 + index_buffer: 417 + index_buffer: 8 + index_buffer: 168 + index_buffer: 8 + index_buffer: 193 + index_buffer: 340 + index_buffer: 261 + index_buffer: 346 + index_buffer: 111 + index_buffer: 117 + index_buffer: 31 + index_buffer: 448 + index_buffer: 346 + index_buffer: 261 + index_buffer: 228 + index_buffer: 31 + index_buffer: 117 + index_buffer: 285 + index_buffer: 417 + index_buffer: 441 + index_buffer: 55 + index_buffer: 221 + index_buffer: 193 + index_buffer: 413 + index_buffer: 441 + index_buffer: 417 + index_buffer: 189 + index_buffer: 193 + index_buffer: 221 + index_buffer: 327 + index_buffer: 460 + index_buffer: 326 + index_buffer: 98 + index_buffer: 97 + index_buffer: 240 + index_buffer: 328 + index_buffer: 326 + index_buffer: 460 + index_buffer: 99 + index_buffer: 240 + index_buffer: 97 + index_buffer: 277 + index_buffer: 355 + index_buffer: 329 + index_buffer: 47 + index_buffer: 100 + index_buffer: 126 + index_buffer: 371 + index_buffer: 329 + index_buffer: 355 + index_buffer: 142 + index_buffer: 126 + index_buffer: 100 + index_buffer: 309 + index_buffer: 392 + index_buffer: 438 + index_buffer: 79 + index_buffer: 218 + index_buffer: 166 + index_buffer: 439 + index_buffer: 438 + index_buffer: 392 + index_buffer: 219 + index_buffer: 166 + index_buffer: 218 + index_buffer: 381 + index_buffer: 382 + index_buffer: 256 + index_buffer: 154 + index_buffer: 26 + index_buffer: 155 + index_buffer: 341 + index_buffer: 256 + index_buffer: 382 + index_buffer: 112 + index_buffer: 155 + index_buffer: 26 + index_buffer: 360 + index_buffer: 279 + index_buffer: 420 + index_buffer: 131 + index_buffer: 198 + index_buffer: 49 + index_buffer: 429 + index_buffer: 420 + index_buffer: 279 + index_buffer: 209 + index_buffer: 49 + index_buffer: 198 + index_buffer: 365 + index_buffer: 364 + index_buffer: 379 + index_buffer: 136 + index_buffer: 150 + index_buffer: 135 + index_buffer: 394 + index_buffer: 379 + index_buffer: 364 + index_buffer: 169 + index_buffer: 135 + index_buffer: 150 + index_buffer: 355 + index_buffer: 277 + index_buffer: 437 + index_buffer: 126 + index_buffer: 217 + index_buffer: 47 + index_buffer: 343 + index_buffer: 437 + index_buffer: 277 + index_buffer: 114 + index_buffer: 47 + index_buffer: 217 + index_buffer: 443 + index_buffer: 444 + index_buffer: 282 + index_buffer: 223 + index_buffer: 52 + index_buffer: 224 + index_buffer: 283 + index_buffer: 282 + index_buffer: 444 + index_buffer: 53 + index_buffer: 224 + index_buffer: 52 + index_buffer: 281 + index_buffer: 275 + index_buffer: 363 + index_buffer: 51 + index_buffer: 134 + index_buffer: 45 + index_buffer: 440 + index_buffer: 363 + index_buffer: 275 + index_buffer: 220 + index_buffer: 45 + index_buffer: 134 + index_buffer: 431 + index_buffer: 262 + index_buffer: 395 + index_buffer: 211 + index_buffer: 170 + index_buffer: 32 + index_buffer: 369 + index_buffer: 395 + index_buffer: 262 + index_buffer: 140 + index_buffer: 32 + index_buffer: 170 + index_buffer: 337 + index_buffer: 299 + index_buffer: 338 + index_buffer: 108 + index_buffer: 109 + index_buffer: 69 + index_buffer: 297 + index_buffer: 338 + index_buffer: 299 + index_buffer: 67 + index_buffer: 69 + index_buffer: 109 + index_buffer: 335 + index_buffer: 273 + index_buffer: 321 + index_buffer: 106 + index_buffer: 91 + index_buffer: 43 + index_buffer: 375 + index_buffer: 321 + index_buffer: 273 + index_buffer: 146 + index_buffer: 43 + index_buffer: 91 + index_buffer: 348 + index_buffer: 450 + index_buffer: 349 + index_buffer: 119 + index_buffer: 120 + index_buffer: 230 + index_buffer: 451 + index_buffer: 349 + index_buffer: 450 + index_buffer: 231 + index_buffer: 230 + index_buffer: 120 + index_buffer: 467 + index_buffer: 359 + index_buffer: 342 + index_buffer: 247 + index_buffer: 113 + index_buffer: 130 + index_buffer: 446 + index_buffer: 342 + index_buffer: 359 + index_buffer: 226 + index_buffer: 130 + index_buffer: 113 + index_buffer: 282 + index_buffer: 283 + index_buffer: 334 + index_buffer: 52 + index_buffer: 105 + index_buffer: 53 + index_buffer: 293 + index_buffer: 334 + index_buffer: 283 + index_buffer: 63 + index_buffer: 53 + index_buffer: 105 + index_buffer: 250 + index_buffer: 458 + index_buffer: 462 + index_buffer: 20 + index_buffer: 242 + index_buffer: 238 + index_buffer: 461 + index_buffer: 462 + index_buffer: 458 + index_buffer: 241 + index_buffer: 238 + index_buffer: 242 + index_buffer: 276 + index_buffer: 353 + index_buffer: 300 + index_buffer: 46 + index_buffer: 70 + index_buffer: 124 + index_buffer: 383 + index_buffer: 300 + index_buffer: 353 + index_buffer: 156 + index_buffer: 124 + index_buffer: 70 + index_buffer: 325 + index_buffer: 292 + index_buffer: 324 + index_buffer: 96 + index_buffer: 95 + index_buffer: 62 + index_buffer: 308 + index_buffer: 324 + index_buffer: 292 + index_buffer: 78 + index_buffer: 62 + index_buffer: 95 + index_buffer: 283 + index_buffer: 276 + index_buffer: 293 + index_buffer: 53 + index_buffer: 63 + index_buffer: 46 + index_buffer: 300 + index_buffer: 293 + index_buffer: 276 + index_buffer: 70 + index_buffer: 46 + index_buffer: 63 + index_buffer: 447 + index_buffer: 264 + index_buffer: 345 + index_buffer: 227 + index_buffer: 116 + index_buffer: 34 + index_buffer: 372 + index_buffer: 345 + index_buffer: 264 + index_buffer: 143 + index_buffer: 34 + index_buffer: 116 + index_buffer: 352 + index_buffer: 345 + index_buffer: 346 + index_buffer: 123 + index_buffer: 117 + index_buffer: 116 + index_buffer: 340 + index_buffer: 346 + index_buffer: 345 + index_buffer: 111 + index_buffer: 116 + index_buffer: 117 + index_buffer: 1 + index_buffer: 19 + index_buffer: 274 + index_buffer: 1 + index_buffer: 44 + index_buffer: 19 + index_buffer: 354 + index_buffer: 274 + index_buffer: 19 + index_buffer: 125 + index_buffer: 19 + index_buffer: 44 + index_buffer: 248 + index_buffer: 281 + index_buffer: 456 + index_buffer: 3 + index_buffer: 236 + index_buffer: 51 + index_buffer: 363 + index_buffer: 456 + index_buffer: 281 + index_buffer: 134 + index_buffer: 51 + index_buffer: 236 + index_buffer: 425 + index_buffer: 426 + index_buffer: 427 + index_buffer: 205 + index_buffer: 207 + index_buffer: 206 + index_buffer: 436 + index_buffer: 427 + index_buffer: 426 + index_buffer: 216 + index_buffer: 206 + index_buffer: 207 + index_buffer: 380 + index_buffer: 381 + index_buffer: 252 + index_buffer: 153 + index_buffer: 22 + index_buffer: 154 + index_buffer: 256 + index_buffer: 252 + index_buffer: 381 + index_buffer: 26 + index_buffer: 154 + index_buffer: 22 + index_buffer: 391 + index_buffer: 393 + index_buffer: 269 + index_buffer: 165 + index_buffer: 39 + index_buffer: 167 + index_buffer: 267 + index_buffer: 269 + index_buffer: 393 + index_buffer: 37 + index_buffer: 167 + index_buffer: 39 + index_buffer: 199 + index_buffer: 428 + index_buffer: 200 + index_buffer: 199 + index_buffer: 200 + index_buffer: 208 + index_buffer: 421 + index_buffer: 200 + index_buffer: 428 + index_buffer: 201 + index_buffer: 208 + index_buffer: 200 + index_buffer: 330 + index_buffer: 329 + index_buffer: 266 + index_buffer: 101 + index_buffer: 36 + index_buffer: 100 + index_buffer: 371 + index_buffer: 266 + index_buffer: 329 + index_buffer: 142 + index_buffer: 100 + index_buffer: 36 + index_buffer: 422 + index_buffer: 432 + index_buffer: 273 + index_buffer: 202 + index_buffer: 43 + index_buffer: 212 + index_buffer: 287 + index_buffer: 273 + index_buffer: 432 + index_buffer: 57 + index_buffer: 212 + index_buffer: 43 + index_buffer: 290 + index_buffer: 250 + index_buffer: 328 + index_buffer: 60 + index_buffer: 99 + index_buffer: 20 + index_buffer: 462 + index_buffer: 328 + index_buffer: 250 + index_buffer: 242 + index_buffer: 20 + index_buffer: 99 + index_buffer: 258 + index_buffer: 286 + index_buffer: 385 + index_buffer: 28 + index_buffer: 158 + index_buffer: 56 + index_buffer: 384 + index_buffer: 385 + index_buffer: 286 + index_buffer: 157 + index_buffer: 56 + index_buffer: 158 + index_buffer: 342 + index_buffer: 446 + index_buffer: 353 + index_buffer: 113 + index_buffer: 124 + index_buffer: 226 + index_buffer: 265 + index_buffer: 353 + index_buffer: 446 + index_buffer: 35 + index_buffer: 226 + index_buffer: 124 + index_buffer: 257 + index_buffer: 386 + index_buffer: 259 + index_buffer: 27 + index_buffer: 29 + index_buffer: 159 + index_buffer: 387 + index_buffer: 259 + index_buffer: 386 + index_buffer: 160 + index_buffer: 159 + index_buffer: 29 + index_buffer: 430 + index_buffer: 422 + index_buffer: 431 + index_buffer: 210 + index_buffer: 211 + index_buffer: 202 + index_buffer: 424 + index_buffer: 431 + index_buffer: 422 + index_buffer: 204 + index_buffer: 202 + index_buffer: 211 + index_buffer: 445 + index_buffer: 342 + index_buffer: 276 + index_buffer: 225 + index_buffer: 46 + index_buffer: 113 + index_buffer: 353 + index_buffer: 276 + index_buffer: 342 + index_buffer: 124 + index_buffer: 113 + index_buffer: 46 + index_buffer: 424 + index_buffer: 422 + index_buffer: 335 + index_buffer: 204 + index_buffer: 106 + index_buffer: 202 + index_buffer: 273 + index_buffer: 335 + index_buffer: 422 + index_buffer: 43 + index_buffer: 202 + index_buffer: 106 + index_buffer: 306 + index_buffer: 292 + index_buffer: 307 + index_buffer: 76 + index_buffer: 77 + index_buffer: 62 + index_buffer: 325 + index_buffer: 307 + index_buffer: 292 + index_buffer: 96 + index_buffer: 62 + index_buffer: 77 + index_buffer: 366 + index_buffer: 447 + index_buffer: 352 + index_buffer: 137 + index_buffer: 123 + index_buffer: 227 + index_buffer: 345 + index_buffer: 352 + index_buffer: 447 + index_buffer: 116 + index_buffer: 227 + index_buffer: 123 + index_buffer: 302 + index_buffer: 268 + index_buffer: 303 + index_buffer: 72 + index_buffer: 73 + index_buffer: 38 + index_buffer: 271 + index_buffer: 303 + index_buffer: 268 + index_buffer: 41 + index_buffer: 38 + index_buffer: 73 + index_buffer: 371 + index_buffer: 358 + index_buffer: 266 + index_buffer: 142 + index_buffer: 36 + index_buffer: 129 + index_buffer: 423 + index_buffer: 266 + index_buffer: 358 + index_buffer: 203 + index_buffer: 129 + index_buffer: 36 + index_buffer: 327 + index_buffer: 294 + index_buffer: 460 + index_buffer: 98 + index_buffer: 240 + index_buffer: 64 + index_buffer: 455 + index_buffer: 460 + index_buffer: 294 + index_buffer: 235 + index_buffer: 64 + index_buffer: 240 + index_buffer: 294 + index_buffer: 331 + index_buffer: 278 + index_buffer: 64 + index_buffer: 48 + index_buffer: 102 + index_buffer: 279 + index_buffer: 278 + index_buffer: 331 + index_buffer: 49 + index_buffer: 102 + index_buffer: 48 + index_buffer: 303 + index_buffer: 271 + index_buffer: 304 + index_buffer: 73 + index_buffer: 74 + index_buffer: 41 + index_buffer: 272 + index_buffer: 304 + index_buffer: 271 + index_buffer: 42 + index_buffer: 41 + index_buffer: 74 + index_buffer: 427 + index_buffer: 436 + index_buffer: 434 + index_buffer: 207 + index_buffer: 214 + index_buffer: 216 + index_buffer: 432 + index_buffer: 434 + index_buffer: 436 + index_buffer: 212 + index_buffer: 216 + index_buffer: 214 + index_buffer: 304 + index_buffer: 272 + index_buffer: 408 + index_buffer: 74 + index_buffer: 184 + index_buffer: 42 + index_buffer: 407 + index_buffer: 408 + index_buffer: 272 + index_buffer: 183 + index_buffer: 42 + index_buffer: 184 + index_buffer: 394 + index_buffer: 430 + index_buffer: 395 + index_buffer: 169 + index_buffer: 170 + index_buffer: 210 + index_buffer: 431 + index_buffer: 395 + index_buffer: 430 + index_buffer: 211 + index_buffer: 210 + index_buffer: 170 + index_buffer: 395 + index_buffer: 369 + index_buffer: 378 + index_buffer: 170 + index_buffer: 149 + index_buffer: 140 + index_buffer: 400 + index_buffer: 378 + index_buffer: 369 + index_buffer: 176 + index_buffer: 140 + index_buffer: 149 + index_buffer: 296 + index_buffer: 334 + index_buffer: 299 + index_buffer: 66 + index_buffer: 69 + index_buffer: 105 + index_buffer: 333 + index_buffer: 299 + index_buffer: 334 + index_buffer: 104 + index_buffer: 105 + index_buffer: 69 + index_buffer: 417 + index_buffer: 168 + index_buffer: 351 + index_buffer: 193 + index_buffer: 122 + index_buffer: 168 + index_buffer: 6 + index_buffer: 351 + index_buffer: 168 + index_buffer: 6 + index_buffer: 168 + index_buffer: 122 + index_buffer: 280 + index_buffer: 411 + index_buffer: 352 + index_buffer: 50 + index_buffer: 123 + index_buffer: 187 + index_buffer: 376 + index_buffer: 352 + index_buffer: 411 + index_buffer: 147 + index_buffer: 187 + index_buffer: 123 + index_buffer: 319 + index_buffer: 320 + index_buffer: 325 + index_buffer: 89 + index_buffer: 96 + index_buffer: 90 + index_buffer: 307 + index_buffer: 325 + index_buffer: 320 + index_buffer: 77 + index_buffer: 90 + index_buffer: 96 + index_buffer: 285 + index_buffer: 295 + index_buffer: 336 + index_buffer: 55 + index_buffer: 107 + index_buffer: 65 + index_buffer: 296 + index_buffer: 336 + index_buffer: 295 + index_buffer: 66 + index_buffer: 65 + index_buffer: 107 + index_buffer: 404 + index_buffer: 320 + index_buffer: 403 + index_buffer: 180 + index_buffer: 179 + index_buffer: 90 + index_buffer: 319 + index_buffer: 403 + index_buffer: 320 + index_buffer: 89 + index_buffer: 90 + index_buffer: 179 + index_buffer: 330 + index_buffer: 348 + index_buffer: 329 + index_buffer: 101 + index_buffer: 100 + index_buffer: 119 + index_buffer: 349 + index_buffer: 329 + index_buffer: 348 + index_buffer: 120 + index_buffer: 119 + index_buffer: 100 + index_buffer: 334 + index_buffer: 293 + index_buffer: 333 + index_buffer: 105 + index_buffer: 104 + index_buffer: 63 + index_buffer: 298 + index_buffer: 333 + index_buffer: 293 + index_buffer: 68 + index_buffer: 63 + index_buffer: 104 + index_buffer: 323 + index_buffer: 454 + index_buffer: 366 + index_buffer: 93 + index_buffer: 137 + index_buffer: 234 + index_buffer: 447 + index_buffer: 366 + index_buffer: 454 + index_buffer: 227 + index_buffer: 234 + index_buffer: 137 + index_buffer: 16 + index_buffer: 315 + index_buffer: 15 + index_buffer: 16 + index_buffer: 15 + index_buffer: 85 + index_buffer: 316 + index_buffer: 15 + index_buffer: 315 + index_buffer: 86 + index_buffer: 85 + index_buffer: 15 + index_buffer: 429 + index_buffer: 279 + index_buffer: 358 + index_buffer: 209 + index_buffer: 129 + index_buffer: 49 + index_buffer: 331 + index_buffer: 358 + index_buffer: 279 + index_buffer: 102 + index_buffer: 49 + index_buffer: 129 + index_buffer: 15 + index_buffer: 316 + index_buffer: 14 + index_buffer: 15 + index_buffer: 14 + index_buffer: 86 + index_buffer: 317 + index_buffer: 14 + index_buffer: 316 + index_buffer: 87 + index_buffer: 86 + index_buffer: 14 + index_buffer: 8 + index_buffer: 285 + index_buffer: 9 + index_buffer: 8 + index_buffer: 9 + index_buffer: 55 + index_buffer: 336 + index_buffer: 9 + index_buffer: 285 + index_buffer: 107 + index_buffer: 55 + index_buffer: 9 + index_buffer: 329 + index_buffer: 349 + index_buffer: 277 + index_buffer: 100 + index_buffer: 47 + index_buffer: 120 + index_buffer: 350 + index_buffer: 277 + index_buffer: 349 + index_buffer: 121 + index_buffer: 120 + index_buffer: 47 + index_buffer: 252 + index_buffer: 253 + index_buffer: 380 + index_buffer: 22 + index_buffer: 153 + index_buffer: 23 + index_buffer: 374 + index_buffer: 380 + index_buffer: 253 + index_buffer: 145 + index_buffer: 23 + index_buffer: 153 + index_buffer: 402 + index_buffer: 403 + index_buffer: 318 + index_buffer: 178 + index_buffer: 88 + index_buffer: 179 + index_buffer: 319 + index_buffer: 318 + index_buffer: 403 + index_buffer: 89 + index_buffer: 179 + index_buffer: 88 + index_buffer: 351 + index_buffer: 6 + index_buffer: 419 + index_buffer: 122 + index_buffer: 196 + index_buffer: 6 + index_buffer: 197 + index_buffer: 419 + index_buffer: 6 + index_buffer: 197 + index_buffer: 6 + index_buffer: 196 + index_buffer: 324 + index_buffer: 318 + index_buffer: 325 + index_buffer: 95 + index_buffer: 96 + index_buffer: 88 + index_buffer: 319 + index_buffer: 325 + index_buffer: 318 + index_buffer: 89 + index_buffer: 88 + index_buffer: 96 + index_buffer: 397 + index_buffer: 367 + index_buffer: 365 + index_buffer: 172 + index_buffer: 136 + index_buffer: 138 + index_buffer: 364 + index_buffer: 365 + index_buffer: 367 + index_buffer: 135 + index_buffer: 138 + index_buffer: 136 + index_buffer: 288 + index_buffer: 435 + index_buffer: 397 + index_buffer: 58 + index_buffer: 172 + index_buffer: 215 + index_buffer: 367 + index_buffer: 397 + index_buffer: 435 + index_buffer: 138 + index_buffer: 215 + index_buffer: 172 + index_buffer: 438 + index_buffer: 439 + index_buffer: 344 + index_buffer: 218 + index_buffer: 115 + index_buffer: 219 + index_buffer: 278 + index_buffer: 344 + index_buffer: 439 + index_buffer: 48 + index_buffer: 219 + index_buffer: 115 + index_buffer: 271 + index_buffer: 311 + index_buffer: 272 + index_buffer: 41 + index_buffer: 42 + index_buffer: 81 + index_buffer: 310 + index_buffer: 272 + index_buffer: 311 + index_buffer: 80 + index_buffer: 81 + index_buffer: 42 + index_buffer: 5 + index_buffer: 281 + index_buffer: 195 + index_buffer: 5 + index_buffer: 195 + index_buffer: 51 + index_buffer: 248 + index_buffer: 195 + index_buffer: 281 + index_buffer: 3 + index_buffer: 51 + index_buffer: 195 + index_buffer: 273 + index_buffer: 287 + index_buffer: 375 + index_buffer: 43 + index_buffer: 146 + index_buffer: 57 + index_buffer: 291 + index_buffer: 375 + index_buffer: 287 + index_buffer: 61 + index_buffer: 57 + index_buffer: 146 + index_buffer: 396 + index_buffer: 428 + index_buffer: 175 + index_buffer: 171 + index_buffer: 175 + index_buffer: 208 + index_buffer: 199 + index_buffer: 175 + index_buffer: 428 + index_buffer: 199 + index_buffer: 208 + index_buffer: 175 + index_buffer: 268 + index_buffer: 312 + index_buffer: 271 + index_buffer: 38 + index_buffer: 41 + index_buffer: 82 + index_buffer: 311 + index_buffer: 271 + index_buffer: 312 + index_buffer: 81 + index_buffer: 82 + index_buffer: 41 + index_buffer: 444 + index_buffer: 445 + index_buffer: 283 + index_buffer: 224 + index_buffer: 53 + index_buffer: 225 + index_buffer: 276 + index_buffer: 283 + index_buffer: 445 + index_buffer: 46 + index_buffer: 225 + index_buffer: 53 + index_buffer: 254 + index_buffer: 339 + index_buffer: 373 + index_buffer: 24 + index_buffer: 144 + index_buffer: 110 + index_buffer: 390 + index_buffer: 373 + index_buffer: 339 + index_buffer: 163 + index_buffer: 110 + index_buffer: 144 + index_buffer: 295 + index_buffer: 282 + index_buffer: 296 + index_buffer: 65 + index_buffer: 66 + index_buffer: 52 + index_buffer: 334 + index_buffer: 296 + index_buffer: 282 + index_buffer: 105 + index_buffer: 52 + index_buffer: 66 + index_buffer: 346 + index_buffer: 448 + index_buffer: 347 + index_buffer: 117 + index_buffer: 118 + index_buffer: 228 + index_buffer: 449 + index_buffer: 347 + index_buffer: 448 + index_buffer: 229 + index_buffer: 228 + index_buffer: 118 + index_buffer: 454 + index_buffer: 356 + index_buffer: 447 + index_buffer: 234 + index_buffer: 227 + index_buffer: 127 + index_buffer: 264 + index_buffer: 447 + index_buffer: 356 + index_buffer: 34 + index_buffer: 127 + index_buffer: 227 + index_buffer: 336 + index_buffer: 296 + index_buffer: 337 + index_buffer: 107 + index_buffer: 108 + index_buffer: 66 + index_buffer: 299 + index_buffer: 337 + index_buffer: 296 + index_buffer: 69 + index_buffer: 66 + index_buffer: 108 + index_buffer: 151 + index_buffer: 337 + index_buffer: 10 + index_buffer: 151 + index_buffer: 10 + index_buffer: 108 + index_buffer: 338 + index_buffer: 10 + index_buffer: 337 + index_buffer: 109 + index_buffer: 108 + index_buffer: 10 + index_buffer: 278 + index_buffer: 439 + index_buffer: 294 + index_buffer: 48 + index_buffer: 64 + index_buffer: 219 + index_buffer: 455 + index_buffer: 294 + index_buffer: 439 + index_buffer: 235 + index_buffer: 219 + index_buffer: 64 + index_buffer: 407 + index_buffer: 415 + index_buffer: 292 + index_buffer: 183 + index_buffer: 62 + index_buffer: 191 + index_buffer: 308 + index_buffer: 292 + index_buffer: 415 + index_buffer: 78 + index_buffer: 191 + index_buffer: 62 + index_buffer: 358 + index_buffer: 371 + index_buffer: 429 + index_buffer: 129 + index_buffer: 209 + index_buffer: 142 + index_buffer: 355 + index_buffer: 429 + index_buffer: 371 + index_buffer: 126 + index_buffer: 142 + index_buffer: 209 + index_buffer: 345 + index_buffer: 372 + index_buffer: 340 + index_buffer: 116 + index_buffer: 111 + index_buffer: 143 + index_buffer: 265 + index_buffer: 340 + index_buffer: 372 + index_buffer: 35 + index_buffer: 143 + index_buffer: 111 + index_buffer: 388 + index_buffer: 390 + index_buffer: 466 + index_buffer: 161 + index_buffer: 246 + index_buffer: 163 + index_buffer: 249 + index_buffer: 466 + index_buffer: 390 + index_buffer: 7 + index_buffer: 163 + index_buffer: 246 + index_buffer: 352 + index_buffer: 346 + index_buffer: 280 + index_buffer: 123 + index_buffer: 50 + index_buffer: 117 + index_buffer: 347 + index_buffer: 280 + index_buffer: 346 + index_buffer: 118 + index_buffer: 117 + index_buffer: 50 + index_buffer: 295 + index_buffer: 442 + index_buffer: 282 + index_buffer: 65 + index_buffer: 52 + index_buffer: 222 + index_buffer: 443 + index_buffer: 282 + index_buffer: 442 + index_buffer: 223 + index_buffer: 222 + index_buffer: 52 + index_buffer: 19 + index_buffer: 94 + index_buffer: 354 + index_buffer: 19 + index_buffer: 125 + index_buffer: 94 + index_buffer: 370 + index_buffer: 354 + index_buffer: 94 + index_buffer: 141 + index_buffer: 94 + index_buffer: 125 + index_buffer: 295 + index_buffer: 285 + index_buffer: 442 + index_buffer: 65 + index_buffer: 222 + index_buffer: 55 + index_buffer: 441 + index_buffer: 442 + index_buffer: 285 + index_buffer: 221 + index_buffer: 55 + index_buffer: 222 + index_buffer: 419 + index_buffer: 197 + index_buffer: 248 + index_buffer: 196 + index_buffer: 3 + index_buffer: 197 + index_buffer: 195 + index_buffer: 248 + index_buffer: 197 + index_buffer: 195 + index_buffer: 197 + index_buffer: 3 + index_buffer: 359 + index_buffer: 263 + index_buffer: 255 + index_buffer: 130 + index_buffer: 25 + index_buffer: 33 + index_buffer: 249 + index_buffer: 255 + index_buffer: 263 + index_buffer: 7 + index_buffer: 33 + index_buffer: 25 + index_buffer: 275 + index_buffer: 274 + index_buffer: 440 + index_buffer: 45 + index_buffer: 220 + index_buffer: 44 + index_buffer: 457 + index_buffer: 440 + index_buffer: 274 + index_buffer: 237 + index_buffer: 44 + index_buffer: 220 + index_buffer: 300 + index_buffer: 383 + index_buffer: 301 + index_buffer: 70 + index_buffer: 71 + index_buffer: 156 + index_buffer: 368 + index_buffer: 301 + index_buffer: 383 + index_buffer: 139 + index_buffer: 156 + index_buffer: 71 + index_buffer: 417 + index_buffer: 351 + index_buffer: 465 + index_buffer: 193 + index_buffer: 245 + index_buffer: 122 + index_buffer: 412 + index_buffer: 465 + index_buffer: 351 + index_buffer: 188 + index_buffer: 122 + index_buffer: 245 + index_buffer: 466 + index_buffer: 263 + index_buffer: 467 + index_buffer: 246 + index_buffer: 247 + index_buffer: 33 + index_buffer: 359 + index_buffer: 467 + index_buffer: 263 + index_buffer: 130 + index_buffer: 33 + index_buffer: 247 + index_buffer: 389 + index_buffer: 251 + index_buffer: 368 + index_buffer: 162 + index_buffer: 139 + index_buffer: 21 + index_buffer: 301 + index_buffer: 368 + index_buffer: 251 + index_buffer: 71 + index_buffer: 21 + index_buffer: 139 + index_buffer: 374 + index_buffer: 386 + index_buffer: 380 + index_buffer: 145 + index_buffer: 153 + index_buffer: 159 + index_buffer: 385 + index_buffer: 380 + index_buffer: 386 + index_buffer: 158 + index_buffer: 159 + index_buffer: 153 + index_buffer: 379 + index_buffer: 394 + index_buffer: 378 + index_buffer: 150 + index_buffer: 149 + index_buffer: 169 + index_buffer: 395 + index_buffer: 378 + index_buffer: 394 + index_buffer: 170 + index_buffer: 169 + index_buffer: 149 + index_buffer: 351 + index_buffer: 419 + index_buffer: 412 + index_buffer: 122 + index_buffer: 188 + index_buffer: 196 + index_buffer: 399 + index_buffer: 412 + index_buffer: 419 + index_buffer: 174 + index_buffer: 196 + index_buffer: 188 + index_buffer: 426 + index_buffer: 322 + index_buffer: 436 + index_buffer: 206 + index_buffer: 216 + index_buffer: 92 + index_buffer: 410 + index_buffer: 436 + index_buffer: 322 + index_buffer: 186 + index_buffer: 92 + index_buffer: 216 + index_buffer: 387 + index_buffer: 373 + index_buffer: 388 + index_buffer: 160 + index_buffer: 161 + index_buffer: 144 + index_buffer: 390 + index_buffer: 388 + index_buffer: 373 + index_buffer: 163 + index_buffer: 144 + index_buffer: 161 + index_buffer: 393 + index_buffer: 326 + index_buffer: 164 + index_buffer: 167 + index_buffer: 164 + index_buffer: 97 + index_buffer: 2 + index_buffer: 164 + index_buffer: 326 + index_buffer: 2 + index_buffer: 97 + index_buffer: 164 + index_buffer: 354 + index_buffer: 370 + index_buffer: 461 + index_buffer: 125 + index_buffer: 241 + index_buffer: 141 + index_buffer: 462 + index_buffer: 461 + index_buffer: 370 + index_buffer: 242 + index_buffer: 141 + index_buffer: 241 + index_buffer: 0 + index_buffer: 267 + index_buffer: 164 + index_buffer: 0 + index_buffer: 164 + index_buffer: 37 + index_buffer: 393 + index_buffer: 164 + index_buffer: 267 + index_buffer: 167 + index_buffer: 37 + index_buffer: 164 + index_buffer: 11 + index_buffer: 12 + index_buffer: 302 + index_buffer: 11 + index_buffer: 72 + index_buffer: 12 + index_buffer: 268 + index_buffer: 302 + index_buffer: 12 + index_buffer: 38 + index_buffer: 12 + index_buffer: 72 + index_buffer: 386 + index_buffer: 374 + index_buffer: 387 + index_buffer: 159 + index_buffer: 160 + index_buffer: 145 + index_buffer: 373 + index_buffer: 387 + index_buffer: 374 + index_buffer: 144 + index_buffer: 145 + index_buffer: 160 + index_buffer: 12 + index_buffer: 13 + index_buffer: 268 + index_buffer: 12 + index_buffer: 38 + index_buffer: 13 + index_buffer: 312 + index_buffer: 268 + index_buffer: 13 + index_buffer: 82 + index_buffer: 13 + index_buffer: 38 + index_buffer: 293 + index_buffer: 300 + index_buffer: 298 + index_buffer: 63 + index_buffer: 68 + index_buffer: 70 + index_buffer: 301 + index_buffer: 298 + index_buffer: 300 + index_buffer: 71 + index_buffer: 70 + index_buffer: 68 + index_buffer: 340 + index_buffer: 265 + index_buffer: 261 + index_buffer: 111 + index_buffer: 31 + index_buffer: 35 + index_buffer: 446 + index_buffer: 261 + index_buffer: 265 + index_buffer: 226 + index_buffer: 35 + index_buffer: 31 + index_buffer: 380 + index_buffer: 385 + index_buffer: 381 + index_buffer: 153 + index_buffer: 154 + index_buffer: 158 + index_buffer: 384 + index_buffer: 381 + index_buffer: 385 + index_buffer: 157 + index_buffer: 158 + index_buffer: 154 + index_buffer: 280 + index_buffer: 330 + index_buffer: 425 + index_buffer: 50 + index_buffer: 205 + index_buffer: 101 + index_buffer: 266 + index_buffer: 425 + index_buffer: 330 + index_buffer: 36 + index_buffer: 101 + index_buffer: 205 + index_buffer: 423 + index_buffer: 391 + index_buffer: 426 + index_buffer: 203 + index_buffer: 206 + index_buffer: 165 + index_buffer: 322 + index_buffer: 426 + index_buffer: 391 + index_buffer: 92 + index_buffer: 165 + index_buffer: 206 + index_buffer: 429 + index_buffer: 355 + index_buffer: 420 + index_buffer: 209 + index_buffer: 198 + index_buffer: 126 + index_buffer: 437 + index_buffer: 420 + index_buffer: 355 + index_buffer: 217 + index_buffer: 126 + index_buffer: 198 + index_buffer: 391 + index_buffer: 327 + index_buffer: 393 + index_buffer: 165 + index_buffer: 167 + index_buffer: 98 + index_buffer: 326 + index_buffer: 393 + index_buffer: 327 + index_buffer: 97 + index_buffer: 98 + index_buffer: 167 + index_buffer: 457 + index_buffer: 438 + index_buffer: 440 + index_buffer: 237 + index_buffer: 220 + index_buffer: 218 + index_buffer: 344 + index_buffer: 440 + index_buffer: 438 + index_buffer: 115 + index_buffer: 218 + index_buffer: 220 + index_buffer: 382 + index_buffer: 362 + index_buffer: 341 + index_buffer: 155 + index_buffer: 112 + index_buffer: 133 + index_buffer: 463 + index_buffer: 341 + index_buffer: 362 + index_buffer: 243 + index_buffer: 133 + index_buffer: 112 + index_buffer: 457 + index_buffer: 461 + index_buffer: 459 + index_buffer: 237 + index_buffer: 239 + index_buffer: 241 + index_buffer: 458 + index_buffer: 459 + index_buffer: 461 + index_buffer: 238 + index_buffer: 241 + index_buffer: 239 + index_buffer: 434 + index_buffer: 430 + index_buffer: 364 + index_buffer: 214 + index_buffer: 135 + index_buffer: 210 + index_buffer: 394 + index_buffer: 364 + index_buffer: 430 + index_buffer: 169 + index_buffer: 210 + index_buffer: 135 + index_buffer: 414 + index_buffer: 463 + index_buffer: 398 + index_buffer: 190 + index_buffer: 173 + index_buffer: 243 + index_buffer: 362 + index_buffer: 398 + index_buffer: 463 + index_buffer: 133 + index_buffer: 243 + index_buffer: 173 + index_buffer: 262 + index_buffer: 428 + index_buffer: 369 + index_buffer: 32 + index_buffer: 140 + index_buffer: 208 + index_buffer: 396 + index_buffer: 369 + index_buffer: 428 + index_buffer: 171 + index_buffer: 208 + index_buffer: 140 + index_buffer: 457 + index_buffer: 274 + index_buffer: 461 + index_buffer: 237 + index_buffer: 241 + index_buffer: 44 + index_buffer: 354 + index_buffer: 461 + index_buffer: 274 + index_buffer: 125 + index_buffer: 44 + index_buffer: 241 + index_buffer: 316 + index_buffer: 403 + index_buffer: 317 + index_buffer: 86 + index_buffer: 87 + index_buffer: 179 + index_buffer: 402 + index_buffer: 317 + index_buffer: 403 + index_buffer: 178 + index_buffer: 179 + index_buffer: 87 + index_buffer: 315 + index_buffer: 404 + index_buffer: 316 + index_buffer: 85 + index_buffer: 86 + index_buffer: 180 + index_buffer: 403 + index_buffer: 316 + index_buffer: 404 + index_buffer: 179 + index_buffer: 180 + index_buffer: 86 + index_buffer: 314 + index_buffer: 405 + index_buffer: 315 + index_buffer: 84 + index_buffer: 85 + index_buffer: 181 + index_buffer: 404 + index_buffer: 315 + index_buffer: 405 + index_buffer: 180 + index_buffer: 181 + index_buffer: 85 + index_buffer: 313 + index_buffer: 406 + index_buffer: 314 + index_buffer: 83 + index_buffer: 84 + index_buffer: 182 + index_buffer: 405 + index_buffer: 314 + index_buffer: 406 + index_buffer: 181 + index_buffer: 182 + index_buffer: 84 + index_buffer: 418 + index_buffer: 406 + index_buffer: 421 + index_buffer: 194 + index_buffer: 201 + index_buffer: 182 + index_buffer: 313 + index_buffer: 421 + index_buffer: 406 + index_buffer: 83 + index_buffer: 182 + index_buffer: 201 + index_buffer: 366 + index_buffer: 401 + index_buffer: 323 + index_buffer: 137 + index_buffer: 93 + index_buffer: 177 + index_buffer: 361 + index_buffer: 323 + index_buffer: 401 + index_buffer: 132 + index_buffer: 177 + index_buffer: 93 + index_buffer: 408 + index_buffer: 407 + index_buffer: 306 + index_buffer: 184 + index_buffer: 76 + index_buffer: 183 + index_buffer: 292 + index_buffer: 306 + index_buffer: 407 + index_buffer: 62 + index_buffer: 183 + index_buffer: 76 + index_buffer: 408 + index_buffer: 306 + index_buffer: 409 + index_buffer: 184 + index_buffer: 185 + index_buffer: 76 + index_buffer: 291 + index_buffer: 409 + index_buffer: 306 + index_buffer: 61 + index_buffer: 76 + index_buffer: 185 + index_buffer: 410 + index_buffer: 409 + index_buffer: 287 + index_buffer: 186 + index_buffer: 57 + index_buffer: 185 + index_buffer: 291 + index_buffer: 287 + index_buffer: 409 + index_buffer: 61 + index_buffer: 185 + index_buffer: 57 + index_buffer: 436 + index_buffer: 410 + index_buffer: 432 + index_buffer: 216 + index_buffer: 212 + index_buffer: 186 + index_buffer: 287 + index_buffer: 432 + index_buffer: 410 + index_buffer: 57 + index_buffer: 186 + index_buffer: 212 + index_buffer: 434 + index_buffer: 416 + index_buffer: 427 + index_buffer: 214 + index_buffer: 207 + index_buffer: 192 + index_buffer: 411 + index_buffer: 427 + index_buffer: 416 + index_buffer: 187 + index_buffer: 192 + index_buffer: 207 + index_buffer: 264 + index_buffer: 368 + index_buffer: 372 + index_buffer: 34 + index_buffer: 143 + index_buffer: 139 + index_buffer: 383 + index_buffer: 372 + index_buffer: 368 + index_buffer: 156 + index_buffer: 139 + index_buffer: 143 + index_buffer: 457 + index_buffer: 459 + index_buffer: 438 + index_buffer: 237 + index_buffer: 218 + index_buffer: 239 + index_buffer: 309 + index_buffer: 438 + index_buffer: 459 + index_buffer: 79 + index_buffer: 239 + index_buffer: 218 + index_buffer: 352 + index_buffer: 376 + index_buffer: 366 + index_buffer: 123 + index_buffer: 137 + index_buffer: 147 + index_buffer: 401 + index_buffer: 366 + index_buffer: 376 + index_buffer: 177 + index_buffer: 147 + index_buffer: 137 + index_buffer: 4 + index_buffer: 1 + index_buffer: 275 + index_buffer: 4 + index_buffer: 45 + index_buffer: 1 + index_buffer: 274 + index_buffer: 275 + index_buffer: 1 + index_buffer: 44 + index_buffer: 1 + index_buffer: 45 + index_buffer: 428 + index_buffer: 262 + index_buffer: 421 + index_buffer: 208 + index_buffer: 201 + index_buffer: 32 + index_buffer: 418 + index_buffer: 421 + index_buffer: 262 + index_buffer: 194 + index_buffer: 32 + index_buffer: 201 + index_buffer: 327 + index_buffer: 358 + index_buffer: 294 + index_buffer: 98 + index_buffer: 64 + index_buffer: 129 + index_buffer: 331 + index_buffer: 294 + index_buffer: 358 + index_buffer: 102 + index_buffer: 129 + index_buffer: 64 + index_buffer: 367 + index_buffer: 435 + index_buffer: 416 + index_buffer: 138 + index_buffer: 192 + index_buffer: 215 + index_buffer: 433 + index_buffer: 416 + index_buffer: 435 + index_buffer: 213 + index_buffer: 215 + index_buffer: 192 + index_buffer: 455 + index_buffer: 439 + index_buffer: 289 + index_buffer: 235 + index_buffer: 59 + index_buffer: 219 + index_buffer: 392 + index_buffer: 289 + index_buffer: 439 + index_buffer: 166 + index_buffer: 219 + index_buffer: 59 + index_buffer: 328 + index_buffer: 462 + index_buffer: 326 + index_buffer: 99 + index_buffer: 97 + index_buffer: 242 + index_buffer: 370 + index_buffer: 326 + index_buffer: 462 + index_buffer: 141 + index_buffer: 242 + index_buffer: 97 + index_buffer: 326 + index_buffer: 370 + index_buffer: 2 + index_buffer: 97 + index_buffer: 2 + index_buffer: 141 + index_buffer: 94 + index_buffer: 2 + index_buffer: 370 + index_buffer: 94 + index_buffer: 141 + index_buffer: 2 + index_buffer: 460 + index_buffer: 455 + index_buffer: 305 + index_buffer: 240 + index_buffer: 75 + index_buffer: 235 + index_buffer: 289 + index_buffer: 305 + index_buffer: 455 + index_buffer: 59 + index_buffer: 235 + index_buffer: 75 + index_buffer: 448 + index_buffer: 339 + index_buffer: 449 + index_buffer: 228 + index_buffer: 229 + index_buffer: 110 + index_buffer: 254 + index_buffer: 449 + index_buffer: 339 + index_buffer: 24 + index_buffer: 110 + index_buffer: 229 + index_buffer: 261 + index_buffer: 446 + index_buffer: 255 + index_buffer: 31 + index_buffer: 25 + index_buffer: 226 + index_buffer: 359 + index_buffer: 255 + index_buffer: 446 + index_buffer: 130 + index_buffer: 226 + index_buffer: 25 + index_buffer: 449 + index_buffer: 254 + index_buffer: 450 + index_buffer: 229 + index_buffer: 230 + index_buffer: 24 + index_buffer: 253 + index_buffer: 450 + index_buffer: 254 + index_buffer: 23 + index_buffer: 24 + index_buffer: 230 + index_buffer: 450 + index_buffer: 253 + index_buffer: 451 + index_buffer: 230 + index_buffer: 231 + index_buffer: 23 + index_buffer: 252 + index_buffer: 451 + index_buffer: 253 + index_buffer: 22 + index_buffer: 23 + index_buffer: 231 + index_buffer: 451 + index_buffer: 252 + index_buffer: 452 + index_buffer: 231 + index_buffer: 232 + index_buffer: 22 + index_buffer: 256 + index_buffer: 452 + index_buffer: 252 + index_buffer: 26 + index_buffer: 22 + index_buffer: 232 + index_buffer: 256 + index_buffer: 341 + index_buffer: 452 + index_buffer: 26 + index_buffer: 232 + index_buffer: 112 + index_buffer: 453 + index_buffer: 452 + index_buffer: 341 + index_buffer: 233 + index_buffer: 112 + index_buffer: 232 + index_buffer: 413 + index_buffer: 464 + index_buffer: 414 + index_buffer: 189 + index_buffer: 190 + index_buffer: 244 + index_buffer: 463 + index_buffer: 414 + index_buffer: 464 + index_buffer: 243 + index_buffer: 244 + index_buffer: 190 + index_buffer: 441 + index_buffer: 413 + index_buffer: 286 + index_buffer: 221 + index_buffer: 56 + index_buffer: 189 + index_buffer: 414 + index_buffer: 286 + index_buffer: 413 + index_buffer: 190 + index_buffer: 189 + index_buffer: 56 + index_buffer: 441 + index_buffer: 286 + index_buffer: 442 + index_buffer: 221 + index_buffer: 222 + index_buffer: 56 + index_buffer: 258 + index_buffer: 442 + index_buffer: 286 + index_buffer: 28 + index_buffer: 56 + index_buffer: 222 + index_buffer: 442 + index_buffer: 258 + index_buffer: 443 + index_buffer: 222 + index_buffer: 223 + index_buffer: 28 + index_buffer: 257 + index_buffer: 443 + index_buffer: 258 + index_buffer: 27 + index_buffer: 28 + index_buffer: 223 + index_buffer: 444 + index_buffer: 443 + index_buffer: 259 + index_buffer: 224 + index_buffer: 29 + index_buffer: 223 + index_buffer: 257 + index_buffer: 259 + index_buffer: 443 + index_buffer: 27 + index_buffer: 223 + index_buffer: 29 + index_buffer: 259 + index_buffer: 260 + index_buffer: 444 + index_buffer: 29 + index_buffer: 224 + index_buffer: 30 + index_buffer: 445 + index_buffer: 444 + index_buffer: 260 + index_buffer: 225 + index_buffer: 30 + index_buffer: 224 + index_buffer: 260 + index_buffer: 467 + index_buffer: 445 + index_buffer: 30 + index_buffer: 225 + index_buffer: 247 + index_buffer: 342 + index_buffer: 445 + index_buffer: 467 + index_buffer: 113 + index_buffer: 247 + index_buffer: 225 + index_buffer: 250 + index_buffer: 309 + index_buffer: 458 + index_buffer: 20 + index_buffer: 238 + index_buffer: 79 + index_buffer: 459 + index_buffer: 458 + index_buffer: 309 + index_buffer: 239 + index_buffer: 79 + index_buffer: 238 + index_buffer: 290 + index_buffer: 305 + index_buffer: 392 + index_buffer: 60 + index_buffer: 166 + index_buffer: 75 + index_buffer: 289 + index_buffer: 392 + index_buffer: 305 + index_buffer: 59 + index_buffer: 75 + index_buffer: 166 + index_buffer: 460 + index_buffer: 305 + index_buffer: 328 + index_buffer: 240 + index_buffer: 99 + index_buffer: 75 + index_buffer: 290 + index_buffer: 328 + index_buffer: 305 + index_buffer: 60 + index_buffer: 75 + index_buffer: 99 + index_buffer: 376 + index_buffer: 433 + index_buffer: 401 + index_buffer: 147 + index_buffer: 177 + index_buffer: 213 + index_buffer: 435 + index_buffer: 401 + index_buffer: 433 + index_buffer: 215 + index_buffer: 213 + index_buffer: 177 + index_buffer: 250 + index_buffer: 290 + index_buffer: 309 + index_buffer: 20 + index_buffer: 79 + index_buffer: 60 + index_buffer: 392 + index_buffer: 309 + index_buffer: 290 + index_buffer: 166 + index_buffer: 60 + index_buffer: 79 + index_buffer: 411 + index_buffer: 416 + index_buffer: 376 + index_buffer: 187 + index_buffer: 147 + index_buffer: 192 + index_buffer: 433 + index_buffer: 376 + index_buffer: 416 + index_buffer: 213 + index_buffer: 192 + index_buffer: 147 + index_buffer: 341 + index_buffer: 463 + index_buffer: 453 + index_buffer: 112 + index_buffer: 233 + index_buffer: 243 + index_buffer: 464 + index_buffer: 453 + index_buffer: 463 + index_buffer: 244 + index_buffer: 243 + index_buffer: 233 + index_buffer: 453 + index_buffer: 464 + index_buffer: 357 + index_buffer: 233 + index_buffer: 128 + index_buffer: 244 + index_buffer: 465 + index_buffer: 357 + index_buffer: 464 + index_buffer: 245 + index_buffer: 244 + index_buffer: 128 + index_buffer: 412 + index_buffer: 343 + index_buffer: 465 + index_buffer: 188 + index_buffer: 245 + index_buffer: 114 + index_buffer: 357 + index_buffer: 465 + index_buffer: 343 + index_buffer: 128 + index_buffer: 114 + index_buffer: 245 + index_buffer: 437 + index_buffer: 343 + index_buffer: 399 + index_buffer: 217 + index_buffer: 174 + index_buffer: 114 + index_buffer: 412 + index_buffer: 399 + index_buffer: 343 + index_buffer: 188 + index_buffer: 114 + index_buffer: 174 + index_buffer: 363 + index_buffer: 440 + index_buffer: 360 + index_buffer: 134 + index_buffer: 131 + index_buffer: 220 + index_buffer: 344 + index_buffer: 360 + index_buffer: 440 + index_buffer: 115 + index_buffer: 220 + index_buffer: 131 + index_buffer: 456 + index_buffer: 420 + index_buffer: 399 + index_buffer: 236 + index_buffer: 174 + index_buffer: 198 + index_buffer: 437 + index_buffer: 399 + index_buffer: 420 + index_buffer: 217 + index_buffer: 198 + index_buffer: 174 + index_buffer: 456 + index_buffer: 363 + index_buffer: 420 + index_buffer: 236 + index_buffer: 198 + index_buffer: 134 + index_buffer: 360 + index_buffer: 420 + index_buffer: 363 + index_buffer: 131 + index_buffer: 134 + index_buffer: 198 + index_buffer: 361 + index_buffer: 401 + index_buffer: 288 + index_buffer: 132 + index_buffer: 58 + index_buffer: 177 + index_buffer: 435 + index_buffer: 288 + index_buffer: 401 + index_buffer: 215 + index_buffer: 177 + index_buffer: 58 + index_buffer: 353 + index_buffer: 265 + index_buffer: 383 + index_buffer: 124 + index_buffer: 156 + index_buffer: 35 + index_buffer: 372 + index_buffer: 383 + index_buffer: 265 + index_buffer: 143 + index_buffer: 35 + index_buffer: 156 + index_buffer: 255 + index_buffer: 249 + index_buffer: 339 + index_buffer: 25 + index_buffer: 110 + index_buffer: 7 + index_buffer: 390 + index_buffer: 339 + index_buffer: 249 + index_buffer: 163 + index_buffer: 7 + index_buffer: 110 + index_buffer: 261 + index_buffer: 255 + index_buffer: 448 + index_buffer: 31 + index_buffer: 228 + index_buffer: 25 + index_buffer: 339 + index_buffer: 448 + index_buffer: 255 + index_buffer: 110 + index_buffer: 25 + index_buffer: 228 + index_buffer: 14 + index_buffer: 317 + index_buffer: 13 + index_buffer: 14 + index_buffer: 13 + index_buffer: 87 + index_buffer: 312 + index_buffer: 13 + index_buffer: 317 + index_buffer: 82 + index_buffer: 87 + index_buffer: 13 + index_buffer: 317 + index_buffer: 402 + index_buffer: 312 + index_buffer: 87 + index_buffer: 82 + index_buffer: 178 + index_buffer: 311 + index_buffer: 312 + index_buffer: 402 + index_buffer: 81 + index_buffer: 178 + index_buffer: 82 + index_buffer: 402 + index_buffer: 318 + index_buffer: 311 + index_buffer: 178 + index_buffer: 81 + index_buffer: 88 + index_buffer: 310 + index_buffer: 311 + index_buffer: 318 + index_buffer: 80 + index_buffer: 88 + index_buffer: 81 + index_buffer: 318 + index_buffer: 324 + index_buffer: 310 + index_buffer: 88 + index_buffer: 80 + index_buffer: 95 + index_buffer: 415 + index_buffer: 310 + index_buffer: 324 + index_buffer: 191 + index_buffer: 95 + index_buffer: 80 +} +pose_transform_matrix { + rows: 4 + cols: 4 + packed_data: 0.9995292 + packed_data: 0.0072318087 + packed_data: -0.029815676 + packed_data: 0 + packed_data: -0.005092691 + packed_data: 0.99744856 + packed_data: 0.07120642 + packed_data: 0 + packed_data: 0.030254554 + packed_data: -0.07102106 + packed_data: 0.9970159 + packed_data: 0 + packed_data: -0.37340546 + packed_data: 22.212194 + packed_data: -64.76358 + packed_data: 1 +} diff --git a/third_party/external_files.bzl b/third_party/external_files.bzl index d14d93169..c140003bf 100644 --- a/third_party/external_files.bzl +++ b/third_party/external_files.bzl @@ -70,6 +70,12 @@ def external_files(): urls = ["https://storage.googleapis.com/mediapipe-assets/BUILD?generation=1661875663693976"], ) + http_file( + name = "com_google_mediapipe_BUILD_orig", + sha256 = "64d5343a6a5f9be06db0a5074a2260f9ae63a989fe01702832cd215680dc19c1", + urls = ["https://storage.googleapis.com/mediapipe-assets/BUILD.orig?generation=1678323576393653"], + ) + http_file( name = "com_google_mediapipe_burger_crop_jpg", sha256 = "8f58de573f0bf59a49c3d86cfabb9ad4061481f574aa049177e8da3963dddc50", @@ -300,8 +306,20 @@ def external_files(): http_file( name = "com_google_mediapipe_face_geometry_expected_out_pbtxt", - sha256 = "611b203bca40e547ae75bf0822fda0695d512d02940e7af08a70068eaa8524f7", - urls = ["https://storage.googleapis.com/mediapipe-assets/face_geometry_expected_out.pbtxt?generation=1677787710308910"], + sha256 = "4a4ed08055a5bc9281472dd60180d11f0cdc9a15fa1788d87a58af3d06b2c6e4", + urls = ["https://storage.googleapis.com/mediapipe-assets/face_geometry_expected_out.pbtxt?generation=1678323580380646"], + ) + + http_file( + name = "com_google_mediapipe_face_landmarker_task", + sha256 = "7cf2bbf1842c429e9defee38e7f1c4238978d8a6faf2da145bb19846f86bd2f4", + urls = ["https://storage.googleapis.com/mediapipe-assets/face_landmarker.task?generation=1678323583183024"], + ) + + http_file( + name = "com_google_mediapipe_face_landmarker_with_blendshapes_task", + sha256 = "a75c1ba70e4b8568000af2ad0b355ed559ab5d5793db50fa9ad241f8dc4fad5f", + urls = ["https://storage.googleapis.com/mediapipe-assets/face_landmarker_with_blendshapes.task?generation=1678323586260800"], ) http_file( @@ -316,6 +334,12 @@ def external_files(): urls = ["https://storage.googleapis.com/mediapipe-assets/face_landmark_with_attention.tflite?generation=1676415468821650"], ) + http_file( + name = "com_google_mediapipe_face_stylization_dummy_tflite", + sha256 = "f57fd2d5638def25466f6fec142eb3397d8ad99a9bd0a9344b622bad7c3f0376", + urls = ["https://storage.googleapis.com/mediapipe-assets/face_stylization_dummy.tflite?generation=1678323589048063"], + ) + http_file( name = "com_google_mediapipe_feature_tensor_meta_json", sha256 = "b2c30ddfd495956ce81085f8a143422f4310b002cfbf1c594ff2ee0576e29d6f", @@ -508,6 +532,12 @@ def external_files(): urls = ["https://storage.googleapis.com/mediapipe-assets/labels.txt?generation=1667892497527642"], ) + http_file( + name = "com_google_mediapipe_language_detector_tflite", + sha256 = "5f64d821110dd2a3280546e8cd59dff09547e25d5f5c9711ec3f03416414dbb2", + urls = ["https://storage.googleapis.com/mediapipe-assets/language_detector.tflite?generation=1678323592870401"], + ) + http_file( name = "com_google_mediapipe_left_hands_jpg", sha256 = "4b5134daa4cb60465535239535f9f74c2842aba3aa5fd30bf04ef5678f93d87f", @@ -780,8 +810,8 @@ def external_files(): http_file( name = "com_google_mediapipe_portrait_expected_blendshapes_with_attention_pbtxt", - sha256 = "0142d56705093c3d79ea5ee79b8e9454499abee00fc059491e6ca14f5fbab862", - urls = ["https://storage.googleapis.com/mediapipe-assets/portrait_expected_blendshapes_with_attention.pbtxt?generation=1678218364703223"], + sha256 = "3f8f698d8ed81346c6f13d1cc85190fd4a58b021e664d336997d29818b8ffbb6", + urls = ["https://storage.googleapis.com/mediapipe-assets/portrait_expected_blendshapes_with_attention.pbtxt?generation=1678323598426417"], ) http_file( @@ -790,6 +820,12 @@ def external_files(): urls = ["https://storage.googleapis.com/mediapipe-assets/portrait_expected_detection.pbtxt?generation=1677044311581104"], ) + http_file( + name = "com_google_mediapipe_portrait_expected_face_geometry_with_attention_pbtxt", + sha256 = "5cc57b8da3ad0527dce581fe1309f6b36043e5837e3f4f5af5e24005a99dc52a", + urls = ["https://storage.googleapis.com/mediapipe-assets/portrait_expected_face_geometry_with_attention.pbtxt?generation=1678323601064393"], + ) + http_file( name = "com_google_mediapipe_portrait_expected_face_landmarks_pbtxt", sha256 = "4ac8587379bd072c36cda0d7345f5e592fae51b30522475e0b49c18aab108ce7", @@ -850,6 +886,12 @@ def external_files(): urls = ["https://storage.googleapis.com/mediapipe-assets/pose_landmark_lite.tflite?generation=1661875901231143"], ) + http_file( + name = "com_google_mediapipe_ptm_512_hdt_ptm_woid_tflite", + sha256 = "2baa1c9783d03dd26f91e3c49efbcab11dd1361ff80e40e7209e81f84f281b6a", + urls = ["https://storage.googleapis.com/mediapipe-assets/ptm_512_hdt_ptm_woid.tflite?generation=1678323604771164"], + ) + http_file( name = "com_google_mediapipe_README_md", sha256 = "a96d08c9c70cd9717207ed72c926e02e5eada751f00bdc5d3a7e82e3492b72cb",