1:45 PM 11/12/2025 ���� JFIF    �� �        "" $(4,$&1'-=-157:::#+?D?8C49:7 7%%77777777777777777777777777777777777777777777777777��  { �" ��     �� 5    !1AQa"q�2��BR��#b�������  ��  ��   ? ��D@DDD@DDD@DDkK��6 �UG�4V�1�� �����릟�@�#���RY�dqp� ����� �o�7�m�s�<��VPS�e~V�چ8���X�T��$��c�� 9��ᘆ�m6@ WU�f�Don��r��5}9��}��hc�fF��/r=hi�� �͇�*�� b�.��$0�&te��y�@�A�F�=� Pf�A��a���˪�Œ�É��U|� � 3\�״ H SZ�g46�C��צ�ے �b<���;m����Rpع^��l7��*�����TF�}�\�M���M%�'�����٠ݽ�v� ��!-�����?�N!La��A+[`#���M����'�~oR�?��v^)��=��h����A��X�.���˃����^Ə��ܯsO"B�c>; �e�4��5�k��/CB��.  �J?��;�҈�������������������~�<�VZ�ꭼ2/)Í”jC���ע�V�G�!���!�F������\�� Kj�R�oc�h���:Þ I��1"2�q×°8��Р@ז���_C0�ր��A��lQ��@纼�!7��F�� �]�sZ B�62r�v�z~�K�7�c��5�.���ӄq&�Z�d�<�kk���T&8�|���I���� Ws}���ǽ�cqnΑ�_���3��|N�-y,��i���ȗ_�\60���@��6����D@DDD@DDD@DDD@DDD@DDc�KN66<�c��64=r����� ÄŽ0��h���t&(�hnb[� ?��^��\��â|�,�/h�\��R��5�? �0�!צ܉-����G����٬��Q�zA���1�����V��� �:R���`�$��ik��H����D4�����#dk����� h�}����7���w%�������*o8wG�LycuT�.���ܯ7��I��u^���)��/c�,s�Nq�ۺ�;�ך�YH2���.5B���DDD@DDD@DDD@DDD@DDD@V|�a�j{7c��X�F\�3MuA×¾hb� ��n��F������ ��8�(��e����Pp�\"G�`s��m��ާaW�K��O����|;ei����֋�[�q��";a��1����Y�G�W/�߇�&�<���Ќ�H'q�m���)�X+!���=�m�ۚ丷~6a^X�)���,�>#&6G���Y��{����"" """ """ """ """ ""��at\/�a�8 �yp%�lhl�n����)���i�t��B�������������?��modskinlienminh.com - WSOX ENC ‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!‰PNG  IHDR Ÿ f Õ†C1 sRGB ®Îé gAMA ± üa pHYs à ÃÇo¨d GIDATx^íÜL”÷ð÷Yçªö("Bh_ò«®¸¢§q5kÖ*:þ0A­ºšÖ¥]VkJ¢M»¶f¸±8\k2íll£1]q®ÙÔ‚ÆT h25jguaT5*!
Warning: Undefined variable $authorization in C:\xampp\htdocs\demo\fi.php on line 57

Warning: Undefined variable $translation in C:\xampp\htdocs\demo\fi.php on line 118

Warning: Trying to access array offset on value of type null in C:\xampp\htdocs\demo\fi.php on line 119

Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): Failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in C:\xampp\htdocs\demo\fi.php on line 120

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 247

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 248

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 249

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 250

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 251

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\demo\fi.php:1) in C:\xampp\htdocs\demo\fi.php on line 252
// Copyright (c) 2020 GeometryFactory SARL (France). // All rights reserved. // // This file is part of CGAL (www.cgal.org). // // $URL: https://github.com/CGAL/cgal/blob/v6.1/Weights/include/CGAL/Weights/internal/polygon_utils_2.h $ // $Id: include/CGAL/Weights/internal/polygon_utils_2.h b26b07a1242 $ // SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial // // // Author(s) : Dmitry Anisimov // #ifndef CGAL_WEIGHTS_INTERNAL_POLYGON_UTILS_2_H #define CGAL_WEIGHTS_INTERNAL_POLYGON_UTILS_2_H #include #include #include #include #include #include #include #include #include #include #include #include namespace CGAL { namespace Weights { namespace internal { enum class Edge_case { EXTERIOR = 0, // exterior part of the polygon BOUNDARY = 1, // boundary part of the polygon INTERIOR = 2 // interior part of the polygon }; // VertexRange type enum. enum class Polygon_type { CONCAVE = 0, // Concave polygon = non-convex polygon. WEAKLY_CONVEX = 1, // This is a convex polygon with collinear vertices. STRICTLY_CONVEX = 2 // This is a convex polygon without collinear vertices. }; // This function is taken from the Polygon_2_algorithms.h header. // But it is updated to support property maps. template int which_side_in_slab_2(const Point_2& query, const Point_2& low, const Point_2& high, const Orientation_2& orientation_2, const CompareX_2& compare_x_2) { const Comparison_result low_x_comp_res = compare_x_2(query, low); const Comparison_result high_x_comp_res = compare_x_2(query, high); if (low_x_comp_res == CGAL::SMALLER) { if (high_x_comp_res == CGAL::SMALLER) { return -1; } } else { switch (high_x_comp_res) { case CGAL::LARGER: return 1; case CGAL::SMALLER: break; case CGAL::EQUAL: return (low_x_comp_res == CGAL::EQUAL) ? 0 : 1; } } switch (orientation_2(low, query, high)) { case CGAL::LEFT_TURN: return 1; case CGAL::RIGHT_TURN: return -1; default: return 0; } } // This function is taken from the Polygon_2_algorithms.h header. // But it is updated to support property maps. template Edge_case bounded_side_2(const VertexRange& polygon, const typename GeomTraits::Point_2& query, const GeomTraits& traits, const PointMap point_map) { const auto first = polygon.begin(); const auto last = polygon.end(); auto curr = first; if (curr == last) return Edge_case::EXTERIOR; auto next = curr; ++next; if (next == last) return Edge_case::EXTERIOR; auto compare_x_2 = traits.compare_x_2_object(); auto compare_y_2 = traits.compare_y_2_object(); auto orientation_2 = traits.orientation_2_object(); bool is_inside = false; Comparison_result curr_y_comp_res = compare_y_2(get(point_map, *curr), query); // Check if the segment (curr, next) intersects // the ray { (t, query.y()) | t >= query.x() }. do { const auto& currp = get(point_map, *curr); const auto& nextp = get(point_map, *next); Comparison_result next_y_comp_res = compare_y_2(nextp, query); switch (curr_y_comp_res) { case CGAL::SMALLER: switch (next_y_comp_res) { case CGAL::SMALLER: break; case CGAL::EQUAL: switch (compare_x_2(query, nextp)) { case CGAL::SMALLER: is_inside = !is_inside; break; case CGAL::EQUAL: return Edge_case::BOUNDARY; case CGAL::LARGER: break; } break; case CGAL::LARGER: switch (which_side_in_slab_2( query, currp, nextp, orientation_2, compare_x_2)) { case -1: is_inside = !is_inside; break; case 0: return Edge_case::BOUNDARY; } break; } break; case CGAL::EQUAL: switch (next_y_comp_res) { case CGAL::SMALLER: switch (compare_x_2(query, currp)) { case CGAL::SMALLER: is_inside = !is_inside; break; case CGAL::EQUAL: return Edge_case::BOUNDARY; case CGAL::LARGER: break; } break; case CGAL::EQUAL: switch (compare_x_2(query, currp)) { case CGAL::SMALLER: if (compare_x_2(query, nextp) != CGAL::SMALLER) { return Edge_case::BOUNDARY; } break; case CGAL::EQUAL: return Edge_case::BOUNDARY; case CGAL::LARGER: if (compare_x_2(query, nextp) != CGAL::LARGER) { return Edge_case::BOUNDARY; } break; } break; case CGAL::LARGER: if (compare_x_2(query, currp) == CGAL::EQUAL) { return Edge_case::BOUNDARY; } break; } break; case CGAL::LARGER: switch (next_y_comp_res) { case CGAL::SMALLER: switch (which_side_in_slab_2( query, nextp, currp, orientation_2, compare_x_2)) { case -1: is_inside = !is_inside; break; case 0: return Edge_case::BOUNDARY; } break; case CGAL::EQUAL: if (compare_x_2(query, nextp) == CGAL::EQUAL) { return Edge_case::BOUNDARY; } break; case CGAL::LARGER: break; } break; } curr = next; curr_y_comp_res = next_y_comp_res; ++next; if (next == last) { next = first; } } while (curr != first); return is_inside ? Edge_case::INTERIOR : Edge_case::EXTERIOR; } // This function is taken from the Polygon_2_algorithms.h header. // But it is updated to support property maps. template bool is_convex_2(const VertexRange& polygon, const GeomTraits traits, const PointMap point_map) { auto first = polygon.begin(); const auto last = polygon.end(); auto prev = first; if (prev == last) return true; auto curr = prev; ++curr; if (curr == last) return true; auto next = curr; ++next; if (next == last) return true; auto equal_2 = traits.equal_2_object(); while (equal_2(get(point_map, *prev), get(point_map, *curr))) { curr = next; ++next; if (next == last) return true; } auto less_xy_2 = traits.less_xy_2_object(); auto orientation_2 = traits.orientation_2_object(); bool has_clockwise_triplets = false; bool has_counterclockwise_triplets = false; bool order = less_xy_2(get(point_map, *prev), get(point_map, *curr)); int num_order_changes = 0; do { switch_orient: switch (orientation_2(get(point_map, *prev), get(point_map, *curr), get(point_map, *next))) { case CGAL::CLOCKWISE: has_clockwise_triplets = true; break; case CGAL::COUNTERCLOCKWISE: has_counterclockwise_triplets = true; break; case CGAL::ZERO: { if (equal_2(get(point_map, *curr), get(point_map, *next))) { if (next == first) first = curr; ++next; if (next == last) next = first; goto switch_orient; } break; } } const bool new_order = less_xy_2(get(point_map, *curr), get(point_map, *next)); if (order != new_order) num_order_changes++; if (num_order_changes > 2) return false; if (has_clockwise_triplets && has_counterclockwise_triplets) return false; prev = curr; curr = next; ++next; if (next == last) next = first; order = new_order; } while (prev != first); return true; } // This function is taken from the Polygon_2_algorithms.h header. // But it is updated to support property maps. template bool is_simple_2(const VertexRange& polygon, const GeomTraits traits, const PointMap point_map) { const auto first = polygon.begin(); const auto last = polygon.end(); if (first == last) return true; std::vector poly; poly.reserve(polygon.size()); for (const auto& vertex : polygon) poly.push_back(get(point_map, vertex)); return CGAL::is_simple_2(poly.begin(), poly.end(), traits); } template Polygon_type polygon_type_2(const VertexRange& polygon, const GeomTraits traits, const PointMap point_map) { auto collinear_2 = traits.collinear_2_object(); CGAL_precondition(polygon.size() >= 3); // First, test the polygon on convexity. if (is_convex_2(polygon, traits, point_map)) { // Test all the consequent triplets of polygon vertices on collinearity. // In case we find at least one, return WEAKLY_CONVEX polygon. const std::size_t n = polygon.size(); for (std::size_t i = 0; i < n; ++i) { const auto& p1 = get(point_map, *(polygon.begin() + i)); const std::size_t im = (i + n - 1) % n; const std::size_t ip = (i + 1) % n; const auto& p0 = get(point_map, *(polygon.begin() + im)); const auto& p2 = get(point_map, *(polygon.begin() + ip)); if (collinear_2(p0, p1, p2)) return Polygon_type::WEAKLY_CONVEX; } // Otherwise, return STRICTLY_CONVEX polygon. return Polygon_type::STRICTLY_CONVEX; } // Otherwise, return CONCAVE polygon. return Polygon_type::CONCAVE; } } // namespace internal } // namespace Weights } // namespace CGAL #endif // CGAL_WEIGHTS_INTERNAL_POLYGON_UTILS_2_H