user: Demonstrate the C code that generates the assembly output below:

```asm
<usage>:
  endbr64
  sub    $0x8,%rsp
  mov    %rdi,%rsi
  lea    D247(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D88(%rip),%rdi
  call   <puts@plt>
  lea    D5(%rip),%rdi
  call   <puts@plt>
  lea    D191(%rip),%rdi
  call   <puts@plt>
  lea    D172(%rip),%rdi
  call   <puts@plt>
  lea    D4(%rip),%rdi
  call   <puts@plt>
  lea    D47(%rip),%rdi
  call   <puts@plt>
  lea    D240(%rip),%rdi
  call   <puts@plt>
  lea    D211(%rip),%rdi
  call   <puts@plt>
  lea    D141(%rip),%rdi
  call   <puts@plt>
  lea    D178(%rip),%rdi
  call   <puts@plt>
  lea    D107(%rip),%rdi
  call   <puts@plt>
  lea    D195(%rip),%rdi
  call   <puts@plt>
  lea    D19(%rip),%rdi
  call   <puts@plt>
  lea    D185(%rip),%rdi
  call   <puts@plt>
  lea    D165(%rip),%rdi
  call   <puts@plt>
  lea    D13(%rip),%rdi
  call   <puts@plt>
  lea    D40(%rip),%rdi
  call   <puts@plt>
  lea    D96(%rip),%rdi
  call   <puts@plt>
  lea    D6(%rip),%rdi
  call   <puts@plt>
  lea    D218(%rip),%rdi
  call   <puts@plt>
  lea    D206(%rip),%rdi
  call   <puts@plt>
  lea    D52(%rip),%rdi
  call   <puts@plt>
  lea    D63(%rip),%rdi
  call   <puts@plt>
  lea    D213(%rip),%rdi
  call   <puts@plt>
  mov    $0xa,%edi
  call   <putchar@plt>
  add    $0x8,%rsp
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D247
datatype: string
name: unpack_data
arguments: data_tag: D88
datatype: string
name: unpack_data
arguments: data_tag: D5
datatype: string
name: unpack_data
arguments: data_tag: D191
datatype: string
name: unpack_data
arguments: data_tag: D172
datatype: string
name: unpack_data
arguments: data_tag: D4
datatype: string
name: unpack_data
arguments: data_tag: D47
datatype: string
name: unpack_data
arguments: data_tag: D240
datatype: string
name: unpack_data
arguments: data_tag: D211
datatype: string
name: unpack_data
arguments: data_tag: D141
datatype: string
name: unpack_data
arguments: data_tag: D178
datatype: string
name: unpack_data
arguments: data_tag: D107
datatype: string
name: unpack_data
arguments: data_tag: D195
datatype: string
name: unpack_data
arguments: data_tag: D19
datatype: string
name: unpack_data
arguments: data_tag: D185
datatype: string
name: unpack_data
arguments: data_tag: D165
datatype: string
name: unpack_data
arguments: data_tag: D13
datatype: string
name: unpack_data
arguments: data_tag: D40
datatype: string
name: unpack_data
arguments: data_tag: D96
datatype: string
name: unpack_data
arguments: data_tag: D6
datatype: string
name: unpack_data
arguments: data_tag: D218
datatype: string
name: unpack_data
arguments: data_tag: D206
datatype: string
name: unpack_data
arguments: data_tag: D52
datatype: string
name: unpack_data
arguments: data_tag: D63
datatype: string
name: unpack_data
arguments: data_tag: D213
datatype: string

tool: D247: 
Usage: %s [options]


tool: D88: 
Options:
-------------

tool: D5: -P<plugin>, --plugin-info[=..] 	  Show plugins summary or detailed plugin information if <plugin> is provided

tool: D191: -p <plugin>, --plugin          	  Use plugin (default plugin is 'md5')

tool: D172: -S<session>, --session-info[=..]  Display sessions summary/detailed info on <session>

tool: D4: -s <session>, --session        	  Load <session> (you may list sessions using -S)

tool: D47: -f <hashfile>, --hashfile     	  Load hashes from file 'hashfile'

tool: D240: -b<ruleset>, --brute[=...]    	  Enables bruteforce mode, load ruleset  'ruleset' (default: '1:8:lalphanum')

tool: D211: -o <filename>, --outfile     	  Write cracked hashes to <filename> upon completion

tool: D141: -O <filename>, --uncrackedfile 	  Write uncracked hashes to <filename> upon completion

tool: D178: -M, --markov-info[=...]      	  Show available Markov stats files summary

tool: D107: -m <statfile>, --markov    	  Enable Markov attack, use <statfile>

tool: D195: -n <threshold>,--markov-threshold Set Markov attack threshold

tool: D19: -N <limit>, --markov-limit 	  Set Markov attack password length limit (<=10, default 8)

tool: D185: -c, --cpu 			  Use CPU even if GPU acceleration is enabled

tool: D165: -F, --fast-markov 		  Faster markov attack (when using GPU)

tool: D13: -G, --gpu-threads 		  Number of GPU threads (up to 4). Increases load/memory utilization, but may improve speeds.

tool: D40: -C, --cpu-threads 		  Number of CPU worker threads.

tool: D96: -D, --gpu-double 		  GPU 2x mode. Better speeds, but less scallable. 

tool: D6: -T, --gpu-temp 			  GPU temperature threshold (default:90 deg celsius). 

tool: D218: -t, --gpu-platform 		  OpenCL platform (default:0). 

tool: D206: -i, --interactive-mode 		  Interactive mode (reduce flicker and tearing). 

tool: D52: -a, --add-opts 			  Additional options (for rule-based attacks). 

tool: D63: 
Ruleset format: 'start_len:end_len:predefined_set:additional_args'


tool: D213: start_len:  	  generated plaintexts are equal in length or longer than that value
end_len:  	  generated plaintexts are equal in length or shorter than that value
predefined_set:   one of 'alpha', 'ualpha', 'lalpha', 'lalphanum', 'ualphanum', 'alphanum', 'ascii', 'none'
additional_args:  additional characters, e.g '+()'

Example:

 -t hello -b1:2:lalpha:* - try all permutations of length 1-2, comprised of lower alphabetical chars and '*'

assistant: ```c
void usage(const char *progname) {
  printf("\nUsage: %s [options]\n", progname);
  printf("\nOptions:\n-------------\n");
  printf("-P<plugin>, --plugin-info[=..] \t  Show plugins summary or detailed plugin information if <plugin> is provided\n");
  printf("-p <plugin>, --plugin          \t  Use plugin (default plugin is 'md5')\n");
  printf("-S<session>, --session-info[=..]  Display sessions summary/detailed info on <session>\n");
  printf("-s <session>, --session        \t  Load <session> (you may list sessions using -S)\n");
  printf("-f <hashfile>, --hashfile     \t  Load hashes from file \'hashfile\'\n");
  printf("-b<ruleset>, --brute[=...]    \t  Enables bruteforce mode, load ruleset  \'ruleset\' (default: \'1:8:lalphanum\')\n");
  printf("-o <filename>, --outfile     \t  Write cracked hashes to <filename> upon completion\n");
  printf("-O <filename>, --uncrackedfile \t  Write uncracked hashes to <filename> upon completion\n");
  printf("-M, --markov-info[=...]      \t  Show available Markov stats files summary\n");
  printf("-m <statfile>, --markov    \t  Enable Markov attack, use <statfile>\n");
  printf("-n <threshold>,--markov-threshold Set Markov attack threshold\n");
  printf("-N <limit>, --markov-limit \t  Set Markov attack password length limit (<=10, default 8)\n");
  printf("-c, --cpu \t\t\t  Use CPU even if GPU acceleration is enabled\n");
  printf("-F, --fast-markov \t\t  Faster markov attack (when using GPU)\n");
  printf("-G, --gpu-threads \t\t  Number of GPU threads (up to 4). Increases load/memory utilization, but may improve speeds.\n");
  printf("-C, --cpu-threads \t\t  Number of CPU worker threads.\n");
  printf("-D, --gpu-double \t\t  GPU 2x mode. Better speeds, but less scallable. \n");
  printf("-T, --gpu-temp \t\t\t  GPU temperature threshold (default:90 deg celsius). \n");
  printf("-t, --gpu-platform \t\t  OpenCL platform (default:0). \n");
  printf("-i, --interactive-mode \t\t  Interactive mode (reduce flicker and tearing). \n");
  printf("-a, --add-opts \t\t\t  Additional options (for rule-based attacks). \n");
  printf("\nRuleset format: \'start_len:end_len:predefined_set:additional_args\'\n\n");
  printf("start_len:  \t  generated plaintexts are equal in length or longer than that value\n"
         "end_len:  \t  generated plaintexts are equal in length or shorter than that value\n"
         "predefined_set:   one of \'alpha\', \'ualpha\', \'lalpha\', \'lalphanum\', \'ualphanum\', \'alphanum\', \'ascii\', \'none\'\n"
         "additional_args:  additional characters, e.g \'+()\'\n\n"
         "Example:\n\n -t hello -b1:2:lalpha:* - try all permutations of length 1-2, comprised of lower alphabetical chars and \'*\'\n");
  printf("\n");
}
```