اذهب إلى المحتوى

Ali Ibrahim12

الأعضاء
  • المساهمات

    45
  • تاريخ الانضمام

  • تاريخ آخر زيارة

كل منشورات العضو Ali Ibrahim12

  1. يوجد في مكتبة os يوجد مكتبة تدعى walk تأخذ مسار المجلد المراد بناء شجرة الملفات له وترجع 3 متغيرات يعبر الأول عن مسار المجلد الرئيسي والثاني عن قائمة المجدات الفرعية في هذا المجلد، وقائمة أسماء الملفات في هذا المجلد. حيث تعمل هذه الدالة بشكل تكراري حتى تمشي على جميع الملفات والمجلدات. تشبه في بنائ الشجرة الشكل التالي حيث تسبر مستوى مستوى تنتقل للمستوى الاعمق من خلال المجلدات وتكون الملفات والمجلدات الفارغة عبارة عن اوراق الشجرة مثال : حيث نريد بناء شجرة الملفات لمجلد يدعى root موجود في المسار التالي "C:\\Users\\Ali\\Desktop\\root" حيث يوجد داخله ثلاث مجلدات وداخله في المسار التالي يوجد هذه الملفات حيث نطبق الكود التالي لبناء الشجرة كما تريد حيث walk ترجع 3 متغيرات files وdirectories ونقوم بالمرور على كل الملفات والدالة walk من النوع generator اي تعيد نتيجة عند كل استدعاء لذلك يجب المرور عليها بحلقة for وهي تثبر مستوى ونتقل للمستوى الثاني حيث يعبر المستوى عن محتويات المجلد حيث تقوم بفتح المجلدات بالترتيب import os path = "C:\\Users\\Ali\\Desktop\\root" for root, directories, files in os.walk(path): for file in files: file_path = os.path.join(root, file) # Perform operations on the file_path print(file_path) for directory in directories: directory_path = os.path.join(root, directory) # Perform operations on the directory_path print(directory_path) لتظهر النتيجة بالشكل التالي
  2. في حال عملك مع لغة بايثون تأكد من تثبيت بايثون من الموقع التالي link ومن ثم تثبيت الامتداد الخاص بها في البرنامج كما يلي: تاكد عند فتح البرنامج الخاص فيك قم بفتح المجلد باكمله ليس فقط ملف واحد بشكل مباشر وتاكد من ان نهاية الملف py.
  3. في البداية يوجد خطأ عند تطبيقك الخط على محتويات الجدول أي عند انشاء كائن من الـTableStyle: ('FONTNAME', (0, 0), (-1, -1), 'Arabic') بهذا تكون قد حلت مشكلة عدم فهم وتشفير اللغة العربية أما بالنسبة للأرقام فيمكنك إنشاء التابع البسيط التالي للتحويل: def convert_to_arabic(number): arabic_digits = { '0': '٠', '1': '١', '2': '٢', '3': '٣', '4': '٤', '5': '٥', '6': '٦', '7': '٧', '8': '٨', '9': '٩' } arabic_number = '' for digit in number: if digit.isdigit(): arabic_number += arabic_digits[digit] else: arabic_number += digit return arabic_number ومن ثم استخدامه بالشكل التالي: reshaped_data = [ [ get_display(reshape(convert_to_arabic(cell))) for cell in row ] for row in mydata ] لتظهر النتيجة بالشكل التالي وتم ارفاق الكود كامل في المرفقات وتأكد من تنزيل المكاتب التالية قبل التشغيل : pip install reportlab pip install arabic_reshaper pip install python-bidi arabic_tables.py
  4. يوجد اصدارين من PyTorch اصدار يعمل على CPU واصدار على ال GPU ويعتمد نوع الاصدار الذي تريده الى نوع الخدمات التي تريد ان تعمل عليها فهناك نماذج تحتاج الى عمليات كبيرة لذلك تتطلب للتشغيل GPU. فان PyTorch هو إطار عمل مفتوح المصدر للتعلم العميق طور الإطار من قبل فريق بحث الذكاء الاصطناعي في شركة ميتا (فيسبوك سابقًا) عام 2016 استنادًا إلى مكتبة تورش Torch المستندة بدورها إلى لغة البرمجة Lua. اي قامو بجعل الخدمات التي تقدمها Torch تقدم بلغة بايثون فاصبحت PyTorch اي Py هي لتبيان انها النسخة التي تعمل بلغة بايثون نظرا لقوة وشهرة بايثون في تطوير نماذج الذكاء الاصطناعي. لتثبيت PyTorch نسخة ال cpu : pip3 install torch torchvision torchaudio لتثبيت PyTorch نسخة ال GPU : تحتاج اولا الى برنامج للتاخطب مع GPU حيث ان GPU الخاصة بشركة NVIDIA تعطينا برنامج يدعى CUDA يقوم بالتخاطب مع ال GPU وتجعل الGPU يقوم بالعمليات على التوازي مما يسرع من اتمام العمليلت اسرع من انجازها على GPU ولتسطيع PyTorch التخاطب وتنفيذ عملياتها لتثبيت CUDA: ملاحظة يجب ان يكون جهازك يملك GPU ذات قدرات عالية اقل شي GTX 1050 لتتمكن من العمل على جهازك. تثبيت (++Visual C) لان CUDA مبني على لغة (++c) ويحتاج بعض المكاتب عند تثبيته على حاسوبك الدخول الى الموقع التالي واختيار النسخة المناسبة لك حسب جهاز الحاسب الخاصة بك. الدخول الى موقع NVIDIA 3. ثم تثبيت CuDNN وهي عبارة عن مكاتب تدعم عمل البرنامج : تثبيت PyTorch من موقع الرسمي : حسب النسخة المتوافقة مع CUDA التي قمت بتحميلها مثال للنسخة 12.1 ويجب ملاحظة ان بعض النسخ قد لا تكون متوفرة بعد فيPyTorch لذلك نطر للعودة لنسخ اقدم من CUDA pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121 وبنسبة للفرق بين pip و conda : pip : هو اداة لادراة المكاتب و التنزيلات والحزم الخاصة بلغة بايثون تكون موجودة بشكل افتراضي عندد تنزيل اللغة. conda: هي نظام او برنامج يقوم بادراة افضل للمكاتب والحزم الخاصة بلغة بايثون خاصة للاشخاص المبتدئين لانها تقوم بتنزيل جميع المكاتب والادوات المشهورة التي تستعمل في بغة بايثون ويمكن تنزيلها عبر الرابط التالي linl
  5. هذه مشكلة لعدم اعطاء صلاحيات قم بتنفيذ الامر التالي في ال(Windows PowerShell) لكن قم بالدخول (run as administrator) كالصورة التالية ثم قم بتنفيذ الامر التالي Set-ExecutionPolicy -ExecutionPolicy RemoteSigned وبعدها قم بالعودة الى الامر تفعيل البيئة وتنحل المشكلة .\venv\Scripts\activate
  6. التجريبية(heuristic) هي عبارة عن قواعد تضاف الى الخوارزميات العادية لتضيف بعض التوجيه للحل وتكون الخوارزمية اكثر ذكاء مثال 1: مسألة الوزراء الثمانية: تتمثل في وضع ثماني وزراء على رقعة شطرنج ثُمانيَّة 8 × 8، بحيثُ لا يهدد وزيران بعضيهما، وبذلك يكون الحل ألا يتشارك وزيران في نفس الصف، أو العمود أو القطر الواحد الحل المعتاد : backtrack algorithm وهي خوارزمية غبية تقوم بتجريب كل الحالات حتى الوصول للحل . الحل باستخدام التجريبية (heuristic) :بحيث نضيف شرط ان يدخل للحالات صاحبة اقل رقم للتجريبية حيث يمكن ونضع كل وزير على الرقعة بحيث يكون عدد المربعات التي يهددها أقل ما يمكن . تمثل رياضيا بان نعطي عقوبة بمقدار 1 على كل مربع يهدده الوزير وتصبح نضع الوزير في المكان الذي يحقق اقل عقوبة الناتجة عن التجريبية. مثال 2: 8-puzzel ترتيب الارقام في الرقة بالشكل الصحيح بحيث يسمح لك الانتقال في كل مرة تحريك رقم حتى الوصول للهدف اذا اعطت هذه المسالة الى الحاسوب لن يكون قادر على رؤية منهجية افضل للوصول للحل كما يراها الانسان الحقيقي فهو يقوم بتجريب جميع التحركات حتى يصل للحل ولمساعدته تم اقتراح مفهوم ال(heuristic) التي تعطيه توجيه للوصول للحل بشكل اسرع الحل التجريبي (heuristic) لهذه اللعبة : يوجد تجريبيتان , واحدة أفضل من الأخرى : عدد القطع التي لا تزال في غير مكانها مقارنة بالهدف. (ما عدا الفراغ). ولحساب التكلفة نضيف واحد عند كل حركة وذلك لحل مشكلة تساوي رقعتين اي تم الوصول للرقعتين بطريقتين مختلفتين واحدة بعدد انتقالات اقل او اكثر من الاخرى. في حالة البداية يمكن تحريك اما 7 او 6 لو 5 ونحسب تكلفة كل حالة حسب الاستراتيجية التي وضعناها وناخذ الاقل تكلفة نكرر العمليات حتى نصل الى الحالة الهدف ويوجد خوارزميات بجث شهيرة كخورازية البحث بالعرض (BFS) التي تقوم بتمثيل الحل على شكل شجرة وتنتقل من مستوى الى اخر حيث تقوم بتجريب جميع الحالات للوصول للحل المطلوب لذلك تعتبر من الخوارزميات الغبية ايضا حيث عدلت على هذه الخورمية واضيف لها (Heuristic) خاص بالمسالة ليصبح اسمها خوارمية (A*) لتقوم بالدخول بالطريق صاحب اقل تكلفة بدل تجربة كل الطرق.
  7. بشكل عام استخدام الخوارزميات والطرق والادوات الموجودة سابقا هي طريقة لتسريع عملية حل المشكلة لديك وتجعلك تركز بشكل اكبر على المشكلة التي تحاول حلها لكن في بعض الحالات قد تتطر الى تعديل على الطرق الموجودة لكي تتكيف مع مشكلتك ويعد ذلك نوع من التطوير وقد تقوم بخلق حلول غير موجودة مسبقا. والرياضيات تلعب دورًا مهما في تطوير الخوارزميات وفهمها. فهي توفر الأدوات الرياضية اللازمة لوصف وتحليل المشاكل وتطوير الخوارزميات المناسبة لحلها اي انها توجه العقل نحو طرق حل المشكلة. تتضمن الرياضيات المجالات: الجبر الخطي الاحتمالات والإحصاء التحليل العددي التفاضل والتكامل وغيرها من الفروع التي تساهم في فهم وتحليل الظواهر التي يتعامل معها الذكاء الاصطناعي. مثال عن فائدة الرياضيات في حل مشكلة التبوؤ: يوجد العديد من خوارزميات التعلم الالي قائمة على الاحصاء وقانين الاحتمال ومنها شجرة القرار (Decision tree ) حيث تعتمد بشل كبير على قوانين الاحتمال لايجاد حلها مثل الانتروبي(entropy) او ال(Gini) يتم استخدام هذين المقياسين عند بناء شجرة القرار لتحديد السمة الأفضل لتقسيم البيانات في كل عقدة. يتم اختيار السمة التي تقلل entropy أو الـ Gini بشكل أكبر بعد عملية التقسيم. حيث تعبر عن مدى الفوضى او العشوائية في اتخاذ القرار والمعادلات التالية تبين انها قوانين احتمالية رياضية حيث (P) تعبر عن احتمالية كل فئة .وتعد الرياضيات حجر اساس لفهم الخورميات والمثال الافضل لفهم مدى اهمية الرياضيات في الذكاء الاصطناعي هي ان الذكاء الاصطناعي يحاول دائما تقليل نسبة الخطأ في انجاز المهام كي يصبح يحاكي عمل وذكاءالبشر ويعتبر الرياضيات هي الادات التي تؤمن جميع الطرق لتقييم الخطأ رياضيا لانه اكثر الانواع دقة هي التقييم الرياضي .
  8. سأقوم بسرد بعض المعلومات المتعلقة بكل منهما ومن ثم ذكر الاختلافات ومن ثم توضيحها بمثال عملي بسيط: Pandas: حسب الموقع الرسمي لها هي عبارة عن حزمة من حزم Python توفر هياكل بيانات سريعة ومرنة ومعبرة (مثل DataFrame و Series) وهي مصممة لجعل العمل مع البيانات "العلائقية (Relational)" أو "المُصنّفة (Labeled)" أمراً سهلاً للغاية. ويهدف إلى أن يكون لبنة البناء الأساسية عالية المستوى لإجراء تحليل عملي لبيانات العالم الحقيقي في بايثون. بالإضافة إلى ذلك، فإن لها هدفاً أوسع يتمثل في أن تصبح أداة تحليل/معالجة البيانات مفتوحة المصدر الأقوى والأكثر مرونة المتاحة بأي لغة. وهي بالفعل في طريقها نحو تحقيق هذا الهدف. PandasAI: حسب الموقع الرسمي لها هي أيضاً حزمة من حزم Python تسهل طرح الأسئلة على بياناتك (CSV، XLSX، PostgreSQL، MySQL، BigQuery، Databrick، Snowflake، وما إلى ذلك) باللغة الطبيعية. xIt يساعدك على استكشاف بياناتك وتنظيفها وتحليلها باستخدام الذكاء الاصطناعي التوليدي. بالإضافة إلى الاستعلام، توفر PandasAI وظائف لاستعراض البيانات من خلال الرسوم البيانية، وتنظيف مجموعات البيانات من خلال معالجة القيم المفقودة، وتحسين جودة البيانات من خلال إنشاء الميزات، مما يجعلها أداة شاملة لعلماء ومحللي البيانات. لذا فأهم الاختلافات بينهما تتمثل في: طريقة التفاعل: Pandas: تتطلب كتابة التعليمات البرمجية لمعالجة البيانات وتحليلها. PandasAI: تسمح للمستخدمين بطرح الأسئلة على مجموعات البيانات الخاصة بهم باستخدام اللغة الطبيعية. استخدام تقنيات الذكاء الاصطناعي: Pandas: لا تحتوي على قدرات ذكاء اصطناعي مدمجة. PandasAI: تستفيد من الذكاء الاصطناعي التوليدي (مثل ChatGPT وغيرها) من النماذج لتحليل البيانات وتوليد رؤى منها. مثال على عملية حساب متوسط الأعمار بـPandas: مثال استخدام PandasAI لمعرفة ما هي أعلى 5 دول من حيث عدد السكان: الخلاصة: نجد أن كلاً منهماً مكتبة قوية ومتعددة الاستخدامات لتحليل البيانات وأن PandasAI قدمت تبسيط وسهولة كبير للقيام بعمليات التحليل وإنشاء الرؤى وأتمتة للمهام المتكررة، ومع ذلك يعتمد الاختيار بينهما على مستوى خبرة الفريق البرمجية وقدرتهم على تحليل البيانات ومتطلبات المشروع ونطاقه الزمني.
  9. هنالك خطأ بسيط في ملف الcss لتنسيق الـoverlay حيث يجب إضافة to قبل الاتجاه كما يلي: header .overlay { background-image: linear-gradient(to top right, rgba(46,178,181,0.8), rgba(197,203,50, 0.8)); min-height: 100vh; } كما أنصح بتحديد الposition للoverlay لتحديد أين سيظهر في حال كنت تريد وضعه فوق الصورة مثلاً : header .overlay { position: absolute; top: 0; right: 0; bottom: 0; left: 0; background-image: linear-gradient(to top right, rgba(46,178,181,0.8), rgba(197,203,50, 0.8)); min-height: 100vh; } فتظهر بهذا الشكل اذا كان ذلك ما تريده:
  10. كتابة الكود جزء مهم من عملية البرمجة لكنها لا تقتصر فقط عليه، حيث تتطلب مهارة فكرية. ويجب أن يكون لديك لمسة إبداعية وتفكير ذكي يجعلك تستخدم كل ما تعلمته وتطبيق كل مفهوم في المكان المناسب. وكل عملية برمجة تمر بالمراحل التالية الأساسية (تحليل المشكلة، تصميم الحل، كتابة الكود، اختباره، وتصحيح الأخطاء) وإليك شرح مبسط عنها وبعض الأساليب المتبعة: فهم المشكلة المطلوب حلها والتخطيط لها: من المهم جداً التخطيط وفهم للمشكلة قبل البدء بكتابة كود البرمجة، وهنالك العديد من الأساليب المتبعة في ذلك منها: استخدام الورقة والقلم وتسجيل الملاحظات لفهم المشكلة جيداً وإيجاد حلول لها إنشاء الوثائق لتحليل المتطلبات (SRS) وحالات الاستخدام (Usecases) تصميم وبناء المخططات (UMLs) تقسّيم المشكلة إلى مشكلات أصغر: اعتمد مبدأ فرّق تسُد (Divide & Conquer) لتسهيل حل المشكلة وتزيع المهام في حال كنت تعمل مع فريق، وتجعل الكود أعلى جودة وأفضل أداءً وسهل الصيانة. حدد المدخلات والمخرجات للبرنامج وكل جزء من أجزاءه تحدد لغة البرمجة المناسبة لمشكلتك: لكل مشكلة لغة برمجة أنسب لحلها، وذلك يجب التفكير في الأسئلة التالية: هل تحتاج المشكلة إلى ذكاء صنعي (AI)؟ هل تحتاج إلى موقع ويب (Website)؟ وما هي خصائص الموقع؟ هل تحتاج إلى تطبيق جوال (Mobile Application)؟ هل تحتاج تطبيق حاسوب (Desktop Application)؟ هل تحتاج إلى محرك ألعاب (Game Engine)؟ التطبيق العملي وكتابة الكود: بعد الانتهاء من عملية فهم المشكلة والتحليل والتخطيط لها نبدأ بالتطبيق العملي وكتابة الكود. من المهم الالتزام بقواعد كتابة الكود النظيف (Clean Code) لبناء تطبيقات سهلة التطوير والصيانة. اختبر الاكواد: بعد كتابة الكود، اختبره بوسائل الاختبار اليدوي والبرمجي. توفّر كل لغات البرمجة أدوات لاختبار الوحدات والأنظمة والتكامل بين وحدات النظام. وتشمل عدة مستويات للاختبار: اختبار الوحدة (Unit Testing): يتم فيه اختبار أصغر جزء قابل للاختبار من النظام أو التطبيق بشكل مستقل للتحقق من أن المكون يعمل كما هو متوقع. اختبار التكامل (Integration Testing): يتحقق من تدفق البيانات والتفاعل بين وحدات البرنامج المختلفة للتأكد من أنها تعمل معًاً بشكل صحيح. اختبار النظام (System Testing): يتم تنفيذه على نظام كامل ومتكامل للتحقق من امتثال النظام للمتطلبات المحددة، ويشمل (اختبار التحميل، الأداء، الموثوقية، والأمان). اختبار القبول (Acceptance Testing): يتم إجراؤه لمعرفة ما إذا كانت متطلبات المواصفات أو العقد قد تم استيفاؤها وفقاً لتسليمها، وغالباً ما يتم بواسطة المستخدم النهائي أو العميل. الصيانة والتطوير: للوصول إلى نظام ناجح يجب أن تستمر صيانة الكود وتطويره بعد تسليم النسخة الأولى منه. إضافة المزيد من المميزات، وإصلاح أي خلل يظهر بعد تسليمه للحصول على منتج برمجي عالي الجودة والكفاءة. في الختام، يجب أن أذكرك أننا في عصر الذكاء الاصطناعي ونشهد تطوراً مذهلاً في التكنولوجيا، لذلك أوصيك بالتعلم المستمر وصقل هذه المهارات لكي تكون مبرمجاً ناجحاً ومميزاً وتستغل هذا التطور لصالحك لتتمكن من تعزيز مسيرتك المهنية.
  11. أخي الكريم، بكونك قد أسست أرضية مناسبة للبدء في لارافل، في البداية يجب أن تعرف أن لارافل تعتبر من أٌطر عمل الBackend والتي يلزمها بشكل أساسي: إتقان مهارة التخطيط للمشروع وتحديد متطلباته وتصميم قواعد بياناته بشكل صحيح. والآن سأدرج لك بعض الخطوات التي يمكنك اتباعها من خلال مصادر التعلم التي تفضلها سواء كانت مواقع الإنترنت أو الكتب أو الدورات التعليمية والتي ستوصلك لهدفك : ستحتاج أولاً إلى أساسيات HTML, CSS, JS تعلم كيفية تنزيل مشروع لارافل بأحدث إصدار أو بإصدار معين (ففي بعض الأحيان يلزمك تنزيل واستخدام نسخة معينة) التعرف لبنية المشروع وهيكلية الملفات وتنظيمها التعرف على مدير الحزم الـComposer والذي يساعدك على إدارة الحزم (packages) التي تقوم بالتعامل معها في مشروع لارافل. الانتقال لمفاهيم لارافل وهي : فهم معمارية MVC (Model-View-Controller): إن إطار عمل لارافل مبني بمعمارية MVC والتي تستخدم لتنظيم الكود. وإليك شرح مبسط عنها: النموذج (Model): والذي يتفاعل مباشرة مع قاعدة البيانات الخاصة بك ويضيف أو يعدل عليها أو يسترد المعلومات منها. العرض (View): والذي يعني واجهة التطبيق فهو يعرض الصفحات التي يتفاعل معها المستخدم مباشرةً. المتحكم (Controller): وهو صلة الوصل بين العرض (View) والنموذج (Model) فهو يستقبل طلبات المستخدمين (Requests) ويعالجها ويقوم ببعض العمليات عن طريق النموذج ومن ثم يرسل بعض المعلومات إلى صفحات العرض. فهم Eloquent ORM: وهو نظام لارافيل للتعامل مع قواعد البيانات والذي يسهِّل عملية إنشاء الاستعلامات والتعامل مع قواعد البيانات عن طريق الModels. وأنصحك بالمقال التالي من أكاديمية حسوب: المبادئ الأساسيّة لإطار العمل Eloquent ORM الانتقال لفهم العلاقات وهي (One to One, One to Many, Many to Many) وكيفية تمثيلها في لارافل. فهم تهجير البيانات (Migrations) في لارافل: والتي تقابل كل منها جدولاً في قاعدة البيانات وتعرف حقوله وتحدد القيود (Constraints) على كل حقل. فهم الـتوجيه (Routing): التعرف لطرق التوجيه في لارافيل وكيفية ربطها بالControllers. التعرف لبعض الأوامر الأساسية في لارافل مثل (إنشاء Controller وإنشاء Model وإنشاء Migration وإنشاء Middleware وتشغيل مشروع لارافل) التعرف على محرك القوالب في لارافل (Blade Templating Engine): والذي يسمح لك بكتابة أكواد HTML ضمن ملفات PHP ويوفر لك العديد من المزايا التي تسهل عملية كتابة الكود. فهم البرمجيات الوسيطة (Middlewares): لإضافة طبقات من المنطق قبل أو بعد تنفيذ الطلبات في التطبيق. التعرف إلى نظم المصادقة (Authentication) في لارافيل الواجهات البرمجية APIs وكيفية بناءها في لارافل وفي الختام، يجب أن أشير لك لأحد مصادر تعلم لارافيل Laravel الغنية عن التعريف بشهادة معتمدة تعزز فرصتك في سوق العمل حيث ستجد في أكاديمية حسوب دورة تطوير تطبيقات الويب باستخدام لغة PHP، وأنصحك بقراءة هذا المقال المقدم من أكاديمية حسوب ما هو إطار عمل لارافيل Laravel وأهميته في سوق العمل، وما هي أهم المميزات التي يقدمها في مجال تطوير مواقع وتطبيقات الويب، والتعرف إلى كيفية تنصيب لارافيل وبدء التعامل معه وأهم مصادر تعلمه. وأتمنى لك كل التوفيق في رحلتك.
  12. انها مشكلة بالمكتبة بعد القوة الكبيرة تحولها الى صفر يمكن استخدام طريقة اخرى لايجاد الحل
  13. الفرق الاساسي ان range ترجع كائن من نوع range لا يمكنك ان تقوم بعمليات المصفوفات العديدة هي مناسبة بشكل كبير لحلقات التكرار في الصور التالية تبين الفرق بين الاثنين حيث np.arange ترجع array تستطيع التعامل معها مع جميع العمليات التي تقبلها المصفوفة وفي الصور الثانية تبين عدم قدرة range على اجراء عميلة sum بينما np.arange كانت قادرة على ذلك
  14. اذا اردت التخاطب مع قاعدة البيانات بواسطة ORM يجب عليك انشاء النموذج والا اذا كنت تستخدم استعلامات مباشرة على قاعدة البيانات لا داعي لكن الاصح انشاء النموذج كي تحافظ على الهيكلية التنظيمية للمشروع MVC
×
×
  • أضف...