diff --git a/Makefile b/Makefile index dd4a9409d9f4017b9c71f5525a81e6935bd932d9..c04e7df9e8d98fa6877cbb4405e31589178dd651 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,48 @@ +REBAR ?= ./rebar3 + RELEASE := mq COOKIE := node_runner VER := 1.0.0 -default: deps compile +all: compile + +compile: + @$(REBAR) compile + +clean: + @$(REBAR) clean + +console: local-build + @./_build/local/rel/server/bin/server console + +start: local-build + @./_build/local/rel/server/bin/server start + +attach: + @./_build/local/rel/server/bin/server attach + +local-build: + @$(REBAR) as local release + + +prod-build: + @$(REBAR) as prod release + +prod-console: prod-build + @./_build/prod/rel/server/bin/server console + +prod-start: prod-build + @./_build/prod/rel/server/bin/server start + +prod-attach: + @./_build/prod/rel/server/bin/server attach + +tar: + @$(REBAR) as prod tar + -include otp.mk +.PHONY: \ + all compile clean console local-build \ + start attach \ + prod-build prod-console prod-start prod-attach \ + tar diff --git a/README.md b/README.md index 18a1a741506bbfed6cb608cf522a8ab76623bdfc..67ffd9a74ea7959f9f35874b17161d59152abcd3 100644 --- a/README.md +++ b/README.md @@ -26,79 +26,26 @@ Developers Setup ---------------- ``` -$ curl -fsSL https://raw.github.com/synrc/mad/master/mad > mad \ - && chmod +x mad \ - && sudo cp /usr/local/bin -$ mad dep com rep -Configuration: [{n2o, - [{port,8000}, - {app,review}, - {pickler,n2o_secret}, - {formatter,bert}, - {log_modules,config}, - {log_level,config}]}, - {emq_dashboard, - [{listeners_dash, - [{http,18083,[{acceptors,4},{max_clients,512}]}]}]}, - {emq_modules, - [{modules, - [{emq_mod_presence,[{qos,1}]}, - {emq_mod_subscription,[{<<"%u/%c/#">>,2}]}, - {emq_mod_rewrite, - [{rewrite,"x/#","^x/y/(.+)$","z/y/$1"}, - {rewrite,"y/+/z/#","^y/(.+)/z/(.+)$", - "y/z/$2"}]}]}]}, - {emqttd, - [{listeners, - [{http,8083,[{acceptors,4},{max_clients,512}]}, - {tcp,1883,[{acceptors,4},{max_clients,512}]}]}, - {sysmon, - [{long_gc,false}, - {long_schedule,240}, - {large_heap,8000000}, - {busy_port,false}, - {busy_dist_port,true}]}, - {session, - [{upgrade_qos,off}, - {max_inflight,32}, - {retry_interval,20}, - {max_awaiting_rel,100}, - {await_rel_timeout,20}, - {enable_stats,off}]}, - {queue,[]}, - {allow_anonymous,true}, - {protocol, - [{max_clientid_len,1024},{max_packet_size,64000}]}, - {acl_file,"etc/acl.conf"}, - {plugins_etc_dir,"etc/plugins/"}, - {plugins_loaded_file,"etc/loaded_plugins"}, - {pubsub, - [{pool_size,8},{by_clientid,true},{async,true}]}]}, - {kvs, - [{dba,store_mnesia}, - {schema,[kvs_user,kvs_acl,kvs_feed,kvs_subscription]}]}] -Applications: [kernel,stdlib,gproc,lager_syslog,pbkdf2,asn1,fs,ranch,mnesia, - compiler,inets,crypto,syntax_tools,xmerl,gen_logger,esockd, - cowlib,goldrush,public_key,lager,ssl,cowboy,mochiweb,emqttd, - erlydtl,kvs,mad,emqttc,nitro,rest,sh,syslog,review] -Erlang/OTP 19 [erts-8.3] [source] [64-bit] [smp:4:4] - [async-threads:10] [hipe] [kernel-poll:false] [dtrace] - -Eshell V8.3 (abort with ^G) -starting emqttd on node 'nonode@nohost' -Nonexistent: [] -Plugins: [{mqtt_plugin,emq_auth_username,"2.1.1", - "Authentication with Username/Password",false}, - {mqtt_plugin,emq_dashboard,"2.1.1","EMQ Web Dashboard",false}, - {mqtt_plugin,emq_modules,"2.1.1","EMQ Modules",false}, - {mqtt_plugin,n2o,"4.5-mqtt","N2O Server",false}] -Names: [emq_dashboard,n2o] -dashboard:http listen on 0.0.0.0:18083 with 4 acceptors. -Async Start Attempt {handler,"timer",n2o,system,n2o,[],[]} -Proc Init: init -mqtt:ws listen on 0.0.0.0:8083 with 4 acceptors. -mqtt:tcp listen on 0.0.0.0:1883 with 4 acceptors. -emqttd 2.1.1 is running now +$ make +===> Verifying dependencies... +... +===> Compiling roster +===> Compiling service +$ make console +===> Verifying dependencies... +===> Compiling roster +===> Compiling service +===> Starting relx build process ... +===> Resolving OTP Applications from directories: +... +===> release successfully created! +Exec: /.../erlang/20.3/erts-9.3/bin/erlexec -boot /.../nynja/server/_build/local/rel/server/releases/1.0.0/server -mode embedded -boot_var ERTS_LIB_DIR /.../erlang/20.3/lib -config /.../nynja/server/_build/local/rel/server/releases/1.0.0/sys.config -args_file /.../nynja/server/_build/local/rel/server/releases/1.0.0/vm.args -- console +Root: /.../nynja/server/_build/local/rel/server +/.../nynja/server/_build/local/rel/server +Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:32] [hipe] [kernel-poll:true] +... +Eshell V9.3 (abort with ^G) +(mq@127.0.0.1)1> > ``` @@ -132,8 +79,7 @@ Creating Single File Bundle --------------------------- ``` -$ mad release emqttd -$ ./emqttd rep +$ make tar ``` User/Device Registration @@ -160,32 +106,9 @@ ok > emqttd_ctl:run(["help"]). ``` -MQTT Erlang Client ------------------- - -``` -$ mad com -==> "/Users/maxim/depot/voxoz/emqttc/examples/gen_server" -Compiling /src/gen_server_example.erl -Writing /ebin/gen_server_example.app -OK -bash-3.2$ ./run -Erlang/OTP 19 [erts-8.2] [source] [64-bit] [smp:4:4] - [async-threads:10] [hipe] [kernel-poll:false] [dtrace] - -Eshell V8.2 (abort with ^G) -1> [info] [Client <0.58.0>]: connecting to 127.0.0.1:1883 -[info] [Client <0.58.0>] connected with 127.0.0.1:1883 -[info] [Client <0.58.0>] RECV: CONNACK_ACCEPT -Client <0.58.0> is connected -[warning] [simpleClient@127.0.0.1:64618] resubscribe [{<<"TopicA">>,1}] -Message from TopicA: <<"hello...1">> -Message from TopicB: <<"hello...1">> -``` Credits ------- * Maxim Sokhatsky - -OM A HUM +* Ulf Wiger diff --git a/apps/roster/src/roster.app.src b/apps/roster/src/roster.app.src index e5ed158381e133b9a1950c109e602c6724111cfc..05e4d7cf1c700c33f92bea00e8426d8e76d3f97a 100644 --- a/apps/roster/src/roster.app.src +++ b/apps/roster/src/roster.app.src @@ -2,6 +2,11 @@ [{description, "Roster Protocol"}, {vsn, "1"}, {registered, []}, - {applications, [kernel,stdlib,mnesia,kvs,emqttd,n2o,bpe,locus,prometheus,libphonenumber_erlang]}, + {applications, [kernel,stdlib, mnesia, crypto, inets, ssl, + ibrowse, cowlib, mochiweb, gen_smtp, + kvs, nitro, emqttc, emqttd, n2o, nitro, bpe, + jose, json_rec, jsx, uuid, erlydtl, jwt, + mad, migresia, mini_s3, qdate, rest, enenra, + locus, prometheus, libphonenumber_erlang]}, {mod, { roster, []}}, {env, []} ]}. diff --git a/otp.mk b/otp.mk deleted file mode 100644 index 2b74dc0b770eea8de329f9747b101df8c5178ff4..0000000000000000000000000000000000000000 --- a/otp.mk +++ /dev/null @@ -1,33 +0,0 @@ -VM := vm.args -SYS := sys.config -ERL_ARGS := -args_file $(VM) -config $(SYS) -RUN_DIR ?= . -LOG_DIR ?= ./log -empty := -ROOTS := deps apps -space := $(empty) $(empty) -comma := $(empty),$(empty) -VSN := $(shell git rev-parse HEAD | head -c 6) -DATE := $(shell date "+%Y%m%d-%H%M%S") -ERL_LIBS := $(subst $(space),:,$(ROOTS)) - -clean: - rm -f .applist - mad $@ -compile: - mad $@ -.applist: - mad plan -$(RUN_DIR) $(LOG_DIR): - mkdir -p $(RUN_DIR) & mkdir -p $(LOG_DIR) -attach: - to_erl $(RUN_DIR)/ -console: .applist - ERL_LIBS=$(ERL_LIBS) erl +pc unicode $(ERL_ARGS) -eval '[application:ensure_started(A) || A <- $(shell cat .applist)]' -start: $(RUN_DIR) $(LOG_DIR) .applist - RUN_ERL_LOG_GENERATIONS=1000 RUN_ERL_LOG_MAXSIZE=20000000 \ - ERL_LIBS=$(ERL_LIBS) run_erl -daemon $(RUN_DIR)/ $(LOG_DIR)/ "exec $(MAKE) console" -stop: - @kill -9 $(shell ps ax -o pid= -o command=|grep $(RELEASE)|grep $(COOKIE)|awk '{print $$1}') - -.PHONY: compile clean console start diff --git a/rebar.config b/rebar.config index 71df83a2c3648303c5f5123106344f20e0562994..20c8d28c76e685bdb6a8bb6665196504616f69e1 100644 --- a/rebar.config +++ b/rebar.config @@ -1,3 +1,4 @@ +%% -*- mode:erlang; erlang-indent-level: 4; indent-tabs-mode: nil -*- {sub_dirs,["apps"]}. {lib_dirs,["apps","deps"]}. {deps_dir,"deps"}. @@ -12,7 +13,7 @@ {rest, ".*", {git, "git://github.com/synrc/rest",{tag,"5.10"}}}, {gen_smtp, ".*", {git, "git://github.com/voxoz/gen_smtp",{tag,"master"}}}, {emq_dashboard, ".*", {git, "https://github.com/synrc/emq_dashboard",{tag,"master"}}}, - {'opencensus-erlang', ".*", {git, "https://github.com/voxoz/opencensus-erlang",{tag, "v0.4.0"}}}, + {opencensus, ".*", {git, "https://github.com/voxoz/opencensus-erlang",{tag, "v0.4.0"}}}, {libphonenumber_erlang, ".*", {git, "https://github.com/marinakr/libphonenumber_erlang.git",{tag,"master"}}}, {gproc, ".*", {git, "https://github.com/uwiger/gproc","0.6.1"}}, {erlydtl, ".*", {git, "git://github.com/voxoz/erlydtl",{tag,"master"}}}, @@ -27,25 +28,48 @@ {rfc3339, ".*", {git, "https://github.com/talentdeficit/rfc3339",{tag,"0.2.2"}}}, {locus, ".*", {git, "https://github.com/g-andrade/locus.git",{ref,"0ea9079ce5686573e0e70e2b1311343dd25feef8"}}}, {prometheus, ".*", {git, "https://github.com/deadtrickster/prometheus.erl",{tag,"master"}}}, - {cowboy, ".*", {git, "git://github.com/voxoz/cowboy", {tag,"master"}}}, - {'jose-erlang', ".*", {git, "https://github.com/manifest/jose-erlang.git", {tag,"master"}}}, - {json_rec, ".*", {git, "https://github.com/justinkirby/json_rec.git", {tag,"master"}}}, - {'erlang-uuid', ".*", {git, "https://github.com/avtobiff/erlang-uuid.git",{tag,"master"}}}, + {cowboy, ".*", {git, "git://github.com/ninenines/cowboy", {tag,"2.7.0"}}}, + {jose, ".*", {git, "https://github.com/NYNJA-MC/jose-erlang.git", {ref, "7094018"}}}, + {json_rec, ".*", {git, "https://github.com/justinkirby/json_rec.git", {tag,"master"}}}, + {uuid, ".*", {git, "https://github.com/avtobiff/erlang-uuid.git",{tag,"master"}}}, {enenra, ".*", {git, "https://github.com/nlfiedler/enenra", {tag, "0.3.0"}}}, {'qdate', ".*", {git, "https://github.com/enterprizing/qdate.git",{ref,"fba988fc54214bb37a3ce11d5c5a3cc68752c3ce"}}} ]}. + + +{profiles, [{local, [{relx, [{dev_mode, true}, + {include_erts, false}, + {include_src, true}]} + ]}, + {prod, [{relx, [{dev_mode, false}, + {include_erts, true}, + {include_src, true}, + {overlay, []} + ]} + ]} + ]}. + {erl_opts, [{parse_transform,lager_transform},{parse_transform, oc_transform},debug_info]}. {relx, [{release, {server, "1.0.0"}, - [roster, service]}, - {sys_config, "./sys.config"}, - {vm_args, "./vm.args"}, - {dev_mode, true}, - {include_erts, false}, - {extended_start_script, true} - ] - }. - {profiles, [ - {prod, [{relx, [{dev_mode, false}, - {include_erts, true}]} - ]} - ]}. + %% Copied from .applist in older version. Should be cleaned up. + [kernel,stdlib,prometheus,bert,fs,gproc,gen_logger,n2o, + metrics,mimerl,unicode_util_compat,base64url,jsx,tools, + certifi,ibrowse,asn1,sasl,compiler,xmerl,counters,ctx,inets, + wts,syntax_tools,qdate_localtime,crypto,mnesia, + libphonenumber_erlang,syn,cowlib,kvs,jiffy,idna,parse_trans, + goldrush,esockd,public_key,bpe,lager,ssl,ranch,mochiweb, + ssl_verify_fun,locus,emqttd,hackney,roster,service,active, + cowboy,emq_dashboard,emqttc,enenra,envy,uuid,erlydtl,forms, + gen_smtp,json_rec,jwt,mad,migresia,mini_s3,nitro,opencensus, + qdate,rest,rfc3339,sh,stacktrace_compat]}, + {sys_config, "./sys.config"}, + {vm_args, "./vm.args"}, + {dev_mode, true}, + {include_erts, false}, + {extended_start_script, true}, + {overlay, [{copy, "admin", "./admin"}, + {copy, "priv", "./priv"}, + {copy, "etc", "./etc"}, + {copy, "asserts", "./asserts"} + ]} + ]}. diff --git a/rebar.lock b/rebar.lock index f641a2fbb6bca33e10d4417842103b9f24c3d93d..ab7819bad4c99013717b5438e59b7be652bc7c22 100644 --- a/rebar.lock +++ b/rebar.lock @@ -1,5 +1,9 @@ {"1.1.0", -[{<<"base64url">>, +[{<<"active">>, + {git,"git://github.com/synrc/active", + {ref,"cdd8f2b0f62b9785673bdbea7be90e1ae1ca1c02"}}, + 0}, + {<<"base64url">>, {git,"https://github.com/dvv/base64url.git", {ref,"f2c64ed8b9bebc536fad37ad97243452b674b837"}}, 0}, @@ -12,42 +16,44 @@ {ref,"356c9e621c38e927a8611ecac592bcdc8d689026"}}, 0}, {<<"certifi">>,{pkg,<<"certifi">>,<<"2.4.2">>},1}, + {<<"cf">>,{pkg,<<"cf">>,<<"0.3.1">>},2}, {<<"counters">>, {git,"https://github.com/deadtrickster/counters.erl.git", {ref,"c3f4aa3acdf71c3db0a4b3fc1343aa45de2c5df0"}}, 0}, {<<"cowboy">>, - {git,"git://github.com/voxoz/cowboy", - {ref,"c1cfbfa5dc6b5f6ecd9591ad5bf642b6a107a7f5"}}, + {git,"git://github.com/ninenines/cowboy", + {ref,"63b17e4edf666d995ec86cdcda17a62ba5ebc423"}}, 0}, {<<"cowlib">>, - {git,"git://github.com/voxoz/cowlib", - {ref,"5cc0038d0a3ae6a829646ddfff998d8c491969ca"}}, + {git,"https://github.com/ninenines/cowlib", + {ref,"c6553f8308a2ca5dcd69d845f0a7d098c40c3363"}}, 1}, {<<"ctx">>, {git,"https://github.com/tsloughter/ctx.git", - {ref,"a5a6b0948708e02bc7b9cb6248807c9ff8327940"}}, + {ref,"91c892b51d3340fc004099e15e4e029a5ec0e098"}}, 0}, {<<"emq_dashboard">>, {git,"https://github.com/synrc/emq_dashboard", - {ref,"f711e8d2b0a992f5540123f3504eebabc324a684"}}, + {ref,"3317c7dd47b07d28d7dbea4de971b48fc042fefd"}}, 0}, {<<"emqttc">>, {git,"git://github.com/voxoz/emqttc", - {ref,"141fd2e925be854321d22005313762adb1195f48"}}, + {ref,"53da0022169ac511018257749b1a193c24bb5be2"}}, 0}, {<<"emqttd">>, {git,"git://github.com/synrc/emqttd", - {ref,"c3d0b7b092fffe7bebe27af27dbbfe1714757d1c"}}, + {ref,"2be612e0e7a00a866cd9af350a030966d73fbc09"}}, + 0}, + {<<"enenra">>, + {git,"https://github.com/nlfiedler/enenra", + {ref,"ccc2553b8df5a188cdc77aeec7b856a1e5250e67"}}, 0}, {<<"envy">>, {git,"https://github.com/markan/envy.git", {ref,"0148fb4b7ed0e188511578e98b42d6e7dde0ebd1"}}, 1}, - {<<"erlang-uuid">>, - {git,"https://github.com/avtobiff/erlang-uuid.git", - {ref,"cb02a2039a9b29dd2eef0446039c9c6e164df9ef"}}, - 0}, + {<<"erlware_commons">>,{pkg,<<"erlware_commons">>,<<"1.3.1">>},1}, {<<"erlydtl">>, {git,"git://github.com/voxoz/erlydtl", {ref,"bdebe6f87d8f989018facbbf8dc6320936ffe98f"}}, @@ -60,6 +66,10 @@ {git,"git://github.com/synrc/forms", {ref,"845feb45a46dfc2e0e9a156da9c01c218d8fd6cc"}}, 1}, + {<<"fs">>, + {git,"git://github.com/synrc/fs", + {ref,"45ca2003b208f461ef4acd56c5fdecd2e98e1f33"}}, + 1}, {<<"gen_logger">>, {git,"git://github.com/voxoz/gen_logger", {ref,"5b14530363feb0b049c4f5c7c606f815aec781d2"}}, @@ -76,10 +86,27 @@ {git,"https://github.com/uwiger/gproc", {ref,"1d16f5e6d7cf616eec4395f2385e3a680a4ffc9f"}}, 0}, + {<<"hackney">>, + {git,"https://github.com/benoitc/hackney", + {ref,"f2ac65700ef7918eb4e827892f1a7bb01e826026"}}, + 1}, {<<"ibrowse">>, {git,"git://github.com/cmullaparthi/ibrowse.git", {ref,"c97136cfb61fcc6f39d4e7da47372a64f7fca04e"}}, 1}, + {<<"idna">>,{pkg,<<"idna">>,<<"6.0.0">>},2}, + {<<"jiffy">>, + {git,"https://github.com/davisp/jiffy", + {ref,"c942525130ff0271bd318715406f234c0dc9bc5a"}}, + 1}, + {<<"jose">>, + {git,"https://github.com/NYNJA-MC/jose-erlang.git", + {ref,"709401825367c029986a3bc688de3ed016b914cd"}}, + 0}, + {<<"json_rec">>, + {git,"https://github.com/justinkirby/json_rec.git", + {ref,"8c72324e0f6fca8534ca733f8af03d4808f7e3be"}}, + 0}, {<<"jsx">>, {git,"https://github.com/talentdeficit/jsx.git", {ref,"fc2a001073f2300ba38427c23e83d5673c020542"}}, @@ -94,20 +121,26 @@ 1}, {<<"lager">>, {git,"git://github.com/voxoz/lager", - {ref,"1ecf4c17e9e39dd7a1943140477f632d17518f0c"}}, + {ref,"9d657ab5acc9e82354f945ef819dab3760fe63cb"}}, 1}, {<<"libphonenumber_erlang">>, {git,"https://github.com/marinakr/libphonenumber_erlang.git", - {ref,"3a6be75ef4f6fdd40fa8afee2a7fc5cf2ddb8601"}}, + {ref,"a78037e6f06f0aeeed9eaf4b8abaf378d24a0d01"}}, 0}, {<<"locus">>, {git,"https://github.com/g-andrade/locus.git", {ref,"0ea9079ce5686573e0e70e2b1311343dd25feef8"}}, 0}, + {<<"mad">>, + {git,"git://github.com/synrc/mad", + {ref,"0cd4d9e709d0ca70ec6d01b9d434692eff51222d"}}, + 1}, + {<<"metrics">>,{pkg,<<"metrics">>,<<"1.0.1">>},2}, {<<"migresia">>, {git,"https://github.com/yoonka/migresia.git", {ref,"40e11825e01502d045e87bf8b5d7dc5a9d6e3f73"}}, 0}, + {<<"mimerl">>,{pkg,<<"mimerl">>,<<"1.0.2">>},2}, {<<"mini_s3">>, {git,"https://github.com/chef/mini_s3.git", {ref,"df0c68ea901343b8e0c647142d88d7f3aae27e7b"}}, @@ -124,18 +157,26 @@ {git,"git://github.com/synrc/nitro", {ref,"1aeb421c332f94b135563f8e855b139c1b067f59"}}, 1}, - {<<"opencensus-erlang">>, + {<<"opencensus">>, {git,"https://github.com/voxoz/opencensus-erlang", {ref,"8dc9ae86f5c1ef69593fe37b49e649afed6bd201"}}, 0}, - {<<"parse_trans">>,{pkg,<<"parse_trans">>,<<"3.3.0">>},2}, + {<<"parse_trans">>, + {git,"https://github.com/uwiger/parse_trans.git", + {ref,"e61ab8e09eee791222ba49a5706162c4985f24b0"}}, + 1}, {<<"prometheus">>, {git,"https://github.com/deadtrickster/prometheus.erl", - {ref,"46ea4b487baf4f6cc44495eae07582808e0369d4"}}, + {ref,"39c6595728041fa075561c03f3d45881065cc7e7"}}, + 0}, + {<<"qdate">>, + {git,"https://github.com/enterprizing/qdate.git", + {ref,"fba988fc54214bb37a3ce11d5c5a3cc68752c3ce"}}, 0}, + {<<"qdate_localtime">>,{pkg,<<"qdate_localtime">>,<<"1.1.0">>},1}, {<<"ranch">>, - {git,"git://github.com/voxoz/ranch", - {ref,"1a75038c82ede22efec46a7dca192b8ce26309e0"}}, + {git,"https://github.com/ninenines/ranch", + {ref,"3190aef88aea04d6dce8545fe9b4574288903f44"}}, 1}, {<<"rest">>, {git,"git://github.com/synrc/rest", @@ -145,20 +186,35 @@ {git,"https://github.com/talentdeficit/rfc3339", {ref,"90effc078c5e673d025b2c1269a153ad4748d3df"}}, 0}, + {<<"sh">>, + {git,"git://github.com/synrc/sh", + {ref,"a4e646aba9a4c18a34d19089e8b9391076b2bff8"}}, + 2}, {<<"ssl_verify_fun">>,{pkg,<<"ssl_verify_fun">>,<<"1.1.4">>},1}, {<<"stacktrace_compat">>,{pkg,<<"stacktrace_compat">>,<<"1.0.2">>},1}, {<<"syn">>, {git,"git://github.com/ostinelli/syn", {ref,"9964eb8969b6e1e712249d3aed4f3dfafd3aaac3"}}, 1}, + {<<"unicode_util_compat">>,{pkg,<<"unicode_util_compat">>,<<"0.4.1">>},3}, + {<<"uuid">>, + {git,"https://github.com/avtobiff/erlang-uuid.git", + {ref,"cb02a2039a9b29dd2eef0446039c9c6e164df9ef"}}, + 0}, {<<"wts">>, {git,"https://github.com/tsloughter/wts.git", - {ref,"5613b6c4354867fd2b02fde5ef15bf80190b8586"}}, + {ref,"09c039e4d9f7ab9b984c9ffb45dd0db0add58f96"}}, 0}]}. [ {pkg_hash,[ {<<"certifi">>, <<"75424FF0F3BAACCFD34B1214184B6EF616D89E420B258BB0A5EA7D7BC628F7F0">>}, - {<<"parse_trans">>, <<"09765507A3C7590A784615CFD421D101AEC25098D50B89D7AA1D66646BC571C1">>}, + {<<"cf">>, <<"5CB902239476E141EA70A740340233782D363A31EEA8AD37049561542E6CD641">>}, + {<<"erlware_commons">>, <<"0CE192AD69BC6FD0880246D852D0ECE17631E234878011D1586E053641ED4C04">>}, + {<<"idna">>, <<"689C46CBCDF3524C44D5F3DDE8001F364CD7608A99556D8FBD8239A5798D4C10">>}, + {<<"metrics">>, <<"25F094DEA2CDA98213CECC3AEFF09E940299D950904393B2A29D191C346A8486">>}, + {<<"mimerl">>, <<"993F9B0E084083405ED8252B99460C4F0563E41729AB42D9074FD5E52439BE88">>}, + {<<"qdate_localtime">>, <<"5F6C3ACF10ECC5A7E2EFA3DCD2C863102B962188DBD9E086EC01D29FE029DA29">>}, {<<"ssl_verify_fun">>, <<"F0EAFFF810D2041E93F915EF59899C923F4568F4585904D010387ED74988E77B">>}, - {<<"stacktrace_compat">>, <<"8AD31C32C9A0EADB1EB298F04DC8B0C8D79BCC6233A638B02791FFCA4F331275">>}]} + {<<"stacktrace_compat">>, <<"8AD31C32C9A0EADB1EB298F04DC8B0C8D79BCC6233A638B02791FFCA4F331275">>}, + {<<"unicode_util_compat">>, <<"D869E4C68901DD9531385BB0C8C40444EBF624E60B6962D95952775CAC5E90CD">>}]} ]. diff --git a/rebar3 b/rebar3 new file mode 100755 index 0000000000000000000000000000000000000000..865ec59000c95fec9d6adf6c0e24f42c88f5014c Binary files /dev/null and b/rebar3 differ