


map() {
{
local A f;
[ $# -ge 1 ] && A="${1}"
[ $# -ge 2 ] && f="${2}"
}
shift 2
eval "{
local k; for k in \"\${!$A[@]}\"; do
local v=\"\${$A[\"\${k}\"]}\";
$f \"\${@}\" \"\${k}\" \"\${v}\"
done
}"
}

mappipe() {
{
local f;
[ $# -ge 1 ] && f="${1}"
}
shift
while read -r line; do
"${f}" "${@}" "${line}"
done
}

curry() {
{
local out f x;
[ $# -ge 1 ] && out="${1}"
[ $# -ge 2 ] && f="${2}"
[ $# -ge 3 ] && x="${3}"
}
eval "{
$out() {
$f '$x' \"\${@}\"
}
}"
}

keys() {
{
local x y;
[ $# -ge 1 ] && x="${1}"
[ $# -ge 2 ] && y="${2}"
}
echo "${x}"
}

values() {
{
local x y;
[ $# -ge 1 ] && x="${1}"
[ $# -ge 2 ] && y="${2}"
}
echo "${y}"
}

set?() {
{
local s;
[ $# -ge 1 ] && s="${1}"
}
eval "{
return \"\$(( \${$s+-1}+1 ))\"
}"
}

unset?() {
{
local s;
[ $# -ge 1 ] && s="${1}"
}
eval "{
return \"\$(( \${$s+1}+0 ))\"
}"
}

empty?() {
{
local s;
[ $# -ge 1 ] && s="${1}"
}
eval "{
return \"\$(( \${$s:+1}+0 ))\"
}"
}

nonempty?() {
{
local s;
[ $# -ge 1 ] && s="${1}"
}
eval "{
return \"\$(( \${$s:+-1}+1 ))\"
}"
}

bool() {
{
local int;
[ $# -ge 1 ] && int="${1}"
}
return "${int}"
}

filter() {
{
local A p;
[ $# -ge 1 ] && A="${1}"
[ $# -ge 2 ] && p="${2}"
}
shift 2
eval "{
local k; for k in \"\${!$A[@]}\"; do
local v=\"\${$A[\"\${k}\"]}\";
if $p \"\${@}\" \"\${k}\" \"\${v}\"; then
echo \"\${v}\"
fi
done
}"
}

compose() {
{
local fg f g;
[ $# -ge 1 ] && fg="${1}"
[ $# -ge 2 ] && f="${2}"
[ $# -ge 3 ] && g="${3}"
}
eval "{
$fg() {
$f \"\$( $g \"\${@}\" )\"
}
}"
}

pick() {
{
local A k;
[ $# -ge 1 ] && A="${1}"
[ $# -ge 2 ] && k="${2}"
}
if [ -z "${k}" ]; then
return 1
fi
eval "{
local output=\"\${$A[$k]}\"
}"
if [ -n "${output}" ]; then
echo "${output}"
fi
}

first() {
{
local A;
[ $# -ge 1 ] && A="${1}"
}
if unset? A; then
return 1
fi
eval "{
echo \"\${$A[0]}\"
}"
}

last() {
{
local A;
[ $# -ge 1 ] && A="${1}"
}
if unset? A; then
return 1
fi
eval "{
echo \"\${$A[-1]}\"
}"
}

require_env() {
{
local var;
[ $# -ge 1 ] && var="${1}"
}
eval "{
pass \"\${$var?\"Required ENV-variable $var not set (hint: \"\"'\"\"$var=yourvalue ./yourscript\"\"'\"\").\"}\"
}"
}

require_cmd() {
{
local var;
[ $# -ge 1 ] && var="${1}"
}
if which "${var}" 1>/dev/null 2>/dev/null; then
return 0
fi
eval "{
pass \"\${$var?\"Please install the required command \"\"'\"\"$var\"\"'\"\" (was not found).\"}\"
}"
}

ismap?() {
{
local x;
[ $# -ge 1 ] && x="${1}"
}
local result k1=__ismap_dummy1 k2=__ismap_dummy2
if empty? x; then
return 1
fi
eval "{
local $k1=0 $k2=0
local v
[ \"\$(( \${$x[$k1]+-1}+1 ))\" = 0 ] && v=\"\${$x[$k1]}\" 
$x[$k1]=a 
$x[$k2]=b 
if [ \"\${$x[$k1]}\" = a ]; then
unset $x[$k1]
unset $x[$k2]
return 0
else
[ \"\$(( \${v+-1}+1 ))\" = 0 ] && $x=\"\${v}\" || unset $x
return 1
fi
}"
}

copy_map() {
{
local __A __B;
[ $# -ge 1 ] && __A="${1}"
[ $# -ge 2 ] && __B="${2}"
}
if ! ismap? "${__A}"; then
echo 'ERROR: in copy_map: '"${__A}"' is not a map'
return 1
fi
if ! ismap? "${__B}"; then
echo 'ERROR: in copy_map: '"${__B}"' is not a map'
return 1
fi
eval "{
local __k; for __k in \"\${!$__A[@]}\"; do
local __v=\"\${$__A[\"\${__k}\"]}\";
$__B[\"\${__k}\"]=\"\${__v}\" 
done
}"
}

copy_array() {
{
local __A __B;
[ $# -ge 1 ] && __A="${1}"
[ $# -ge 2 ] && __B="${2}"
}
eval "{
local __k; for __k in \"\${!$__A[@]}\"; do
local __v=\"\${$__A[\"\${__k}\"]}\";
if ! [[ \"\${__k}\" =$ ^[1-9]+\$  ]]; then
echo 'ERROR: not a valid array key: '\"\${__k}\"''
return 1
fi
$__B[\"\${__k}\"]=\"\${__v}\" 
done
}"
}

clear_array() {
{
local __A;
[ $# -ge 1 ] && __A="${1}"
}
eval "{
local __k; for __k in \"\${!$__A[@]}\"; do
unset $__A[\"\${__k}\"]
done
}"
}

NL='
' 

pass() {
true
}





json_print() {
local value
{
local __powscript_gensym_reference_variable_2255_1_22685;
json_value __powscript_gensym_reference_variable_2255_1_22685 "${@}" || return 1
value="${__powscript_gensym_reference_variable_2255_1_22685}"
}
echo "${value}"
}

json_print_type() {
local type
{
local __powscript_gensym_reference_variable_2255_2_26383;
json_type __powscript_gensym_reference_variable_2255_2_26383 "${@}" || return 1
type="${__powscript_gensym_reference_variable_2255_2_26383}"
}
echo "${type}"
}

json_value() {
json_property value "${@}"
}

json_type() {
json_property type "${@}"
}


json_property() {
{
local kind out start_id values;
[ $# -ge 1 ] && kind="${1}"
[ $# -ge 2 ] && out="${2}"
[ $# -ge 3 ] && start_id="${3}"
[ $# -ge 4 ] && values="${4}"
}
shift 3
local id type value
if [[ "${start_id}" =~ ^[0-9]+$  ]]; then
shift
else
values="${start_id}" 
start_id=1 
fi
{
local __powscript_gensym_reference_variable_2255_3_5770;
json_get_id __powscript_gensym_reference_variable_2255_3_5770 "${start_id}" "${values}" "${@}" || return 1
id="${__powscript_gensym_reference_variable_2255_3_5770}"
}
eval "{
type=\"\${$values[\"\${id}\":type]}\" 
value=\"\${$values[\"\${id}\":value]}\" 
}"
case "${kind}" in
type )
{
if ! [ "${out#__powscript_gensym_reference_variable_}" = "${out}" ]; then :; else >&2 echo 'ERROR:'"${out}"' is not a reference'
 return 1; fi
eval "{
$out=\"\${type}\"
}"
}
;;
value )
case "${type}" in
object|array )
{
if ! [ "${out#__powscript_gensym_reference_variable_}" = "${out}" ]; then :; else >&2 echo 'ERROR:'"${out}"' is not a reference'
 return 1; fi
eval "{
$out=\"\${id}\"
}"
}
;;
* )
{
if ! [ "${out#__powscript_gensym_reference_variable_}" = "${out}" ]; then :; else >&2 echo 'ERROR:'"${out}"' is not a reference'
 return 1; fi
eval "{
$out=\"\${value}\"
}"
}
;;
esac
;;
esac
}

json_get_id() {
{
local out id values;
[ $# -ge 1 ] && out="${1}"
[ $# -ge 2 ] && id="${2}"
[ $# -ge 3 ] && values="${3}"
}
shift 3
if ! ismap? "${values}"; then
echo 'ERROR: in json_get: '"${values}"' is not a json object'
return 1
fi
eval "{
local key; for key in \"\${@}\"; do
id=\"\${$values[\"\${id}\"-\"\${key}\"]}\" 
done
}"
{
if ! [ "${out#__powscript_gensym_reference_variable_}" = "${out}" ]; then :; else >&2 echo 'ERROR:'"${out}"' is not a reference'
 return 1; fi
eval "{
$out=\"\${id}\"
}"
}
}

json_parse() {
{
local __out __string;
[ $# -ge 1 ] && __out="${1}"
[ $# -ge 2 ] && __string="${2}"
}
declare -A __objects
_json_parse "${__out}" "${__string}" || return 1
copy_map __objects "${__out}"
}

_json_parse() {
{
local out string;
[ $# -ge 1 ] && out="${1}"
[ $# -ge 2 ] && string="${2}"
}
local index=0
local c
local state='top'
local unicode1 unicode2
local key=''
local value=''
declare -a value_id_stack
declare -i value_stack_pos
declare -i value_id
declare -i previous_id
declare -i next_id
value_id_stack[0]=0 
value_stack_pos=0 
value_id=0 
next_id=1 
declare -i state_depth
declare -a state_list
state_depth=0 
declare -i line
declare -i collumn
line=0 
collumn=0 
state_pop() {
if [ $(( ${state_depth} )) -gt $(( 0 )) ]; then
state_depth=$(( ${state_depth}-1 )) 
state="${state_list["${state_depth}"]}" 
fi
}
state_push() {
{
local v;
[ $# -ge 1 ] && v="${1}"
}
state_list["${state_depth}"]="${state}" 
state_depth=$(( ${state_depth}+1 )) 
state="${v}" 
}
state_replace() {
{
local v;
[ $# -ge 1 ] && v="${1}"
}
state_pop
state_push "${v}"
}
set_type() {
{
local t;
[ $# -ge 1 ] && t="${1}"
}
__objects[''"${value_id}"':type']="${t}" 
}
add_value_to_object() {
__objects[''"${previous_id}"'-'"${key}"'']="${value_id}" 
}
add_value_to_array() {
local index="${__objects["${previous_id}":length]}"
__objects[''"${previous_id}"'-'"${index}"'']="${value_id}" 
__objects[''"${previous_id}"':length']=$(( ${index:-0}+1 )) 
}
start_value() {
previous_id="${value_id}" 
value_id="${next_id}" 
next_id=$(( ${next_id}+1 )) 
value_stack_pos=$(( ${value_stack_pos}+1 )) 
value_id_stack["${value_stack_pos}"]="${value_id}" 
state_push 'value'
}
end_value() {
__objects[''"${value_id}"':value']=''"${value}"'' 
value= value_stack_pos=$(( ${value_stack_pos}-1 )) 
value_id="${previous_id}" 
previous_id="${value_id_stack["${value_stack_pos}"]}" 
state_pop
}
start_array() {
__objects[''"${value_id}"':length']=0 
}
error() {
{
local msg;
[ $# -ge 1 ] && msg="${1}"
}
echo 'ERROR:'"${line}"':'"${collumn}"': while parsing json: '"${msg}"'' >&2
}
if ! ismap? "${out}"; then
error 'expected an associative array as an argument, but '"${out}"' isn'"'"'t one'; return 1
fi
start_value
while [ $(( ${index} )) -lt $(( ${#string} )) ]; do
c="${string:$(( ${index:-0} )):1}" 
index=$(( ${index}+1 )) 
if [ "${c}" = "${NL}" ]; then
newline=$(( ${newline}+1 )) 
collumn=0 
else
collumn=$(( ${collumn}+1 )) 
fi
case "${state}" in
'value' )
case "${c}" in
[[:space:]] )
pass
;;
'{' )
state_push 'object'
state_push 'object-key'
;;
'[' )
start_array
state_push 'array-start'
;;
'"' )
state_push 'string'
;;
'-' )
state_push 'negative'
value='-' 
;;
'0' )
state_push 'after-integer'
value='0' 
;;
[1-9] )
value="${value}""${c}" 
set_type 'number'
state_push 'integer'
;;
't' )
value="${string:$(( ${index:-0}-1 )):$(( 5 ))}" 
case "${value}" in
'true'|'true'[[:space:]] )
set_type 'bool'
value='true' 
end_value
index=$(( ${index}+4 )) 
;;
'true,'|'true]'|'true}' )
set_type 'bool'
value='true' 
end_value
index=$(( ${index}+3 )) 
;;
* )
error 'unexpected character '"${c}"': didn'"'"'t lead to '"'"'true'"'"' ('"${value}"'...)'; return 1
;;
esac
;;
'f' )
value="${string:$(( ${index:-0}-1 )):$(( 6 ))}" 
case "${value}" in
'false'|'false'[[:space:]] )
set_type 'bool'
value='false' 
end_value
index=$(( ${index}+5 )) 
;;
'false,'|'false]'|'false}' )
set_type 'bool'
value='false' 
end_value
index=$(( ${index}+4 )) 
;;
* )
error 'unexpected character '"${c}"': didn'"'"'t lead to '"'"'false'"'"' ('"${value}"'...)'; return 1
;;
esac
;;
* )
error 'unexpected character '"${c}"''; return 1
;;
esac
;;
'object-key' )
case "${c}" in
[[:space:]] )
pass
;;
'"' )
state_pop
state_push 'object-colon'
state_push 'string'
;;
'}' )
state_pop
end_object
;;
* )
error 'unexpected character '"${c}"': expected a string as a object key'; return 1
;;
esac
;;
'object-colon' )
case "${c}" in
[[:space:]] )
pass
;;
':' )
state_pop
start_value
add_value_to_object
;;
* )
error 'unexpected character '"${c}"': expected a colon (:) after the object key'; return 1
;;
esac
;;
'object' )
case "${c}" in
[[:space:]] )
pass
;;
',' )
state_push 'object-key'
;;
'}' )
set_type 'object'
state_pop
end_value
;;
* )
error 'unexpected character '"${c}"': expected '"'"','"'"' or '"'"'}'"'"' in object'; return 1
;;
esac
;;
'array-start' )
case "${c}" in
']' )
set_type 'array'
state_pop
end_value
;;
* )
index=$(( ${index}-1 )) 
state_replace 'array'
start_value
add_value_to_array
;;
esac
;;
'array' )
case "${c}" in
',' )
start_value
add_value_to_array
;;
']' )
set_type 'array'
state_pop
end_value
;;
* )
error 'expected '"'"','"'"' or '"'"'}'"'"' in array'; return 1
;;
esac
;;
'string' )
case "${c}" in
'"' )
set_type 'string'
state_pop
if [ "${state}" = 'value' ]; then
end_value
elif [ "${state}" = 'object-colon' ]; then
key=''"${value}"'' 
value='' 
fi
;;
'\' )
state_push 'escape'
;;
* )
value="${value}""${c}" 
;;
esac
;;
'escape' )
state_pop
case "${c}" in
'"'|'\'|'/' )
value="${value}""${c}" 
;;
[bfnrt] )
local v
printf -v v '\'"${c}"''
value="${value}""${v}" 
;;
u )
local unicode offset
{
local __powscript_gensym_reference_variable_2255_4_22344;
local __powscript_gensym_reference_variable_2255_5_27790;
parse_utf16 -r __powscript_gensym_reference_variable_2255_4_22344 -o __powscript_gensym_reference_variable_2255_5_27790 "${string:$(( ${index:-0}+1 )):$(( 8 ))}" || return 1
unicode="${__powscript_gensym_reference_variable_2255_4_22344}"
offset="${__powscript_gensym_reference_variable_2255_5_27790}"
}
value="${value}""${unicode}" 
index=$(( ${index}+${offset} )) 
;;
* )
error 'invalid escape character: '"${c}"''; return 1
;;
esac
;;
'negative' )
case "${c}" in
0 )
state_replace 'after-integer'
value="${value}"0 
;;
[1-9] )
state_replace 'integer'
value="${value}""${c}" 
;;
* )
error 'unexpected character '"${c}"': expected a digit from 0 to 9'; return 1
;;
esac
;;
'integer' )
case "${c}" in
[0-9] )
value="${value}""${c}" 
;;
'.' )
value="${value}"'.' 
state_replace 'floating-point'
;;
[[:space:]] )
state_pop
set_type 'number'
end_value
;;
','|']'|'}' )
state_pop
set_type 'number'
end_value
index=$(( ${index}-1 )) 
;;
* )
error 'unexpected character '"${c}"': expected a digit from 0 to 9, . or whitespace'; return 1
;;
esac
;;
'after-integer' )
case "${c}" in
'.' )
value="${value}"'.' 
state_replace 'floating-point-start'
;;
[[:space:]] )
state_pop
set_type 'number'
end_value
;;
','|']'|'}' )
state_pop
set_type 'number'
end_value
index=$(( ${index}-1 )) 
;;
* )
error 'unexpected character '"${c}"': expected . or whitespace'; return 1
;;
esac
;;
'floating-point-start' )
case "${c}" in
[0-9] )
value="${value}""${c}" 
state_replace 'floating-point'
;;
* )
error 'unexpected character '"${c}"': expected a digit from 0 to 9 after .'; return 1
;;
esac
;;
'floating-point' )
case "${c}" in
[0-9] )
value="${value}""${c}" 
;;
[eE] )
value="${value}"e 
state_replace 'float-e'
;;
[[:space:]] )
state_pop
set_type 'number'
end_value
;;
','|']'|'}' )
state_pop
set_type 'number'
end_value
index=$(( ${index}-1 )) 
;;
* )
error 'unexpected character '"${c}"': expected a digit from 0 to 9, e/E or whitespace.'; return 1
;;
esac
;;
'float-e' )
case "${c}" in
[0-9]|+|- )
value="${value}""${c}" 
state_replace 'float-e-value'
;;
* )
error 'unexpected character '"${c}"': expected a digit from 0 to 9, + or -.'; return 1
;;
esac
;;
'float-e-value' )
case "${c}" in
[0-9] )
value="${value}""${c}" 
;;
[[:space:]] )
state_pop
set_type 'number'
end_value
;;
esac
;;
esac
done
while [ "${state}" != 'top' ]; do
case "${state}" in
'integer'|'floating-point'|'float-e-value' )
state_pop
end_value
;;
* )
error 'premature end of input. ('"${state}"')'
return 1
;;
esac
done
}

require_env 'URL'
require_cmd 'curl'

usage() {
{
local app;
[ $# -ge 1 ] && app="${1}"
}
echo ''"${app}"' <jsonkey>'
}

version() {
declare -A data 
json="$( curl -s ''"${URL}"'' )" 
json_parse data ''"${json}"''
echo data.version
}

run() {
{
local cmd;
[ $# -ge 1 ] && cmd="${1}"
}
if empty? cmd; then
help="$( usage myapp )" 
echo 'Usage: '"${help}"'' && exit
fi
"${cmd}"
}

run "${@}"



if [ "${ASYNC}" = 1 ]; then
wait
fi




