#include <iostream>
#include <functional>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
#include <unordered_map>
#include <iterator>
#include <cassert>
using namespace std;
//boring helper functions
inline std::string trim(const std::string &s) {
auto wsfront=std::find_if_not(s.begin(),s.end(),[](int c){return std::isspace(c);});
return std::string(wsfront,std::find_if_not(s.rbegin(),std::string::const_reverse_iterator(wsfront),[](int c){return std::isspace(c);}).base());
}
vector<string> str_to_tokens(string const &src) {
istringstream stream(src);
return {
istream_iterator<string>{stream},
istream_iterator<string>{}
};
}
string join(vector<string> const &vec, string const &delim) {
stringstream res;
copy(vec.begin(), vec.end(), ostream_iterator<string>(res, delim.c_str()));
return res.str();
}
//scaffolding
using arguments = vector<string>;
using command = function<void(arguments const &)>;
using commands = unordered_map<string, command>;
using middleware = function<void(arguments &)>;
using middlewares = vector<middleware>;
//bullshit that matters
void print(arguments const &args) {
for(auto &&arg: args) {
cout << arg << " ";
}
cout << endl;
}
struct data_store {
using vname = string;
using vval = string;
unordered_map<vname, vval> vars;
void store(vname const &name, vval const &val) {
vars[name] = val;
}
void store_cmd(arguments const &args) {
enum { VNAME, VEQSIGN, VVAL_BEG };
assert(args[VEQSIGN] == "=");
auto val = join({begin(args)+VVAL_BEG, end(args)}, " ");
store(args[VNAME], trim(val));
}
vval get(vname const &name) const {
return vars.at(name);
}
};
void replace_vars_with_values(data_store const &store, string const &var_prefix, arguments &args) {
for(auto &arg: args) {
if(arg.rfind(var_prefix, 0) == 0) {
arg = store.get(string{begin(arg)+var_prefix.size(), end(arg)});
}
}
}
void apply_middlewares(middlewares const &mdws, arguments &args) {
for(auto &&mdw: mdws) {
mdw(args);
}
}
int main() {
string var_prefix = "$";
data_store dstore;
middlewares mdws = {
[&](arguments &args) { return replace_vars_with_values(dstore, var_prefix, args); }
};
commands cmds = {
{"print", print},
{"var", [&dstore](arguments const &args) { dstore.store_cmd(args); }}
};
string input;
while(getline(cin, input)) {
if(input.empty()) {
continue;
}
auto tokens = str_to_tokens(input);
apply_middlewares(mdws, tokens);
enum { FUNC_POS, ARGS_START };
cmds.at(tokens[FUNC_POS])(arguments{begin(tokens)+ARGS_START, end(tokens)});
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPHNzdHJlYW0+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxjYXNzZXJ0Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy9ib3JpbmcgaGVscGVyIGZ1bmN0aW9ucwppbmxpbmUgc3RkOjpzdHJpbmcgdHJpbShjb25zdCBzdGQ6OnN0cmluZyAmcykgewogICBhdXRvICB3c2Zyb250PXN0ZDo6ZmluZF9pZl9ub3Qocy5iZWdpbigpLHMuZW5kKCksW10oaW50IGMpe3JldHVybiBzdGQ6Omlzc3BhY2UoYyk7fSk7CiAgIHJldHVybiBzdGQ6OnN0cmluZyh3c2Zyb250LHN0ZDo6ZmluZF9pZl9ub3Qocy5yYmVnaW4oKSxzdGQ6OnN0cmluZzo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcih3c2Zyb250KSxbXShpbnQgYyl7cmV0dXJuIHN0ZDo6aXNzcGFjZShjKTt9KS5iYXNlKCkpOwp9Cgp2ZWN0b3I8c3RyaW5nPiBzdHJfdG9fdG9rZW5zKHN0cmluZyBjb25zdCAmc3JjKSB7Cglpc3RyaW5nc3RyZWFtIHN0cmVhbShzcmMpOwoJcmV0dXJuIHsKCQlpc3RyZWFtX2l0ZXJhdG9yPHN0cmluZz57c3RyZWFtfSwKCQlpc3RyZWFtX2l0ZXJhdG9yPHN0cmluZz57fQoJfTsKfQoKc3RyaW5nIGpvaW4odmVjdG9yPHN0cmluZz4gY29uc3QgJnZlYywgc3RyaW5nIGNvbnN0ICZkZWxpbSkgewogICAgc3RyaW5nc3RyZWFtIHJlczsKICAgIGNvcHkodmVjLmJlZ2luKCksIHZlYy5lbmQoKSwgb3N0cmVhbV9pdGVyYXRvcjxzdHJpbmc+KHJlcywgZGVsaW0uY19zdHIoKSkpOwogICAgcmV0dXJuIHJlcy5zdHIoKTsKfQoKLy9zY2FmZm9sZGluZwp1c2luZyBhcmd1bWVudHMgPSB2ZWN0b3I8c3RyaW5nPjsKdXNpbmcgY29tbWFuZCA9IGZ1bmN0aW9uPHZvaWQoYXJndW1lbnRzIGNvbnN0ICYpPjsKdXNpbmcgY29tbWFuZHMgPSB1bm9yZGVyZWRfbWFwPHN0cmluZywgY29tbWFuZD47CnVzaW5nIG1pZGRsZXdhcmUgPSBmdW5jdGlvbjx2b2lkKGFyZ3VtZW50cyAmKT47CnVzaW5nIG1pZGRsZXdhcmVzID0gdmVjdG9yPG1pZGRsZXdhcmU+OwoKLy9idWxsc2hpdCB0aGF0IG1hdHRlcnMKdm9pZCBwcmludChhcmd1bWVudHMgY29uc3QgJmFyZ3MpIHsKCWZvcihhdXRvICYmYXJnOiBhcmdzKSB7CgkJY291dCA8PCBhcmcgPDwgIiAiOwoJfQoJY291dCA8PCBlbmRsOwp9CgpzdHJ1Y3QgZGF0YV9zdG9yZSB7Cgl1c2luZyB2bmFtZSA9IHN0cmluZzsKCXVzaW5nIHZ2YWwgPSBzdHJpbmc7Cgl1bm9yZGVyZWRfbWFwPHZuYW1lLCB2dmFsPiB2YXJzOwoJCgl2b2lkIHN0b3JlKHZuYW1lIGNvbnN0ICZuYW1lLCB2dmFsIGNvbnN0ICZ2YWwpIHsKCQl2YXJzW25hbWVdID0gdmFsOwoJfQoJCgl2b2lkIHN0b3JlX2NtZChhcmd1bWVudHMgY29uc3QgJmFyZ3MpIHsKCQllbnVtIHsgVk5BTUUsIFZFUVNJR04sIFZWQUxfQkVHIH07CgkJYXNzZXJ0KGFyZ3NbVkVRU0lHTl0gPT0gIj0iKTsKCQlhdXRvIHZhbCA9IGpvaW4oe2JlZ2luKGFyZ3MpK1ZWQUxfQkVHLCBlbmQoYXJncyl9LCAiICIpOwoJCXN0b3JlKGFyZ3NbVk5BTUVdLCB0cmltKHZhbCkpOwoJfQoJCgl2dmFsIGdldCh2bmFtZSBjb25zdCAmbmFtZSkgY29uc3QgewoJCXJldHVybiB2YXJzLmF0KG5hbWUpOwoJfQp9OwoKdm9pZCByZXBsYWNlX3ZhcnNfd2l0aF92YWx1ZXMoZGF0YV9zdG9yZSBjb25zdCAmc3RvcmUsIHN0cmluZyBjb25zdCAmdmFyX3ByZWZpeCwgYXJndW1lbnRzICZhcmdzKSB7Cglmb3IoYXV0byAmYXJnOiBhcmdzKSB7CgkJaWYoYXJnLnJmaW5kKHZhcl9wcmVmaXgsIDApID09IDApIHsKCQkJYXJnID0gc3RvcmUuZ2V0KHN0cmluZ3tiZWdpbihhcmcpK3Zhcl9wcmVmaXguc2l6ZSgpLCBlbmQoYXJnKX0pOwoJCX0KCX0KfQoKdm9pZCBhcHBseV9taWRkbGV3YXJlcyhtaWRkbGV3YXJlcyBjb25zdCAmbWR3cywgYXJndW1lbnRzICZhcmdzKSB7Cglmb3IoYXV0byAmJm1kdzogbWR3cykgewoJCW1kdyhhcmdzKTsKCX0KfQoKaW50IG1haW4oKSB7CglzdHJpbmcgdmFyX3ByZWZpeCA9ICIkIjsKCWRhdGFfc3RvcmUgZHN0b3JlOwoJCgltaWRkbGV3YXJlcyBtZHdzID0gewoJCVsmXShhcmd1bWVudHMgJmFyZ3MpIHsgcmV0dXJuIHJlcGxhY2VfdmFyc193aXRoX3ZhbHVlcyhkc3RvcmUsIHZhcl9wcmVmaXgsIGFyZ3MpOyB9Cgl9OwoJCgljb21tYW5kcyBjbWRzID0gewoJCXsicHJpbnQiLCBwcmludH0sCgkJeyJ2YXIiLCBbJmRzdG9yZV0oYXJndW1lbnRzIGNvbnN0ICZhcmdzKSB7IGRzdG9yZS5zdG9yZV9jbWQoYXJncyk7IH19Cgl9OwoJCglzdHJpbmcgaW5wdXQ7Cgl3aGlsZShnZXRsaW5lKGNpbiwgaW5wdXQpKSB7CgkJaWYoaW5wdXQuZW1wdHkoKSkgewoJCQljb250aW51ZTsKCQl9CgkJYXV0byB0b2tlbnMgPSBzdHJfdG9fdG9rZW5zKGlucHV0KTsKCQlhcHBseV9taWRkbGV3YXJlcyhtZHdzLCB0b2tlbnMpOwoJCQoJCWVudW0geyBGVU5DX1BPUywgQVJHU19TVEFSVCB9OwoJCQoJCWNtZHMuYXQodG9rZW5zW0ZVTkNfUE9TXSkoYXJndW1lbnRze2JlZ2luKHRva2VucykrQVJHU19TVEFSVCwgZW5kKHRva2Vucyl9KTsKCX0KCXJldHVybiAwOwp9