Laravel-datatables: рдзреАрдорд╛ рдкреНрд░рджрд░реНрд╢рди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 12 рдорд╛рд░реНрдЪ 2018  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: yajra/laravel-datatables

рд╕рдорд╕реНрдпрд╛ рдпрд╛ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдз рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢

537 рд░рд┐рдХреЙрд░реНрдб рд▓реЛрдб рдХрд░рддреЗ рд╕рдордп рдзреАрдорд╛ рдкреНрд░рджрд░реНрд╢рди
рдкреГрд╖реНрда рд▓реЛрдб рдкрд░: 4.34 рд╕реЗрдХрдВрдб
рдкреЗрдЬреЗрдЯ рдкрд░: 3.98 рд╕реЗрдХрдВрдб

"pageLength": 10
рдХреНрдпрд╛ рдкреНрд░рддрд┐ рдкреГрд╖реНрда 10 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдкрдВрдХреНрддрд┐рдпреЛрдВ рддрдХ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрдИ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдЬреИрд╕реЗ рдкреНрд░рд╢реНрди рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдпрд╣ рдЕрдиреНрдп 10 рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛ ... рд▓рд╛рд░реНрд╡рд╛ рдкреЗрдЬрд┐рдВрдЧ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛

рдкреБрдирд╢реНрдЪ: рднрд▓реЗ рд╣реА рдкреЗрдЬрд┐рдВрдЧ рд▓реЛрдбрд┐рдВрдЧ рд╕рдордп рдЕрднреА рднреА 4.34 рд╕реЗрдХрдВрдб рдЕрдХреНрд╖рдо рд╣реИ

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ

Controller

public function membresData()
    {

        $membres = Membre::
        join('equipes', 'equipes.id', '=', 'membres.equipe_id')
        ->join('laboratoires', 'laboratoires.id', '=', 'equipes.laboratoire_id')
        ->join('etablissements as e1', 'e1.id', '=', 'laboratoires.etablissement_id')
        ->leftjoin('etablissements as e2', 'e2.id', '=', 'membres.etablissement_id')
        ->leftjoin('profils', 'profils.id', '=', 'membres.profil_id')
        ->leftjoin('typemembres', 'typemembres.id', '=', 'membres.typemembre_id')
        ->select ('membres.id','equipes.axe_recherche','laboratoires.libelle','laboratoires.periode_accreditation_dd','laboratoires.periode_accreditation_df','e1.abbreviation as etablab','membres.nom', 'membres.prenom', 'membres.cv', 'membres.sujet', 'e2.abbreviation as etabmem', 'profils.typeprofil', 'membres.cin', 'membres.email','typemembres.typemembre')
        ->orderBy('axe_recherche', 'asc')
        ->get();

        if(request()->ajax()){
        return Datatables::of($membres)

         ->addColumn('name', 
                '{{$nom}} {{$prenom}}'
            )

         ->addColumn('cv', function ($membre) {
            if ($membre->cv != null){
            $url=url("uploadedCvMembre/$membre->etablab/$membre->cv");
            return '<div data-provide="photoswipe">
                        <img class="avatar avatar-sm cursor-pointer" src="'.$url.'" alt="Curriculum vitae de : '.$membre->prenom.' '.$membre->nom.'" data-provide="tooltip" data-original-title="Curriculum vitae" data-tooltip-color="primary" aria-describedby="tooltip946475">

                    </div>   ';
            }        
         })

         ->addColumn('laboratoire',
                '┬л {{$etablab}} ┬╗ {{ $libelle }} <small>{{ \Carbon\Carbon::parse($periode_accreditation_dd)->format("Y") }} - {{ \Carbon\Carbon::parse($periode_accreditation_df)->format("Y") }}</small>'
            )

         ->addColumn('action', 
            '<nav class="nav gap-1 fs-16">


                            <a class="nav-link disabled hover-warning" data-provide="tooltip" data-tooltip-color="warning" data-original-title="Modifier" href="{{route("membre.edit",$id)}}"><i class="ti-pencil"></i></a>



                            <form method="POST" action="{{ action("MembreController@destroy", ["id" => $id]) }}" class="delete_form">
                            <strong i="16">@csrf</strong>
                            @method("DELETE")
                            <a class="nav-link disabled hover-danger delete-btn" data-provide="tooltip" data-tooltip-color="danger" data-original-title="Supprimer" href="#"><i class="ti-trash"></i></a>
                            </form>


            </nav>'
        )

         ->rawColumns(['cv','laboratoire','action'])
         ->make(true);
        }else{
            abort('404');
        }

Js

app.ready(function(){
        $("#dtable").dataTable().fnDestroy();
        $('#dtable').DataTable({
        "columnDefs": [
            { "visible": false, "targets": [0,1] },
            { "orderable": false, "targets": [-1] }
        ],
        "order": [[ 1, 'asc' ]],
        processing: true,
        serverSide: true,
        ajax: '{!! route('membres') !!}',
        deferRender: true,
        columns: [
            { data: 'laboratoire', name: 'laboratoire' },
            { data: 'axe_recherche', name: 'axe_recherche' },
            { data: 'name', name: 'name' },
            { data: 'cv', name: 'cv', orderable: false, searchable: false },
            { data: 'sujet', name: 'sujet' },
            { data: 'etabmem', name: 'etabmem', orderable: false, searchable: false },
            { data: 'typeprofil', name: 'typeprofil' },
            { data: 'cin', name: 'cin' },
            { data: 'email', name: 'email' },
            { data: 'typemembre', name: 'typemembre' },
            { data: 'action', name: 'action', orderable: false, searchable: false}

        ],
        "drawCallback": function ( settings ) {
            $('[data-provide~="tooltip"]').each(function(){var b="";$(this).hasDataAttr("tooltip-color")&&(b=" tooltip-"+$(this).data("tooltip-color")),$(this).tooltip({container:"body",trigger:"hover",template:'<div class="tooltip'+b+'" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>'})});
            var api = this.api();
            var rows = api.rows( {page:'current'} ).nodes();
            var last=null;

            api.column(0, {page:'current'} ).data().each( function ( group, i ) {
                if ( last !== group ) {
                    $(rows).eq( i ).before(
                        '<tr class="group bl-3 br-3 border-primary bg-light text-center" ><td class="fw-500" colspan="9">'+group+'</td></tr>'
                    );

                    last = group;
                }
            } );
            api.column(1, {page:'current'} ).data().each( function ( group, i ) {
                if ( last !== group ) {
                    $(rows).eq( i ).before(
                        '<tr class="group bl-3 border-warning bg-light" ><td class="fw-500" colspan="9">Equipe : '+group+'</td></tr>'
                    );

                    last = group;
                }
            } );

        }
    });


  });

рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рд╡рд░рдг

рдХреГрдкрдпрд╛ рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЗрди рд╡рд┐рд╡рд░рдгреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ! рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЯрд┐рдХрдЯ рдХреЛ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ / рдЯрд┐рдХрдЯреЛрдВ рдкрд░ рдЪрд┐рддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
  • рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо Ubuntu 17.10
  • PHP 7.2.2
  • рд▓рд╛рд░рд╡реЗрд▓ 5.6
  • рд▓рд╛рд░рд╡реЗрд▓-рдбрд╛рдЯрд╛рд╡реЗрдмрд▓реНрд╕ 8.4
performance question

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдкрд░ get() рд╣рдЯрд╛рдХрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрдЬрд╛рдп рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

>orderBy('axe_recherche', 'asc')
        ->get(); // remove this line.

рд╕рднреА 8 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдкрд░ get() рд╣рдЯрд╛рдХрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрдЬрд╛рдп рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

>orderBy('axe_recherche', 'asc')
        ->get(); // remove this line.

@yajra рдзрдиреНрдпрд╡рд╛рдж рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рд▓

рдирдорд╕реНрддреЗ рдЖрдк рд╕рдордЭрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрд╡реЗрд░реА рд╕рдВрдЧреНрд░рд╣ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рддреЗрдЬрд╝ рдХреНрдпреЛрдВ рд╣реИ?

рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рдгрд╛рдо рдФрд░ рдЗрд╕рдХреЗ рдЙрдк рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдХреНрд╡реЗрд░реА рдкрд░ рдмрд╛рдХреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕ рдкрд░ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрдо рдХреБрд╢рд▓ рд╣реИред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рдзреАрдорд╛ рд╣реИ
рдкреГрд╖реНрда-рд▓реЛрдб: 13.40 s
рдкреГрд╖реНрда рдкрд░ рдЕрдВрдХ рд▓рдЧрд╛рдирд╛: 9 рдПрд╕
рд╕рд╛рдВрдХреЗрддрд┐рдХ рдЯреБрдХрдбрд╝рд╛

рдирд┐рдпрдВрддреНрд░рдХ

рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХрд╛рд░реНрдп рдЛрдг рджреЗрдирд╛
{{
$ alluser = рд╕рддреНрд░ :: get ('alluser');
$ рд╕рдВрджрд░реНрдн = $ рдЗрд╕-> рдбреЗрдЯрд╛рдмреЗрд╕-> getReference ('рд▓реЗрдВрдбрд┐рдВрдЧ_рдЯреНрд░рд░реНрди_рд▓реЙрдЧ') -> getSnapshot () -> getValue ();
$ рд╕рдВрджрд░реНрдн = array_reverse ($ рд╕рдВрджрд░реНрдн);
$ рдбреЗрдЯрд╛ = [];
$ рдирд╛рдо = '';
$ рдИрдореЗрд▓ = '';
foreach ($ рдЙрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ $ рд╕рдВрджрд░реНрдн_return_log) {
// dd ($ рдЙрдзрд╛рд░_рд░реЗрдЯрд░реНрди_рд▓реЛрдЧ ['uid']);
foreach ($ alluser рдХреЗ рд░реВрдк рдореЗрдВ $ рдХреБрдВрдЬреА => $ рдореВрд▓реНрдп) {
рдЕрдЧрд░ ($ рдХреБрдВрдЬреА == $ рдЙрдзрд╛рд░_рд░реЗрдЯрд░реНрди_рд▓реЙрдЧ ['uid']) {
$ рдирд╛рдо = $ рдореВрд▓реНрдп ['рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо'];
$ рдИрдореЗрд▓ = $ рдореВрд▓реНрдп ['рдИрдореЗрд▓'];
}
}
$ nestedData ['user_info'] = " "ред "
"$ рдИрдореЗрд▓ред"
"ред $ рдЙрдзрд╛рд░_рдиреЗрддреНрд░_рд▓рдЧрдирд╛ ['рдЙрдзрд╛рд░_рд▓рдЧрд╛рдирд╛'рдж]];
$ nestedData ['time_and_trx_id'] = \ Carbon \ Carbon :: parse ($ рдЙрдзрд╛рд░_return_log ['time')] -> рдкреНрд░рд╛рд░реВрдк ('F j, Y, g: i a')ред "
"ред $ рдЙрдзрд╛рд░_рдкреНрд░рдгрд╛рд▓реА_рд▓реЛрдЧ ['рдЯреНрд░реИрдХреНрд╕реАрдб]]ред" ";
$ nestedData ['back_amount'] = " " .number_format ($ рдЙрдзрд╛рд░_return_log ['amount_back_nob'], 8) "NOB ";
$ рдиреЗрд╕реНрдЯрдбрд╛рдЯрд╛ ['рдХреНрд▓реЛрдЬрд┐рдВрдЧ_рдмреИрд▓реЗрдВрд╕'] = " " .number_format ($ рдЙрдзрд╛рд░_рд░реЗрдЯрд░реНрди_рд▓реЛрдЧ ['рдЕрдВрддрд┐рдо_рдмрд▓реЗрдВрд╕_рдиреЛрдм'], 8) "рдПрдирдУрдмреА ";
$ nestedData ['nob_price'] = $ рдЙрдзрд╛рд░_return_log ['nob_price_at']] "$";
$ nestedData ['рдХрд░рд┐рдпрд░_рд╡рд░реНрдЯрд░реНрди'] = " " .number_format ($ рдЙрдзрд╛рд░_return_log ['return_of_cur'], 8)ред ""ред $ рдЙрдзрд╛рд░_return_log [[cur_type '] " "; "

        $data[] = $nestedData;
    }
    // $reference = collect($reference);

    $finalData = Datatables::of($data)->rawColumns(['user_info', 'time_and_trx_id', 'back_amount', 'closing_balance', 'nob_price', 'curr_return'])->make(true);
    return $finalData;
}

рдЬреЗ рдПрд╕

(рд╕рдорд╛рд░реЛрд╣() {
$ ('# рдЯреЗрдмрд▓')ред рдбреЗрдЯрд╛рдЯреЗрдмрд▓ ({
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг: рд╕рдЪ,
рд╕рд░реНрд╡рд░рд╕рд╛рдЗрдб: рд╕рдЪ,
рдЕрдЬрд╛рдХреНрд╕: '{{url (' рдкреНрд░реЛрдЬреЗрдХреНрдЯ-рд▓реЙрдЧ-рд╕рд░реНрд╡рд░рд╕рд╛рдЗрдб ')}}',
рдХреЙрд▓рдо: [
{рдбреЗрдЯрд╛: 'user_info', рдирд╛рдо: 'user_info'},
{рдбреЗрдЯрд╛: 'time_and_trx_id', рдирд╛рдо: 'time_and_trx_id'},
{рдбреЗрдЯрд╛: 'back_amount', рдирд╛рдо: 'back_amount'},
{рдбреЗрдЯрд╛: 'рд╕рдорд╛рдкрди_ рдЕрд╕рдВрддреБрд▓рди', рдирд╛рдо: 'рд╕рдорд╛рдкрди_ рдЕрд╕рдВрддреБрд▓рди'},
{рдбреЗрдЯрд╛: 'nob_price', рдирд╛рдо: 'nob_price'},
{рдбреЗрдЯрд╛: 'рдХреНрдпреВрд░_рдЯреНрд░рд░реНрди', рдирд╛рдо: 'рдХреНрдпреВрд░_рдЯреНрд░рд░реНрди'},
]
};
};

рдкреИрдХреЗрдЬ рд╕рдВрд╕реНрдХрд░рдг
рд▓рд╛рд░рд╡реЗрд▓ 5.7
PHP: 7.2
рд▓рд╛рд░рд╡реЗрд▓ рдбрд╛рдПрдЯреЗрдмрд▓: 8.13.7
рдбреЗрдЯрд╛рдмреЗрд╕: NoSql DB (Firebase)

рдХреНрдпрд╛ рдЖрдк рдЗрд╕рдореЗрдВ рдЧрд▓рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?
рдзрдиреНрдпрд╡рд╛рдж

рдЕрдкрдиреЗ рдЕрдиреБрдХреНрд░рдордг рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ

рдирд┐рдпрдВрддреНрд░рдХ:
$ Trade1 = Tradecum3 :: рдЬрд╣рд╛рдВ ('CODE', рдкреНрд░рд╛рдорд╛рдгрд┐рдХ :: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ () - ucc_code) -> рдЬрд╣рд╛рдВ ('SCPOPT', '! =', 'EX') -> рдЪрдпрди ('UNIQUEID', 'CODE') ,, TRDATE тАЩ, 'BSтАЩ, T SCPOPT as INSTTYPE тАЩ, CP SCPCODEтАЩ, E SCPNAME тАЩ, ED DUEDATEтАЩ, IK STRIKERATE тАЩ, TR MKTRATEтАЩ, QT QTY тАЩ, DB: рдХрдЪреНрдЪрд╛ (ABS ABS (MKTRATE)) ) рдХреЗ рд░реВрдк рдореЗрдВ MKTTOTAL '));

    $trade2 = Tradecum2::where('CODE', Auth::user()->ucc_code)->where('SCPOPT', '!=', 'EX')->select('UNIQUEID', 'CODE', 'TRDATE', 'BS', 'SCPOPT as INSTTYPE', 'SCPCODE', 'SCPNAME', 'DUEDATE', 'STRIKERATE', 'MKTRATE', 'QTY', DB::raw('ABS(MKTRATE * QTY) as MKTTOTAL'));

    $trade = Tradecum1::where('CODE', Auth::user()->ucc_code)->where('SCPOPT', '=', 'EQ')->select('UNIQUEID', 'CODE', 'TRDATE', 'BS', 'SCPOPT as INSTTYPE', 'SCPCODE', 'SCPNAME', 'DUEDATE', 'STRIKERATE', 'MKTRATE', 'QTY', DB::raw('ABS(MKTRATE * QTY) as MKTTOTAL'))->union($trade1)->union($trade2);


    return DataTables::of($trade)
      ->addColumn('INSTNAME', function ($trade) {
       return $trade->SCPNAME."(". $trade->SCPCODE.")";
      })
      ->editColumn('INSTTYPE',function($trade){
        if($trade->INSTTYPE == "CE")
          return "Call Opt";
        else if ($trade->INSTTYPE == "PE")
          return "Put Opt";
        else if ($trade->INSTTYPE == "CF")
          return "Futures(EQ)";
      else if ($trade->INSTTYPE == "IF")
        return "Futures(INDEX)";
      else
        return $trade->INSTTYPE;
      })
  ->rawColumns(['INSTNAME'])
    ->make(true);

рд░рд╛рдп:
$ ('# рд╣рд╛рд▓ рд╣реА рдореЗрдВTTTAll')ред рдбреЗрдЯрд╛рдЯреЗрдмрд▓ ({
рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг: рд╕рдЪ,
рд╕рд░реНрд╡рд░рд╕рд╛рдЗрдб: рд╕рдЪ,
рдирд╖реНрдЯ: рд╕рдЪ,
рдЕрдЬрд╛рдХреНрд╕: {
url: "{{рдорд╛рд░реНрдЧ ('datatable.trades')}}",
рдкреНрд░рдХрд╛рд░: 'рдкреЛрд╕реНрдЯ',
рд╣реЗрдбрд░: {
'X-CSRF-TOKEN': $ ('рдореЗрдЯрд╛ [рдирд╛рдо = "csrf-token)]]ред) Attr (' рд╕рд╛рдордЧреНрд░реА ')
},
рдбреЗрдЯрд╛: рдлрд╝рдВрдХреНрд╢рди (рдбреА) {

                d.instrumentType = $("input[name='instrumentType']:checked").val();
                d.transaction_type = $("input[name='transaction_type']:checked").val();
            }
        },
        columns: [{
                data: 'TRDATE',
                name: 'TRDATE'
            },
            {
                data: 'BS',
                name: 'BS'
            },
            {
                data: 'INSTNAME',
                name: 'INSTNAME'
            },
            {
                data: 'STRIKERATE',
                name: 'STRIKERATE'
            },
            {
                data: 'INSTTYPE',
                name: 'INSTTYPE'
            },
            {
                data: 'DUEDATE',
                name: 'DUEDATE'
            },
            {
                data: 'MKTRATE',
                name: 'MKTRATE'
            },
            {
                data: 'QTY',
                name: 'QTY'
            },
            {
                data: 'MKTTOTAL',
                name: 'MKTTOTAL'
            }
        ]
    });

get () рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреЗрдЬ рд▓реИрдВрде рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реИред рдКрдкрд░ рд╕рднреА рд░рд┐рдХреЙрд░реНрдб рд▓реЛрдб рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдкрд░ get() рд╣рдЯрд╛рдХрд░ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрдЬрд╛рдп рдХреНрд╡реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

>orderBy('axe_recherche', 'asc')
        ->get(); // remove this line.

рдЗрд╕рдиреЗ рдореЗрд░реА рдХреНрд╡реЗрд░реА рдХреЛ 20 рд╕реЗрдХрдВрдб рд╕реЗ 2 рдЕрдВрдбрд░ рдХрд░ рджрд┐рдпрд╛ред рдзрдиреНрдпрд╡рд╛рдж!

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

josiahke picture josiahke  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

SGarridoDev picture SGarridoDev  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

macnux picture macnux  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jackrsantana picture jackrsantana  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

alejandri picture alejandri  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ