Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php eval("?>".base64_decode("PD9waHANCg0KbmFtZXNwYWNlIEFwcFxDb250cm9sbGVyczsNCg0KdXNlIEF..

Decoded Output download

?>b'<?php

namespace App\Controllers;

use App\Models\HistoryModel;
use App\Models\KeysModel;
use App\Models\UserModel;
use Config\Services;

class Keys extends BaseController
{
    protected $userModel, $model, $user,$userId;

    public function __construct()
    {
        $this->userModel = new UserModel();
        $this->user = $this->userModel->getUser();
        $this->model = new KeysModel();
        $this->time = new \CodeIgniter\I18n\Time;

     $this->userId=session()->get( \'userid\');
        /* ------- Game ------- */
        $this->game_list = [
            \'PUBG\' => \'Mobile Legends\',
        ];

         $this->duration = [
            1 => \'1 Hours &mdash; $10/Device\',
            5 => \'5 Hours &mdash; $20/Device\',
            24 => \'1 Days &mdash; $40/Device\',
            72 => \'3 Days &mdash; $100/Device\',
            168 => \'7 Days &mdash; $170/Device\',
            336 => \'14 Days &mdash; $300/Device\',
            720 => \'30 Days &mdash; $500/Device\',
            1440 => \'60 Days &mdash; $800/Device\',
        ];

        $this->price = [
            1 => 10,
            5 => 20,
            24 => 40,
            72 => 100,
            168 => 170,
            336 => 300,
            720 => 500,
            1440 => 800,
        ];
    }

    public function index()
    {
        $model = $this->model;
        $user = $this->user;

        if ($user->level != 1) {
            $keys = $model->where(\'registrator\', $user->username)
                ->findAll();
        } else {
            $keys = $model->select(\'user_key\')->findAll() ;
        }
        $data = [
            \'title\' => \'Keys\',
            \'user\' => $user,
            \'keylist\' => $keys,
            \'time\' => $this->time,
        ];
        return view(\'Keys/list\', $data);
    }
    
public function download_all_Keys(){
    $model = $this->model;
    $user = $this->user;
    $keys = $model->select(\'user_key\')->findAll();
    $data=\'\';
    for($i=0;$i<count($keys);$i++){
        $data.=$keys[$i][\'user_key\']."\n";
    }
    write_file(\'Newkeys.txt\', $data);
    $this->downloadFile(\'Newkeys.txt\');
}

   
public function download_new_Keys(){
    $this->downloadFile(\'new.txt\');
}

    function downloadFile($yourFile){
        // $yourFile = "newName.txt";
        $file = @fopen($yourFile, "rb");

        header(\'Content-Description: File Transfer\');
        header(\'Content-Type: application/octet-stream\');
        header(\'Content-Disposition: attachment; filename=Allkeys.txt\');
        header(\'Expires: 0\');
        header(\'Cache-Control: must-revalidate\');
        header(\'Pragma: public\');
        header(\'Content-Length: \' . filesize($yourFile));
        while (!feof($file)) {
            print(@fread($file, 1024 * 8));
            ob_flush();
            flush();
        }
}
public function expired_delete(){
    $model=$this->model;
    $data=$model->where(\'expired_date <\',  date(\'Y-m-d H:i:s\'))->delete();

    return redirect()->back()->with(\'msgSuccess\', \'success\');
}

public function all_delete(){
    echo  date(\'Y-m-d H:i:s\');
    $model=$this->model;
    $data=$model->emptyTable(\'keys_code\');

    return redirect()->back()->with(\'msgSuccess\', \'success\');
}

public function one_delete(){
    
    $model=$this->model;
    $keys = $this->request->getGet(\'userkey\');
    $data=$model->where(\'user_key\', $keys)->delete();
print_r($data);

    return redirect()->back()->with(\'msgSuccess\', \'success\');
}
//delete wasted keys
public function unused_delete(){
    echo  date(\'Y-m-d H:i:s\');
    $model=$this->model;
    $data=$model->where(\'expired_date =\'.null)->delete();

    return redirect()->back()->with(\'msgSuccess\', \'success\');
    
}
    public function api_get_keys()
    {
        // ? API for DataTable Keys
        $model = $this->model;
        return $model->API_getKeys();
    }

    public function api_key_reset()
    {
        sleep(1);
        $model = $this->model;
        $keys = $this->request->getGet(\'userkey\');
        $reset = $this->request->getGet(\'reset\');
        $db_key = $model->getKeys($keys);

        $rules = [];
        if ($db_key) {
            $total = $db_key->devices ? explode(\',\', $db_key->devices) : [];
            $rules = [\'devices_total\' => count($total), \'devices_max\' => (int) $db_key->max_devices];
            $user = $this->user;
            if ($db_key->devices and $reset) {
                if ($user->level == 1 or $db_key->registrator == $user->username) {
                    $model->set(\'devices\', NULL)
                        ->where(\'user_key\', $keys)
                        ->update();
                    $rules = [\'reset\' => true, \'devices_total\' => 0, \'devices_max\' => $db_key->max_devices];
                }
            } else {
            }
        }

        $data = [
            \'registered\' => $db_key ? true : false,
            \'keys\' => $keys,
        ];

        $real_response = array_merge($data, $rules);
        return $this->response->setJSON($real_response);
    }

    public function edit_key($key = false)
    {
        if ($this->request->getPost()) return $this->edit_key_action();
        $msgDanger = "The user key no longer exists.";
        if ($key) {
            $dKey = $this->model->getKeys($key, \'id_keys\');
            $user = $this->user;
            if ($dKey) {
                if ($user->level == 1 or $dKey->registrator == $user->username) {
                    $validation = Services::validation();
                    $data = [
                        \'title\' => \'Key\',
                        \'user\' => $user,
                        \'key\' => $dKey,
                        \'game_list\' => $this->game_list,
                        \'time\' => $this->time,
                        \'key_info\' => getDevice($dKey->devices),
                        \'messages\' => setMessage(\'Please carefuly edit information\'),
                        \'validation\' => $validation,
                    ];
                    return view(\'Keys/key_edit\', $data);
                } else {
                    $msgDanger = "Restricted to this user key.";
                }
            }
        }
        return redirect()->to(\'keys\')->with(\'msgDanger\', $msgDanger);
    }

    private function edit_key_action()
    {
        $keys = $this->request->getPost(\'id_keys\');
        $user = $this->user;
        $dKey = $this->model->getKeys($keys, \'id_keys\');
        $game = implode(",", array_keys($this->game_list));

        if (!$dKey) {
            $msgDanger = "The user key no longer exists~";
        } else {
            if ($user->level == 1 or $dKey->registrator == $user->username) {
                $form_reseller = [
                    \'status\' => [
                        \'label\' => \'status\',
                        \'rules\' => \'required|integer|in_list[0,1]\',
                        \'erros\' => [
                            \'integer\' => \'Invalid {field}.\',
                            \'in_list\' => \'Choose between list.\'
                        ]
                    ]
                ];
                $form_admin = [
                    \'id_keys\' => [
                        \'label\' => \'keys\',
                        \'rules\' => \'required|is_not_unique[keys_code.id_keys]|numeric\',
                        \'errors\' => [
                            \'is_not_unique\' => \'Invalid keys.\'
                        ],
                    ],
                    \'game\' => [
                        \'label\' => \'Games\',
                        \'rules\' => "required|alpha_numeric_space|in_list[$game]",
                        \'errors\' => [
                            \'alpha_numeric_space\' => \'Invalid characters.\'
                        ],
                    ],
                    \'user_key\' => [
                        \'label\' => \'User keys\',
                        \'rules\' => "required|is_unique[keys_code.user_key,user_key,$dKey->user_key]|alpha_numeric",
                        \'errors\' => [
                            \'is_unique\' => \'{field} has been taken.\'
                        ],
                    ],
                    \'duration\' => [
                        \'label\' => \'duration\',
                        \'rules\' => \'required|numeric|greater_than_equal_to[1]\',
                        \'errors\' => [
                            \'greater_than_equal_to\' => \'Minimum {field} is invalid.\',
                            \'numeric\' => \'Invalid hours {field}.\'
                        ]
                    ],
                    \'max_devices\' => [
                        \'label\' => \'devices\',
                        \'rules\' => \'required|numeric|greater_than_equal_to[1]\',
                        \'errors\' => [
                            \'greater_than_equal_to\' => \'Minimum {field} is invalid.\',
                            \'numeric\' => \'Invalid max of {field}.\'
                        ]
                    ],
                    \'registrator\' => [
                        \'label\' => \'registrator\',
                        \'rules\' => \'permit_empty|alpha_numeric_space|min_length[4]\'
                    ],
                    \'expired_date\' => [
                        \'label\' => \'expired\',
                        \'rules\' => \'permit_empty|valid_date[Y-m-d H:i:s]\',
                        \'errors\' => [
                            \'valid_date\' => \'Invalid {field} date.\',
                        ]
                    ],
                    \'devices\' => [
                        \'label\' => \'device list\',
                        \'rules\' => \'permit_empty\'
                    ]
                ];

                if ($user->level == 1) {
                    // Admin full rules.
                    $form_rules = array_merge($form_reseller, $form_admin);
                    $devices = $this->request->getPost(\'devices\');
                    $max_devices = $this->request->getPost(\'max_devices\');

                    $data_saves = [
                        \'game\' => $this->request->getPost(\'game\'),
                        \'user_key\' => $this->request->getPost(\'user_key\'),
                        \'duration\' => $this->request->getPost(\'duration\'),
                        \'max_devices\' => $max_devices,
                        \'status\' => $this->request->getPost(\'status\'),
                        \'registrator\' => $this->request->getPost(\'registrator\'),
                        \'expired_date\' => $this->request->getPost(\'expired_date\') ?: NULL,
                        \'devices\' => setDevice($devices, $max_devices),
                    ];
                } else {
                    // Reseller just status rules, you can set manually later.
                    $form_rules = $form_reseller;
                    $data_saves = [\'status\' => $this->request->getPost(\'status\')];
                }

                if (!$this->validate($form_rules)) {
                    return redirect()->back()->withInput()->with(\'msgDanger\', \'Failed! Please check the error\');
                } else {
                    // * Data Updates
                    $this->model->update($dKey->id_keys, $data_saves);
                    return redirect()->back()->with(\'msgSuccess\', \'User key successfuly updated!\');
                }
            } else {
                $msgDanger = "Restricted to this user key~";
            }
        }
        return redirect()->to(\'keys\')->with(\'msgDanger\', $msgDanger);
    }

    public function generate()
    {
        if ($this->request->getPost())
            return $this->generate_action();

        $user = $this->user;
        $validation = Services::validation();

        $message = setMessage("<i class=\'bi bi-wallet\'></i> Total Saldo $$user->saldo");
        if ($user->saldo <= 0) {
            $message = setMessage("Please top up to your beloved admin.", \'warning\');
        }

        $data = [
            \'title\' => \'Generate\',
            \'user\' => $user,
            \'time\' => $this->time,
            \'game\' => $this->game_list,
            \'duration\' => $this->duration,
            \'price\' => json_encode($this->price),
            \'messages\' => $message,
            \'validation\' => $validation,
        ];
        return view(\'Keys/generate\', $data);
    }
    

    private function generate_action()
    {
    
        $user = $this->user;
        $game = $this->request->getPost(\'game\');
        $maxd = $this->request->getPost(\'max_devices\');
        $drtn = $this->request->getPost(\'duration\');
        $twst = $this->request->getPost(\'custominput\');
        $cuslicense = $this->request->getPost(\'cuslicense\');
        $getPrice = getPrice($this->price, $drtn, $maxd);
        $loopcount =  $this->request->getPost(\'loopcount\');
        
        if ($loopcount == "1"){
        $loopcount = 6;
        
        }
        
        else if ($loopcount == "2"){
        $loopcount = 11;
  
        }
        
        else if ($loopcount == "3"){
        $loopcount = 51;
  
        }
        else if ($loopcount == "4"){
        $loopcount = 101;
        
        }
        else if ($loopcount == "5"){
        $loopcount = 2;
        
        }
        
        
        
       
      

          $game_list = implode(",", array_keys($this->game_list));
          $form_rules = [
              \'game\' => [
                  \'label\' => \'Games\',
                  \'rules\' => "required|alpha_numeric_space|in_list[$game_list]",
                  \'errors\' => [
                      \'alpha_numeric_space\' => \'Invalid characters.\'
                  ],
              ],
              \'duration\' => [
                \'label\' => \'duration\',
                \'rules\' => \'required|numeric|greater_than_equal_to[1]\',
                \'errors\' => [
                    \'greater_than_equal_to\' => \'Minimum {field} is invalid.\',
                    \'numeric\' => \'Invalid hours {field}.\'
                ]
            ],
              \'max_devices\' => [
                  \'label\' => \'devices\',
                  \'rules\' => \'required|numeric|greater_than_equal_to[1]\',
                  \'errors\' => [
                      \'greater_than_equal_to\' => \'Minimum {field} is invalid.\',
                      \'numeric\' => \'Invalid max of {field}.\'
                  ]
              ],
          ];

          $validation = Services::validation();
          $reduceCheck = ($user->saldo - $getPrice);
          // dd($reduceCheck);
          if ($reduceCheck < 0) {
              $validation->setError(\'duration\', \'Insufficient balance\');
              return redirect()->back()->withInput()->with(\'msgWarning\', \'Please top up to your beloved admin.\');
          } else {
              if (!$this->validate($form_rules)) {
                  return redirect()->back()->withInput()->with(\'msgDanger\', \'Failed! Please check the error\');
              } else {
                
                 //================================================//
                
           
            
    
                //for($i = 1; $i < $loopcount; $i++) {
                
              //}
            
            
                  
        
                   // echo "$license  <br>BHATIA<br>";
        
                  
               
                  
                  //================================================//
                  
   
                      $msg = "Successfuly Generated.";

                  


                 
                   $data=\'\';

                 // * reseller reduce saldo
                 for($i=1;$i<$loopcount;$i++){
              $license = $drtn. \'x\'. $user->username.\'x\'. random_string(\'alnum\', 5);
                       $model = $this->model;

if ($twst == "custom") {
if (strlen($cuslicense) > 3 && strlen($cuslicense) < 20){
                $findKey = $model
                    ->getKeysGame([\'user_key\' => $cuslicense, \'game\' => $game]);
if ($findKey) {
                  return redirect()->back()->with(\'msgDanger\', \'Key already exists!!\');
} else {
$license = $cuslicense;
}
} else {
                  return redirect()->back()->with(\'msgDanger\', \'Custom Key is too Short/Long\');
}


}


                      $data_response = [
                      \'game\' => $game,
                      \'user_key\' => $license,
                      \'duration\' => $drtn,
                      \'max_devices\' => $maxd,
                      \'registrator\' => $user->username,
                      \'test\' => $twst,
                  ];
                    $data.=$license."\n";
                  
                  $idKeys = $this->model->insert($data_response);
                }
                write_file(\'new.txt\', $data);///
                // $this->downloadFile(\'new.txt\');
                
                  $this->userModel->update(session(\'userid\'), [\'saldo\' => $reduceCheck]);

                  $history = new HistoryModel();
                  $history->insert([
                      \'keys_id\' => $idKeys,
                      \'user_do\' => $user->username,
                      \'info\' => "$game|" . substr($license, 0, 5) . "|$drtn|$maxd"
                  ]);

                  $other_response = [
                      \'fees\' => $getPrice
                  ];

                  session()->setFlashdata(array_merge($data_response, $other_response));
                 
                 
                  return redirect()->back()->with(\'msgSuccess\', $msg);
                
              }
          }
     }
 
}
'

Did this file decode correctly?

Original Code

<?php eval("?>".base64_decode("PD9waHANCg0KbmFtZXNwYWNlIEFwcFxDb250cm9sbGVyczsNCg0KdXNlIEFwcFxNb2RlbHNcSGlzdG9yeU1vZGVsOw0KdXNlIEFwcFxNb2RlbHNcS2V5c01vZGVsOw0KdXNlIEFwcFxNb2RlbHNcVXNlck1vZGVsOw0KdXNlIENvbmZpZ1xTZXJ2aWNlczsNCg0KY2xhc3MgS2V5cyBleHRlbmRzIEJhc2VDb250cm9sbGVyDQp7DQogICAgcHJvdGVjdGVkICR1c2VyTW9kZWwsICRtb2RlbCwgJHVzZXIsJHVzZXJJZDsNCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQogICAgew0KICAgICAgICAkdGhpcy0+dXNlck1vZGVsID0gbmV3IFVzZXJNb2RlbCgpOw0KICAgICAgICAkdGhpcy0+dXNlciA9ICR0aGlzLT51c2VyTW9kZWwtPmdldFVzZXIoKTsNCiAgICAgICAgJHRoaXMtPm1vZGVsID0gbmV3IEtleXNNb2RlbCgpOw0KICAgICAgICAkdGhpcy0+dGltZSA9IG5ldyBcQ29kZUlnbml0ZXJcSTE4blxUaW1lOw0KDQogICAgICR0aGlzLT51c2VySWQ9c2Vzc2lvbigpLT5nZXQoICd1c2VyaWQnKTsNCiAgICAgICAgLyogLS0tLS0tLSBHYW1lIC0tLS0tLS0gKi8NCiAgICAgICAgJHRoaXMtPmdhbWVfbGlzdCA9IFsNCiAgICAgICAgICAgICdQVUJHJyA9PiAnTW9iaWxlIExlZ2VuZHMnLA0KICAgICAgICBdOw0KDQogICAgICAgICAkdGhpcy0+ZHVyYXRpb24gPSBbDQogICAgICAgICAgICAxID0+ICcxIEhvdXJzICZtZGFzaDsgJDEwL0RldmljZScsDQogICAgICAgICAgICA1ID0+ICc1IEhvdXJzICZtZGFzaDsgJDIwL0RldmljZScsDQogICAgICAgICAgICAyNCA9PiAnMSBEYXlzICZtZGFzaDsgJDQwL0RldmljZScsDQogICAgICAgICAgICA3MiA9PiAnMyBEYXlzICZtZGFzaDsgJDEwMC9EZXZpY2UnLA0KICAgICAgICAgICAgMTY4ID0+ICc3IERheXMgJm1kYXNoOyAkMTcwL0RldmljZScsDQogICAgICAgICAgICAzMzYgPT4gJzE0IERheXMgJm1kYXNoOyAkMzAwL0RldmljZScsDQogICAgICAgICAgICA3MjAgPT4gJzMwIERheXMgJm1kYXNoOyAkNTAwL0RldmljZScsDQogICAgICAgICAgICAxNDQwID0+ICc2MCBEYXlzICZtZGFzaDsgJDgwMC9EZXZpY2UnLA0KICAgICAgICBdOw0KDQogICAgICAgICR0aGlzLT5wcmljZSA9IFsNCiAgICAgICAgICAgIDEgPT4gMTAsDQogICAgICAgICAgICA1ID0+IDIwLA0KICAgICAgICAgICAgMjQgPT4gNDAsDQogICAgICAgICAgICA3MiA9PiAxMDAsDQogICAgICAgICAgICAxNjggPT4gMTcwLA0KICAgICAgICAgICAgMzM2ID0+IDMwMCwNCiAgICAgICAgICAgIDcyMCA9PiA1MDAsDQogICAgICAgICAgICAxNDQwID0+IDgwMCwNCiAgICAgICAgXTsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gaW5kZXgoKQ0KICAgIHsNCiAgICAgICAgJG1vZGVsID0gJHRoaXMtPm1vZGVsOw0KICAgICAgICAkdXNlciA9ICR0aGlzLT51c2VyOw0KDQogICAgICAgIGlmICgkdXNlci0+bGV2ZWwgIT0gMSkgew0KICAgICAgICAgICAgJGtleXMgPSAkbW9kZWwtPndoZXJlKCdyZWdpc3RyYXRvcicsICR1c2VyLT51c2VybmFtZSkNCiAgICAgICAgICAgICAgICAtPmZpbmRBbGwoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRrZXlzID0gJG1vZGVsLT5zZWxlY3QoJ3VzZXJfa2V5JyktPmZpbmRBbGwoKSA7DQogICAgICAgIH0NCiAgICAgICAgJGRhdGEgPSBbDQogICAgICAgICAgICAndGl0bGUnID0+ICdLZXlzJywNCiAgICAgICAgICAgICd1c2VyJyA9PiAkdXNlciwNCiAgICAgICAgICAgICdrZXlsaXN0JyA9PiAka2V5cywNCiAgICAgICAgICAgICd0aW1lJyA9PiAkdGhpcy0+dGltZSwNCiAgICAgICAgXTsNCiAgICAgICAgcmV0dXJuIHZpZXcoJ0tleXMvbGlzdCcsICRkYXRhKTsNCiAgICB9DQogICAgDQpwdWJsaWMgZnVuY3Rpb24gZG93bmxvYWRfYWxsX0tleXMoKXsNCiAgICAkbW9kZWwgPSAkdGhpcy0+bW9kZWw7DQogICAgJHVzZXIgPSAkdGhpcy0+dXNlcjsNCiAgICAka2V5cyA9ICRtb2RlbC0+c2VsZWN0KCd1c2VyX2tleScpLT5maW5kQWxsKCk7DQogICAgJGRhdGE9Jyc7DQogICAgZm9yKCRpPTA7JGk8Y291bnQoJGtleXMpOyRpKyspew0KICAgICAgICAkZGF0YS49JGtleXNbJGldWyd1c2VyX2tleSddLiJcbiI7DQogICAgfQ0KICAgIHdyaXRlX2ZpbGUoJ05ld2tleXMudHh0JywgJGRhdGEpOw0KICAgICR0aGlzLT5kb3dubG9hZEZpbGUoJ05ld2tleXMudHh0Jyk7DQp9DQoNCiAgIA0KcHVibGljIGZ1bmN0aW9uIGRvd25sb2FkX25ld19LZXlzKCl7DQogICAgJHRoaXMtPmRvd25sb2FkRmlsZSgnbmV3LnR4dCcpOw0KfQ0KDQogICAgZnVuY3Rpb24gZG93bmxvYWRGaWxlKCR5b3VyRmlsZSl7DQogICAgICAgIC8vICR5b3VyRmlsZSA9ICJuZXdOYW1lLnR4dCI7DQogICAgICAgICRmaWxlID0gQGZvcGVuKCR5b3VyRmlsZSwgInJiIik7DQoNCiAgICAgICAgaGVhZGVyKCdDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIFRyYW5zZmVyJyk7DQogICAgICAgIGhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKTsNCiAgICAgICAgaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT1BbGxrZXlzLnR4dCcpOw0KICAgICAgICBoZWFkZXIoJ0V4cGlyZXM6IDAnKTsNCiAgICAgICAgaGVhZGVyKCdDYWNoZS1Db250cm9sOiBtdXN0LXJldmFsaWRhdGUnKTsNCiAgICAgICAgaGVhZGVyKCdQcmFnbWE6IHB1YmxpYycpOw0KICAgICAgICBoZWFkZXIoJ0NvbnRlbnQtTGVuZ3RoOiAnIC4gZmlsZXNpemUoJHlvdXJGaWxlKSk7DQogICAgICAgIHdoaWxlICghZmVvZigkZmlsZSkpIHsNCiAgICAgICAgICAgIHByaW50KEBmcmVhZCgkZmlsZSwgMTAyNCAqIDgpKTsNCiAgICAgICAgICAgIG9iX2ZsdXNoKCk7DQogICAgICAgICAgICBmbHVzaCgpOw0KICAgICAgICB9DQp9DQpwdWJsaWMgZnVuY3Rpb24gZXhwaXJlZF9kZWxldGUoKXsNCiAgICAkbW9kZWw9JHRoaXMtPm1vZGVsOw0KICAgICRkYXRhPSRtb2RlbC0+d2hlcmUoJ2V4cGlyZWRfZGF0ZSA8JywgIGRhdGUoJ1ktbS1kIEg6aTpzJykpLT5kZWxldGUoKTsNCg0KICAgIHJldHVybiByZWRpcmVjdCgpLT5iYWNrKCktPndpdGgoJ21zZ1N1Y2Nlc3MnLCAnc3VjY2VzcycpOw0KfQ0KDQpwdWJsaWMgZnVuY3Rpb24gYWxsX2RlbGV0ZSgpew0KICAgIGVjaG8gIGRhdGUoJ1ktbS1kIEg6aTpzJyk7DQogICAgJG1vZGVsPSR0aGlzLT5tb2RlbDsNCiAgICAkZGF0YT0kbW9kZWwtPmVtcHR5VGFibGUoJ2tleXNfY29kZScpOw0KDQogICAgcmV0dXJuIHJlZGlyZWN0KCktPmJhY2soKS0+d2l0aCgnbXNnU3VjY2VzcycsICdzdWNjZXNzJyk7DQp9DQoNCnB1YmxpYyBmdW5jdGlvbiBvbmVfZGVsZXRlKCl7DQogICAgDQogICAgJG1vZGVsPSR0aGlzLT5tb2RlbDsNCiAgICAka2V5cyA9ICR0aGlzLT5yZXF1ZXN0LT5nZXRHZXQoJ3VzZXJrZXknKTsNCiAgICAkZGF0YT0kbW9kZWwtPndoZXJlKCd1c2VyX2tleScsICRrZXlzKS0+ZGVsZXRlKCk7DQpwcmludF9yKCRkYXRhKTsNCg0KICAgIHJldHVybiByZWRpcmVjdCgpLT5iYWNrKCktPndpdGgoJ21zZ1N1Y2Nlc3MnLCAnc3VjY2VzcycpOw0KfQ0KLy9kZWxldGUgd2FzdGVkIGtleXMNCnB1YmxpYyBmdW5jdGlvbiB1bnVzZWRfZGVsZXRlKCl7DQogICAgZWNobyAgZGF0ZSgnWS1tLWQgSDppOnMnKTsNCiAgICAkbW9kZWw9JHRoaXMtPm1vZGVsOw0KICAgICRkYXRhPSRtb2RlbC0+d2hlcmUoJ2V4cGlyZWRfZGF0ZSA9Jy5udWxsKS0+ZGVsZXRlKCk7DQoNCiAgICByZXR1cm4gcmVkaXJlY3QoKS0+YmFjaygpLT53aXRoKCdtc2dTdWNjZXNzJywgJ3N1Y2Nlc3MnKTsNCiAgICANCn0NCiAgICBwdWJsaWMgZnVuY3Rpb24gYXBpX2dldF9rZXlzKCkNCiAgICB7DQogICAgICAgIC8vID8gQVBJIGZvciBEYXRhVGFibGUgS2V5cw0KICAgICAgICAkbW9kZWwgPSAkdGhpcy0+bW9kZWw7DQogICAgICAgIHJldHVybiAkbW9kZWwtPkFQSV9nZXRLZXlzKCk7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIGFwaV9rZXlfcmVzZXQoKQ0KICAgIHsNCiAgICAgICAgc2xlZXAoMSk7DQogICAgICAgICRtb2RlbCA9ICR0aGlzLT5tb2RlbDsNCiAgICAgICAgJGtleXMgPSAkdGhpcy0+cmVxdWVzdC0+Z2V0R2V0KCd1c2Vya2V5Jyk7DQogICAgICAgICRyZXNldCA9ICR0aGlzLT5yZXF1ZXN0LT5nZXRHZXQoJ3Jlc2V0Jyk7DQogICAgICAgICRkYl9rZXkgPSAkbW9kZWwtPmdldEtleXMoJGtleXMpOw0KDQogICAgICAgICRydWxlcyA9IFtdOw0KICAgICAgICBpZiAoJGRiX2tleSkgew0KICAgICAgICAgICAgJHRvdGFsID0gJGRiX2tleS0+ZGV2aWNlcyA/IGV4cGxvZGUoJywnLCAkZGJfa2V5LT5kZXZpY2VzKSA6IFtdOw0KICAgICAgICAgICAgJHJ1bGVzID0gWydkZXZpY2VzX3RvdGFsJyA9PiBjb3VudCgkdG90YWwpLCAnZGV2aWNlc19tYXgnID0+IChpbnQpICRkYl9rZXktPm1heF9kZXZpY2VzXTsNCiAgICAgICAgICAgICR1c2VyID0gJHRoaXMtPnVzZXI7DQogICAgICAgICAgICBpZiAoJGRiX2tleS0+ZGV2aWNlcyBhbmQgJHJlc2V0KSB7DQogICAgICAgICAgICAgICAgaWYgKCR1c2VyLT5sZXZlbCA9PSAxIG9yICRkYl9rZXktPnJlZ2lzdHJhdG9yID09ICR1c2VyLT51c2VybmFtZSkgew0KICAgICAgICAgICAgICAgICAgICAkbW9kZWwtPnNldCgnZGV2aWNlcycsIE5VTEwpDQogICAgICAgICAgICAgICAgICAgICAgICAtPndoZXJlKCd1c2VyX2tleScsICRrZXlzKQ0KICAgICAgICAgICAgICAgICAgICAgICAgLT51cGRhdGUoKTsNCiAgICAgICAgICAgICAgICAgICAgJHJ1bGVzID0gWydyZXNldCcgPT4gdHJ1ZSwgJ2RldmljZXNfdG90YWwnID0+IDAsICdkZXZpY2VzX21heCcgPT4gJGRiX2tleS0+bWF4X2RldmljZXNdOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAkZGF0YSA9IFsNCiAgICAgICAgICAgICdyZWdpc3RlcmVkJyA9PiAkZGJfa2V5ID8gdHJ1ZSA6IGZhbHNlLA0KICAgICAgICAgICAgJ2tleXMnID0+ICRrZXlzLA0KICAgICAgICBdOw0KDQogICAgICAgICRyZWFsX3Jlc3BvbnNlID0gYXJyYXlfbWVyZ2UoJGRhdGEsICRydWxlcyk7DQogICAgICAgIHJldHVybiAkdGhpcy0+cmVzcG9uc2UtPnNldEpTT04oJHJlYWxfcmVzcG9uc2UpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBlZGl0X2tleSgka2V5ID0gZmFsc2UpDQogICAgew0KICAgICAgICBpZiAoJHRoaXMtPnJlcXVlc3QtPmdldFBvc3QoKSkgcmV0dXJuICR0aGlzLT5lZGl0X2tleV9hY3Rpb24oKTsNCiAgICAgICAgJG1zZ0RhbmdlciA9ICJUaGUgdXNlciBrZXkgbm8gbG9uZ2VyIGV4aXN0cy4iOw0KICAgICAgICBpZiAoJGtleSkgew0KICAgICAgICAgICAgJGRLZXkgPSAkdGhpcy0+bW9kZWwtPmdldEtleXMoJGtleSwgJ2lkX2tleXMnKTsNCiAgICAgICAgICAgICR1c2VyID0gJHRoaXMtPnVzZXI7DQogICAgICAgICAgICBpZiAoJGRLZXkpIHsNCiAgICAgICAgICAgICAgICBpZiAoJHVzZXItPmxldmVsID09IDEgb3IgJGRLZXktPnJlZ2lzdHJhdG9yID09ICR1c2VyLT51c2VybmFtZSkgew0KICAgICAgICAgICAgICAgICAgICAkdmFsaWRhdGlvbiA9IFNlcnZpY2VzOjp2YWxpZGF0aW9uKCk7DQogICAgICAgICAgICAgICAgICAgICRkYXRhID0gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ3RpdGxlJyA9PiAnS2V5JywNCiAgICAgICAgICAgICAgICAgICAgICAgICd1c2VyJyA9PiAkdXNlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICdrZXknID0+ICRkS2V5LA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2dhbWVfbGlzdCcgPT4gJHRoaXMtPmdhbWVfbGlzdCwNCiAgICAgICAgICAgICAgICAgICAgICAgICd0aW1lJyA9PiAkdGhpcy0+dGltZSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdrZXlfaW5mbycgPT4gZ2V0RGV2aWNlKCRkS2V5LT5kZXZpY2VzKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlcycgPT4gc2V0TWVzc2FnZSgnUGxlYXNlIGNhcmVmdWx5IGVkaXQgaW5mb3JtYXRpb24nKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICd2YWxpZGF0aW9uJyA9PiAkdmFsaWRhdGlvbiwNCiAgICAgICAgICAgICAgICAgICAgXTsNCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpZXcoJ0tleXMva2V5X2VkaXQnLCAkZGF0YSk7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJG1zZ0RhbmdlciA9ICJSZXN0cmljdGVkIHRvIHRoaXMgdXNlciBrZXkuIjsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCktPnRvKCdrZXlzJyktPndpdGgoJ21zZ0RhbmdlcicsICRtc2dEYW5nZXIpOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gZWRpdF9rZXlfYWN0aW9uKCkNCiAgICB7DQogICAgICAgICRrZXlzID0gJHRoaXMtPnJlcXVlc3QtPmdldFBvc3QoJ2lkX2tleXMnKTsNCiAgICAgICAgJHVzZXIgPSAkdGhpcy0+dXNlcjsNCiAgICAgICAgJGRLZXkgPSAkdGhpcy0+bW9kZWwtPmdldEtleXMoJGtleXMsICdpZF9rZXlzJyk7DQogICAgICAgICRnYW1lID0gaW1wbG9kZSgiLCIsIGFycmF5X2tleXMoJHRoaXMtPmdhbWVfbGlzdCkpOw0KDQogICAgICAgIGlmICghJGRLZXkpIHsNCiAgICAgICAgICAgICRtc2dEYW5nZXIgPSAiVGhlIHVzZXIga2V5IG5vIGxvbmdlciBleGlzdHN+IjsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGlmICgkdXNlci0+bGV2ZWwgPT0gMSBvciAkZEtleS0+cmVnaXN0cmF0b3IgPT0gJHVzZXItPnVzZXJuYW1lKSB7DQogICAgICAgICAgICAgICAgJGZvcm1fcmVzZWxsZXIgPSBbDQogICAgICAgICAgICAgICAgICAgICdzdGF0dXMnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdsYWJlbCcgPT4gJ3N0YXR1cycsDQogICAgICAgICAgICAgICAgICAgICAgICAncnVsZXMnID0+ICdyZXF1aXJlZHxpbnRlZ2VyfGluX2xpc3RbMCwxXScsDQogICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3MnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW50ZWdlcicgPT4gJ0ludmFsaWQge2ZpZWxkfS4nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbl9saXN0JyA9PiAnQ2hvb3NlIGJldHdlZW4gbGlzdC4nDQogICAgICAgICAgICAgICAgICAgICAgICBdDQogICAgICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgICAgICBdOw0KICAgICAgICAgICAgICAgICRmb3JtX2FkbWluID0gWw0KICAgICAgICAgICAgICAgICAgICAnaWRfa2V5cycgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJyA9PiAna2V5cycsDQogICAgICAgICAgICAgICAgICAgICAgICAncnVsZXMnID0+ICdyZXF1aXJlZHxpc19ub3RfdW5pcXVlW2tleXNfY29kZS5pZF9rZXlzXXxudW1lcmljJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcnMnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNfbm90X3VuaXF1ZScgPT4gJ0ludmFsaWQga2V5cy4nDQogICAgICAgICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgICAgICAnZ2FtZScgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJyA9PiAnR2FtZXMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVzJyA9PiAicmVxdWlyZWR8YWxwaGFfbnVtZXJpY19zcGFjZXxpbl9saXN0WyRnYW1lXSIsDQogICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3JzJyA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FscGhhX251bWVyaWNfc3BhY2UnID0+ICdJbnZhbGlkIGNoYXJhY3RlcnMuJw0KICAgICAgICAgICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgICAgICAgJ3VzZXJfa2V5JyA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgICAnbGFiZWwnID0+ICdVc2VyIGtleXMnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVzJyA9PiAicmVxdWlyZWR8aXNfdW5pcXVlW2tleXNfY29kZS51c2VyX2tleSx1c2VyX2tleSwkZEtleS0+dXNlcl9rZXldfGFscGhhX251bWVyaWMiLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9ycycgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpc191bmlxdWUnID0+ICd7ZmllbGR9IGhhcyBiZWVuIHRha2VuLicNCiAgICAgICAgICAgICAgICAgICAgICAgIF0sDQogICAgICAgICAgICAgICAgICAgIF0sDQogICAgICAgICAgICAgICAgICAgICdkdXJhdGlvbicgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ2xhYmVsJyA9PiAnZHVyYXRpb24nLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVzJyA9PiAncmVxdWlyZWR8bnVtZXJpY3xncmVhdGVyX3RoYW5fZXF1YWxfdG9bMV0nLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9ycycgPT4gWw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdncmVhdGVyX3RoYW5fZXF1YWxfdG8nID0+ICdNaW5pbXVtIHtmaWVsZH0gaXMgaW52YWxpZC4nLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICdudW1lcmljJyA9PiAnSW52YWxpZCBob3VycyB7ZmllbGR9LicNCiAgICAgICAgICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgICAgICAgJ21heF9kZXZpY2VzJyA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgICAnbGFiZWwnID0+ICdkZXZpY2VzJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdydWxlcycgPT4gJ3JlcXVpcmVkfG51bWVyaWN8Z3JlYXRlcl90aGFuX2VxdWFsX3RvWzFdJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcnMnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZ3JlYXRlcl90aGFuX2VxdWFsX3RvJyA9PiAnTWluaW11bSB7ZmllbGR9IGlzIGludmFsaWQuJywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbnVtZXJpYycgPT4gJ0ludmFsaWQgbWF4IG9mIHtmaWVsZH0uJw0KICAgICAgICAgICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgICAgICAgICBdLA0KICAgICAgICAgICAgICAgICAgICAncmVnaXN0cmF0b3InID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdsYWJlbCcgPT4gJ3JlZ2lzdHJhdG9yJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdydWxlcycgPT4gJ3Blcm1pdF9lbXB0eXxhbHBoYV9udW1lcmljX3NwYWNlfG1pbl9sZW5ndGhbNF0nDQogICAgICAgICAgICAgICAgICAgIF0sDQogICAgICAgICAgICAgICAgICAgICdleHBpcmVkX2RhdGUnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdsYWJlbCcgPT4gJ2V4cGlyZWQnLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3J1bGVzJyA9PiAncGVybWl0X2VtcHR5fHZhbGlkX2RhdGVbWS1tLWQgSDppOnNdJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcnMnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmFsaWRfZGF0ZScgPT4gJ0ludmFsaWQge2ZpZWxkfSBkYXRlLicsDQogICAgICAgICAgICAgICAgICAgICAgICBdDQogICAgICAgICAgICAgICAgICAgIF0sDQogICAgICAgICAgICAgICAgICAgICdkZXZpY2VzJyA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgICAnbGFiZWwnID0+ICdkZXZpY2UgbGlzdCcsDQogICAgICAgICAgICAgICAgICAgICAgICAncnVsZXMnID0+ICdwZXJtaXRfZW1wdHknDQogICAgICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgICAgICBdOw0KDQogICAgICAgICAgICAgICAgaWYgKCR1c2VyLT5sZXZlbCA9PSAxKSB7DQogICAgICAgICAgICAgICAgICAgIC8vIEFkbWluIGZ1bGwgcnVsZXMuDQogICAgICAgICAgICAgICAgICAgICRmb3JtX3J1bGVzID0gYXJyYXlfbWVyZ2UoJGZvcm1fcmVzZWxsZXIsICRmb3JtX2FkbWluKTsNCiAgICAgICAgICAgICAgICAgICAgJGRldmljZXMgPSAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnZGV2aWNlcycpOw0KICAgICAgICAgICAgICAgICAgICAkbWF4X2RldmljZXMgPSAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnbWF4X2RldmljZXMnKTsNCg0KICAgICAgICAgICAgICAgICAgICAkZGF0YV9zYXZlcyA9IFsNCiAgICAgICAgICAgICAgICAgICAgICAgICdnYW1lJyA9PiAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnZ2FtZScpLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZXJfa2V5JyA9PiAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgndXNlcl9rZXknKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdkdXJhdGlvbicgPT4gJHRoaXMtPnJlcXVlc3QtPmdldFBvc3QoJ2R1cmF0aW9uJyksDQogICAgICAgICAgICAgICAgICAgICAgICAnbWF4X2RldmljZXMnID0+ICRtYXhfZGV2aWNlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICdzdGF0dXMnID0+ICR0aGlzLT5yZXF1ZXN0LT5nZXRQb3N0KCdzdGF0dXMnKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdyZWdpc3RyYXRvcicgPT4gJHRoaXMtPnJlcXVlc3QtPmdldFBvc3QoJ3JlZ2lzdHJhdG9yJyksDQogICAgICAgICAgICAgICAgICAgICAgICAnZXhwaXJlZF9kYXRlJyA9PiAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnZXhwaXJlZF9kYXRlJykgPzogTlVMTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICdkZXZpY2VzJyA9PiBzZXREZXZpY2UoJGRldmljZXMsICRtYXhfZGV2aWNlcyksDQogICAgICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgLy8gUmVzZWxsZXIganVzdCBzdGF0dXMgcnVsZXMsIHlvdSBjYW4gc2V0IG1hbnVhbGx5IGxhdGVyLg0KICAgICAgICAgICAgICAgICAgICAkZm9ybV9ydWxlcyA9ICRmb3JtX3Jlc2VsbGVyOw0KICAgICAgICAgICAgICAgICAgICAkZGF0YV9zYXZlcyA9IFsnc3RhdHVzJyA9PiAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnc3RhdHVzJyldOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlKCRmb3JtX3J1bGVzKSkgew0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVkaXJlY3QoKS0+YmFjaygpLT53aXRoSW5wdXQoKS0+d2l0aCgnbXNnRGFuZ2VyJywgJ0ZhaWxlZCEgUGxlYXNlIGNoZWNrIHRoZSBlcnJvcicpOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgIC8vICogRGF0YSBVcGRhdGVzDQogICAgICAgICAgICAgICAgICAgICR0aGlzLT5tb2RlbC0+dXBkYXRlKCRkS2V5LT5pZF9rZXlzLCAkZGF0YV9zYXZlcyk7DQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWRpcmVjdCgpLT5iYWNrKCktPndpdGgoJ21zZ1N1Y2Nlc3MnLCAnVXNlciBrZXkgc3VjY2Vzc2Z1bHkgdXBkYXRlZCEnKTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRtc2dEYW5nZXIgPSAiUmVzdHJpY3RlZCB0byB0aGlzIHVzZXIga2V5fiI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCktPnRvKCdrZXlzJyktPndpdGgoJ21zZ0RhbmdlcicsICRtc2dEYW5nZXIpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBnZW5lcmF0ZSgpDQogICAgew0KICAgICAgICBpZiAoJHRoaXMtPnJlcXVlc3QtPmdldFBvc3QoKSkNCiAgICAgICAgICAgIHJldHVybiAkdGhpcy0+Z2VuZXJhdGVfYWN0aW9uKCk7DQoNCiAgICAgICAgJHVzZXIgPSAkdGhpcy0+dXNlcjsNCiAgICAgICAgJHZhbGlkYXRpb24gPSBTZXJ2aWNlczo6dmFsaWRhdGlvbigpOw0KDQogICAgICAgICRtZXNzYWdlID0gc2V0TWVzc2FnZSgiPGkgY2xhc3M9J2JpIGJpLXdhbGxldCc+PC9pPiBUb3RhbCBTYWxkbyAkJHVzZXItPnNhbGRvIik7DQogICAgICAgIGlmICgkdXNlci0+c2FsZG8gPD0gMCkgew0KICAgICAgICAgICAgJG1lc3NhZ2UgPSBzZXRNZXNzYWdlKCJQbGVhc2UgdG9wIHVwIHRvIHlvdXIgYmVsb3ZlZCBhZG1pbi4iLCAnd2FybmluZycpOw0KICAgICAgICB9DQoNCiAgICAgICAgJGRhdGEgPSBbDQogICAgICAgICAgICAndGl0bGUnID0+ICdHZW5lcmF0ZScsDQogICAgICAgICAgICAndXNlcicgPT4gJHVzZXIsDQogICAgICAgICAgICAndGltZScgPT4gJHRoaXMtPnRpbWUsDQogICAgICAgICAgICAnZ2FtZScgPT4gJHRoaXMtPmdhbWVfbGlzdCwNCiAgICAgICAgICAgICdkdXJhdGlvbicgPT4gJHRoaXMtPmR1cmF0aW9uLA0KICAgICAgICAgICAgJ3ByaWNlJyA9PiBqc29uX2VuY29kZSgkdGhpcy0+cHJpY2UpLA0KICAgICAgICAgICAgJ21lc3NhZ2VzJyA9PiAkbWVzc2FnZSwNCiAgICAgICAgICAgICd2YWxpZGF0aW9uJyA9PiAkdmFsaWRhdGlvbiwNCiAgICAgICAgXTsNCiAgICAgICAgcmV0dXJuIHZpZXcoJ0tleXMvZ2VuZXJhdGUnLCAkZGF0YSk7DQogICAgfQ0KICAgIA0KDQogICAgcHJpdmF0ZSBmdW5jdGlvbiBnZW5lcmF0ZV9hY3Rpb24oKQ0KICAgIHsNCiAgICANCiAgICAgICAgJHVzZXIgPSAkdGhpcy0+dXNlcjsNCiAgICAgICAgJGdhbWUgPSAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnZ2FtZScpOw0KICAgICAgICAkbWF4ZCA9ICR0aGlzLT5yZXF1ZXN0LT5nZXRQb3N0KCdtYXhfZGV2aWNlcycpOw0KICAgICAgICAkZHJ0biA9ICR0aGlzLT5yZXF1ZXN0LT5nZXRQb3N0KCdkdXJhdGlvbicpOw0KICAgICAgICAkdHdzdCA9ICR0aGlzLT5yZXF1ZXN0LT5nZXRQb3N0KCdjdXN0b21pbnB1dCcpOw0KICAgICAgICAkY3VzbGljZW5zZSA9ICR0aGlzLT5yZXF1ZXN0LT5nZXRQb3N0KCdjdXNsaWNlbnNlJyk7DQogICAgICAgICRnZXRQcmljZSA9IGdldFByaWNlKCR0aGlzLT5wcmljZSwgJGRydG4sICRtYXhkKTsNCiAgICAgICAgJGxvb3Bjb3VudCA9ICAkdGhpcy0+cmVxdWVzdC0+Z2V0UG9zdCgnbG9vcGNvdW50Jyk7DQogICAgICAgIA0KICAgICAgICBpZiAoJGxvb3Bjb3VudCA9PSAiMSIpew0KICAgICAgICAkbG9vcGNvdW50ID0gNjsNCiAgICAgICAgDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIGVsc2UgaWYgKCRsb29wY291bnQgPT0gIjIiKXsNCiAgICAgICAgJGxvb3Bjb3VudCA9IDExOw0KICANCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgZWxzZSBpZiAoJGxvb3Bjb3VudCA9PSAiMyIpew0KICAgICAgICAkbG9vcGNvdW50ID0gNTE7DQogIA0KICAgICAgICB9DQogICAgICAgIGVsc2UgaWYgKCRsb29wY291bnQgPT0gIjQiKXsNCiAgICAgICAgJGxvb3Bjb3VudCA9IDEwMTsNCiAgICAgICAgDQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoJGxvb3Bjb3VudCA9PSAiNSIpew0KICAgICAgICAkbG9vcGNvdW50ID0gMjsNCiAgICAgICAgDQogICAgICAgIH0NCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICANCiAgICAgICANCiAgICAgIA0KDQogICAgICAgICAgJGdhbWVfbGlzdCA9IGltcGxvZGUoIiwiLCBhcnJheV9rZXlzKCR0aGlzLT5nYW1lX2xpc3QpKTsNCiAgICAgICAgICAkZm9ybV9ydWxlcyA9IFsNCiAgICAgICAgICAgICAgJ2dhbWUnID0+IFsNCiAgICAgICAgICAgICAgICAgICdsYWJlbCcgPT4gJ0dhbWVzJywNCiAgICAgICAgICAgICAgICAgICdydWxlcycgPT4gInJlcXVpcmVkfGFscGhhX251bWVyaWNfc3BhY2V8aW5fbGlzdFskZ2FtZV9saXN0XSIsDQogICAgICAgICAgICAgICAgICAnZXJyb3JzJyA9PiBbDQogICAgICAgICAgICAgICAgICAgICAgJ2FscGhhX251bWVyaWNfc3BhY2UnID0+ICdJbnZhbGlkIGNoYXJhY3RlcnMuJw0KICAgICAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgJ2R1cmF0aW9uJyA9PiBbDQogICAgICAgICAgICAgICAgJ2xhYmVsJyA9PiAnZHVyYXRpb24nLA0KICAgICAgICAgICAgICAgICdydWxlcycgPT4gJ3JlcXVpcmVkfG51bWVyaWN8Z3JlYXRlcl90aGFuX2VxdWFsX3RvWzFdJywNCiAgICAgICAgICAgICAgICAnZXJyb3JzJyA9PiBbDQogICAgICAgICAgICAgICAgICAgICdncmVhdGVyX3RoYW5fZXF1YWxfdG8nID0+ICdNaW5pbXVtIHtmaWVsZH0gaXMgaW52YWxpZC4nLA0KICAgICAgICAgICAgICAgICAgICAnbnVtZXJpYycgPT4gJ0ludmFsaWQgaG91cnMge2ZpZWxkfS4nDQogICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgXSwNCiAgICAgICAgICAgICAgJ21heF9kZXZpY2VzJyA9PiBbDQogICAgICAgICAgICAgICAgICAnbGFiZWwnID0+ICdkZXZpY2VzJywNCiAgICAgICAgICAgICAgICAgICdydWxlcycgPT4gJ3JlcXVpcmVkfG51bWVyaWN8Z3JlYXRlcl90aGFuX2VxdWFsX3RvWzFdJywNCiAgICAgICAgICAgICAgICAgICdlcnJvcnMnID0+IFsNCiAgICAgICAgICAgICAgICAgICAgICAnZ3JlYXRlcl90aGFuX2VxdWFsX3RvJyA9PiAnTWluaW11bSB7ZmllbGR9IGlzIGludmFsaWQuJywNCiAgICAgICAgICAgICAgICAgICAgICAnbnVtZXJpYycgPT4gJ0ludmFsaWQgbWF4IG9mIHtmaWVsZH0uJw0KICAgICAgICAgICAgICAgICAgXQ0KICAgICAgICAgICAgICBdLA0KICAgICAgICAgIF07DQoNCiAgICAgICAgICAkdmFsaWRhdGlvbiA9IFNlcnZpY2VzOjp2YWxpZGF0aW9uKCk7DQogICAgICAgICAgJHJlZHVjZUNoZWNrID0gKCR1c2VyLT5zYWxkbyAtICRnZXRQcmljZSk7DQogICAgICAgICAgLy8gZGQoJHJlZHVjZUNoZWNrKTsNCiAgICAgICAgICBpZiAoJHJlZHVjZUNoZWNrIDwgMCkgew0KICAgICAgICAgICAgICAkdmFsaWRhdGlvbi0+c2V0RXJyb3IoJ2R1cmF0aW9uJywgJ0luc3VmZmljaWVudCBiYWxhbmNlJyk7DQogICAgICAgICAgICAgIHJldHVybiByZWRpcmVjdCgpLT5iYWNrKCktPndpdGhJbnB1dCgpLT53aXRoKCdtc2dXYXJuaW5nJywgJ1BsZWFzZSB0b3AgdXAgdG8geW91ciBiZWxvdmVkIGFkbWluLicpOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIGlmICghJHRoaXMtPnZhbGlkYXRlKCRmb3JtX3J1bGVzKSkgew0KICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCktPmJhY2soKS0+d2l0aElucHV0KCktPndpdGgoJ21zZ0RhbmdlcicsICdGYWlsZWQhIFBsZWFzZSBjaGVjayB0aGUgZXJyb3InKTsNCiAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vLw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICANCiAgICAgICAgICAgIA0KICAgIA0KICAgICAgICAgICAgICAgIC8vZm9yKCRpID0gMTsgJGkgPCAkbG9vcGNvdW50OyAkaSsrKSB7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgIC8vfQ0KICAgICAgICAgICAgDQogICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICANCiAgICAgICAgICAgICAgICAgICAvLyBlY2hvICIkbGljZW5zZSAgPGJyPkJIQVRJQTxicj4iOw0KICAgICAgICANCiAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly8NCiAgICAgICAgICAgICAgICAgIA0KICAgDQogICAgICAgICAgICAgICAgICAgICAgJG1zZyA9ICJTdWNjZXNzZnVseSBHZW5lcmF0ZWQuIjsNCg0KICAgICAgICAgICAgICAgICAgDQoNCg0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAkZGF0YT0nJzsNCg0KICAgICAgICAgICAgICAgICAvLyAqIHJlc2VsbGVyIHJlZHVjZSBzYWxkbw0KICAgICAgICAgICAgICAgICBmb3IoJGk9MTskaTwkbG9vcGNvdW50OyRpKyspew0KICAgICAgICAgICAgICAkbGljZW5zZSA9ICRkcnRuLiAneCcuICR1c2VyLT51c2VybmFtZS4neCcuIHJhbmRvbV9zdHJpbmcoJ2FsbnVtJywgNSk7DQogICAgICAgICAgICAgICAgICAgICAgICRtb2RlbCA9ICR0aGlzLT5tb2RlbDsNCg0KaWYgKCR0d3N0ID09ICJjdXN0b20iKSB7DQppZiAoc3RybGVuKCRjdXNsaWNlbnNlKSA+IDMgJiYgc3RybGVuKCRjdXNsaWNlbnNlKSA8IDIwKXsNCiAgICAgICAgICAgICAgICAkZmluZEtleSA9ICRtb2RlbA0KICAgICAgICAgICAgICAgICAgICAtPmdldEtleXNHYW1lKFsndXNlcl9rZXknID0+ICRjdXNsaWNlbnNlLCAnZ2FtZScgPT4gJGdhbWVdKTsNCmlmICgkZmluZEtleSkgew0KICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlZGlyZWN0KCktPmJhY2soKS0+d2l0aCgnbXNnRGFuZ2VyJywgJ0tleSBhbHJlYWR5IGV4aXN0cyEhJyk7DQp9IGVsc2Ugew0KJGxpY2Vuc2UgPSAkY3VzbGljZW5zZTsNCn0NCn0gZWxzZSB7DQogICAgICAgICAgICAgICAgICByZXR1cm4gcmVkaXJlY3QoKS0+YmFjaygpLT53aXRoKCdtc2dEYW5nZXInLCAnQ3VzdG9tIEtleSBpcyB0b28gU2hvcnQvTG9uZycpOw0KfQ0KDQoNCn0NCg0KDQogICAgICAgICAgICAgICAgICAgICAgJGRhdGFfcmVzcG9uc2UgPSBbDQogICAgICAgICAgICAgICAgICAgICAgJ2dhbWUnID0+ICRnYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICd1c2VyX2tleScgPT4gJGxpY2Vuc2UsDQogICAgICAgICAgICAgICAgICAgICAgJ2R1cmF0aW9uJyA9PiAkZHJ0biwNCiAgICAgICAgICAgICAgICAgICAgICAnbWF4X2RldmljZXMnID0+ICRtYXhkLA0KICAgICAgICAgICAgICAgICAgICAgICdyZWdpc3RyYXRvcicgPT4gJHVzZXItPnVzZXJuYW1lLA0KICAgICAgICAgICAgICAgICAgICAgICd0ZXN0JyA9PiAkdHdzdCwNCiAgICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICAgICAgICAgICRkYXRhLj0kbGljZW5zZS4iXG4iOw0KICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAkaWRLZXlzID0gJHRoaXMtPm1vZGVsLT5pbnNlcnQoJGRhdGFfcmVzcG9uc2UpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgICAgICB3cml0ZV9maWxlKCduZXcudHh0JywgJGRhdGEpOy8vLw0KICAgICAgICAgICAgICAgIC8vICR0aGlzLT5kb3dubG9hZEZpbGUoJ25ldy50eHQnKTsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICR0aGlzLT51c2VyTW9kZWwtPnVwZGF0ZShzZXNzaW9uKCd1c2VyaWQnKSwgWydzYWxkbycgPT4gJHJlZHVjZUNoZWNrXSk7DQoNCiAgICAgICAgICAgICAgICAgICRoaXN0b3J5ID0gbmV3IEhpc3RvcnlNb2RlbCgpOw0KICAgICAgICAgICAgICAgICAgJGhpc3RvcnktPmluc2VydChbDQogICAgICAgICAgICAgICAgICAgICAgJ2tleXNfaWQnID0+ICRpZEtleXMsDQogICAgICAgICAgICAgICAgICAgICAgJ3VzZXJfZG8nID0+ICR1c2VyLT51c2VybmFtZSwNCiAgICAgICAgICAgICAgICAgICAgICAnaW5mbycgPT4gIiRnYW1lfCIgLiBzdWJzdHIoJGxpY2Vuc2UsIDAsIDUpIC4gInwkZHJ0bnwkbWF4ZCINCiAgICAgICAgICAgICAgICAgIF0pOw0KDQogICAgICAgICAgICAgICAgICAkb3RoZXJfcmVzcG9uc2UgPSBbDQogICAgICAgICAgICAgICAgICAgICAgJ2ZlZXMnID0+ICRnZXRQcmljZQ0KICAgICAgICAgICAgICAgICAgXTsNCg0KICAgICAgICAgICAgICAgICAgc2Vzc2lvbigpLT5zZXRGbGFzaGRhdGEoYXJyYXlfbWVyZ2UoJGRhdGFfcmVzcG9uc2UsICRvdGhlcl9yZXNwb25zZSkpOw0KICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICByZXR1cm4gcmVkaXJlY3QoKS0+YmFjaygpLT53aXRoKCdtc2dTdWNjZXNzJywgJG1zZyk7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgIH0NCiANCn0NCg==")); ?>

Function Calls

base64_decode 1

Variables

None

Stats

MD5 a473b3701d51c6fb527d783b88eb1500
Eval Count 1
Decode Time 76 ms