From 2d10cd0ecc8c3972716a9cb025e39991d558fd55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 17 Oct 2017 14:54:56 +0200 Subject: [PATCH 01/35] Fixing JSON WiP. Refactor & Write tests. --- ethcore/src/client/evm_test_client.rs | 2 +- evmbin/src/display/json.rs | 32 ++++++++++++++++++++++++--- evmbin/src/main.rs | 2 +- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/ethcore/src/client/evm_test_client.rs b/ethcore/src/client/evm_test_client.rs index ff03554f9..7734d5ad2 100644 --- a/ethcore/src/client/evm_test_client.rs +++ b/ethcore/src/client/evm_test_client.rs @@ -219,7 +219,7 @@ impl<'a> EvmTestClient<'a> { TransactResult::Ok { state_root: *self.state.root(), gas_left: initial_gas - result.receipt.gas_used, - output: result.output + output: result.output, } }, Err(error) => TransactResult::Err { diff --git a/evmbin/src/display/json.rs b/evmbin/src/display/json.rs index b36653c78..3de0d261c 100644 --- a/evmbin/src/display/json.rs +++ b/evmbin/src/display/json.rs @@ -37,6 +37,8 @@ pub struct Informant { stack: Vec, memory: Vec, storage: HashMap, + traces: Vec, + subtraces: Vec, } impl Informant { @@ -57,6 +59,14 @@ impl Informant { } } +impl Drop for Informant { + fn drop(&mut self) { + for trace in &self.traces { + println!("{}", trace); + } + } +} + impl vm::Informant for Informant { fn before_test(&self, name: &str, action: &str) { println!( @@ -104,18 +114,19 @@ impl trace::VMTracer for Informant { fn trace_executed(&mut self, gas_used: U256, stack_push: &[U256], mem_diff: Option<(usize, &[u8])>, store_diff: Option<(U256, U256)>) { let info = ::evm::INSTRUCTIONS[self.instruction as usize]; - println!( + let trace = format!( "{{\"pc\":{pc},\"op\":{op},\"opName\":\"{name}\",\"gas\":{gas},\"gasCost\":{gas_cost},\"memory\":{memory},\"stack\":{stack},\"storage\":{storage},\"depth\":{depth}}}", pc = self.pc, op = self.instruction, name = info.name, - gas = display::u256_as_str(&(gas_used + self.gas_cost)), + gas = display::u256_as_str(&(gas_used.saturating_add(self.gas_cost))), gas_cost = display::u256_as_str(&self.gas_cost), memory = self.memory(), stack = self.stack(), storage = self.storage(), depth = self.depth, ); + self.traces.push(trace); self.gas_used = gas_used; @@ -133,6 +144,11 @@ impl trace::VMTracer for Informant { if let Some((pos, val)) = store_diff { self.storage.insert(pos.into(), val.into()); } + + + if !self.subtraces.is_empty() { + self.traces.extend(::std::mem::replace(&mut self.subtraces, vec![])); + } } fn prepare_subtrace(&self, code: &[u8]) -> Self where Self: Sized { @@ -144,13 +160,23 @@ impl trace::VMTracer for Informant { } fn done_subtrace(&mut self, mut sub: Self) { + let subtraces = ::std::mem::replace(&mut sub.traces, vec![]); if sub.depth == 1 { + self.traces.extend(subtraces); // print last line with final state: sub.gas_cost = 0.into(); let gas_used = sub.gas_used; trace::VMTracer::trace_executed(&mut sub, gas_used, &[], None, None); + } else { + self.subtraces = subtraces; } } - fn drain(self) -> Option { None } + fn drain(self) -> Option { + println!("Drain called."); + for trace in &self.traces { + println!("{}", trace); + } + None + } } diff --git a/evmbin/src/main.rs b/evmbin/src/main.rs index d3668037f..b37654c04 100644 --- a/evmbin/src/main.rs +++ b/evmbin/src/main.rs @@ -187,7 +187,7 @@ impl Args { pub fn gas(&self) -> Result { match self.flag_gas { Some(ref gas) => gas.parse().map_err(to_string), - None => Ok(!U256::zero()), + None => Ok(U256::from(u64::max_value())), } } From 2d222a59207593e9ee69eb337851392e4b36dc76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Fri, 20 Oct 2017 15:40:25 +0200 Subject: [PATCH 02/35] Capture traces and write some tests. --- Cargo.lock | 1 + ethcore/src/client/client.rs | 2 +- ethcore/src/client/evm_test_client.rs | 7 +- ethcore/src/executed.rs | 6 +- ethcore/src/executive.rs | 16 +-- ethcore/src/state/mod.rs | 14 +- ethcore/src/trace/executive_tracer.rs | 4 + ethcore/src/trace/mod.rs | 18 ++- ethcore/src/trace/noop_tracer.rs | 4 + evmbin/Cargo.toml | 3 + evmbin/src/display/json.rs | 86 ++++++------ evmbin/src/display/simple.rs | 6 +- evmbin/src/info.rs | 180 +++++++++++++++++++++++--- evmbin/src/main.rs | 11 +- rpc/Cargo.toml | 2 +- 15 files changed, 267 insertions(+), 93 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b38433244..de14f0765 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -940,6 +940,7 @@ dependencies = [ "ethjson 0.1.0", "evm 0.1.0", "panic_hook 0.1.0", + "pretty_assertions 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)", "serde_derive 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/ethcore/src/client/client.rs b/ethcore/src/client/client.rs index b65e698df..f3f06438f 100644 --- a/ethcore/src/client/client.rs +++ b/ethcore/src/client/client.rs @@ -1142,7 +1142,7 @@ impl Client { state_diff: bool, transaction: &SignedTransaction, options: TransactOptions, - ) -> Result where + ) -> Result, CallError> where T: trace::Tracer, V: trace::VMTracer, { diff --git a/ethcore/src/client/evm_test_client.rs b/ethcore/src/client/evm_test_client.rs index 366735d56..814e119ba 100644 --- a/ethcore/src/client/evm_test_client.rs +++ b/ethcore/src/client/evm_test_client.rs @@ -197,7 +197,7 @@ impl<'a> EvmTestClient<'a> { env_info: &client::EnvInfo, transaction: transaction::SignedTransaction, vm_tracer: T, - ) -> TransactResult { + ) -> TransactResult { let initial_gas = transaction.gas; // Verify transaction let is_ok = transaction.verify_basic(true, None, env_info.number >= self.spec.engine.params().eip86_transition); @@ -219,6 +219,7 @@ impl<'a> EvmTestClient<'a> { state_root: *self.state.root(), gas_left: initial_gas - result.receipt.gas_used, output: result.output, + vm_trace: result.vm_trace, } }, Err(error) => TransactResult::Err { @@ -230,7 +231,7 @@ impl<'a> EvmTestClient<'a> { } /// A result of applying transaction to the state. -pub enum TransactResult { +pub enum TransactResult { /// Successful execution Ok { /// State root @@ -239,6 +240,8 @@ pub enum TransactResult { gas_left: U256, /// Output output: Vec, + /// VM Traces + vm_trace: Option, }, /// Transaction failed to run Err { diff --git a/ethcore/src/executed.rs b/ethcore/src/executed.rs index 490681dfb..5035e5eb8 100644 --- a/ethcore/src/executed.rs +++ b/ethcore/src/executed.rs @@ -29,7 +29,7 @@ use std::fmt; /// Transaction execution receipt. #[derive(Debug, PartialEq, Clone)] -pub struct Executed { +pub struct Executed { /// True if the outer call/create resulted in an exceptional exit. pub exception: Option, @@ -63,9 +63,9 @@ pub struct Executed { /// Transaction output. pub output: Bytes, /// The trace of this transaction. - pub trace: Vec, + pub trace: Vec, /// The VM trace of this transaction. - pub vm_trace: Option, + pub vm_trace: Option, /// The state diff, if we traced it. pub state_diff: Option, } diff --git a/ethcore/src/executive.rs b/ethcore/src/executive.rs index 3709ea449..a23f60007 100644 --- a/ethcore/src/executive.rs +++ b/ethcore/src/executive.rs @@ -30,7 +30,7 @@ use evm::{CallType, Factory, Finalize, FinalizationResult}; use vm::{self, Ext, CreateContractAddress, ReturnData, CleanDustMode, ActionParams, ActionValue}; use wasm; use externalities::*; -use trace::{self, FlatTrace, VMTrace, Tracer, VMTracer}; +use trace::{self, Tracer, VMTracer}; use transaction::{Action, SignedTransaction}; use crossbeam; pub use executed::{Executed, ExecutionResult}; @@ -214,7 +214,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { /// This function should be used to execute transaction. pub fn transact(&'a mut self, t: &SignedTransaction, options: TransactOptions) - -> Result where T: Tracer, V: VMTracer, + -> Result, ExecutionError> where T: Tracer, V: VMTracer, { self.transact_with_tracer(t, options.check_nonce, options.output_from_init_contract, options.tracer, options.vm_tracer) } @@ -223,7 +223,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { /// This will ensure the caller has enough balance to execute the desired transaction. /// Used for extra-block executions for things like consensus contracts and RPCs pub fn transact_virtual(&'a mut self, t: &SignedTransaction, options: TransactOptions) - -> Result where T: Tracer, V: VMTracer, + -> Result, ExecutionError> where T: Tracer, V: VMTracer, { let sender = t.sender(); let balance = self.state.balance(&sender)?; @@ -244,7 +244,7 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { output_from_create: bool, mut tracer: T, mut vm_tracer: V - ) -> Result where T: Tracer, V: VMTracer { + ) -> Result, ExecutionError> where T: Tracer, V: VMTracer { let sender = t.sender(); let nonce = self.state.nonce(&sender)?; @@ -587,15 +587,15 @@ impl<'a, B: 'a + StateBackend> Executive<'a, B> { } /// Finalizes the transaction (does refunds and suicides). - fn finalize( + fn finalize( &mut self, t: &SignedTransaction, mut substate: Substate, result: vm::Result, output: Bytes, - trace: Vec, - vm_trace: Option - ) -> ExecutionResult { + trace: Vec, + vm_trace: Option + ) -> Result, ExecutionError> { let schedule = self.machine.schedule(self.info.number); // refunds from SSTORE nonzero -> zero diff --git a/ethcore/src/state/mod.rs b/ethcore/src/state/mod.rs index dfde05921..a7a5a303b 100644 --- a/ethcore/src/state/mod.rs +++ b/ethcore/src/state/mod.rs @@ -62,19 +62,19 @@ pub use self::backend::Backend; pub use self::substate::Substate; /// Used to return information about an `State::apply` operation. -pub struct ApplyOutcome { +pub struct ApplyOutcome { /// The receipt for the applied transaction. pub receipt: Receipt, /// The output of the applied transaction. pub output: Bytes, /// The trace for the applied transaction, empty if tracing was not produced. - pub trace: Vec, + pub trace: Vec, /// The VM trace for the applied transaction, None if tracing was not produced. - pub vm_trace: Option + pub vm_trace: Option } /// Result type for the execution ("application") of a transaction. -pub type ApplyResult = Result; +pub type ApplyResult = Result, Error>; /// Return type of proof validity check. #[derive(Debug, Clone)] @@ -668,7 +668,7 @@ impl State { /// Execute a given transaction, producing a receipt and an optional trace. /// This will change the state accordingly. - pub fn apply(&mut self, env_info: &EnvInfo, machine: &Machine, t: &SignedTransaction, tracing: bool) -> ApplyResult { + pub fn apply(&mut self, env_info: &EnvInfo, machine: &Machine, t: &SignedTransaction, tracing: bool) -> ApplyResult { if tracing { let options = TransactOptions::with_tracing(); self.apply_with_tracing(env_info, machine, t, options.tracer, options.vm_tracer) @@ -687,7 +687,7 @@ impl State { t: &SignedTransaction, tracer: T, vm_tracer: V, - ) -> ApplyResult where + ) -> ApplyResult where T: trace::Tracer, V: trace::VMTracer, { @@ -728,7 +728,7 @@ impl State { // `virt` signals that we are executing outside of a block set and restrictions like // gas limits and gas costs should be lifted. fn execute(&mut self, env_info: &EnvInfo, machine: &Machine, t: &SignedTransaction, options: TransactOptions, virt: bool) - -> Result where T: trace::Tracer, V: trace::VMTracer, + -> Result, ExecutionError> where T: trace::Tracer, V: trace::VMTracer, { let mut e = Executive::new(self, env_info, machine); diff --git a/ethcore/src/trace/executive_tracer.rs b/ethcore/src/trace/executive_tracer.rs index 38c134e6b..2137d679d 100644 --- a/ethcore/src/trace/executive_tracer.rs +++ b/ethcore/src/trace/executive_tracer.rs @@ -83,6 +83,8 @@ fn should_prefix_address_properly() { } impl Tracer for ExecutiveTracer { + type Output = FlatTrace; + fn prepare_trace_call(&self, params: &ActionParams) -> Option { Some(Call::from(params.clone())) } @@ -201,6 +203,8 @@ impl ExecutiveVMTracer { } impl VMTracer for ExecutiveVMTracer { + type Output = VMTrace; + fn trace_next_instruction(&mut self, _pc: usize, _instruction: u8) -> bool { true } fn trace_prepare_execute(&mut self, pc: usize, instruction: u8, gas_cost: U256) { diff --git a/ethcore/src/trace/mod.rs b/ethcore/src/trace/mod.rs index f86daf13f..991e434fc 100644 --- a/ethcore/src/trace/mod.rs +++ b/ethcore/src/trace/mod.rs @@ -48,6 +48,9 @@ use header::BlockNumber; /// This trait is used by executive to build traces. pub trait Tracer: Send { + /// Data returned when draining the Tracer. + type Output; + /// Prepares call trace for given params. Noop tracer should return None. fn prepare_trace_call(&self, params: &ActionParams) -> Option; @@ -63,7 +66,7 @@ pub trait Tracer: Send { call: Option, gas_used: U256, output: Option, - subs: Vec, + subs: Vec, ); /// Stores trace create info. @@ -73,14 +76,14 @@ pub trait Tracer: Send { gas_used: U256, code: Option, address: Address, - subs: Vec + subs: Vec ); /// Stores failed call trace. - fn trace_failed_call(&mut self, call: Option, subs: Vec, error: TraceError); + fn trace_failed_call(&mut self, call: Option, subs: Vec, error: TraceError); /// Stores failed create trace. - fn trace_failed_create(&mut self, create: Option, subs: Vec, error: TraceError); + fn trace_failed_create(&mut self, create: Option, subs: Vec, error: TraceError); /// Stores suicide info. fn trace_suicide(&mut self, address: Address, balance: U256, refund_address: Address); @@ -92,12 +95,15 @@ pub trait Tracer: Send { fn subtracer(&self) -> Self where Self: Sized; /// Consumes self and returns all traces. - fn drain(self) -> Vec; + fn drain(self) -> Vec; } /// Used by executive to build VM traces. pub trait VMTracer: Send { + /// Data returned when draining the VMTracer. + type Output; + /// Trace the progression of interpreter to next instruction. /// If tracer returns `false` it won't be called again. /// @returns true if `trace_prepare_execute` and `trace_executed` should be called. @@ -116,7 +122,7 @@ pub trait VMTracer: Send { fn done_subtrace(&mut self, sub: Self) where Self: Sized; /// Consumes self and returns the VM trace. - fn drain(self) -> Option; + fn drain(self) -> Option; } /// `DbExtras` provides an interface to query extra data which is not stored in tracesdb, diff --git a/ethcore/src/trace/noop_tracer.rs b/ethcore/src/trace/noop_tracer.rs index 6def53c6c..bff8b9d44 100644 --- a/ethcore/src/trace/noop_tracer.rs +++ b/ethcore/src/trace/noop_tracer.rs @@ -27,6 +27,8 @@ use trace::trace::{Call, Create, VMTrace, RewardType}; pub struct NoopTracer; impl Tracer for NoopTracer { + type Output = FlatTrace; + fn prepare_trace_call(&self, _: &ActionParams) -> Option { None } @@ -76,6 +78,8 @@ impl Tracer for NoopTracer { pub struct NoopVMTracer; impl VMTracer for NoopVMTracer { + type Output = VMTrace; + fn trace_next_instruction(&mut self, _pc: usize, _instruction: u8) -> bool { false } fn trace_prepare_execute(&mut self, _pc: usize, _instruction: u8, _gas_cost: U256) {} diff --git a/evmbin/Cargo.toml b/evmbin/Cargo.toml index efb6ba591..200e5a735 100644 --- a/evmbin/Cargo.toml +++ b/evmbin/Cargo.toml @@ -22,5 +22,8 @@ evm = { path = "../ethcore/evm" } vm = { path = "../ethcore/vm" } panic_hook = { path = "../panic_hook" } +[dev-dependencies] +pretty_assertions = "0.1" + [features] evm-debug = ["ethcore/evm-debug-tests"] diff --git a/evmbin/src/display/json.rs b/evmbin/src/display/json.rs index 3de0d261c..badd16d2a 100644 --- a/evmbin/src/display/json.rs +++ b/evmbin/src/display/json.rs @@ -16,11 +16,13 @@ //! JSON VM output. -use ethcore::trace; use std::collections::HashMap; -use bigint::prelude::U256; +use std::mem; + use bigint::hash::H256; +use bigint::prelude::U256; use bytes::ToPretty; +use ethcore::trace; use display; use info as vm; @@ -39,6 +41,7 @@ pub struct Informant { storage: HashMap, traces: Vec, subtraces: Vec, + unmatched: bool, } impl Informant { @@ -59,14 +62,6 @@ impl Informant { } } -impl Drop for Informant { - fn drop(&mut self) { - for trace in &self.traces { - println!("{}", trace); - } - } -} - impl vm::Informant for Informant { fn before_test(&self, name: &str, action: &str) { println!( @@ -80,28 +75,43 @@ impl vm::Informant for Informant { self.gas_used = gas; } - fn finish(result: Result) { + fn finish(result: vm::RunResult) { match result { - Ok(success) => println!( - "{{\"output\":\"0x{output}\",\"gasUsed\":\"{gas:x}\",\"time\":{time}}}", - output = success.output.to_hex(), - gas = success.gas_used, - time = display::as_micros(&success.time), - ), - Err(failure) => println!( - "{{\"error\":\"{error}\",\"gasUsed\":\"{gas:x}\",\"time\":{time}}}", - error = failure.error, - gas = failure.gas_used, - time = display::as_micros(&failure.time), - ), + Ok(success) => { + for trace in success.traces.unwrap_or_else(Vec::new) { + println!("{}", trace); + } + + println!( + "{{\"output\":\"0x{output}\",\"gasUsed\":\"{gas:x}\",\"time\":{time}}}", + output = success.output.to_hex(), + gas = success.gas_used, + time = display::as_micros(&success.time), + ) + }, + Err(failure) => { + for trace in failure.traces.unwrap_or_else(Vec::new) { + println!("{}", trace); + } + + println!( + "{{\"error\":\"{error}\",\"gasUsed\":\"{gas:x}\",\"time\":{time}}}", + error = failure.error, + gas = failure.gas_used, + time = display::as_micros(&failure.time), + ) + }, } } } impl trace::VMTracer for Informant { + type Output = Vec; + fn trace_next_instruction(&mut self, pc: usize, instruction: u8) -> bool { self.pc = pc; self.instruction = instruction; + self.unmatched = true; true } @@ -128,6 +138,7 @@ impl trace::VMTracer for Informant { ); self.traces.push(trace); + self.unmatched = false; self.gas_used = gas_used; let len = self.stack.len(); @@ -147,7 +158,7 @@ impl trace::VMTracer for Informant { if !self.subtraces.is_empty() { - self.traces.extend(::std::mem::replace(&mut self.subtraces, vec![])); + self.traces.extend(mem::replace(&mut self.subtraces, vec![])); } } @@ -159,24 +170,21 @@ impl trace::VMTracer for Informant { vm } - fn done_subtrace(&mut self, mut sub: Self) { - let subtraces = ::std::mem::replace(&mut sub.traces, vec![]); - if sub.depth == 1 { - self.traces.extend(subtraces); - // print last line with final state: - sub.gas_cost = 0.into(); - let gas_used = sub.gas_used; - trace::VMTracer::trace_executed(&mut sub, gas_used, &[], None, None); - } else { - self.subtraces = subtraces; + fn done_subtrace(&mut self, sub: Self) { + if let Some(subtraces) = sub.drain() { + self.subtraces.extend(subtraces); } } - fn drain(self) -> Option { - println!("Drain called."); - for trace in &self.traces { - println!("{}", trace); + fn drain(mut self) -> Option { + if self.unmatched { + // print last line with final state: + self.gas_cost = 0.into(); + let gas_used = self.gas_used; + self.trace_executed(gas_used, &[], None, None); + } else if !self.subtraces.is_empty() { + self.traces.extend(mem::replace(&mut self.subtraces, vec![])); } - None + Some(self.traces) } } diff --git a/evmbin/src/display/simple.rs b/evmbin/src/display/simple.rs index 9f6773734..6e9959a8e 100644 --- a/evmbin/src/display/simple.rs +++ b/evmbin/src/display/simple.rs @@ -31,7 +31,7 @@ impl vm::Informant for Informant { println!("Test: {} ({})", name, action); } - fn finish(result: Result) { + fn finish(result: vm::RunResult) { match result { Ok(success) => { println!("Output: 0x{}", success.output.to_hex()); @@ -47,7 +47,9 @@ impl vm::Informant for Informant { } impl trace::VMTracer for Informant { + type Output = (); + fn prepare_subtrace(&self, _code: &[u8]) -> Self where Self: Sized { Default::default() } fn done_subtrace(&mut self, _sub: Self) {} - fn drain(self) -> Option { None } + fn drain(self) -> Option<()> { None } } diff --git a/evmbin/src/info.rs b/evmbin/src/info.rs index 4af30db71..218a3c419 100644 --- a/evmbin/src/info.rs +++ b/evmbin/src/info.rs @@ -22,6 +22,7 @@ use bigint::hash::H256; use ethcore::{trace, spec, transaction, pod_state}; use ethcore::client::{self, EvmTestClient, EvmTestError, TransactResult}; use ethjson; +use vm::ActionParams; /// VM execution informant pub trait Informant: trace::VMTracer { @@ -30,27 +31,51 @@ pub trait Informant: trace::VMTracer { /// Set initial gas. fn set_gas(&mut self, _gas: U256) {} /// Display final result. - fn finish(result: Result); + fn finish(result: RunResult); } /// Execution finished correctly -pub struct Success { +#[derive(Debug)] +pub struct Success { /// Used gas pub gas_used: U256, /// Output as bytes pub output: Vec, /// Time Taken pub time: Duration, + /// Traces + pub traces: Option, } /// Execution failed -pub struct Failure { +#[derive(Debug)] +pub struct Failure { /// Used gas pub gas_used: U256, /// Internal error pub error: EvmTestError, /// Duration pub time: Duration, + /// Traces + pub traces: Option, +} + +/// EVM Execution result +pub type RunResult = Result, Failure>; + +/// Execute given `ActionParams` and return the result. +pub fn run_action( + spec: &spec::Spec, + params: ActionParams, + mut informant: T, +) -> RunResult { + informant.set_gas(params.gas); + run(spec, params.gas, None, |mut client| { + let result = client + .call(params, &mut informant) + .map(|r| (r.gas_left, r.return_data.to_vec())); + (result, informant.drain()) + }) } /// Execute given Transaction and verify resulting state root. @@ -82,19 +107,19 @@ pub fn run_transaction( let result = client.transact(env_info, transaction, informant); match result { TransactResult::Ok { state_root, .. } if state_root != post_root => { - Err(EvmTestError::PostCondition(format!( + (Err(EvmTestError::PostCondition(format!( "State root mismatch (got: {}, expected: {})", state_root, post_root, - ))) + ))), None) }, - TransactResult::Ok { gas_left, output, .. } => { - Ok((gas_left, output)) + TransactResult::Ok { gas_left, output, vm_trace, .. } => { + (Ok((gas_left, output)), vm_trace) }, TransactResult::Err { error, .. } => { - Err(EvmTestError::PostCondition(format!( + (Err(EvmTestError::PostCondition(format!( "Unexpected execution error: {:?}", error - ))) + ))), None) }, } }); @@ -103,8 +128,13 @@ pub fn run_transaction( } /// Execute VM with given `ActionParams` -pub fn run<'a, F, T>(spec: &'a spec::Spec, initial_gas: U256, pre_state: T, run: F) -> Result where - F: FnOnce(EvmTestClient) -> Result<(U256, Vec), EvmTestError>, +pub fn run<'a, F, T, X>( + spec: &'a spec::Spec, + initial_gas: U256, + pre_state: T, + run: F, +) -> RunResult where + F: FnOnce(EvmTestClient) -> (Result<(U256, Vec), EvmTestError>, Option), T: Into>, { let test_client = match pre_state.into() { @@ -113,23 +143,135 @@ pub fn run<'a, F, T>(spec: &'a spec::Spec, initial_gas: U256, pre_state: T, run: }.map_err(|error| Failure { gas_used: 0.into(), error, - time: Duration::from_secs(0) + time: Duration::from_secs(0), + traces: None, })?; let start = Instant::now(); let result = run(test_client); - let duration = start.elapsed(); + let time = start.elapsed(); match result { - Ok((gas_left, output)) => Ok(Success { + (Ok((gas_left, output)), traces) => Ok(Success { gas_used: initial_gas - gas_left, - output: output, - time: duration, + output, + time, + traces, }), - Err(e) => Err(Failure { + (Err(error), traces) => Err(Failure { gas_used: initial_gas, - error: e, - time: duration, + error, + time, + traces, }), } } + +#[cfg(test)] +mod tests { + use std::sync::Arc; + use rustc_hex::FromHex; + use super::*; + + #[test] + fn should_trace_failure() { + run_test( + "60F8d6", + 0xffff, + r#" +{"pc":0,"op":96,"opName":"PUSH1","gas":"0xffff","gasCost":"0x3","memory":"0x","stack":[],"storage":{},"depth":1} +{"pc":2,"op":214,"opName":"","gas":"0xfffc","gasCost":"0x0","memory":"0x","stack":["0xf8"],"storage":{},"depth":1} + "#, + ); + + run_test( + "F8d6", + 0xffff, + r#" +{"pc":0,"op":248,"opName":"","gas":"0xffff","gasCost":"0x0","memory":"0x","stack":[],"storage":{},"depth":1} + "#, + ); + } + + #[test] + fn should_trace_create_correctly() { + run_test( + "32343434345830f138343438323439f0", + 0xffff, + r#" +{"pc":0,"op":50,"opName":"ORIGIN","gas":"0xffff","gasCost":"0x2","memory":"0x","stack":[],"storage":{},"depth":1} +{"pc":1,"op":52,"opName":"CALLVALUE","gas":"0xfffd","gasCost":"0x2","memory":"0x","stack":["0x0"],"storage":{},"depth":1} +{"pc":2,"op":52,"opName":"CALLVALUE","gas":"0xfffb","gasCost":"0x2","memory":"0x","stack":["0x0","0x0"],"storage":{},"depth":1} +{"pc":3,"op":52,"opName":"CALLVALUE","gas":"0xfff9","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0"],"storage":{},"depth":1} +{"pc":4,"op":52,"opName":"CALLVALUE","gas":"0xfff7","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0","0x0"],"storage":{},"depth":1} +{"pc":5,"op":88,"opName":"PC","gas":"0xfff5","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0","0x0","0x0"],"storage":{},"depth":1} +{"pc":6,"op":48,"opName":"ADDRESS","gas":"0xfff3","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0","0x0","0x0","0x5"],"storage":{},"depth":1} +{"pc":7,"op":241,"opName":"CALL","gas":"0xfff1","gasCost":"0x61d0","memory":"0x","stack":["0x0","0x0","0x0","0x0","0x0","0x5","0x0"],"storage":{},"depth":1} +{"pc":8,"op":56,"opName":"CODESIZE","gas":"0x9e21","gasCost":"0x2","memory":"0x","stack":["0x1"],"storage":{},"depth":1} +{"pc":9,"op":52,"opName":"CALLVALUE","gas":"0x9e1f","gasCost":"0x2","memory":"0x","stack":["0x1","0x10"],"storage":{},"depth":1} +{"pc":10,"op":52,"opName":"CALLVALUE","gas":"0x9e1d","gasCost":"0x2","memory":"0x","stack":["0x1","0x10","0x0"],"storage":{},"depth":1} +{"pc":11,"op":56,"opName":"CODESIZE","gas":"0x9e1b","gasCost":"0x2","memory":"0x","stack":["0x1","0x10","0x0","0x0"],"storage":{},"depth":1} +{"pc":12,"op":50,"opName":"ORIGIN","gas":"0x9e19","gasCost":"0x2","memory":"0x","stack":["0x1","0x10","0x0","0x0","0x10"],"storage":{},"depth":1} +{"pc":13,"op":52,"opName":"CALLVALUE","gas":"0x9e17","gasCost":"0x2","memory":"0x","stack":["0x1","0x10","0x0","0x0","0x10","0x0"],"storage":{},"depth":1} +{"pc":14,"op":57,"opName":"CODECOPY","gas":"0x9e15","gasCost":"0x9","memory":"0x","stack":["0x1","0x10","0x0","0x0","0x10","0x0","0x0"],"storage":{},"depth":1} +{"pc":15,"op":240,"opName":"CREATE","gas":"0x9e0c","gasCost":"0x9e0c","memory":"0x32343434345830f138343438323439f0","stack":["0x1","0x10","0x0","0x0"],"storage":{},"depth":1} +{"pc":0,"op":50,"opName":"ORIGIN","gas":"0x210c","gasCost":"0x2","memory":"0x","stack":[],"storage":{},"depth":2} +{"pc":1,"op":52,"opName":"CALLVALUE","gas":"0x210a","gasCost":"0x2","memory":"0x","stack":["0x0"],"storage":{},"depth":2} +{"pc":2,"op":52,"opName":"CALLVALUE","gas":"0x2108","gasCost":"0x2","memory":"0x","stack":["0x0","0x0"],"storage":{},"depth":2} +{"pc":3,"op":52,"opName":"CALLVALUE","gas":"0x2106","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0"],"storage":{},"depth":2} +{"pc":4,"op":52,"opName":"CALLVALUE","gas":"0x2104","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0","0x0"],"storage":{},"depth":2} +{"pc":5,"op":88,"opName":"PC","gas":"0x2102","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0","0x0","0x0"],"storage":{},"depth":2} +{"pc":6,"op":48,"opName":"ADDRESS","gas":"0x2100","gasCost":"0x2","memory":"0x","stack":["0x0","0x0","0x0","0x0","0x0","0x5"],"storage":{},"depth":2} +{"pc":7,"op":241,"opName":"CALL","gas":"0x20fe","gasCost":"0x0","memory":"0x","stack":["0x0","0x0","0x0","0x0","0x0","0x5","0xbd770416a3345f91e4b34576cb804a576fa48eb1"],"storage":{},"depth":2} + "#, + ) + } + + fn run_test>( + code: &str, + gas: T, + expected: &str, + ) { + let mut params = ActionParams::default(); + params.code = Some(Arc::new(code.from_hex().unwrap())); + params.gas = gas.into(); + + let spec = ::ethcore::ethereum::new_foundation(&::std::env::temp_dir()); + let informant = ::display::json::Informant::default(); + let result = run_action(&spec, params, informant); + let expected = expected.split("\n") + .map(|x| x.trim()) + .map(|x| x.to_owned()) + .filter(|x| !x.is_empty()) + .collect::>(); + match result { + Ok(Success { traces, .. }) => { + assert_traces_eq(&traces.unwrap(), &expected); + }, + Err(Failure { traces, .. }) => { + assert_traces_eq(&traces.unwrap(), &expected); + }, + } + } + + fn assert_traces_eq( + a: &[String], + b: &[String], + ) { + let mut ita = a.iter(); + let mut itb = b.iter(); + + loop { + match (ita.next(), itb.next()) { + (Some(a), Some(b)) => { + assert_eq!(a, b); + println!("{}", a); + }, + (None, None) => return, + e => { + panic!("Traces mismatch: {:?}", e); + } + } + } + } +} diff --git a/evmbin/src/main.rs b/evmbin/src/main.rs index b37654c04..a32af49e0 100644 --- a/evmbin/src/main.rs +++ b/evmbin/src/main.rs @@ -32,6 +32,10 @@ extern crate vm; extern crate evm; extern crate panic_hook; +#[cfg(test)] +#[macro_use] +extern crate pretty_assertions; + use std::sync::Arc; use std::{fmt, fs}; use std::path::PathBuf; @@ -136,7 +140,7 @@ fn run_state_test(args: Args) { } } -fn run_call(args: Args, mut informant: T) { +fn run_call(args: Args, informant: T) { let from = arg(args.from(), "--from"); let to = arg(args.to(), "--to"); let code = arg(args.code(), "--code"); @@ -160,10 +164,7 @@ fn run_call(args: Args, mut informant: T) { params.code = code.map(Arc::new); params.data = data; - informant.set_gas(gas); - let result = info::run(&spec, gas, None, |mut client| { - client.call(params, &mut informant).map(|r| (r.gas_left, r.return_data.to_vec())) - }); + let result = info::run_action(&spec, params, informant); T::finish(result); } diff --git a/rpc/Cargo.toml b/rpc/Cargo.toml index dc70406c7..360a7b776 100644 --- a/rpc/Cargo.toml +++ b/rpc/Cargo.toml @@ -60,9 +60,9 @@ hash = { path = "../util/hash" } hardware-wallet = { path = "../hw" } clippy = { version = "0.0.103", optional = true} -pretty_assertions = "0.1" [dev-dependencies] +pretty_assertions = "0.1" macros = { path = "../util/macros" } ethcore-network = { path = "../util/network" } kvdb-memorydb = { path = "../util/kvdb-memorydb" } From 5f5476ceb8bbb49bae82485a219efc7f4959abb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Mon, 23 Oct 2017 14:02:53 +0200 Subject: [PATCH 03/35] Fix parsing of non-utf8 characters. --- devtools/src/http_client.rs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/devtools/src/http_client.rs b/devtools/src/http_client.rs index 078c33721..0257d86d7 100644 --- a/devtools/src/http_client.rs +++ b/devtools/src/http_client.rs @@ -83,9 +83,17 @@ pub fn request(address: &SocketAddr, request: &str) -> Response { req.set_read_timeout(Some(Duration::from_secs(2))).unwrap(); req.write_all(request.as_bytes()).unwrap(); - let mut response = String::new(); - let _ = req.read_to_string(&mut response); + let mut response = Vec::new(); + loop { + let mut chunk = [0; 32 *1024]; + match req.read(&mut chunk) { + Err(err) => panic!("Unable to read response: {:?}", err), + Ok(0) => break, + Ok(read) => response.extend_from_slice(&chunk[..read]), + } + } + let response = String::from_utf8_lossy(&response).into_owned(); let mut lines = response.lines(); let status = lines.next().expect("Expected a response").to_owned(); let headers_raw = read_block(&mut lines, false); From dd21e61371c9e3f31ed6fdd2b7cfacfc127237e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Mon, 23 Oct 2017 23:52:50 +0200 Subject: [PATCH 04/35] Fix ws tests. --- devtools/src/http_client.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/devtools/src/http_client.rs b/devtools/src/http_client.rs index 0257d86d7..ab2341059 100644 --- a/devtools/src/http_client.rs +++ b/devtools/src/http_client.rs @@ -16,7 +16,7 @@ use std::thread; use std::time::Duration; -use std::io::{Read, Write}; +use std::io::{self, Read, Write}; use std::str::{self, Lines}; use std::net::{TcpStream, SocketAddr}; @@ -87,6 +87,7 @@ pub fn request(address: &SocketAddr, request: &str) -> Response { loop { let mut chunk = [0; 32 *1024]; match req.read(&mut chunk) { + Err(ref err) if err.kind() == io::ErrorKind::WouldBlock => break, Err(err) => panic!("Unable to read response: {:?}", err), Ok(0) => break, Ok(read) => response.extend_from_slice(&chunk[..read]), From 025244e8b23a020fa0e906acc37228cb728beb5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 24 Oct 2017 11:57:55 +0200 Subject: [PATCH 05/35] Return error on timed unlock attempt. (#6777) --- parity/rpc_apis.rs | 4 ++-- rpc/src/v1/impls/personal.rs | 17 ++++++++++------- rpc/src/v1/tests/mocked/personal.rs | 8 ++++---- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/parity/rpc_apis.rs b/parity/rpc_apis.rs index 6064d3d2f..14ca9a999 100644 --- a/parity/rpc_apis.rs +++ b/parity/rpc_apis.rs @@ -292,7 +292,7 @@ impl FullDependencies { } }, Api::Personal => { - handler.extend_with(PersonalClient::new(&self.secret_store, dispatcher.clone(), self.geth_compatibility).to_delegate()); + handler.extend_with(PersonalClient::new(self.secret_store.clone(), dispatcher.clone(), self.geth_compatibility).to_delegate()); }, Api::Signer => { handler.extend_with(SignerClient::new(&self.secret_store, dispatcher.clone(), &self.signer_service, self.remote.clone()).to_delegate()); @@ -495,7 +495,7 @@ impl LightDependencies { }, Api::Personal => { let secret_store = Some(self.secret_store.clone()); - handler.extend_with(PersonalClient::new(&secret_store, dispatcher.clone(), self.geth_compatibility).to_delegate()); + handler.extend_with(PersonalClient::new(secret_store, dispatcher.clone(), self.geth_compatibility).to_delegate()); }, Api::Signer => { let secret_store = Some(self.secret_store.clone()); diff --git a/rpc/src/v1/impls/personal.rs b/rpc/src/v1/impls/personal.rs index cfc7521d9..6ad2285f9 100644 --- a/rpc/src/v1/impls/personal.rs +++ b/rpc/src/v1/impls/personal.rs @@ -42,11 +42,11 @@ pub struct PersonalClient { impl PersonalClient { /// Creates new PersonalClient - pub fn new(store: &Option>, dispatcher: D, allow_perm_unlock: bool) -> Self { + pub fn new(accounts: Option>, dispatcher: D, allow_perm_unlock: bool) -> Self { PersonalClient { - accounts: store.clone(), - dispatcher: dispatcher, - allow_perm_unlock: allow_perm_unlock, + accounts, + dispatcher, + allow_perm_unlock, } } @@ -89,15 +89,18 @@ impl Personal for PersonalClient { }; let r = match (self.allow_perm_unlock, duration) { - (false, _) => store.unlock_account_temporarily(account, account_pass), + (false, None) => store.unlock_account_temporarily(account, account_pass), + (false, _) => return Err(errors::unsupported( + "Time-unlocking is only supported in --geth compatibility mode.", + Some("Restart your client with --geth flag or use personal_sendTransaction instead."), + )), (true, Some(0)) => store.unlock_account_permanently(account, account_pass), (true, Some(d)) => store.unlock_account_timed(account, account_pass, d * 1000), (true, None) => store.unlock_account_timed(account, account_pass, 300_000), }; match r { Ok(_) => Ok(true), - // TODO [ToDr] Proper error here? - Err(_) => Ok(false), + Err(err) => Err(errors::account("Unable to unlock the account.", err)), } } diff --git a/rpc/src/v1/tests/mocked/personal.rs b/rpc/src/v1/tests/mocked/personal.rs index d34d734c0..f1a521f87 100644 --- a/rpc/src/v1/tests/mocked/personal.rs +++ b/rpc/src/v1/tests/mocked/personal.rs @@ -54,7 +54,7 @@ fn setup() -> PersonalTester { let miner = miner_service(); let dispatcher = FullDispatcher::new(client, miner.clone()); - let personal = PersonalClient::new(&opt_accounts, dispatcher, false); + let personal = PersonalClient::new(opt_accounts, dispatcher, false); let mut io = IoHandler::default(); io.extend_with(personal.to_delegate()); @@ -178,7 +178,7 @@ fn sign_and_send_test(method: &str) { } #[test] -fn should_unlock_account_temporarily() { +fn should_unlock_not_account_temporarily_if_allow_perm_is_disabled() { let tester = setup(); let address = tester.accounts.new_account("password123").unwrap(); @@ -192,10 +192,10 @@ fn should_unlock_account_temporarily() { ], "id": 1 }"#; - let response = r#"{"jsonrpc":"2.0","result":true,"id":1}"#; + let response = r#"{"jsonrpc":"2.0","error":{"code":-32000,"message":"Time-unlocking is only supported in --geth compatibility mode.","data":"Restart your client with --geth flag or use personal_sendTransaction instead."},"id":1}"#; assert_eq!(tester.io.handle_request_sync(&request), Some(response.into())); - assert!(tester.accounts.sign(address, None, Default::default()).is_ok(), "Should unlock account."); + assert!(tester.accounts.sign(address, None, Default::default()).is_err(), "Should not unlock account."); } #[test] From f68cb37efba674b1079441ee821408481e09c66e Mon Sep 17 00:00:00 2001 From: Afri Schoedon <5chdn@users.noreply.github.com> Date: Tue, 24 Oct 2017 12:01:35 +0200 Subject: [PATCH 06/35] Align README with 1.8 and prepare CHANGELOG with 1.8.1 (#6833) * Update README.md for 1.8.0 * Update CHANGELOG.md for 1.8.1 * Clarify note on trezor wallets * Update CHANGELOG.md for 1.8.1 * Update CHANGELOG.md for 1.8.1 * Update CHANGELOG.md for 1.8.1 * Fix Typos. --- CHANGELOG.md | 27 +++++++++++++++++++++++++++ README.md | 37 ++++++++++++++++++++++--------------- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b3695b06a..7110201e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,30 @@ +## Parity [v1.8.1](https://github.com/paritytech/parity/releases/tag/v1.8.1) (2017-10-20) + +Parity 1.8.1 fixes several bugs with token balances, tweaks snapshot-sync, improves the performance of nodes with huge amounts of accounts and changes the Trezor account derivation path. + +**Important Note**: The **Trezor** account derivation path was changed in this release ([#6815](https://github.com/paritytech/parity/pull/6815)) to always use the first account (`m/44'/60'/0'/0/0` instead of `m/44'/60'/0'/0`). This way we enable compatibility with other Ethereum wallets supporting Trezor hardware-wallets. However, **action is required** before upgrading, if you have funds on your Parity Trezor wallet. If you already upgraded to 1.8.1, please downgrade to 1.8.0 first to recover the funds with the following steps: + +1. Make sure you have 1.8.0-beta and your Trezor plugged in. +2. Create a new standard Parity account. Make sure you have backups of the recovery phrase and don't forget the password. +3. Move your funds from the Trezor hardware-wallet account to the freshly generated Parity account. +4. Upgrade to 1.8.1-beta and plug in your Trezor. +5. Move your funds from your Parity account to the new Trezor account. +6. Keep using Parity as normal. + +If you don't want to downgrade or move your funds off your Trezor-device, you can also use the official Trezor application or other wallets allowing to select the derivation path to access the funds. + +Full list of included changes: + +- Add ECIP1017 to Morden config ([#6845](https://github.com/paritytech/parity/pull/6845)) +- Ethstore optimizations ([#6844](https://github.com/paritytech/parity/pull/6844)) +- Bumb to v1.8.1 ([#6843](https://github.com/paritytech/parity/pull/6843)) +- Backport ([#6837](https://github.com/paritytech/parity/pull/6837)) + - Tweaked snapshot sync threshold ([#6829](https://github.com/paritytech/parity/pull/6829)) + - Change keypath derivation logic ([#6815](https://github.com/paritytech/parity/pull/6815)) +- Refresh cached tokens based on registry info & random balances ([#6824](https://github.com/paritytech/parity/pull/6824)) + - Refresh cached tokens based on registry info & random balances ([#6818](https://github.com/paritytech/parity/pull/6818)) + - Don't display errored token images + ## Parity [v1.8.0](https://github.com/paritytech/parity/releases/tag/v1.8.0) (2017-10-15) We are happy to announce our newest Parity 1.8 release. Among others, it enables the following features: diff --git a/README.md b/README.md index 4a1c30084..770cbca44 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ [![Snap Status](https://build.snapcraft.io/badge/paritytech/parity.svg)](https://build.snapcraft.io/user/paritytech/parity) [![GPLv3](https://img.shields.io/badge/license-GPL%20v3-green.svg)](https://www.gnu.org/licenses/gpl-3.0.en.html) -- [Download the latest release here.](https://github.com/paritytech/parity/releases) +- [Download the latest release here.](https://github.com/paritytech/parity/releases/latest) ### Join the chat! @@ -29,19 +29,19 @@ Parity comes with a built-in wallet. To access [Parity Wallet](http://web3.site/ - create and register your own tokens; - and much more. -By default, Parity will also run a JSONRPC server on `127.0.0.1:8545`. This is fully configurable and supports a number of RPC APIs. +By default, Parity will also run a JSONRPC server on `127.0.0.1:8545` and a websockets server on `127.0.0.1:8546`. This is fully configurable and supports a number of APIs. -If you run into an issue while using parity, feel free to file one in this repository or hop on our [gitter chat room](https://gitter.im/paritytech/parity) to ask a question. We are glad to help! +If you run into an issue while using parity, feel free to file one in this repository or hop on our [Gitter](https://gitter.im/paritytech/parity) or [Riot](https://riot.im/app/#/room/#parity-watercooler:matrix.org) chat room to ask a question. We are glad to help! -**For security-critical issues**, please refer to the security policy outlined in `SECURITY.MD`. +**For security-critical issues**, please refer to the security policy outlined in [SECURITY.MD](SECURITY.md). -Parity's current release is 1.7. You can download it at https://github.com/paritytech/parity/releases or follow the instructions below to build from source. +Parity's current release is 1.8. You can download it at https://github.com/paritytech/parity/releases or follow the instructions below to build from source. ---- ## Build dependencies -**Parity requires Rust version 1.19.0 to build** +**Parity requires Rust version 1.21.0 to build** We recommend installing Rust through [rustup](https://www.rustup.rs/). If you don't already have rustup, you can install it like this: @@ -51,19 +51,20 @@ We recommend installing Rust through [rustup](https://www.rustup.rs/). If you do ``` Parity also requires `gcc`, `g++`, `libssl-dev`/`openssl`, `libudev-dev` and `pkg-config` packages to be installed. + - OSX: ```bash $ curl https://sh.rustup.rs -sSf | sh ``` `clang` is required. It comes with Xcode command line tools or can be installed with homebrew. -- Windows - Make sure you have Visual Studio 2015 with C++ support installed. Next, download and run the rustup installer from +- Windows + Make sure you have Visual Studio 2015 with C++ support installed. Next, download and run the rustup installer from https://static.rust-lang.org/rustup/dist/x86_64-pc-windows-msvc/rustup-init.exe, start "VS2015 x64 Native Tools Command Prompt", and use the following command to install and set up the msvc toolchain: - ``` + ```bash $ rustup default stable-x86_64-pc-windows-msvc - ``` + ``` Once you have rustup, install parity or download and build from source @@ -98,6 +99,9 @@ Note: if cargo fails to parse manifest try: ```bash $ ~/.cargo/bin/cargo build --release ``` + +This will always compile the latest nightly builds. If you want to build stable or beta, do a `git checkout stable` or `git checkout beta` first. + ---- ## Simple one-line installer for Mac and Ubuntu @@ -106,9 +110,14 @@ $ ~/.cargo/bin/cargo build --release bash <(curl https://get.parity.io -Lk) ``` +The one-line installer always defaults to the latest beta release. + ## Start Parity + ### Manually + To start Parity manually, just run + ```bash $ ./target/release/parity ``` @@ -116,11 +125,9 @@ $ ./target/release/parity and Parity will begin syncing the Ethereum blockchain. ### Using systemd service file + To start Parity as a regular user using systemd init: -1. Copy `parity/scripts/parity.service` to your +1. Copy `./scripts/parity.service` to your systemd user directory (usually `~/.config/systemd/user`). -2. To pass any argument to Parity, write a `~/.parity/parity.conf` file this way: -`ARGS="ARG1 ARG2 ARG3"`. - - Example: `ARGS="ui --identity MyMachine"`. +2. To configure Parity, write a `/etc/parity/config.toml` config file, see [Configuring Parity](https://github.com/paritytech/parity/wiki/Configuring-Parity) for details. From d68b3f131dfeaaf3cc0774427f0bf15872180e3a Mon Sep 17 00:00:00 2001 From: Marek Kotewicz Date: Tue, 24 Oct 2017 17:12:15 +0700 Subject: [PATCH 07/35] updated ntp to version 0.3 (#6854) --- Cargo.lock | 40 +++++------------------------------- dapps/node-health/Cargo.toml | 2 +- 2 files changed, 6 insertions(+), 36 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 935389755..63f7d4f20 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -77,20 +77,6 @@ dependencies = [ "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "backtrace" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace-sys 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "dbghelp-sys 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", - "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-demangle 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "backtrace" version = "0.3.3" @@ -214,11 +200,6 @@ dependencies = [ "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "byteorder" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "byteorder" version = "1.1.0" @@ -453,14 +434,6 @@ dependencies = [ "regex 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "error-chain" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "backtrace 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "error-chain" version = "0.11.0" @@ -1750,7 +1723,7 @@ dependencies = [ "futures 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "futures-cpupool 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", - "ntp 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ntp 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "parity-reactor 0.1.0", "parking_lot 0.4.8 (registry+https://github.com/rust-lang/crates.io-index)", "serde 1.0.15 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1773,13 +1746,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "ntp" -version = "0.2.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "conv 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "custom_derive 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", - "error-chain 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "time 0.1.38 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -3538,7 +3511,6 @@ dependencies = [ "checksum arrayvec 0.3.23 (registry+https://github.com/rust-lang/crates.io-index)" = "699e63a93b79d717e8c3b5eb1b28b7780d0d6d9e59a72eb769291c83b0c8dc67" "checksum aster 0.41.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4ccfdf7355d9db158df68f976ed030ab0f6578af811f5a7bb6dcf221ec24e0e0" "checksum atty 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d912da0db7fa85514874458ca3651fe2cddace8d0b0505571dbdcd41ab490159" -"checksum backtrace 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "346d7644f0b5f9bc73082d3b2236b69a05fd35cce0cfa3724e184e6a5c9e2a2f" "checksum backtrace 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "99f2ce94e22b8e664d95c57fff45b98a966c2252b60691d0b7aeeccd88d70983" "checksum backtrace-sys 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "c63ea141ef8fdb10409d0f5daf30ac51f84ef43bff66f16627773d2a292cd189" "checksum base-x 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2f59103b47307f76e03bef1633aec7fa9e29bfb5aa6daf5a334f94233c71f6c1" @@ -3554,7 +3526,6 @@ dependencies = [ "checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" "checksum bloomchain 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3f421095d2a76fc24cd3fb3f912b90df06be7689912b1bdb423caefae59c258d" "checksum bn 0.4.4 (git+https://github.com/paritytech/bn)" = "" -"checksum byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0fc10e8cc6b2580fda3f36eb6dc5316657f812a3df879a44a66fc9f0fdbc4855" "checksum byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff81738b726f5d099632ceaffe7fb65b90212e8dce59d518729e7e8634032d3d" "checksum bytes 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d828f97b58cc5de3e40c421d0cf2132d6b2da4ee0e11b8632fa838f0f9333ad6" "checksum cc 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7db2f146208d7e0fbee761b09cd65a7f51ccc38705d4e7262dad4d73b12a76b1" @@ -3582,7 +3553,6 @@ dependencies = [ "checksum elastic-array 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "258ff6a9a94f648d0379dbd79110e057edbb53eb85cc237e33eadf8e5a30df85" "checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b" "checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" -"checksum error-chain 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd5c82c815138e278b8dcdeffc49f27ea6ffb528403e9dea4194f2e3dd40b143" "checksum eth-secp256k1 0.5.6 (git+https://github.com/paritytech/rust-secp256k1)" = "" "checksum ethabi 4.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c819a3adef0413a2519cbd9a19a35dd1c20c7a0110705beaba8aa4aa87eda95f" "checksum fdlimit 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b1ee15a7050e5580b3712877157068ea713b245b080ff302ae2ca973cfcd9baa" @@ -3655,7 +3625,7 @@ dependencies = [ "checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09" "checksum nodrop 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "52cd74cd09beba596430cc6e3091b74007169a56246e1262f0ba451ea95117b2" "checksum nom 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a5b8c256fd9471521bcb84c3cdba98921497f1a331cbc15b8030fc63b82050ce" -"checksum ntp 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d23f30ae7da76e2c6c2f5de53f298aa9a3911d3955ab2c349eb944caedceb088" +"checksum ntp 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "143149743832c6543b60a8ef2a26cd9122dfecec2b767158e852a7beecf6d7a0" "checksum num 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "a311b77ebdc5dd4cf6449d81e4135d9f0e3b153839ac90e648a8ef538f923525" "checksum num-bigint 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "8fd0f8dbb4c0960998958a796281d88c16fbe68d87b1baa6f31e2979e81fd0bd" "checksum num-complex 0.1.40 (registry+https://github.com/rust-lang/crates.io-index)" = "503e668405c5492d67cf662a81e05be40efe2e6bcf10f7794a07bd9865e704e6" diff --git a/dapps/node-health/Cargo.toml b/dapps/node-health/Cargo.toml index ff13e8593..014d7ab27 100644 --- a/dapps/node-health/Cargo.toml +++ b/dapps/node-health/Cargo.toml @@ -9,7 +9,7 @@ authors = ["Parity Technologies "] futures = "0.1" futures-cpupool = "0.1" log = "0.3" -ntp = "0.2.0" +ntp = "0.3.0" parking_lot = "0.4" serde = "1.0" serde_derive = "1.0" From b98150526c9f099ca7ac4c627a4869cbcde887bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 24 Oct 2017 12:13:00 +0200 Subject: [PATCH 08/35] Fix serialization of non-localized transactions (#6868) * Fix serialization of non-localized transactions. * Return proper SignedTransactions representation. --- ethcore/src/transaction.rs | 5 +++++ rpc/src/v1/helpers/dispatch.rs | 27 ++++++++++++++++++++------- rpc/src/v1/helpers/light_fetch.rs | 23 +++++++++++++++++------ rpc/src/v1/impls/signer.rs | 7 ++++--- rpc/src/v1/tests/mocked/eth.rs | 4 ++-- rpc/src/v1/tests/mocked/parity_set.rs | 2 +- rpc/src/v1/tests/mocked/signer.rs | 2 +- rpc/src/v1/tests/mocked/signing.rs | 8 +++++--- rpc/src/v1/types/transaction.rs | 11 +++++------ 9 files changed, 60 insertions(+), 29 deletions(-) diff --git a/ethcore/src/transaction.rs b/ethcore/src/transaction.rs index 02f77d5f3..3596f6c21 100644 --- a/ethcore/src/transaction.rs +++ b/ethcore/src/transaction.rs @@ -469,6 +469,11 @@ impl SignedTransaction { pub fn is_unsigned(&self) -> bool { self.transaction.is_unsigned() } + + /// Deconstructs this transaction back into `UnverifiedTransaction` + pub fn deconstruct(self) -> (UnverifiedTransaction, Address, Option) { + (self.transaction, self.sender, self.public) + } } /// Signed Transaction that is a part of canon blockchain. diff --git a/rpc/src/v1/helpers/dispatch.rs b/rpc/src/v1/helpers/dispatch.rs index 0da257035..d84bd6cad 100644 --- a/rpc/src/v1/helpers/dispatch.rs +++ b/rpc/src/v1/helpers/dispatch.rs @@ -71,6 +71,9 @@ pub trait Dispatcher: Send + Sync + Clone { fn sign(&self, accounts: Arc, filled: FilledTransactionRequest, password: SignWith) -> BoxFuture, Error>; + /// Converts a `SignedTransaction` into `RichRawTransaction` + fn enrich(&self, SignedTransaction) -> RpcRichRawTransaction; + /// "Dispatch" a local transaction. fn dispatch_transaction(&self, signed_transaction: PendingTransaction) -> Result; } @@ -163,6 +166,11 @@ impl Dispatcher for FullDispatcher RpcRichRawTransaction { + let block_number = self.client.best_block_header().number(); + RpcRichRawTransaction::from_signed(signed_transaction, block_number, self.client.eip86_transition()) + } + fn dispatch_transaction(&self, signed_transaction: PendingTransaction) -> Result { let hash = signed_transaction.transaction.hash(); @@ -261,11 +269,11 @@ impl LightDispatcher { transaction_queue: Arc>, ) -> Self { LightDispatcher { - sync: sync, - client: client, - on_demand: on_demand, - cache: cache, - transaction_queue: transaction_queue, + sync, + client, + on_demand, + cache, + transaction_queue, } } @@ -399,6 +407,11 @@ impl Dispatcher for LightDispatcher { .and_then(move |nonce| with_nonce(filled, nonce))) } + fn enrich(&self, signed_transaction: SignedTransaction) -> RpcRichRawTransaction { + let block_number = self.client.best_block_header().number(); + RpcRichRawTransaction::from_signed(signed_transaction, block_number, self.client.eip86_transition()) + } + fn dispatch_transaction(&self, signed_transaction: PendingTransaction) -> Result { let hash = signed_transaction.transaction.hash(); @@ -510,8 +523,8 @@ pub fn execute( }, ConfirmationPayload::SignTransaction(request) => { Box::new(dispatcher.sign(accounts, request, pass) - .map(|result| result - .map(RpcRichRawTransaction::from) + .map(move |result| result + .map(move |tx| dispatcher.enrich(tx)) .map(ConfirmationResponse::SignTransaction) )) }, diff --git a/rpc/src/v1/helpers/light_fetch.rs b/rpc/src/v1/helpers/light_fetch.rs index ac5902b51..2544f66b0 100644 --- a/rpc/src/v1/helpers/light_fetch.rs +++ b/rpc/src/v1/helpers/light_fetch.rs @@ -23,7 +23,7 @@ use ethcore::encoded; use ethcore::executed::{Executed, ExecutionError}; use ethcore::ids::BlockId; use ethcore::filter::Filter as EthcoreFilter; -use ethcore::transaction::{Action, Transaction as EthTransaction, SignedTransaction}; +use ethcore::transaction::{Action, Transaction as EthTransaction, SignedTransaction, LocalizedTransaction}; use ethcore::receipt::Receipt; use jsonrpc_core::{BoxFuture, Error}; @@ -65,13 +65,24 @@ pub struct LightFetch { /// Extract a transaction at given index. pub fn extract_transaction_at_index(block: encoded::Block, index: usize, eip86_transition: u64) -> Option { block.transactions().into_iter().nth(index) + // Verify if transaction signature is correct. .and_then(|tx| SignedTransaction::new(tx).ok()) - .map(|tx| Transaction::from_signed(tx, block.number(), eip86_transition)) - .map(|mut tx| { - tx.block_hash = Some(block.hash().into()); - tx.transaction_index = Some(index.into()); - tx + .map(|signed_tx| { + let (signed, sender, _) = signed_tx.deconstruct(); + let block_hash = block.hash(); + let block_number = block.number(); + let transaction_index = index; + let cached_sender = Some(sender); + + LocalizedTransaction { + signed, + block_number, + block_hash, + transaction_index, + cached_sender, + } }) + .map(|tx| Transaction::from_localized(tx, eip86_transition)) } diff --git a/rpc/src/v1/impls/signer.rs b/rpc/src/v1/impls/signer.rs index c864134fb..cecd1f2db 100644 --- a/rpc/src/v1/impls/signer.rs +++ b/rpc/src/v1/impls/signer.rs @@ -73,8 +73,8 @@ impl SignerClient { SignerClient { signer: signer.clone(), accounts: store.clone(), - dispatcher: dispatcher, - subscribers: subscribers, + dispatcher, + subscribers, } } @@ -205,7 +205,8 @@ impl Signer for SignerClient { }, ConfirmationPayload::SignTransaction(request) => { Self::verify_transaction(bytes, request, |pending_transaction| { - Ok(ConfirmationResponse::SignTransaction(pending_transaction.transaction.into())) + let rich = self.dispatcher.enrich(pending_transaction.transaction); + Ok(ConfirmationResponse::SignTransaction(rich)) }) }, ConfirmationPayload::EthSignMessage(address, data) => { diff --git a/rpc/src/v1/tests/mocked/eth.rs b/rpc/src/v1/tests/mocked/eth.rs index 337ef9513..9969ee286 100644 --- a/rpc/src/v1/tests/mocked/eth.rs +++ b/rpc/src/v1/tests/mocked/eth.rs @@ -547,7 +547,7 @@ fn rpc_eth_pending_transaction_by_hash() { tester.miner.pending_transactions.lock().insert(H256::zero(), tx); } - let response = r#"{"jsonrpc":"2.0","result":{"blockHash":null,"blockNumber":"0x0","chainId":null,"condition":null,"creates":null,"from":"0x0f65fe9276bc9a24ae7083ae28e2660ef72df99e","gas":"0x5208","gasPrice":"0x1","hash":"0x41df922fd0d4766fcc02e161f8295ec28522f329ae487f14d811e4b64c8d6e31","input":"0x","nonce":"0x0","publicKey":"0x7ae46da747962c2ee46825839c1ef9298e3bd2e70ca2938495c3693a485ec3eaa8f196327881090ff64cf4fbb0a48485d4f83098e189ed3b7a87d5941b59f789","r":"0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353","raw":"0xf85f800182520894095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba048b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353a0efffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804","s":"0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804","standardV":"0x0","to":"0x095e7baea6a6c7c4c2dfeb977efac326af552d87","transactionIndex":null,"v":"0x1b","value":"0xa"},"id":1}"#; + let response = r#"{"jsonrpc":"2.0","result":{"blockHash":null,"blockNumber":null,"chainId":null,"condition":null,"creates":null,"from":"0x0f65fe9276bc9a24ae7083ae28e2660ef72df99e","gas":"0x5208","gasPrice":"0x1","hash":"0x41df922fd0d4766fcc02e161f8295ec28522f329ae487f14d811e4b64c8d6e31","input":"0x","nonce":"0x0","publicKey":"0x7ae46da747962c2ee46825839c1ef9298e3bd2e70ca2938495c3693a485ec3eaa8f196327881090ff64cf4fbb0a48485d4f83098e189ed3b7a87d5941b59f789","r":"0x48b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353","raw":"0xf85f800182520894095e7baea6a6c7c4c2dfeb977efac326af552d870a801ba048b55bfa915ac795c431978d8a6a992b628d557da5ff759b307d495a36649353a0efffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804","s":"0xefffd310ac743f371de3b9f7f9cb56c0b28ad43601b4ab949f53faa07bd2c804","standardV":"0x0","to":"0x095e7baea6a6c7c4c2dfeb977efac326af552d87","transactionIndex":null,"v":"0x1b","value":"0xa"},"id":1}"#; let request = r#"{ "jsonrpc": "2.0", "method": "eth_getTransactionByHash", @@ -863,7 +863,7 @@ fn rpc_eth_sign_transaction() { let response = r#"{"jsonrpc":"2.0","result":{"#.to_owned() + r#""raw":"0x"# + &rlp.to_hex() + r#"","# + r#""tx":{"# + - r#""blockHash":null,"blockNumber":"0x0","# + + r#""blockHash":null,"blockNumber":null,"# + &format!("\"chainId\":{},", t.chain_id().map_or("null".to_owned(), |n| format!("{}", n))) + r#""condition":null,"creates":null,"# + &format!("\"from\":\"0x{:?}\",", &address) + diff --git a/rpc/src/v1/tests/mocked/parity_set.rs b/rpc/src/v1/tests/mocked/parity_set.rs index 1653a1908..ed27862ac 100644 --- a/rpc/src/v1/tests/mocked/parity_set.rs +++ b/rpc/src/v1/tests/mocked/parity_set.rs @@ -234,7 +234,7 @@ fn rpc_parity_remove_transaction() { let hash = signed.hash(); let request = r#"{"jsonrpc": "2.0", "method": "parity_removeTransaction", "params":[""#.to_owned() + &format!("0x{:?}", hash) + r#""], "id": 1}"#; - let response = r#"{"jsonrpc":"2.0","result":{"blockHash":null,"blockNumber":"0x0","chainId":null,"condition":null,"creates":null,"from":"0x0000000000000000000000000000000000000002","gas":"0x76c0","gasPrice":"0x9184e72a000","hash":"0xa2e0da8a8064e0b9f93e95a53c2db6d01280efb8ac72a708d25487e67dd0f8fc","input":"0x","nonce":"0x1","publicKey":null,"r":"0x1","raw":"0xe9018609184e72a0008276c0940000000000000000000000000000000000000005849184e72a80800101","s":"0x1","standardV":"0x4","to":"0x0000000000000000000000000000000000000005","transactionIndex":null,"v":"0x0","value":"0x9184e72a"},"id":1}"#; + let response = r#"{"jsonrpc":"2.0","result":{"blockHash":null,"blockNumber":null,"chainId":null,"condition":null,"creates":null,"from":"0x0000000000000000000000000000000000000002","gas":"0x76c0","gasPrice":"0x9184e72a000","hash":"0xa2e0da8a8064e0b9f93e95a53c2db6d01280efb8ac72a708d25487e67dd0f8fc","input":"0x","nonce":"0x1","publicKey":null,"r":"0x1","raw":"0xe9018609184e72a0008276c0940000000000000000000000000000000000000005849184e72a80800101","s":"0x1","standardV":"0x4","to":"0x0000000000000000000000000000000000000005","transactionIndex":null,"v":"0x0","value":"0x9184e72a"},"id":1}"#; miner.pending_transactions.lock().insert(hash, signed); assert_eq!(io.handle_request_sync(&request), Some(response.to_owned())); diff --git a/rpc/src/v1/tests/mocked/signer.rs b/rpc/src/v1/tests/mocked/signer.rs index 0211b5f24..3399cd741 100644 --- a/rpc/src/v1/tests/mocked/signer.rs +++ b/rpc/src/v1/tests/mocked/signer.rs @@ -456,7 +456,7 @@ fn should_confirm_sign_transaction_with_rlp() { let response = r#"{"jsonrpc":"2.0","result":{"#.to_owned() + r#""raw":"0x"# + &rlp.to_hex() + r#"","# + r#""tx":{"# + - r#""blockHash":null,"blockNumber":"0x0","# + + r#""blockHash":null,"blockNumber":null,"# + &format!("\"chainId\":{},", t.chain_id().map_or("null".to_owned(), |n| format!("{}", n))) + r#""condition":null,"creates":null,"# + &format!("\"from\":\"0x{:?}\",", &address) + diff --git a/rpc/src/v1/tests/mocked/signing.rs b/rpc/src/v1/tests/mocked/signing.rs index 41c8ec7a0..dbe5534ca 100644 --- a/rpc/src/v1/tests/mocked/signing.rs +++ b/rpc/src/v1/tests/mocked/signing.rs @@ -26,7 +26,7 @@ use v1::impls::SigningQueueClient; use v1::metadata::Metadata; use v1::traits::{EthSigning, ParitySigning, Parity}; use v1::helpers::{SignerService, SigningQueue, FullDispatcher}; -use v1::types::ConfirmationResponse; +use v1::types::{ConfirmationResponse, RichRawTransaction}; use v1::tests::helpers::TestMinerService; use v1::tests::mocked::parity; @@ -307,7 +307,7 @@ fn should_add_sign_transaction_to_the_queue() { let response = r#"{"jsonrpc":"2.0","result":{"#.to_owned() + r#""raw":"0x"# + &rlp.to_hex() + r#"","# + r#""tx":{"# + - r#""blockHash":null,"blockNumber":"0x0","# + + r#""blockHash":null,"blockNumber":null,"# + &format!("\"chainId\":{},", t.chain_id().map_or("null".to_owned(), |n| format!("{}", n))) + r#""condition":null,"creates":null,"# + &format!("\"from\":\"0x{:?}\",", &address) + @@ -334,7 +334,9 @@ fn should_add_sign_transaction_to_the_queue() { ::std::thread::spawn(move || loop { if signer.requests().len() == 1 { // respond - signer.request_confirmed(1.into(), Ok(ConfirmationResponse::SignTransaction(t.into()))); + signer.request_confirmed(1.into(), Ok(ConfirmationResponse::SignTransaction( + RichRawTransaction::from_signed(t.into(), 0x0, u64::max_value()) + ))); break } ::std::thread::sleep(Duration::from_millis(100)) diff --git a/rpc/src/v1/types/transaction.rs b/rpc/src/v1/types/transaction.rs index 570c21120..dbd326488 100644 --- a/rpc/src/v1/types/transaction.rs +++ b/rpc/src/v1/types/transaction.rs @@ -158,11 +158,10 @@ pub struct RichRawTransaction { pub transaction: Transaction } - -impl From for RichRawTransaction { - fn from(t: SignedTransaction) -> Self { - // TODO: change transition to 0 when EIP-86 is commonly used. - let tx: Transaction = Transaction::from_signed(t, 0, u64::max_value()); +impl RichRawTransaction { + /// Creates new `RichRawTransaction` from `SignedTransaction`. + pub fn from_signed(tx: SignedTransaction, block_number: u64, eip86_transition: u64) -> Self { + let tx = Transaction::from_signed(tx, block_number, eip86_transition); RichRawTransaction { raw: tx.raw.clone(), transaction: tx, @@ -213,7 +212,7 @@ impl Transaction { hash: t.hash().into(), nonce: t.nonce.into(), block_hash: None, - block_number: Some(block_number.into()), + block_number: None, transaction_index: None, from: t.sender().into(), to: match t.action { From dfccc3fb04a707a1a8fe8b8512040cea69528076 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tomasz=20Drwi=C4=99ga?= Date: Tue, 24 Oct 2017 12:25:34 +0200 Subject: [PATCH 09/35] Allow force sealing and reseal=0 for non-dev chains. (#6878) --- parity/configuration.rs | 58 +++++++++++++++-------------------------- parity/rpc.rs | 6 +++++ 2 files changed, 27 insertions(+), 37 deletions(-) diff --git a/parity/configuration.rs b/parity/configuration.rs index c8cc11599..678afb146 100644 --- a/parity/configuration.rs +++ b/parity/configuration.rs @@ -40,7 +40,7 @@ use parity_rpc::NetworkSettings; use cache::CacheConfig; use helpers::{to_duration, to_mode, to_block_id, to_u256, to_pending_set, to_price, replace_home, replace_home_and_local, geth_ipc_path, parity_ipc_path, to_bootnodes, to_addresses, to_address, to_gas_limit, to_queue_strategy}; -use params::{ResealPolicy, AccountsConfig, GasPricerConfig, MinerExtras}; +use params::{ResealPolicy, AccountsConfig, GasPricerConfig, MinerExtras, SpecType}; use ethcore_logger::Config as LogConfig; use dir::{self, Directories, default_hypervisor_path, default_local_path, default_data_path}; use dapps::Configuration as DappsConfiguration; @@ -109,7 +109,7 @@ impl Configuration { let pruning = self.args.arg_pruning.parse()?; let pruning_history = self.args.arg_pruning_history; let vm_type = self.vm_type()?; - let spec = self.chain().parse()?; + let spec = self.chain()?; let mode = match self.args.arg_mode.as_ref() { "last" => None, mode => Some(to_mode(&mode, self.args.arg_mode_timeout, self.args.arg_mode_alarm)?), @@ -336,7 +336,7 @@ impl Configuration { pruning_memory: self.args.arg_pruning_memory, daemon: daemon, logger_config: logger_config.clone(), - miner_options: self.miner_options(self.args.arg_reseal_min_period)?, + miner_options: self.miner_options()?, ntp_servers: self.ntp_servers(), ws_conf: ws_conf, http_conf: http_conf, @@ -441,15 +441,16 @@ impl Configuration { } } - fn chain(&self) -> String { - if let Some(ref s) = self.spec_name_override { + fn chain(&self) -> Result { + let name = if let Some(ref s) = self.spec_name_override { s.clone() - } - else if self.args.flag_testnet { + } else if self.args.flag_testnet { "testnet".to_owned() } else { self.args.arg_chain.clone() - } + }; + + Ok(name.parse()?) } fn max_peers(&self) -> u32 { @@ -504,8 +505,9 @@ impl Configuration { } else { Ok(None) } } - fn miner_options(&self, reseal_min_period: u64) -> Result { - if self.args.flag_force_sealing && reseal_min_period == 0 { + fn miner_options(&self) -> Result { + let is_dev_chain = self.chain()? == SpecType::Dev; + if is_dev_chain && self.args.flag_force_sealing && self.args.arg_reseal_min_period == 0 { return Err("Force sealing can't be used with reseal_min_period = 0".into()); } @@ -528,7 +530,7 @@ impl Configuration { tx_queue_gas_limit: to_gas_limit(&self.args.arg_tx_queue_gas)?, tx_queue_strategy: to_queue_strategy(&self.args.arg_tx_queue_strategy)?, pending_set: to_pending_set(&self.args.arg_relay_set)?, - reseal_min_period: Duration::from_millis(reseal_min_period), + reseal_min_period: Duration::from_millis(self.args.arg_reseal_min_period), reseal_max_period: Duration::from_millis(self.args.arg_reseal_max_period), work_queue_size: self.args.arg_work_queue_size, enable_resubmission: !self.args.flag_remove_solved, @@ -885,7 +887,7 @@ impl Configuration { let net_addresses = self.net_addresses()?; Ok(NetworkSettings { name: self.args.arg_identity.clone(), - chain: self.chain(), + chain: format!("{}", self.chain()?), network_port: net_addresses.0.port(), rpc_enabled: http_conf.enabled, rpc_interface: http_conf.interface, @@ -916,8 +918,6 @@ impl Configuration { } fn directories(&self) -> Directories { - use path; - let local_path = default_local_path(); let base_path = self.args.arg_base_path.as_ref().or_else(|| self.args.arg_datadir.as_ref()).map_or_else(|| default_data_path(), |s| s.clone()); let data_path = replace_home("", &base_path); @@ -937,21 +937,6 @@ impl Configuration { let secretstore_path = replace_home(&data_path, &self.args.arg_secretstore_path); let ui_path = replace_home(&data_path, &self.args.arg_ui_path); - if self.args.flag_geth && !cfg!(windows) { - let geth_root = if self.chain() == "testnet".to_owned() { path::ethereum::test() } else { path::ethereum::default() }; - ::std::fs::create_dir_all(geth_root.as_path()).unwrap_or_else( - |e| warn!("Failed to create '{}' for geth mode: {}", &geth_root.to_str().unwrap(), e)); - } - - if cfg!(feature = "ipc") && !cfg!(feature = "windows") { - let mut path_buf = PathBuf::from(data_path.clone()); - path_buf.push("ipc"); - let ipc_path = path_buf.to_str().unwrap(); - ::std::fs::create_dir_all(ipc_path).unwrap_or_else( - |e| warn!("Failed to directory '{}' for ipc sockets: {}", ipc_path, e) - ); - } - Directories { keys: keys_path, base: data_path, @@ -1404,21 +1389,20 @@ mod tests { let conf3 = parse(&["parity", "--tx-queue-strategy", "gas"]); // then - let min_period = conf0.args.arg_reseal_min_period; - assert_eq!(conf0.miner_options(min_period).unwrap(), mining_options); + assert_eq!(conf0.miner_options().unwrap(), mining_options); mining_options.tx_queue_strategy = PrioritizationStrategy::GasFactorAndGasPrice; - assert_eq!(conf1.miner_options(min_period).unwrap(), mining_options); + assert_eq!(conf1.miner_options().unwrap(), mining_options); mining_options.tx_queue_strategy = PrioritizationStrategy::GasPriceOnly; - assert_eq!(conf2.miner_options(min_period).unwrap(), mining_options); + assert_eq!(conf2.miner_options().unwrap(), mining_options); mining_options.tx_queue_strategy = PrioritizationStrategy::GasAndGasPrice; - assert_eq!(conf3.miner_options(min_period).unwrap(), mining_options); + assert_eq!(conf3.miner_options().unwrap(), mining_options); } #[test] fn should_fail_on_force_reseal_and_reseal_min_period() { - let conf = parse(&["parity", "--chain", "dev", "--force-sealing"]); + let conf = parse(&["parity", "--chain", "dev", "--force-sealing", "--reseal-min-period", "0"]); - assert!(conf.miner_options(0).is_err()); + assert!(conf.miner_options().is_err()); } #[test] @@ -1446,7 +1430,7 @@ mod tests { // then assert_eq!(conf.network_settings(), Ok(NetworkSettings { name: "testname".to_owned(), - chain: "testnet".to_owned(), + chain: "kovan".to_owned(), network_port: 30303, rpc_enabled: true, rpc_interface: "127.0.0.1".to_owned(), diff --git a/parity/rpc.rs b/parity/rpc.rs index 8121792e7..995c7f988 100644 --- a/parity/rpc.rs +++ b/parity/rpc.rs @@ -303,6 +303,12 @@ pub fn new_ipc( let handler = setup_apis(conf.apis, dependencies); let remote = dependencies.remote.clone(); + let path = PathBuf::from(&conf.socket_addr); + if let Some(dir) = path.parent() { + ::std::fs::create_dir_all(&dir) + .map_err(|err| format!("Unable to create IPC directory at {}: {}", dir.display(), err))?; + } + match rpc::start_ipc(&conf.socket_addr, handler, remote, rpc::RpcExtractor) { Ok(server) => Ok(Some(server)), Err(io_error) => Err(format!("IPC error: {}", io_error)), From f7ba063b22c31384aaebcc774a553169bbc881c3 Mon Sep 17 00:00:00 2001 From: David Dorgan Date: Tue, 24 Oct 2017 12:31:50 +0100 Subject: [PATCH 10/35] Sync parity-ewf with parity --- dapps/src/handlers/async.rs | 112 + dapps/src/url.rs | 150 ++ ethcore/build.rs | 23 + ethcore/light/build.rs | 27 + ethcore/light/src/types/mod.rs.in | 17 + ethcore/light/src/types/request/builder.rs | 258 ++ ethcore/res/ethereum/metropolis_test.json | 53 + ethcore/res/ethereum/tobalaba.json | 38 + ethcore/src/json_tests/homestead_chain.rs | 39 + .../src/snapshot/snapshot_service_trait.rs | 58 + ethcore/src/tests/rpc.rs | 78 + ethcore/wasm/src/call_args.rs | 63 + ipc-common-types/Cargo.toml | 16 + ipc-common-types/build.rs | 21 + ipc-common-types/src/lib.rs | 26 + ipc-common-types/src/types/mod.rs | 21 + ipc-common-types/src/types/mod.rs.in | 21 + ipc-common-types/src/types/release_track.rs | 83 + ipc-common-types/src/types/version_info.rs | 70 + ipc/codegen/Cargo.toml | 26 + ipc/codegen/build.rs | 43 + ipc/codegen/src/codegen.rs | 898 +++++++ ipc/codegen/src/lib.rs | 237 ++ ipc/codegen/src/lib.rs.in | 18 + ipc/codegen/src/serialization.rs | 810 +++++++ ipc/hypervisor/Cargo.toml | 19 + ipc/hypervisor/build.rs | 21 + ipc/hypervisor/src/lib.rs | 273 +++ ipc/hypervisor/src/service.rs | 20 + ipc/hypervisor/src/service.rs.in | 125 + ipc/nano/Cargo.toml | 13 + ipc/nano/src/lib.rs | 355 +++ ipc/rpc/Cargo.toml | 14 + ipc/rpc/src/binary.rs | 1196 ++++++++++ ipc/rpc/src/interface.rs | 106 + ipc/rpc/src/lib.rs | 28 + ipc/tests/Cargo.toml | 20 + ipc/tests/binary.rs | 19 + ipc/tests/binary.rs.in | 169 ++ ipc/tests/build.rs | 24 + ipc/tests/examples.rs | 173 ++ ipc/tests/nested.rs | 18 + ipc/tests/nested.rs.in | 56 + ipc/tests/over_nano.rs | 77 + ipc/tests/run.rs | 32 + ipc/tests/service.rs | 18 + ipc/tests/service.rs.in | 69 + ipc/tests/with_attrs.rs | 18 + ipc/tests/with_attrs.rs.in | 28 + js/assets/fonts/Roboto/LICENSE.txt | 202 ++ js/assets/fonts/Roboto/font.css | 56 + js/assets/fonts/Roboto/ttf/Roboto-Black.ttf | Bin 0 -> 163488 bytes .../fonts/Roboto/ttf/Roboto-BlackItalic.ttf | Bin 0 -> 165444 bytes js/assets/fonts/Roboto/ttf/Roboto-Bold.ttf | Bin 0 -> 162464 bytes .../fonts/Roboto/ttf/Roboto-BoldItalic.ttf | Bin 0 -> 163644 bytes js/assets/fonts/Roboto/ttf/Roboto-Italic.ttf | Bin 0 -> 161484 bytes js/assets/fonts/Roboto/ttf/Roboto-Light.ttf | Bin 0 -> 162420 bytes .../fonts/Roboto/ttf/Roboto-LightItalic.ttf | Bin 0 -> 166492 bytes js/assets/fonts/Roboto/ttf/Roboto-Medium.ttf | Bin 0 -> 162588 bytes .../fonts/Roboto/ttf/Roboto-MediumItalic.ttf | Bin 0 -> 165636 bytes js/assets/fonts/Roboto/ttf/Roboto-Regular.ttf | Bin 0 -> 162876 bytes js/assets/fonts/Roboto/ttf/Roboto-Thin.ttf | Bin 0 -> 163132 bytes .../fonts/Roboto/ttf/Roboto-ThinItalic.ttf | Bin 0 -> 168276 bytes ...6m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2 | Bin 0 -> 788 bytes ...6luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2 | Bin 0 -> 10824 bytes ...OxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2 | Bin 0 -> 6832 bytes ...tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2 | Bin 0 -> 10324 bytes ...Sg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2 | Bin 0 -> 5176 bytes ...4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2 | Bin 0 -> 3036 bytes ...ShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2 | Bin 0 -> 8040 bytes js/assets/fonts/RobotoMono/LICENSE.txt | 202 ++ js/assets/fonts/RobotoMono/font.css | 56 + .../fonts/RobotoMono/ttf/RobotoMono-Bold.ttf | Bin 0 -> 114752 bytes .../RobotoMono/ttf/RobotoMono-BoldItalic.ttf | Bin 0 -> 122808 bytes .../RobotoMono/ttf/RobotoMono-Italic.ttf | Bin 0 -> 120832 bytes .../fonts/RobotoMono/ttf/RobotoMono-Light.ttf | Bin 0 -> 118976 bytes .../RobotoMono/ttf/RobotoMono-LightItalic.ttf | Bin 0 -> 127568 bytes .../RobotoMono/ttf/RobotoMono-Medium.ttf | Bin 0 -> 114696 bytes .../ttf/RobotoMono-MediumItalic.ttf | Bin 0 -> 123640 bytes .../RobotoMono/ttf/RobotoMono-Regular.ttf | Bin 0 -> 114624 bytes .../fonts/RobotoMono/ttf/RobotoMono-Thin.ttf | Bin 0 -> 118132 bytes .../RobotoMono/ttf/RobotoMono-ThinItalic.ttf | Bin 0 -> 121456 bytes ...C58uwPiY8_59Fz-pRBTtN4E2_qSPBnw6AgMc.woff2 | Bin 0 -> 3516 bytes ...C58uwPiY8_59Fz0ExlR2MysFCBK8OirNw2kM.woff2 | Bin 0 -> 12108 bytes ...C58uwPiY8_59Fz2MSHb9EAJwuSzGfuRChQzQ.woff2 | Bin 0 -> 5264 bytes ...C58uwPiY8_59Fz2dsm03krrxlabhmVQFB99s.woff2 | Bin 0 -> 6712 bytes ...C58uwPiY8_59Fz9Dnm4qiMZlH5rhYv_7LI2Y.woff2 | Bin 0 -> 8136 bytes ...C58uwPiY8_59Fz9TIkQYohD4BpHvJ3NvbHoA.woff2 | Bin 0 -> 11032 bytes ...C58uwPiY8_59FzyJ0caWjaSBdV-xZbEgst_k.woff2 | Bin 0 -> 740 bytes js/assets/images/certifications/unknown.svg | 4 + .../images/contracts/ethereum-black-64x64.png | Bin 0 -> 771 bytes js/assets/images/contracts/ethereum-black.png | Bin 0 -> 147077 bytes js/assets/images/contracts/ethereum-white.png | Bin 0 -> 22208 bytes js/assets/images/contracts/unknown-64x64.png | Bin 0 -> 2248 bytes js/assets/images/contracts/unknown.png | Bin 0 -> 34230 bytes js/assets/images/dapps/blocks-350.jpg | Bin 0 -> 235011 bytes js/assets/images/dapps/close.svg | 12 + js/assets/images/dapps/plus.svg | 12 + js/assets/images/dapps/signature.png | Bin 0 -> 2655 bytes .../images/parity-logo-black-no-text.ico | Bin 0 -> 674 bytes .../images/parity-logo-black-no-text.png | Bin 0 -> 4386 bytes .../images/parity-logo-black-no-text.svg | 65 + js/assets/images/parity-logo-black.svg | 107 + .../images/parity-logo-white-no-text.svg | 66 + js/assets/images/parity-logo-white.svg | 100 + js/assets/images/paritybar.png | Bin 0 -> 1971 bytes js/assets/images/shapeshift-btn.png | Bin 0 -> 22406 bytes js/assets/images/shapeshift-logo.png | Bin 0 -> 15127 bytes js/npm/etherscan/README.md | 34 + js/npm/etherscan/package.json | 33 + js/npm/jsonrpc/README.md | 5 + js/npm/jsonrpc/package.json | 29 + js/npm/parity/README.md | 83 + js/npm/parity/package.json | 33 + js/npm/parity/test/smoke.spec.js | 26 + js/npm/shapeshift/README.md | 34 + js/npm/shapeshift/package.json | 31 + js/npm/test/mocha.config.js | 29 + js/npm/test/mocha.opts | 1 + js/scripts/build-rpc-json.js | 70 + js/scripts/build-rpc-markdown.js | 328 +++ js/scripts/helpers/log.js | 32 + js/scripts/helpers/parsed-rpc-traits.js | 81 + js/src/3rdparty/email-verification/index.js | 68 + .../email-verification/terms-of-service.js | 27 + js/src/3rdparty/etherscan/account.js | 75 + js/src/3rdparty/etherscan/account.spec.js | 71 + js/src/3rdparty/etherscan/call.js | 47 + js/src/3rdparty/etherscan/helpers.spec.js | 38 + js/src/3rdparty/etherscan/index.js | 28 + js/src/3rdparty/etherscan/links.js | 55 + js/src/3rdparty/etherscan/links.spec.js | 57 + js/src/3rdparty/etherscan/stats.js | 36 + js/src/3rdparty/etherscan/stats.spec.js | 37 + js/src/3rdparty/ledger/index.js | 17 + js/src/3rdparty/ledger/ledger.js | 136 ++ js/src/3rdparty/ledger/ledger.spec.js | 120 + js/src/3rdparty/ledger/vendor/README.md | 11 + js/src/3rdparty/ledger/vendor/ledger-eth.js | 166 ++ js/src/3rdparty/ledger/vendor/ledger3.js | 72 + js/src/3rdparty/shapeshift/helpers.spec.js | 56 + js/src/3rdparty/shapeshift/index.js | 22 + js/src/3rdparty/shapeshift/rpc.js | 67 + js/src/3rdparty/shapeshift/rpc.spec.js | 91 + js/src/3rdparty/shapeshift/shapeshift.js | 135 ++ js/src/3rdparty/shapeshift/shapeshift.spec.js | 220 ++ js/src/3rdparty/sms-verification/index.js | 68 + .../sms-verification/terms-of-service.js | 27 + js/src/abi/README.md | 32 + js/src/abi/abi.js | 20 + js/src/abi/decoder/bytesTaken.js | 30 + js/src/abi/decoder/bytesTaken.spec.js | 29 + js/src/abi/decoder/decodeResult.js | 30 + js/src/abi/decoder/decodeResult.spec.js | 29 + js/src/abi/decoder/decoder.js | 156 ++ js/src/abi/decoder/decoder.spec.js | 319 +++ js/src/abi/decoder/index.js | 17 + js/src/abi/encoder/encoder.js | 75 + js/src/abi/encoder/encoder.spec.js | 291 +++ js/src/abi/encoder/index.js | 17 + js/src/abi/encoder/mediate.js | 142 ++ js/src/abi/encoder/mediate.spec.js | 105 + js/src/abi/index.js | 17 + js/src/abi/spec/constructor.js | 36 + js/src/abi/spec/constructor.spec.js | 52 + js/src/abi/spec/event/decodedLog.js | 30 + js/src/abi/spec/event/decodedLog.spec.js | 28 + js/src/abi/spec/event/decodedLogParam.js | 45 + js/src/abi/spec/event/decodedLogParam.spec.js | 42 + js/src/abi/spec/event/event.js | 114 + js/src/abi/spec/event/event.spec.js | 111 + js/src/abi/spec/event/eventParam.js | 41 + js/src/abi/spec/event/eventParam.spec.js | 44 + js/src/abi/spec/event/index.js | 17 + js/src/abi/spec/function.js | 88 + js/src/abi/spec/function.spec.js | 101 + js/src/abi/spec/index.js | 17 + js/src/abi/spec/interface.js | 77 + js/src/abi/spec/interface.spec.js | 126 + js/src/abi/spec/param.js | 42 + js/src/abi/spec/param.spec.js | 47 + js/src/abi/spec/paramType/format.js | 80 + js/src/abi/spec/paramType/format.spec.js | 228 ++ js/src/abi/spec/paramType/index.js | 17 + js/src/abi/spec/paramType/paramType.js | 52 + js/src/abi/spec/paramType/paramType.spec.js | 87 + js/src/abi/spec/paramType/types.js | 19 + js/src/abi/token/index.js | 17 + js/src/abi/token/token.js | 42 + js/src/abi/token/token.spec.js | 75 + js/src/abi/util/address.js | 66 + js/src/abi/util/address.spec.js | 100 + js/src/abi/util/pad.js | 77 + js/src/abi/util/pad.spec.js | 124 + js/src/abi/util/signature.js | 49 + js/src/abi/util/signature.spec.js | 111 + js/src/abi/util/slice.js | 31 + js/src/abi/util/slice.spec.js | 44 + js/src/abi/util/sliceAs.js | 47 + js/src/abi/util/sliceAs.spec.js | 55 + js/src/abi/util/types.js | 27 + js/src/abi/util/types.spec.js | 62 + js/src/api/README.md | 146 ++ js/src/api/api.js | 184 ++ js/src/api/api.spec.js | 59 + js/src/api/contract/contract.js | 561 +++++ js/src/api/contract/contract.spec.js | 597 +++++ js/src/api/contract/index.js | 17 + js/src/api/format/input.js | 242 ++ js/src/api/format/input.spec.js | 341 +++ js/src/api/format/output.js | 414 ++++ js/src/api/format/output.spec.js | 502 ++++ js/src/api/index.js | 17 + js/src/api/local/accounts/account.js | 116 + js/src/api/local/accounts/accounts.js | 229 ++ js/src/api/local/accounts/index.js | 21 + js/src/api/local/ethkey/ethkey.js | 147 ++ js/src/api/local/ethkey/ethkey.wasm.js | 1 + js/src/api/local/ethkey/index.js | 47 + js/src/api/local/ethkey/index.spec.js | 58 + js/src/api/local/ethkey/worker.js | 138 ++ js/src/api/local/ethkey/workerPool.js | 105 + js/src/api/local/index.js | 17 + js/src/api/local/localAccountsMiddleware.js | 288 +++ .../api/local/localAccountsMiddleware.spec.js | 157 ++ js/src/api/local/transactions.js | 147 ++ js/src/api/local/transactions.spec.js | 85 + js/src/api/pubsub/eth/eth.js | 227 ++ js/src/api/pubsub/eth/index.js | 16 + js/src/api/pubsub/index.js | 16 + js/src/api/pubsub/net/index.js | 16 + js/src/api/pubsub/net/net.js | 42 + js/src/api/pubsub/parity/index.js | 16 + js/src/api/pubsub/parity/parity.js | 364 +++ js/src/api/pubsub/pubsub.js | 79 + js/src/api/pubsub/pubsub.spec.js | 613 +++++ js/src/api/pubsub/pubsubBase.js | 38 + js/src/api/pubsub/signer/index.js | 16 + js/src/api/pubsub/signer/signer.js | 37 + js/src/api/rpc/db/db.js | 43 + js/src/api/rpc/db/db.spec.js | 38 + js/src/api/rpc/db/index.js | 17 + js/src/api/rpc/eth/eth.e2e.js | 170 ++ js/src/api/rpc/eth/eth.js | 321 +++ js/src/api/rpc/eth/eth.spec.js | 474 ++++ js/src/api/rpc/eth/index.js | 17 + js/src/api/rpc/index.js | 25 + js/src/api/rpc/net/index.js | 17 + js/src/api/rpc/net/net.e2e.js | 46 + js/src/api/rpc/net/net.js | 39 + js/src/api/rpc/net/net.spec.js | 36 + js/src/api/rpc/parity/index.js | 17 + js/src/api/rpc/parity/parity.e2e.js | 79 + js/src/api/rpc/parity/parity.js | 587 +++++ js/src/api/rpc/parity/parity.spec.js | 146 ++ js/src/api/rpc/personal/index.js | 17 + js/src/api/rpc/personal/personal.e2e.js | 53 + js/src/api/rpc/personal/personal.js | 46 + js/src/api/rpc/personal/personal.spec.js | 75 + js/src/api/rpc/shh/index.js | 17 + js/src/api/rpc/shh/shh.js | 91 + js/src/api/rpc/signer/index.js | 17 + js/src/api/rpc/signer/signer.js | 65 + js/src/api/rpc/trace/index.js | 17 + js/src/api/rpc/trace/trace.e2e.js | 45 + js/src/api/rpc/trace/trace.js | 66 + js/src/api/rpc/trace/trace.spec.js | 44 + js/src/api/rpc/web3/index.js | 17 + js/src/api/rpc/web3/web3.e2e.js | 44 + js/src/api/rpc/web3/web3.js | 33 + js/src/api/rpc/web3/web3.spec.js | 38 + js/src/api/subscriptions/eth.js | 95 + js/src/api/subscriptions/eth.spec.js | 102 + js/src/api/subscriptions/index.js | 19 + js/src/api/subscriptions/logging.js | 44 + js/src/api/subscriptions/logging.spec.js | 49 + js/src/api/subscriptions/manager.js | 137 ++ js/src/api/subscriptions/manager.spec.js | 134 ++ js/src/api/subscriptions/personal.js | 160 ++ js/src/api/subscriptions/personal.spec.js | 156 ++ js/src/api/subscriptions/signer.js | 118 + js/src/api/transport/error.js | 61 + js/src/api/transport/http/http.e2e.js | 29 + js/src/api/transport/http/http.js | 103 + js/src/api/transport/http/http.spec.js | 142 ++ js/src/api/transport/http/index.js | 17 + js/src/api/transport/index.js | 20 + js/src/api/transport/jsonRpcBase.js | 168 ++ js/src/api/transport/jsonRpcBase.spec.js | 88 + js/src/api/transport/logger.js | 150 ++ js/src/api/transport/middleware.js | 44 + js/src/api/transport/middleware.spec.js | 62 + js/src/api/transport/ws/index.js | 17 + js/src/api/transport/ws/ws.e2e.js | 29 + js/src/api/transport/ws/ws.js | 398 ++++ js/src/api/transport/ws/ws.spec.js | 116 + js/src/api/util/decode.js | 95 + js/src/api/util/decode.spec.js | 105 + js/src/api/util/encode.js | 69 + js/src/api/util/encode.spec.js | 90 + js/src/api/util/format.js | 106 + js/src/api/util/format.spec.js | 94 + js/src/api/util/identity.js | 30 + js/src/api/util/index.js | 51 + js/src/api/util/sha3.js | 36 + js/src/api/util/sha3.spec.js | 46 + js/src/api/util/types.js | 60 + js/src/api/util/types.spec.js | 118 + js/src/api/util/wei.js | 37 + js/src/api/util/wei.spec.js | 57 + js/src/config.js | 40 + js/src/contracts/abi/badgereg.json | 1 + js/src/contracts/abi/basiccoin.json | 1 + js/src/contracts/abi/basiccoinmanager.json | 1 + js/src/contracts/abi/certifier.json | 1 + .../abi/consensys-multisig-wallet.json | 510 ++++ js/src/contracts/abi/dappreg.json | 1 + js/src/contracts/abi/eip20.json | 163 ++ js/src/contracts/abi/email-verification.json | 1 + .../abi/foundation-multisig-wallet.json | 476 ++++ js/src/contracts/abi/gavcoin.json | 1 + js/src/contracts/abi/githubhint.json | 81 + js/src/contracts/abi/index.js | 31 + js/src/contracts/abi/old-wallet.json | 466 ++++ js/src/contracts/abi/owned.json | 1 + js/src/contracts/abi/registry.json | 1 + js/src/contracts/abi/registry2.json | 1 + js/src/contracts/abi/signaturereg.json | 128 + js/src/contracts/abi/sms-verification.json | 1 + js/src/contracts/abi/tokenreg.json | 1 + js/src/contracts/badgereg.js | 128 + js/src/contracts/code/index.js | 21 + js/src/contracts/code/wallet.js | 32 + js/src/contracts/contracts.js | 83 + js/src/contracts/dappreg.js | 68 + js/src/contracts/githubhint.js | 46 + js/src/contracts/githubhint.spec.js | 66 + js/src/contracts/index.js | 17 + js/src/contracts/registry.js | 165 ++ js/src/contracts/registry.spec.js | 86 + js/src/contracts/signaturereg.js | 34 + js/src/contracts/snippets/enhanced-wallet.sol | 464 ++++ .../snippets/human-standard-token.sol | 60 + js/src/contracts/snippets/standard-token.sol | 55 + js/src/contracts/snippets/token.sol | 47 + js/src/contracts/snippets/wallet.sol | 403 ++++ js/src/contracts/tokenreg.js | 44 + js/src/contracts/verification.js | 88 + js/src/dapps/chaindeploy.js | 29 + .../chaindeploy/Application/application.css | 78 + .../chaindeploy/Application/application.js | 178 ++ js/src/dapps/chaindeploy/Application/index.js | 17 + js/src/dapps/chaindeploy/Contract/contract.js | 132 ++ js/src/dapps/chaindeploy/Contract/index.js | 17 + js/src/dapps/chaindeploy/Dapp/dapp.js | 98 + js/src/dapps/chaindeploy/Dapp/index.js | 17 + .../chaindeploy/ListItem/Header/header.js | 45 + .../chaindeploy/ListItem/Header/index.js | 17 + .../dapps/chaindeploy/ListItem/Icon/icon.js | 53 + .../dapps/chaindeploy/ListItem/Icon/index.js | 17 + .../dapps/chaindeploy/ListItem/Row/index.js | 17 + js/src/dapps/chaindeploy/ListItem/Row/row.js | 54 + js/src/dapps/chaindeploy/ListItem/index.js | 20 + .../dapps/chaindeploy/ListItem/listItem.css | 94 + js/src/dapps/chaindeploy/ListItem/listItem.js | 63 + js/src/dapps/chaindeploy/_dapps.js | 43 + .../chaindeploy/contracts/abi/jg-voting.json | 1 + .../dapps/chaindeploy/contracts/badgereg.js | 30 + .../chaindeploy/contracts/code/badgereg.json | 5 + .../chaindeploy/contracts/code/dappreg.json | 5 + .../chaindeploy/contracts/code/gavcoin.json | 5 + .../contracts/code/githubhint.json | 5 + .../chaindeploy/contracts/code/jg-voting.json | 5 + .../chaindeploy/contracts/code/registry.json | 5 + .../contracts/code/signaturereg.json | 5 + .../contracts/code/tokendeploy.json | 5 + .../chaindeploy/contracts/code/tokenreg.json | 5 + .../contracts/code/verifyEmail.json | 5 + .../chaindeploy/contracts/code/verifySms.json | 5 + js/src/dapps/chaindeploy/contracts/dappreg.js | 30 + js/src/dapps/chaindeploy/contracts/gavcoin.js | 32 + .../dapps/chaindeploy/contracts/githubhint.js | 30 + js/src/dapps/chaindeploy/contracts/index.js | 52 + .../dapps/chaindeploy/contracts/jg-voting.js | 32 + .../dapps/chaindeploy/contracts/registry.js | 30 + .../chaindeploy/contracts/signaturereg.js | 30 + .../chaindeploy/contracts/tokendeployMgr.js | 30 + .../chaindeploy/contracts/tokendeployReg.js | 28 + .../dapps/chaindeploy/contracts/tokenreg.js | 30 + .../chaindeploy/contracts/verifyEmail.js | 37 + .../dapps/chaindeploy/contracts/verifySms.js | 37 + js/src/dapps/chaindeploy/contracts/wallet.js | 29 + js/src/dapps/chaindeploy/dapps/console.js | 33 + js/src/dapps/chaindeploy/dapps/dappreg.js | 33 + js/src/dapps/chaindeploy/dapps/gavcoin.js | 41 + js/src/dapps/chaindeploy/dapps/githubhint.js | 33 + js/src/dapps/chaindeploy/dapps/index.js | 50 + js/src/dapps/chaindeploy/dapps/jg-voting.js | 41 + .../dapps/chaindeploy/dapps/jg-whenblock.js | 39 + js/src/dapps/chaindeploy/dapps/localtx.js | 33 + js/src/dapps/chaindeploy/dapps/registry.js | 33 + .../dapps/chaindeploy/dapps/signaturereg.js | 33 + js/src/dapps/chaindeploy/dapps/tokendeploy.js | 33 + js/src/dapps/chaindeploy/dapps/tokenreg.js | 33 + js/src/dapps/chaindeploy/dapps/web.js | 33 + js/src/dapps/chaindeploy/parity.js | 21 + js/src/dapps/chaindeploy/store.js | 714 ++++++ js/src/dapps/chaindeploy/utils.js | 82 + js/src/dapps/console.js | 59 + .../dapps/console/Application/application.css | 65 + .../dapps/console/Application/application.js | 94 + .../console/Application/application.store.js | 42 + js/src/dapps/console/Application/index.js | 17 + .../console/Autocomplete/autocomplete.css | 55 + .../console/Autocomplete/autocomplete.js | 96 + .../Autocomplete/autocomplete.store.js | 234 ++ js/src/dapps/console/Autocomplete/index.js | 17 + js/src/dapps/console/Console/console.css | 58 + js/src/dapps/console/Console/console.js | 118 + js/src/dapps/console/Console/console.store.js | 126 + js/src/dapps/console/Console/index.js | 17 + js/src/dapps/console/Header/header.css | 51 + js/src/dapps/console/Header/header.js | 65 + js/src/dapps/console/Header/index.js | 17 + js/src/dapps/console/Input/index.js | 17 + js/src/dapps/console/Input/input.css | 46 + js/src/dapps/console/Input/input.js | 145 ++ js/src/dapps/console/Input/input.store.js | 124 + js/src/dapps/console/Settings/index.js | 17 + js/src/dapps/console/Settings/settings.css | 32 + js/src/dapps/console/Settings/settings.js | 70 + .../dapps/console/Settings/settings.store.js | 71 + js/src/dapps/console/Snippets/index.js | 17 + js/src/dapps/console/Snippets/snippets.css | 122 + js/src/dapps/console/Snippets/snippets.js | 221 ++ .../dapps/console/Snippets/snippets.store.js | 249 ++ js/src/dapps/console/Watches/index.js | 17 + js/src/dapps/console/Watches/watches.css | 107 + js/src/dapps/console/Watches/watches.js | 186 ++ js/src/dapps/console/Watches/watches.store.js | 148 ++ js/src/dapps/console/codemirror.css | 36 + js/src/dapps/console/parity.js | 331 +++ js/src/dapps/console/utils.js | 36 + js/src/dapps/dappreg.js | 48 + .../dapps/dappreg/Application/application.css | 59 + .../dapps/dappreg/Application/application.js | 69 + js/src/dapps/dappreg/Application/index.js | 17 + js/src/dapps/dappreg/Button/button.css | 47 + js/src/dapps/dappreg/Button/button.js | 55 + js/src/dapps/dappreg/Button/index.js | 17 + js/src/dapps/dappreg/Card/card.css | 66 + js/src/dapps/dappreg/Card/card.js | 99 + js/src/dapps/dappreg/Card/index.js | 17 + .../dappreg/CreateDappCard/createDappCard.js | 84 + js/src/dapps/dappreg/CreateDappCard/index.js | 17 + js/src/dapps/dappreg/DappCard/dappCard.css | 22 + js/src/dapps/dappreg/DappCard/dappCard.js | 110 + js/src/dapps/dappreg/DappCard/index.js | 17 + js/src/dapps/dappreg/DappModal/dappModal.css | 82 + js/src/dapps/dappreg/DappModal/dappModal.js | 423 ++++ js/src/dapps/dappreg/DappModal/index.js | 17 + js/src/dapps/dappreg/Dapps/dapps.css | 38 + js/src/dapps/dappreg/Dapps/dapps.js | 73 + js/src/dapps/dappreg/Dapps/index.js | 17 + js/src/dapps/dappreg/Input/index.js | 17 + js/src/dapps/dappreg/Input/input.css | 96 + js/src/dapps/dappreg/Input/input.js | 53 + js/src/dapps/dappreg/Modal/index.js | 17 + js/src/dapps/dappreg/Modal/modal.css | 141 ++ js/src/dapps/dappreg/Modal/modal.js | 160 ++ js/src/dapps/dappreg/ModalDelete/index.js | 17 + .../dapps/dappreg/ModalDelete/modalDelete.js | 61 + js/src/dapps/dappreg/ModalRegister/index.js | 17 + .../dappreg/ModalRegister/modalRegister.js | 68 + js/src/dapps/dappreg/ModalUpdate/index.js | 17 + .../dapps/dappreg/ModalUpdate/modalUpdate.js | 84 + js/src/dapps/dappreg/SelectAccount/index.js | 17 + .../dappreg/SelectAccount/selectAccount.js | 57 + js/src/dapps/dappreg/Transactions/index.js | 17 + .../dappreg/Transactions/transactions.css | 95 + .../dappreg/Transactions/transactions.js | 136 ++ js/src/dapps/dappreg/Warning/index.js | 17 + js/src/dapps/dappreg/Warning/warning.css | 38 + js/src/dapps/dappreg/Warning/warning.js | 55 + js/src/dapps/dappreg/_colors.css | 30 + js/src/dapps/dappreg/_utils.css | 22 + js/src/dapps/dappreg/dappStore.js | 153 ++ js/src/dapps/dappreg/dappsStore.js | 522 +++++ js/src/dapps/dappreg/parity.js | 45 + js/src/dapps/dappreg/utils.js | 190 ++ js/src/dapps/dappreg/utils.spec.js | 33 + js/src/dapps/githubhint.js | 48 + .../githubhint/Application/application.css | 161 ++ .../githubhint/Application/application.js | 521 +++++ js/src/dapps/githubhint/Application/index.js | 17 + js/src/dapps/githubhint/Button/button.css | 56 + js/src/dapps/githubhint/Button/button.js | 53 + js/src/dapps/githubhint/Button/index.js | 17 + js/src/dapps/githubhint/Events/events.css | 37 + js/src/dapps/githubhint/Events/events.js | 52 + js/src/dapps/githubhint/Events/index.js | 17 + js/src/dapps/githubhint/Loading/index.js | 17 + js/src/dapps/githubhint/Loading/loading.css | 24 + js/src/dapps/githubhint/Loading/loading.js | 29 + js/src/dapps/githubhint/parity.js | 21 + js/src/dapps/githubhint/services.js | 60 + js/src/dapps/index.ejs | 37 + js/src/dapps/localtx.js | 48 + .../dapps/localtx/Application/application.css | 43 + .../dapps/localtx/Application/application.js | 212 ++ .../localtx/Application/application.spec.js | 32 + js/src/dapps/localtx/Application/index.js | 17 + .../localtx/IdentityIcon/identityIcon.css | 23 + .../localtx/IdentityIcon/identityIcon.js | 37 + js/src/dapps/localtx/IdentityIcon/index.js | 17 + js/src/dapps/localtx/Transaction/index.js | 17 + .../dapps/localtx/Transaction/transaction.css | 39 + .../dapps/localtx/Transaction/transaction.js | 395 ++++ .../localtx/Transaction/transaction.spec.js | 67 + js/src/dapps/localtx/parity.js | 21 + js/src/dapps/registry.js | 49 + js/src/dapps/registry/Accounts/accounts.css | 24 + js/src/dapps/registry/Accounts/accounts.js | 66 + js/src/dapps/registry/Accounts/actions.js | 40 + js/src/dapps/registry/Accounts/index.js | 17 + .../registry/Application/application.css | 66 + .../dapps/registry/Application/application.js | 138 ++ js/src/dapps/registry/Application/index.js | 17 + js/src/dapps/registry/Container.js | 68 + js/src/dapps/registry/Events/actions.js | 102 + js/src/dapps/registry/Events/events.css | 57 + js/src/dapps/registry/Events/events.js | 315 +++ js/src/dapps/registry/Events/index.js | 17 + js/src/dapps/registry/Events/reducers.js | 90 + .../registry/IdentityIcon/identityIcon.css | 23 + .../registry/IdentityIcon/identityIcon.js | 40 + js/src/dapps/registry/IdentityIcon/index.js | 17 + js/src/dapps/registry/Lookup/actions.js | 108 + js/src/dapps/registry/Lookup/index.js | 17 + js/src/dapps/registry/Lookup/lookup.css | 26 + js/src/dapps/registry/Lookup/lookup.js | 179 ++ js/src/dapps/registry/Lookup/reducers.js | 48 + js/src/dapps/registry/Names/actions.js | 135 ++ js/src/dapps/registry/Names/index.js | 17 + js/src/dapps/registry/Names/names.css | 46 + js/src/dapps/registry/Names/names.js | 191 ++ js/src/dapps/registry/Names/reducers.js | 75 + js/src/dapps/registry/Records/actions.js | 75 + js/src/dapps/registry/Records/index.js | 1 + js/src/dapps/registry/Records/records.css | 42 + js/src/dapps/registry/Records/records.js | 137 ++ js/src/dapps/registry/Records/reducers.js | 55 + js/src/dapps/registry/Reverse/actions.js | 117 + js/src/dapps/registry/Reverse/index.js | 1 + js/src/dapps/registry/Reverse/reducers.js | 85 + js/src/dapps/registry/Reverse/reverse.css | 42 + js/src/dapps/registry/Reverse/reverse.js | 162 ++ js/src/dapps/registry/actions.js | 95 + .../registry/addresses/accounts-reducer.js | 39 + js/src/dapps/registry/addresses/actions.js | 38 + .../registry/addresses/contacts-reducer.js | 32 + js/src/dapps/registry/parity.js | 23 + js/src/dapps/registry/reducers.js | 63 + js/src/dapps/registry/store.js | 22 + js/src/dapps/registry/ui/address.css | 41 + js/src/dapps/registry/ui/address.js | 120 + js/src/dapps/registry/ui/hash.css | 25 + js/src/dapps/registry/ui/hash.js | 67 + js/src/dapps/registry/ui/image.js | 40 + js/src/dapps/registry/util/actions.js | 31 + js/src/dapps/registry/util/etherscan-url.js | 28 + js/src/dapps/registry/util/post-tx.js | 30 + js/src/dapps/registry/util/registry.js | 37 + js/src/dapps/signaturereg.js | 48 + .../signaturereg/Application/application.css | 29 + .../signaturereg/Application/application.js | 121 + .../dapps/signaturereg/Application/index.js | 17 + js/src/dapps/signaturereg/Button/button.css | 43 + js/src/dapps/signaturereg/Button/button.js | 50 + js/src/dapps/signaturereg/Button/index.js | 17 + js/src/dapps/signaturereg/Events/events.css | 76 + js/src/dapps/signaturereg/Events/events.js | 84 + js/src/dapps/signaturereg/Events/index.js | 17 + js/src/dapps/signaturereg/Header/header.css | 67 + js/src/dapps/signaturereg/Header/header.js | 48 + js/src/dapps/signaturereg/Header/index.js | 17 + .../IdentityIcon/identityIcon.css | 23 + .../signaturereg/IdentityIcon/identityIcon.js | 37 + .../dapps/signaturereg/IdentityIcon/index.js | 17 + js/src/dapps/signaturereg/Import/import.css | 151 ++ js/src/dapps/signaturereg/Import/import.js | 204 ++ js/src/dapps/signaturereg/Import/index.js | 17 + js/src/dapps/signaturereg/Loading/index.js | 17 + js/src/dapps/signaturereg/Loading/loading.css | 24 + js/src/dapps/signaturereg/Loading/loading.js | 29 + js/src/dapps/signaturereg/format.js | 40 + js/src/dapps/signaturereg/parity.js | 21 + js/src/dapps/signaturereg/services.js | 181 ++ js/src/dapps/static/.gitkeep | 0 js/src/dapps/style.css | 48 + js/src/dapps/tokendeploy.js | 68 + .../AddressSelect/addressSelect.css | 27 + .../AddressSelect/addressSelect.js | 95 + .../dapps/tokendeploy/AddressSelect/index.js | 17 + .../tokendeploy/Application/Header/header.css | 71 + .../tokendeploy/Application/Header/header.js | 81 + .../tokendeploy/Application/Header/index.js | 17 + .../tokendeploy/Application/Loading/index.js | 17 + .../Application/Loading/loading.css | 24 + .../Application/Loading/loading.js | 29 + .../tokendeploy/Application/application.css | 28 + .../tokendeploy/Application/application.js | 107 + js/src/dapps/tokendeploy/Application/index.js | 17 + js/src/dapps/tokendeploy/Application/pages.js | 38 + .../dapps/tokendeploy/Container/container.css | 26 + .../dapps/tokendeploy/Container/container.js | 37 + js/src/dapps/tokendeploy/Container/index.js | 17 + .../Deploy/Deployment/deployment.css | 19 + .../Deploy/Deployment/deployment.js | 321 +++ .../tokendeploy/Deploy/Deployment/index.js | 17 + .../dapps/tokendeploy/Deploy/Event/event.css | 69 + .../dapps/tokendeploy/Deploy/Event/event.js | 104 + .../dapps/tokendeploy/Deploy/Event/index.js | 17 + .../tokendeploy/Deploy/Events/events.css | 41 + .../dapps/tokendeploy/Deploy/Events/events.js | 145 ++ .../dapps/tokendeploy/Deploy/Events/index.js | 17 + js/src/dapps/tokendeploy/Deploy/deploy.js | 31 + js/src/dapps/tokendeploy/Deploy/index.js | 17 + .../tokendeploy/IdentityIcon/identityIcon.css | 22 + .../tokendeploy/IdentityIcon/identityIcon.js | 39 + .../dapps/tokendeploy/IdentityIcon/index.js | 17 + .../dapps/tokendeploy/Overview/Owner/index.js | 17 + .../tokendeploy/Overview/Owner/owner.css | 54 + .../dapps/tokendeploy/Overview/Owner/owner.js | 79 + .../dapps/tokendeploy/Overview/Token/index.js | 17 + .../tokendeploy/Overview/Token/token.css | 53 + .../dapps/tokendeploy/Overview/Token/token.js | 68 + js/src/dapps/tokendeploy/Overview/index.js | 17 + .../dapps/tokendeploy/Overview/overview.css | 26 + js/src/dapps/tokendeploy/Overview/overview.js | 105 + .../dapps/tokendeploy/Transfer/Event/event.js | 106 + .../dapps/tokendeploy/Transfer/Event/index.js | 17 + .../tokendeploy/Transfer/Events/events.js | 151 ++ .../tokendeploy/Transfer/Events/index.js | 17 + .../dapps/tokendeploy/Transfer/Send/index.js | 17 + .../dapps/tokendeploy/Transfer/Send/send.css | 19 + .../dapps/tokendeploy/Transfer/Send/send.js | 345 +++ js/src/dapps/tokendeploy/Transfer/index.js | 17 + js/src/dapps/tokendeploy/Transfer/transfer.js | 31 + js/src/dapps/tokendeploy/_form.css | 108 + js/src/dapps/tokendeploy/_status.css | 36 + js/src/dapps/tokendeploy/background.jpg | Bin 0 -> 127459 bytes js/src/dapps/tokendeploy/parity.js | 21 + js/src/dapps/tokendeploy/services.js | 293 +++ js/src/dapps/tokenreg.js | 54 + .../AccountSelector/account-selector.css | 25 + .../AccountSelector/account-selector.js | 130 ++ .../Accounts/AccountSelector/container.js | 51 + .../Accounts/AccountSelector/index.js | 17 + js/src/dapps/tokenreg/Accounts/actions.js | 55 + js/src/dapps/tokenreg/Accounts/reducer.js | 57 + js/src/dapps/tokenreg/Actions/Query/index.js | 17 + js/src/dapps/tokenreg/Actions/Query/query.js | 217 ++ .../dapps/tokenreg/Actions/Register/index.js | 17 + .../tokenreg/Actions/Register/register.js | 235 ++ js/src/dapps/tokenreg/Actions/actions.css | 50 + js/src/dapps/tokenreg/Actions/actions.js | 179 ++ js/src/dapps/tokenreg/Actions/component.js | 119 + js/src/dapps/tokenreg/Actions/container.js | 60 + js/src/dapps/tokenreg/Actions/index.js | 17 + js/src/dapps/tokenreg/Actions/reducer.js | 155 ++ .../tokenreg/Application/application.css | 35 + .../dapps/tokenreg/Application/application.js | 77 + js/src/dapps/tokenreg/Application/index.js | 17 + js/src/dapps/tokenreg/Chip/chip.css | 45 + js/src/dapps/tokenreg/Chip/chip.js | 72 + js/src/dapps/tokenreg/Chip/index.js | 17 + js/src/dapps/tokenreg/Container.js | 66 + .../tokenreg/IdentityIcon/identityIcon.css | 23 + .../tokenreg/IdentityIcon/identityIcon.js | 37 + js/src/dapps/tokenreg/IdentityIcon/index.js | 17 + .../dapps/tokenreg/Inputs/Text/container.js | 38 + js/src/dapps/tokenreg/Inputs/Text/index.js | 17 + .../dapps/tokenreg/Inputs/Text/input-text.js | 149 ++ js/src/dapps/tokenreg/Inputs/inputs.css | 33 + js/src/dapps/tokenreg/Inputs/validation.js | 253 ++ js/src/dapps/tokenreg/Loading/index.js | 17 + js/src/dapps/tokenreg/Loading/loading.css | 23 + js/src/dapps/tokenreg/Loading/loading.js | 36 + js/src/dapps/tokenreg/Status/actions.js | 185 ++ js/src/dapps/tokenreg/Status/index.js | 17 + js/src/dapps/tokenreg/Status/reducer.js | 63 + js/src/dapps/tokenreg/Status/status.css | 42 + js/src/dapps/tokenreg/Status/status.js | 45 + .../dapps/tokenreg/Tokens/Token/add-meta.js | 227 ++ js/src/dapps/tokenreg/Tokens/Token/index.js | 17 + js/src/dapps/tokenreg/Tokens/Token/token.css | 140 ++ js/src/dapps/tokenreg/Tokens/Token/token.js | 399 ++++ .../tokenreg/Tokens/Token/tokenContainer.js | 73 + js/src/dapps/tokenreg/Tokens/actions.js | 261 +++ js/src/dapps/tokenreg/Tokens/container.js | 65 + js/src/dapps/tokenreg/Tokens/index.js | 17 + js/src/dapps/tokenreg/Tokens/reducer.js | 114 + js/src/dapps/tokenreg/Tokens/tokens.css | 24 + js/src/dapps/tokenreg/Tokens/tokens.js | 52 + js/src/dapps/tokenreg/constants.js | 30 + js/src/dapps/tokenreg/parity.js | 21 + js/src/dapps/tokenreg/reducers.js | 28 + js/src/dapps/tokenreg/store.js | 22 + js/src/dapps/tokenreg/utils.js | 76 + js/src/environment/empty.js | 0 js/src/environment/index.js | 22 + .../integration-tests/fake-backend.js | 85 + js/src/environment/integration-tests/index.js | 17 + js/src/environment/perf-debug/index.js | 17 + js/src/environment/perf-debug/why-update.js | 20 + js/src/environment/tests/index.js | 17 + js/src/environment/tests/test-utils.js | 49 + js/src/i18n/_default/account.js | 56 + js/src/i18n/_default/accounts.js | 43 + js/src/i18n/_default/addAddress.js | 38 + js/src/i18n/_default/addContract.js | 60 + js/src/i18n/_default/address.js | 28 + js/src/i18n/_default/addressSelect.js | 26 + js/src/i18n/_default/addresses.js | 25 + js/src/i18n/_default/application.js | 29 + js/src/i18n/_default/connection.js | 27 + js/src/i18n/_default/contract.js | 41 + js/src/i18n/_default/contracts.js | 28 + js/src/i18n/_default/createAccount.js | 194 ++ js/src/i18n/_default/createWallet.js | 87 + js/src/i18n/_default/dapp.js | 20 + js/src/i18n/_default/dapps.js | 48 + js/src/i18n/_default/deleteAccount.js | 24 + js/src/i18n/_default/deployContract.js | 67 + js/src/i18n/_default/editMeta.js | 34 + js/src/i18n/_default/errors.js | 26 + js/src/i18n/_default/executeContract.js | 45 + js/src/i18n/_default/extension.js | 20 + js/src/i18n/_default/faucet.js | 28 + js/src/i18n/_default/firstRun.js | 51 + js/src/i18n/_default/home.js | 38 + js/src/i18n/_default/index.js | 62 + js/src/i18n/_default/loadContract.js | 43 + js/src/i18n/_default/parityBar.js | 29 + js/src/i18n/_default/passwordChange.js | 54 + js/src/i18n/_default/peers.js | 46 + js/src/i18n/_default/requests.js | 24 + js/src/i18n/_default/saveContract.js | 27 + js/src/i18n/_default/settings.js | 100 + js/src/i18n/_default/shapeshift.js | 66 + js/src/i18n/_default/signer.js | 119 + js/src/i18n/_default/status.js | 86 + js/src/i18n/_default/syncWarning.js | 24 + js/src/i18n/_default/tabBar.js | 21 + js/src/i18n/_default/transfer.js | 56 + js/src/i18n/_default/txEditor.js | 39 + js/src/i18n/_default/ui.js | 196 ++ js/src/i18n/_default/upgradeParity.js | 47 + js/src/i18n/_default/vaults.js | 108 + js/src/i18n/_default/verification.js | 85 + js/src/i18n/_default/wallet.js | 45 + js/src/i18n/_default/walletSettings.js | 72 + js/src/i18n/_default/web.js | 19 + js/src/i18n/_default/writeContract.js | 62 + js/src/i18n/constants.js | 27 + js/src/i18n/de/index.js | 21 + js/src/i18n/de/settings.js | 96 + js/src/i18n/en/index.js | 21 + js/src/i18n/en/settings.js | 67 + js/src/i18n/index.js | 21 + js/src/i18n/languages.js | 23 + js/src/i18n/languages.spec.js | 30 + js/src/i18n/nl/account.js | 39 + js/src/i18n/nl/accounts.js | 34 + js/src/i18n/nl/addAddress.js | 38 + js/src/i18n/nl/addContract.js | 60 + js/src/i18n/nl/address.js | 28 + js/src/i18n/nl/addressSelect.js | 26 + js/src/i18n/nl/addresses.js | 25 + js/src/i18n/nl/application.js | 30 + js/src/i18n/nl/connection.js | 26 + js/src/i18n/nl/contract.js | 41 + js/src/i18n/nl/contracts.js | 28 + js/src/i18n/nl/createAccount.js | 160 ++ js/src/i18n/nl/createWallet.js | 106 + js/src/i18n/nl/dapp.js | 20 + js/src/i18n/nl/dapps.js | 45 + js/src/i18n/nl/deleteAccount.js | 24 + js/src/i18n/nl/deployContract.js | 90 + js/src/i18n/nl/details_windows.js | 17 + js/src/i18n/nl/editMeta.js | 34 + js/src/i18n/nl/errors.js | 24 + js/src/i18n/nl/executeContract.js | 58 + js/src/i18n/nl/extension.js | 20 + js/src/i18n/nl/faucet.js | 28 + js/src/i18n/nl/firstRun.js | 49 + js/src/i18n/nl/home.js | 38 + js/src/i18n/nl/index.js | 105 + js/src/i18n/nl/loadContract.js | 43 + js/src/i18n/nl/parityBar.js | 29 + js/src/i18n/nl/passwordChange.js | 54 + js/src/i18n/nl/saveContract.js | 27 + js/src/i18n/nl/settings.js | 101 + js/src/i18n/nl/shapeshift.js | 66 + js/src/i18n/nl/signer.js | 103 + js/src/i18n/nl/status.js | 66 + js/src/i18n/nl/tabBar.js | 21 + js/src/i18n/nl/transfer.js | 61 + js/src/i18n/nl/txEditor.js | 39 + js/src/i18n/nl/ui.js | 163 ++ js/src/i18n/nl/upgradeParity.js | 47 + js/src/i18n/nl/vaults.js | 108 + js/src/i18n/nl/verification.js | 85 + js/src/i18n/nl/wallet.js | 45 + js/src/i18n/nl/walletSettings.js | 69 + js/src/i18n/nl/web.js | 19 + js/src/i18n/nl/writeContract.js | 62 + js/src/i18n/store.js | 77 + js/src/i18n/store.spec.js | 73 + js/src/i18n/zh-Hant-TW/account.js | 39 + js/src/i18n/zh-Hant-TW/accounts.js | 36 + js/src/i18n/zh-Hant-TW/addAddress.js | 41 + js/src/i18n/zh-Hant-TW/addContract.js | 60 + js/src/i18n/zh-Hant-TW/address.js | 28 + js/src/i18n/zh-Hant-TW/addressSelect.js | 26 + js/src/i18n/zh-Hant-TW/addresses.js | 25 + js/src/i18n/zh-Hant-TW/application.js | 30 + js/src/i18n/zh-Hant-TW/connection.js | 30 + js/src/i18n/zh-Hant-TW/contract.js | 41 + js/src/i18n/zh-Hant-TW/contracts.js | 28 + js/src/i18n/zh-Hant-TW/createAccount.js | 165 ++ js/src/i18n/zh-Hant-TW/createWallet.js | 106 + js/src/i18n/zh-Hant-TW/dapp.js | 20 + js/src/i18n/zh-Hant-TW/dapps.js | 48 + js/src/i18n/zh-Hant-TW/deleteAccount.js | 24 + js/src/i18n/zh-Hant-TW/deployContract.js | 90 + js/src/i18n/zh-Hant-TW/details_windows.js | 17 + js/src/i18n/zh-Hant-TW/editMeta.js | 34 + js/src/i18n/zh-Hant-TW/errors.js | 24 + js/src/i18n/zh-Hant-TW/executeContract.js | 58 + js/src/i18n/zh-Hant-TW/extension.js | 22 + js/src/i18n/zh-Hant-TW/faucet.js | 29 + js/src/i18n/zh-Hant-TW/firstRun.js | 52 + js/src/i18n/zh-Hant-TW/home.js | 38 + js/src/i18n/zh-Hant-TW/index.js | 105 + js/src/i18n/zh-Hant-TW/loadContract.js | 43 + js/src/i18n/zh-Hant-TW/parityBar.js | 29 + js/src/i18n/zh-Hant-TW/passwordChange.js | 54 + js/src/i18n/zh-Hant-TW/saveContract.js | 27 + js/src/i18n/zh-Hant-TW/settings.js | 126 + js/src/i18n/zh-Hant-TW/shapeshift.js | 76 + js/src/i18n/zh-Hant-TW/signer.js | 107 + js/src/i18n/zh-Hant-TW/status.js | 67 + js/src/i18n/zh-Hant-TW/tabBar.js | 22 + js/src/i18n/zh-Hant-TW/transfer.js | 62 + js/src/i18n/zh-Hant-TW/txEditor.js | 40 + js/src/i18n/zh-Hant-TW/ui.js | 163 ++ js/src/i18n/zh-Hant-TW/upgradeParity.js | 55 + js/src/i18n/zh-Hant-TW/vaults.js | 114 + js/src/i18n/zh-Hant-TW/verification.js | 85 + js/src/i18n/zh-Hant-TW/wallet.js | 46 + js/src/i18n/zh-Hant-TW/walletSettings.js | 75 + js/src/i18n/zh-Hant-TW/web.js | 19 + js/src/i18n/zh-Hant-TW/writeContract.js | 62 + js/src/i18n/zh/account.js | 39 + js/src/i18n/zh/accounts.js | 36 + js/src/i18n/zh/addAddress.js | 41 + js/src/i18n/zh/addContract.js | 60 + js/src/i18n/zh/address.js | 28 + js/src/i18n/zh/addressSelect.js | 26 + js/src/i18n/zh/addresses.js | 25 + js/src/i18n/zh/application.js | 30 + js/src/i18n/zh/connection.js | 30 + js/src/i18n/zh/contract.js | 41 + js/src/i18n/zh/contracts.js | 28 + js/src/i18n/zh/createAccount.js | 165 ++ js/src/i18n/zh/createWallet.js | 106 + js/src/i18n/zh/dapp.js | 20 + js/src/i18n/zh/dapps.js | 48 + js/src/i18n/zh/deleteAccount.js | 24 + js/src/i18n/zh/deployContract.js | 90 + js/src/i18n/zh/details_windows.js | 17 + js/src/i18n/zh/editMeta.js | 34 + js/src/i18n/zh/errors.js | 24 + js/src/i18n/zh/executeContract.js | 58 + js/src/i18n/zh/extension.js | 22 + js/src/i18n/zh/faucet.js | 29 + js/src/i18n/zh/firstRun.js | 52 + js/src/i18n/zh/home.js | 38 + js/src/i18n/zh/index.js | 105 + js/src/i18n/zh/loadContract.js | 43 + js/src/i18n/zh/parityBar.js | 29 + js/src/i18n/zh/passwordChange.js | 54 + js/src/i18n/zh/saveContract.js | 27 + js/src/i18n/zh/settings.js | 126 + js/src/i18n/zh/shapeshift.js | 76 + js/src/i18n/zh/signer.js | 107 + js/src/i18n/zh/status.js | 67 + js/src/i18n/zh/tabBar.js | 22 + js/src/i18n/zh/transfer.js | 62 + js/src/i18n/zh/txEditor.js | 40 + js/src/i18n/zh/ui.js | 163 ++ js/src/i18n/zh/upgradeParity.js | 55 + js/src/i18n/zh/vaults.js | 114 + js/src/i18n/zh/verification.js | 85 + js/src/i18n/zh/wallet.js | 46 + js/src/i18n/zh/walletSettings.js | 75 + js/src/i18n/zh/web.js | 19 + js/src/i18n/zh/writeContract.js | 62 + js/src/index.ejs | 38 + js/src/index.js | 99 + js/src/jsonrpc/.gitignore | 1 + js/src/jsonrpc/README.md | 21 + js/src/jsonrpc/helpers.js | 92 + js/src/jsonrpc/index.js | 37 + js/src/jsonrpc/index.spec.js | 49 + js/src/jsonrpc/interfaces/db.js | 107 + js/src/jsonrpc/interfaces/eth.js | 1319 +++++++++++ js/src/jsonrpc/interfaces/net.js | 51 + js/src/jsonrpc/interfaces/parity.js | 2070 +++++++++++++++++ js/src/jsonrpc/interfaces/personal.js | 101 + js/src/jsonrpc/interfaces/shh.js | 291 +++ js/src/jsonrpc/interfaces/signer.js | 237 ++ js/src/jsonrpc/interfaces/trace.js | 376 +++ js/src/jsonrpc/interfaces/web3.js | 46 + js/src/jsonrpc/types.js | 202 ++ js/src/library.etherscan.js | 33 + js/src/library.jsonrpc.js | 19 + js/src/library.shapeshift.js | 33 + js/src/main.js | 35 + js/src/mobx/hardwareStore.js | 165 ++ js/src/mobx/hardwareStore.spec.js | 253 ++ js/src/mobx/historyStore.js | 62 + js/src/mobx/historyStore.spec.js | 71 + js/src/modals/AddAddress/addAddress.js | 187 ++ js/src/modals/AddAddress/addAddress.spec.js | 32 + js/src/modals/AddAddress/index.js | 17 + js/src/modals/AddAddress/store.js | 87 + js/src/modals/AddAddress/store.spec.js | 128 + js/src/modals/AddAddress/store.test.js | 28 + js/src/modals/AddContract/addContract.css | 16 + js/src/modals/AddContract/addContract.js | 293 +++ js/src/modals/AddContract/addContract.spec.js | 85 + js/src/modals/AddContract/addContract.test.js | 49 + js/src/modals/AddContract/index.js | 17 + js/src/modals/AddContract/store.js | 126 + js/src/modals/AddContract/store.spec.js | 171 ++ js/src/modals/AddContract/types.js | 97 + js/src/modals/AddDapps/addDapps.css | 47 + js/src/modals/AddDapps/addDapps.js | 137 ++ js/src/modals/AddDapps/addDapps.spec.js | 46 + js/src/modals/AddDapps/index.js | 17 + .../AccountDetails/accountDetails.js | 187 ++ .../AccountDetails/accountDetails.spec.js | 42 + .../CreateAccount/AccountDetails/index.js | 17 + .../AccountDetailsGeth/accountDetailsGeth.js | 66 + .../accountDetailsGeth.spec.js | 42 + .../CreateAccount/AccountDetailsGeth/index.js | 17 + .../CreateAccount/ChangeVault/changeVault.js | 51 + .../ChangeVault/changeVault.spec.js | 100 + .../modals/CreateAccount/ChangeVault/index.js | 17 + .../CreationType/creationType.js | 191 ++ .../CreationType/creationType.spec.js | 60 + .../CreateAccount/CreationType/index.js | 17 + .../modals/CreateAccount/GethCard/gethCard.js | 44 + js/src/modals/CreateAccount/GethCard/index.js | 17 + .../modals/CreateAccount/NewAccount/index.js | 17 + .../CreateAccount/NewAccount/newAccount.js | 277 +++ .../NewAccount/newAccount.spec.js | 161 ++ js/src/modals/CreateAccount/NewGeth/index.js | 17 + .../modals/CreateAccount/NewGeth/newGeth.js | 97 + .../CreateAccount/NewGeth/newGeth.spec.js | 66 + .../modals/CreateAccount/NewImport/index.js | 17 + .../CreateAccount/NewImport/newImport.js | 159 ++ .../CreateAccount/NewImport/newImport.spec.js | 96 + js/src/modals/CreateAccount/NewQr/index.js | 17 + js/src/modals/CreateAccount/NewQr/newQr.js | 136 ++ .../modals/CreateAccount/NewQr/newQr.spec.js | 93 + js/src/modals/CreateAccount/RawKey/index.js | 17 + js/src/modals/CreateAccount/RawKey/rawKey.js | 173 ++ .../CreateAccount/RawKey/rawKey.spec.js | 126 + .../CreateAccount/RecoveryPhrase/index.js | 17 + .../RecoveryPhrase/recoveryPhrase.js | 254 ++ .../RecoveryPhrase/recoveryPhrase.spec.js | 141 ++ js/src/modals/CreateAccount/TypeIcon/index.js | 17 + .../modals/CreateAccount/TypeIcon/typeIcon.js | 62 + js/src/modals/CreateAccount/createAccount.css | 138 ++ js/src/modals/CreateAccount/createAccount.js | 438 ++++ .../CreateAccount/createAccount.spec.js | 51 + .../CreateAccount/createAccount.test.js | 79 + js/src/modals/CreateAccount/errors.js | 77 + js/src/modals/CreateAccount/index.js | 21 + js/src/modals/CreateAccount/print.js | 70 + js/src/modals/CreateAccount/recoveryPage.ejs | 48 + js/src/modals/CreateAccount/store.js | 512 ++++ js/src/modals/CreateAccount/store.spec.js | 812 +++++++ .../CreateWallet/WalletDetails/index.js | 17 + .../WalletDetails/walletDetails.js | 251 ++ .../WalletDetails/walletDetails.spec.js | 49 + .../modals/CreateWallet/WalletInfo/index.js | 17 + .../CreateWallet/WalletInfo/walletInfo.js | 159 ++ .../WalletInfo/walletInfo.spec.js | 46 + .../modals/CreateWallet/WalletType/index.js | 17 + .../CreateWallet/WalletType/walletType.js | 88 + .../WalletType/walletType.spec.js | 42 + js/src/modals/CreateWallet/createWallet.css | 58 + js/src/modals/CreateWallet/createWallet.js | 205 ++ .../modals/CreateWallet/createWallet.spec.js | 58 + .../modals/CreateWallet/createWallet.test.js | 25 + .../modals/CreateWallet/createWalletStore.js | 306 +++ js/src/modals/CreateWallet/index.js | 17 + .../modals/DappPermissions/dappPermissions.js | 73 + .../DappPermissions/dappPermissions.spec.js | 50 + js/src/modals/DappPermissions/index.js | 17 + js/src/modals/DappPermissions/store.js | 133 ++ js/src/modals/DappPermissions/store.spec.js | 136 ++ js/src/modals/DeleteAccount/deleteAccount.css | 54 + js/src/modals/DeleteAccount/deleteAccount.js | 155 ++ .../DeleteAccount/deleteAccount.spec.js | 139 ++ js/src/modals/DeleteAccount/index.js | 17 + .../DeployContract/DetailsStep/detailsStep.js | 407 ++++ .../DeployContract/DetailsStep/index.js | 17 + .../DeployContract/ParametersStep/index.js | 17 + .../ParametersStep/parametersStep.js | 112 + .../modals/DeployContract/deployContract.css | 26 + .../modals/DeployContract/deployContract.js | 509 ++++ .../DeployContract/deployContract.spec.js | 55 + js/src/modals/DeployContract/index.js | 17 + js/src/modals/EditMeta/editMeta.js | 212 ++ js/src/modals/EditMeta/editMeta.spec.js | 87 + js/src/modals/EditMeta/editMeta.test.js | 70 + js/src/modals/EditMeta/index.js | 17 + js/src/modals/EditMeta/store.js | 121 + js/src/modals/EditMeta/store.spec.js | 235 ++ .../AdvancedStep/advancedStep.js | 37 + .../ExecuteContract/AdvancedStep/index.js | 17 + .../DetailsStep/detailsStep.js | 214 ++ .../DetailsStep/detailsStep.spec.js | 80 + .../ExecuteContract/DetailsStep/index.js | 17 + .../ExecuteContract/executeContract.css | 61 + .../modals/ExecuteContract/executeContract.js | 348 +++ .../ExecuteContract/executeContract.spec.js | 70 + .../ExecuteContract/executeContract.test.js | 86 + js/src/modals/ExecuteContract/index.js | 17 + js/src/modals/ExportAccount/exportAccount.js | 177 ++ .../ExportAccount/exportAccount.spec.js | 76 + .../ExportAccount/exportInput/exportInput.js | 61 + .../modals/ExportAccount/exportInput/index.js | 17 + js/src/modals/ExportAccount/exportStore.js | 106 + .../modals/ExportAccount/exportStore.spec.js | 133 ++ js/src/modals/ExportAccount/index.js | 17 + js/src/modals/Faucet/faucet.js | 162 ++ js/src/modals/Faucet/index.js | 17 + js/src/modals/Faucet/store.js | 126 + js/src/modals/FirstRun/Completed/completed.js | 41 + js/src/modals/FirstRun/Completed/index.js | 17 + js/src/modals/FirstRun/TnC/index.js | 17 + js/src/modals/FirstRun/TnC/tnc.js | 59 + js/src/modals/FirstRun/TnC/tnc.md | 215 ++ js/src/modals/FirstRun/Welcome/index.js | 17 + js/src/modals/FirstRun/Welcome/welcome.js | 83 + js/src/modals/FirstRun/firstRun.css | 50 + js/src/modals/FirstRun/firstRun.js | 366 +++ js/src/modals/FirstRun/firstRun.spec.js | 69 + js/src/modals/FirstRun/index.js | 17 + js/src/modals/LoadContract/index.js | 17 + js/src/modals/LoadContract/loadContract.css | 52 + js/src/modals/LoadContract/loadContract.js | 349 +++ .../modals/LoadContract/loadContract.spec.js | 159 ++ js/src/modals/PasswordManager/index.js | 17 + .../PasswordManager/passwordManager.css | 84 + .../modals/PasswordManager/passwordManager.js | 448 ++++ .../PasswordManager/passwordManager.spec.js | 111 + .../PasswordManager/passwordManager.test.js | 54 + js/src/modals/PasswordManager/store.js | 161 ++ js/src/modals/PasswordManager/store.spec.js | 103 + js/src/modals/SaveContract/index.js | 17 + js/src/modals/SaveContract/saveContract.css | 20 + js/src/modals/SaveContract/saveContract.js | 136 ++ .../awaitingDepositStep.js | 120 + .../awaitingDepositStep.spec.js | 112 + .../Shapeshift/AwaitingDepositStep/index.js | 17 + .../awaitingExchangeStep.js | 57 + .../awaitingExchangeStep.spec.js | 40 + .../Shapeshift/AwaitingExchangeStep/index.js | 17 + .../Shapeshift/CompletedStep/completedStep.js | 58 + .../CompletedStep/completedStep.spec.js | 41 + .../modals/Shapeshift/CompletedStep/index.js | 17 + .../modals/Shapeshift/ErrorStep/errorStep.js | 49 + .../Shapeshift/ErrorStep/errorStep.spec.js | 40 + js/src/modals/Shapeshift/ErrorStep/index.js | 17 + js/src/modals/Shapeshift/OptionsStep/index.js | 17 + .../Shapeshift/OptionsStep/optionsStep.css | 61 + .../Shapeshift/OptionsStep/optionsStep.js | 161 ++ .../OptionsStep/optionsSteps.spec.js | 126 + js/src/modals/Shapeshift/Price/index.js | 17 + js/src/modals/Shapeshift/Price/price.js | 58 + js/src/modals/Shapeshift/Price/price.spec.js | 41 + js/src/modals/Shapeshift/Value/index.js | 17 + js/src/modals/Shapeshift/Value/value.css | 30 + js/src/modals/Shapeshift/Value/value.js | 47 + js/src/modals/Shapeshift/Value/value.spec.js | 36 + js/src/modals/Shapeshift/index.js | 17 + js/src/modals/Shapeshift/shapeshift.css | 84 + js/src/modals/Shapeshift/shapeshift.js | 233 ++ js/src/modals/Shapeshift/shapeshift.spec.js | 160 ++ js/src/modals/Shapeshift/store.js | 199 ++ js/src/modals/Shapeshift/store.spec.js | 355 +++ js/src/modals/Transfer/Details/details.js | 239 ++ js/src/modals/Transfer/Details/index.js | 17 + js/src/modals/Transfer/Details/tokenSelect.js | 131 ++ js/src/modals/Transfer/Extras/extras.js | 87 + js/src/modals/Transfer/Extras/index.js | 17 + js/src/modals/Transfer/errors.js | 28 + js/src/modals/Transfer/index.js | 17 + js/src/modals/Transfer/store.js | 515 ++++ js/src/modals/Transfer/transfer.css | 158 ++ js/src/modals/Transfer/transfer.js | 313 +++ js/src/modals/UpgradeParity/index.js | 17 + js/src/modals/UpgradeParity/store.js | 159 ++ js/src/modals/UpgradeParity/store.spec.js | 58 + js/src/modals/UpgradeParity/upgradeParity.css | 46 + js/src/modals/UpgradeParity/upgradeParity.js | 337 +++ js/src/modals/VaultAccounts/index.js | 17 + js/src/modals/VaultAccounts/vaultAccounts.js | 186 ++ .../VaultAccounts/vaultAccounts.spec.js | 182 ++ js/src/modals/VaultCreate/index.js | 17 + js/src/modals/VaultCreate/vaultCreate.css | 44 + js/src/modals/VaultCreate/vaultCreate.js | 227 ++ js/src/modals/VaultCreate/vaultCreate.spec.js | 162 ++ js/src/modals/VaultLock/index.js | 17 + js/src/modals/VaultLock/vaultLock.js | 92 + js/src/modals/VaultLock/vaultLock.spec.js | 131 ++ js/src/modals/VaultMeta/index.js | 17 + js/src/modals/VaultMeta/vaultMeta.js | 298 +++ js/src/modals/VaultMeta/vaultMeta.spec.js | 171 ++ js/src/modals/VaultSelector/index.js | 17 + js/src/modals/VaultSelector/vaultSelector.js | 100 + .../VaultSelector/vaultSelector.spec.js | 171 ++ js/src/modals/VaultUnlock/index.js | 17 + js/src/modals/VaultUnlock/vaultUnlock.css | 31 + js/src/modals/VaultUnlock/vaultUnlock.js | 121 + js/src/modals/VaultUnlock/vaultUnlock.spec.js | 146 ++ js/src/modals/Verification/Done/done.css | 31 + js/src/modals/Verification/Done/done.js | 38 + js/src/modals/Verification/Done/index.js | 17 + .../Verification/GatherData/gatherData.css | 49 + .../Verification/GatherData/gatherData.js | 290 +++ .../modals/Verification/GatherData/index.js | 17 + js/src/modals/Verification/QueryCode/index.js | 17 + .../Verification/QueryCode/queryCode.js | 87 + .../Verification/SendConfirmation/index.js | 17 + .../SendConfirmation/sendConfirmation.css | 20 + .../SendConfirmation/sendConfirmation.js | 66 + .../modals/Verification/SendRequest/index.js | 17 + .../Verification/SendRequest/sendRequest.css | 20 + .../Verification/SendRequest/sendRequest.js | 78 + js/src/modals/Verification/email-store.js | 130 ++ js/src/modals/Verification/how-it-works.js | 41 + js/src/modals/Verification/index.js | 17 + js/src/modals/Verification/sms-store.js | 91 + js/src/modals/Verification/store.js | 263 +++ js/src/modals/Verification/verification.css | 25 + js/src/modals/Verification/verification.js | 451 ++++ js/src/modals/WalletSettings/index.js | 17 + .../modals/WalletSettings/walletSettings.css | 68 + .../modals/WalletSettings/walletSettings.js | 459 ++++ .../WalletSettings/walletSettingsStore.js | 342 +++ js/src/modals/index.js | 43 + js/src/parity.js | 31 + js/src/playground/index.js | 17 + js/src/playground/playground.css | 91 + js/src/playground/playground.js | 92 + js/src/playground/playground.spec.js | 47 + js/src/playground/playgroundExample.js | 55 + js/src/playground/store.js | 40 + js/src/playground/store.spec.js | 34 + js/src/redux/actions.js | 30 + js/src/redux/index.js | 23 + js/src/redux/middleware.js | 49 + js/src/redux/providers/apiActions.js | 22 + js/src/redux/providers/apiReducer.js | 27 + js/src/redux/providers/balances.js | 188 ++ js/src/redux/providers/balancesActions.js | 334 +++ js/src/redux/providers/balancesReducer.js | 27 + .../redux/providers/certifications/actions.js | 31 + .../providers/certifications/middleware.js | 242 ++ .../redux/providers/certifications/reducer.js | 45 + js/src/redux/providers/chainMiddleware.js | 60 + .../redux/providers/chainMiddleware.spec.js | 116 + js/src/redux/providers/imagesActions.js | 24 + js/src/redux/providers/imagesReducer.js | 42 + js/src/redux/providers/index.js | 33 + js/src/redux/providers/personal.js | 152 ++ js/src/redux/providers/personalActions.js | 189 ++ js/src/redux/providers/personalReducer.js | 61 + js/src/redux/providers/registry/actions.js | 28 + js/src/redux/providers/registry/middleware.js | 164 ++ js/src/redux/providers/registry/reducer.js | 35 + js/src/redux/providers/requestsActions.js | 185 ++ .../redux/providers/requestsActions.spec.js | 111 + js/src/redux/providers/requestsReducer.js | 43 + js/src/redux/providers/signer.js | 39 + js/src/redux/providers/signerActions.js | 41 + js/src/redux/providers/signerMiddleware.js | 210 ++ .../redux/providers/signerMiddleware.spec.js | 221 ++ js/src/redux/providers/signerReducer.js | 111 + js/src/redux/providers/snackbarActions.js | 34 + js/src/redux/providers/snackbarReducer.js | 44 + js/src/redux/providers/status.js | 321 +++ js/src/redux/providers/statusActions.js | 29 + js/src/redux/providers/statusReducer.js | 77 + js/src/redux/providers/tokens.js | 161 ++ js/src/redux/providers/tokensReducer.js | 39 + js/src/redux/providers/walletActions.js | 360 +++ js/src/redux/providers/walletReducer.js | 89 + js/src/redux/providers/worker.js | 90 + js/src/redux/providers/workerActions.js | 29 + js/src/redux/providers/workerReducer.js | 36 + js/src/redux/providers/workerWrapper.js | 23 + js/src/redux/reducers.js | 54 + js/src/redux/store.js | 96 + js/src/redux/util.js | 23 + js/src/reset.css | 108 + js/src/routes.js | 160 ++ js/src/serviceWorker.js | 31 + js/src/ui/AccountCard/accountCard.css | 139 ++ js/src/ui/AccountCard/accountCard.example.js | 110 + js/src/ui/AccountCard/accountCard.js | 218 ++ js/src/ui/AccountCard/accountCard.spec.js | 160 ++ js/src/ui/AccountCard/index.js | 17 + js/src/ui/Actionbar/Export/export.js | 62 + js/src/ui/Actionbar/Export/index.js | 17 + js/src/ui/Actionbar/Import/import.css | 21 + js/src/ui/Actionbar/Import/import.js | 250 ++ js/src/ui/Actionbar/Import/index.js | 17 + js/src/ui/Actionbar/Search/index.js | 17 + js/src/ui/Actionbar/Search/search.css | 43 + js/src/ui/Actionbar/Search/search.js | 169 ++ js/src/ui/Actionbar/Sort/index.js | 17 + js/src/ui/Actionbar/Sort/sort.css | 20 + js/src/ui/Actionbar/Sort/sort.js | 155 ++ js/src/ui/Actionbar/Sort/sortStore.js | 75 + js/src/ui/Actionbar/actionbar.css | 44 + js/src/ui/Actionbar/actionbar.js | 203 ++ js/src/ui/Actionbar/actionbar.spec.js | 38 + js/src/ui/Actionbar/index.js | 22 + js/src/ui/Badge/badge.css | 35 + js/src/ui/Badge/badge.js | 38 + js/src/ui/Badge/badge.spec.js | 38 + js/src/ui/Badge/index.js | 17 + js/src/ui/Balance/balance.css | 76 + js/src/ui/Balance/balance.js | 167 ++ js/src/ui/Balance/balance.spec.js | 96 + js/src/ui/Balance/index.js | 17 + js/src/ui/BlockStatus/blockStatus.css | 22 + js/src/ui/BlockStatus/blockStatus.js | 122 + js/src/ui/BlockStatus/blockStatus.spec.js | 94 + js/src/ui/BlockStatus/index.js | 17 + js/src/ui/Button/button.css | 20 + js/src/ui/Button/button.js | 84 + js/src/ui/Button/button.spec.js | 42 + js/src/ui/Button/index.js | 17 + js/src/ui/Certifications/certifications.css | 58 + js/src/ui/Certifications/certifications.js | 110 + js/src/ui/Certifications/index.js | 17 + js/src/ui/ConfirmDialog/confirmDialog.css | 20 + js/src/ui/ConfirmDialog/confirmDialog.js | 99 + js/src/ui/ConfirmDialog/confirmDialog.spec.js | 136 ++ js/src/ui/ConfirmDialog/index.js | 17 + js/src/ui/Container/Title/index.js | 17 + js/src/ui/Container/Title/title.css | 59 + js/src/ui/Container/Title/title.js | 110 + js/src/ui/Container/Title/title.spec.js | 46 + js/src/ui/Container/container.css | 88 + js/src/ui/Container/container.js | 124 + js/src/ui/Container/container.spec.js | 58 + js/src/ui/Container/index.js | 20 + js/src/ui/ContextProvider/contextProvider.js | 60 + js/src/ui/ContextProvider/index.js | 1 + js/src/ui/CopyToClipboard/copyToClipboard.css | 33 + js/src/ui/CopyToClipboard/copyToClipboard.js | 141 ++ js/src/ui/CopyToClipboard/index.js | 17 + .../CurrencySymbol/currencySymbol.example.js | 51 + js/src/ui/CurrencySymbol/currencySymbol.js | 65 + .../ui/CurrencySymbol/currencySymbol.spec.js | 99 + js/src/ui/CurrencySymbol/index.js | 17 + js/src/ui/DappCard/dappCard.css | 51 + js/src/ui/DappCard/dappCard.js | 99 + js/src/ui/DappCard/index.js | 17 + js/src/ui/DappIcon/dappIcon.css | 31 + js/src/ui/DappIcon/dappIcon.js | 49 + js/src/ui/DappIcon/dappIcon.spec.js | 70 + js/src/ui/DappIcon/index.js | 17 + js/src/ui/Editor/editor.js | 101 + js/src/ui/Editor/index.js | 17 + js/src/ui/Editor/mode-solidity.js | 1000 ++++++++ js/src/ui/Errors/actions.js | 28 + js/src/ui/Errors/errors.css | 26 + js/src/ui/Errors/errors.js | 120 + js/src/ui/Errors/index.js | 25 + js/src/ui/Errors/middleware.js | 46 + js/src/ui/Errors/reducers.js | 45 + js/src/ui/Features/constants.js | 21 + js/src/ui/Features/defaults.js | 84 + js/src/ui/Features/defaults.spec.js | 67 + js/src/ui/Features/features.css | 20 + js/src/ui/Features/features.js | 69 + js/src/ui/Features/features.spec.js | 89 + js/src/ui/Features/index.js | 25 + js/src/ui/Features/store.js | 73 + js/src/ui/Features/store.spec.js | 96 + .../ui/Form/AddressSelect/addressSelect.css | 164 ++ js/src/ui/Form/AddressSelect/addressSelect.js | 656 ++++++ .../Form/AddressSelect/addressSelectStore.js | 314 +++ js/src/ui/Form/AddressSelect/index.js | 17 + js/src/ui/Form/AutoComplete/autocomplete.css | 24 + js/src/ui/Form/AutoComplete/autocomplete.js | 268 +++ js/src/ui/Form/AutoComplete/index.js | 17 + js/src/ui/Form/DappUrlInput/dappUrlInput.js | 61 + .../ui/Form/DappUrlInput/dappUrlInput.spec.js | 70 + js/src/ui/Form/DappUrlInput/index.js | 17 + js/src/ui/Form/FileSelect/fileSelect.css | 52 + js/src/ui/Form/FileSelect/fileSelect.js | 76 + js/src/ui/Form/FileSelect/fileSelect.spec.js | 118 + js/src/ui/Form/FileSelect/index.js | 17 + js/src/ui/Form/FormWrap/formWrap.css | 24 + js/src/ui/Form/FormWrap/formWrap.js | 33 + js/src/ui/Form/FormWrap/index.js | 17 + js/src/ui/Form/Input/index.js | 17 + js/src/ui/Form/Input/input.css | 27 + js/src/ui/Form/Input/input.js | 325 +++ js/src/ui/Form/InputAddress/index.js | 17 + js/src/ui/Form/InputAddress/inputAddress.css | 72 + js/src/ui/Form/InputAddress/inputAddress.js | 193 ++ js/src/ui/Form/InputAddressSelect/index.js | 17 + .../InputAddressSelect/inputAddressSelect.js | 75 + js/src/ui/Form/InputChip/index.js | 17 + js/src/ui/Form/InputChip/inputChip.css | 26 + js/src/ui/Form/InputChip/inputChip.js | 208 ++ js/src/ui/Form/InputDate/index.js | 17 + js/src/ui/Form/InputDate/inputDate.css | 22 + js/src/ui/Form/InputDate/inputDate.js | 53 + js/src/ui/Form/InputInline/index.js | 17 + js/src/ui/Form/InputInline/inputInline.css | 19 + js/src/ui/Form/InputInline/inputInline.js | 96 + js/src/ui/Form/InputTime/index.js | 17 + js/src/ui/Form/InputTime/inputTime.css | 22 + js/src/ui/Form/InputTime/inputTime.js | 54 + js/src/ui/Form/Label/index.js | 17 + js/src/ui/Form/Label/label.css | 24 + js/src/ui/Form/Label/label.js | 40 + js/src/ui/Form/PasswordStrength/index.js | 17 + .../PasswordStrength/passwordStrength.css | 31 + .../Form/PasswordStrength/passwordStrength.js | 126 + .../PasswordStrength/passwordStrength.spec.js | 62 + js/src/ui/Form/RadioButtons/index.js | 17 + js/src/ui/Form/RadioButtons/radioButtons.css | 37 + js/src/ui/Form/RadioButtons/radioButtons.js | 114 + js/src/ui/Form/Select/index.js | 17 + js/src/ui/Form/Select/select.js | 101 + js/src/ui/Form/TypedInput/index.js | 17 + js/src/ui/Form/TypedInput/typedInput.css | 57 + js/src/ui/Form/TypedInput/typedInput.js | 470 ++++ js/src/ui/Form/TypedInput/typedInput.spec.js | 70 + js/src/ui/Form/VaultSelect/index.js | 17 + js/src/ui/Form/VaultSelect/vaultSelect.js | 109 + .../ui/Form/VaultSelect/vaultSelect.spec.js | 90 + js/src/ui/Form/form.css | 34 + js/src/ui/Form/form.js | 49 + js/src/ui/Form/index.js | 34 + js/src/ui/GasPriceEditor/gasPriceEditor.css | 89 + js/src/ui/GasPriceEditor/gasPriceEditor.js | 253 ++ .../ui/GasPriceEditor/gasPriceEditor.spec.js | 84 + js/src/ui/GasPriceEditor/index.js | 17 + js/src/ui/GasPriceEditor/store.js | 255 ++ js/src/ui/GasPriceEditor/store.spec.js | 324 +++ .../GasPriceSelector/CustomBar/customBar.js | 77 + js/src/ui/GasPriceSelector/CustomBar/index.js | 17 + .../CustomCursor/customCursor.js | 74 + .../ui/GasPriceSelector/CustomCursor/index.js | 17 + .../CustomShape/customShape.js | 52 + .../ui/GasPriceSelector/CustomShape/index.js | 17 + .../CustomTooltip/customTooltip.js | 67 + .../GasPriceSelector/CustomTooltip/index.js | 17 + .../ui/GasPriceSelector/gasPriceSelector.css | 31 + .../ui/GasPriceSelector/gasPriceSelector.js | 374 +++ js/src/ui/GasPriceSelector/index.js | 17 + js/src/ui/GasPriceSelector/util.js | 35 + js/src/ui/Icons/index.js | 74 + js/src/ui/Icons/index.spec.js | 28 + js/src/ui/IdentityIcon/identityIcon.css | 58 + js/src/ui/IdentityIcon/identityIcon.js | 157 ++ js/src/ui/IdentityIcon/identityIcon.spec.js | 112 + js/src/ui/IdentityIcon/index.js | 17 + js/src/ui/IdentityName/identityName.js | 91 + js/src/ui/IdentityName/identityName.spec.js | 83 + js/src/ui/IdentityName/index.js | 17 + js/src/ui/LanguageSelector/index.js | 17 + .../ui/LanguageSelector/languageSelector.js | 78 + .../LanguageSelector/langugeSelector.spec.js | 69 + js/src/ui/Loading/index.js | 17 + js/src/ui/Loading/loading.css | 23 + js/src/ui/Loading/loading.js | 43 + js/src/ui/MethodDecoding/index.js | 17 + js/src/ui/MethodDecoding/methodDecoding.css | 103 + js/src/ui/MethodDecoding/methodDecoding.js | 676 ++++++ .../ui/MethodDecoding/methodDecodingStore.js | 368 +++ js/src/ui/Modal/Busy/busy.css | 27 + js/src/ui/Modal/Busy/busy.js | 41 + js/src/ui/Modal/Busy/index.js | 17 + js/src/ui/Modal/Completed/completed.css | 24 + js/src/ui/Modal/Completed/completed.js | 35 + js/src/ui/Modal/Completed/index.js | 17 + js/src/ui/Modal/index.js | 23 + js/src/ui/ModalBox/body.js | 35 + js/src/ui/ModalBox/index.js | 17 + js/src/ui/ModalBox/modalBox.css | 62 + js/src/ui/ModalBox/modalBox.js | 43 + js/src/ui/ModalBox/modalBox.spec.js | 62 + js/src/ui/ModalBox/summary.js | 37 + js/src/ui/Page/index.js | 17 + js/src/ui/Page/page.css | 31 + js/src/ui/Page/page.js | 63 + js/src/ui/Page/page.spec.js | 79 + js/src/ui/ParityBackground/index.js | 17 + .../ui/ParityBackground/parityBackground.js | 109 + js/src/ui/Portal/index.js | 17 + js/src/ui/Portal/portal.css | 146 ++ js/src/ui/Portal/portal.example.js | 112 + js/src/ui/Portal/portal.js | 217 ++ js/src/ui/Portal/portal.spec.js | 64 + js/src/ui/QrCode/index.js | 17 + js/src/ui/QrCode/qrCode.css | 32 + js/src/ui/QrCode/qrCode.example.js | 63 + js/src/ui/QrCode/qrCode.js | 87 + js/src/ui/QrCode/qrCode.spec.js | 108 + js/src/ui/QrCode/qrSize.js | 79 + js/src/ui/QrScan/index.js | 17 + js/src/ui/QrScan/qrScan.css | 25 + js/src/ui/QrScan/qrScan.js | 50 + js/src/ui/QrScan/qrScan.spec.js | 69 + js/src/ui/ScrollableText/index.js | 17 + js/src/ui/ScrollableText/scrollableText.css | 34 + js/src/ui/ScrollableText/scrollableText.js | 40 + js/src/ui/SectionList/index.js | 17 + js/src/ui/SectionList/sectionList.css | 73 + js/src/ui/SectionList/sectionList.example.js | 94 + js/src/ui/SectionList/sectionList.js | 112 + js/src/ui/SectionList/sectionList.spec.js | 99 + js/src/ui/SelectionList/index.js | 17 + js/src/ui/SelectionList/selectionList.css | 89 + js/src/ui/SelectionList/selectionList.js | 110 + js/src/ui/SelectionList/selectionList.spec.js | 100 + js/src/ui/ShortenedHash/index.js | 17 + js/src/ui/ShortenedHash/shortenedHash.css | 21 + js/src/ui/ShortenedHash/shortenedHash.js | 42 + js/src/ui/SignerIcon/index.js | 17 + js/src/ui/SignerIcon/signerIcon.js | 60 + js/src/ui/StackEventListener/index.js | 17 + .../StackEventListener/stackEventListener.js | 56 + js/src/ui/StatusIndicator/index.js | 17 + js/src/ui/StatusIndicator/statusIndicator.css | 89 + js/src/ui/StatusIndicator/statusIndicator.js | 70 + js/src/ui/Tags/index.js | 17 + js/src/ui/Tags/tags.css | 61 + js/src/ui/Tags/tags.js | 99 + js/src/ui/Theme/index.js | 17 + js/src/ui/Theme/theme.js | 74 + js/src/ui/Theme/theme.spec.js | 55 + js/src/ui/Title/index.js | 17 + js/src/ui/Title/title.css | 31 + js/src/ui/Title/title.js | 120 + js/src/ui/Title/title.spec.js | 90 + js/src/ui/TokenImage/index.js | 17 + js/src/ui/TokenImage/tokenImage.js | 72 + js/src/ui/Tooltips/Tooltip/index.js | 17 + js/src/ui/Tooltips/Tooltip/tooltip.js | 147 ++ js/src/ui/Tooltips/Tooltip/tooltip.spec.js | 68 + js/src/ui/Tooltips/actions.js | 34 + js/src/ui/Tooltips/index.js | 20 + js/src/ui/Tooltips/reducers.js | 71 + js/src/ui/Tooltips/tooltips.css | 103 + js/src/ui/Tooltips/tooltips.js | 88 + js/src/ui/Tooltips/tooltips.spec.js | 76 + js/src/ui/TxHash/index.js | 17 + js/src/ui/TxHash/txHash.css | 37 + js/src/ui/TxHash/txHash.js | 268 +++ js/src/ui/TxHash/txHash.spec.js | 151 ++ js/src/ui/TxList/TxRow/index.js | 17 + js/src/ui/TxList/TxRow/txRow.js | 429 ++++ js/src/ui/TxList/TxRow/txRow.spec.js | 130 ++ js/src/ui/TxList/index.js | 17 + js/src/ui/TxList/store.js | 176 ++ js/src/ui/TxList/store.spec.js | 89 + js/src/ui/TxList/txList.css | 99 + js/src/ui/TxList/txList.js | 98 + js/src/ui/TxList/txList.spec.js | 55 + js/src/ui/VaultCard/Layout/index.js | 17 + js/src/ui/VaultCard/Layout/layout.css | 45 + js/src/ui/VaultCard/Layout/layout.js | 68 + js/src/ui/VaultCard/Layout/layout.spec.js | 90 + js/src/ui/VaultCard/index.js | 17 + js/src/ui/VaultCard/vaultCard.css | 62 + js/src/ui/VaultCard/vaultCard.js | 126 + js/src/ui/VaultCard/vaultCard.spec.js | 94 + js/src/ui/VaultTag/index.js | 17 + js/src/ui/VaultTag/vaultTag.css | 48 + js/src/ui/VaultTag/vaultTag.js | 45 + js/src/ui/Warning/index.js | 17 + js/src/ui/Warning/warning.css | 26 + js/src/ui/Warning/warning.js | 41 + js/src/ui/index.js | 63 + js/src/util/abi.js | 149 ++ js/src/util/array.js | 26 + js/src/util/array.spec.js | 29 + js/src/util/constants.js | 32 + js/src/util/dapplink.js | 62 + js/src/util/dapplink.spec.js | 83 + js/src/util/dapps.js | 193 ++ js/src/util/messages.js | 44 + js/src/util/notifications.js | 57 + js/src/util/proptypes.js | 38 + js/src/util/qrscan.js | 141 ++ js/src/util/signer.js | 108 + js/src/util/solidity.js | 86 + js/src/util/subscribe-to-events.js | 101 + js/src/util/subscribe-to-events.spec.js | 137 ++ js/src/util/subscribe-to-events.test.js | 53 + js/src/util/tokens/bytecodes.js | 23 + js/src/util/tx.js | 294 +++ js/src/util/validation.js | 232 ++ js/src/util/validation.spec.js | 333 +++ js/src/util/wallets.js | 256 ++ js/src/util/wallets/consensys-wallet.js | 354 +++ js/src/util/wallets/foundation-wallet.js | 500 ++++ js/src/util/wallets/pending-contracts.js | 49 + js/src/util/wallets/updates.js | 21 + js/src/util/web3.extensions.js | 48 + js/src/views/Account/Header/header.css | 86 + js/src/views/Account/Header/header.js | 213 ++ js/src/views/Account/Header/header.spec.js | 247 ++ js/src/views/Account/Header/index.js | 17 + js/src/views/Account/Transactions/index.js | 17 + js/src/views/Account/Transactions/store.js | 118 + .../views/Account/Transactions/store.spec.js | 193 ++ .../Account/Transactions/transactions.css | 27 + .../Account/Transactions/transactions.js | 126 + .../Account/Transactions/transactions.spec.js | 56 + .../Account/Transactions/transactions.test.js | 31 + js/src/views/Account/account.css | 26 + js/src/views/Account/account.js | 537 +++++ js/src/views/Account/account.spec.js | 191 ++ js/src/views/Account/account.test.js | 58 + js/src/views/Account/index.js | 17 + js/src/views/Account/store.js | 60 + js/src/views/Account/store.spec.js | 92 + js/src/views/Accounts/List/index.js | 17 + js/src/views/Accounts/List/list.css | 46 + js/src/views/Accounts/List/list.js | 277 +++ js/src/views/Accounts/Summary/index.js | 17 + js/src/views/Accounts/Summary/summary.js | 294 +++ js/src/views/Accounts/accounts.css | 138 ++ js/src/views/Accounts/accounts.js | 516 ++++ js/src/views/Accounts/accounts.spec.js | 127 + js/src/views/Accounts/index.js | 17 + js/src/views/Address/Delete/delete.js | 135 ++ js/src/views/Address/Delete/index.js | 17 + js/src/views/Address/address.css | 50 + js/src/views/Address/address.js | 255 ++ js/src/views/Address/index.js | 17 + js/src/views/Addresses/addresses.css | 44 + js/src/views/Addresses/addresses.js | 294 +++ js/src/views/Addresses/index.js | 17 + .../views/Application/Container/container.js | 51 + js/src/views/Application/Container/index.js | 17 + .../DappContainer/dappContainer.js | 38 + .../views/Application/DappContainer/index.js | 17 + .../views/Application/Extension/extension.css | 52 + .../views/Application/Extension/extension.js | 74 + js/src/views/Application/Extension/index.js | 17 + js/src/views/Application/Extension/store.js | 116 + .../Application/FrameError/frameError.css | 21 + .../Application/FrameError/frameError.js | 33 + js/src/views/Application/FrameError/index.js | 17 + js/src/views/Application/Requests/index.js | 17 + .../views/Application/Requests/requests.css | 126 + js/src/views/Application/Requests/requests.js | 248 ++ .../Application/Requests/savedRequests.js | 107 + .../Requests/savedRequests.spec.js | 99 + js/src/views/Application/Snackbar/index.js | 17 + js/src/views/Application/Snackbar/snackbar.js | 77 + js/src/views/Application/Status/index.js | 17 + js/src/views/Application/Status/status.css | 65 + js/src/views/Application/Status/status.js | 154 ++ js/src/views/Application/TabBar/Tab/index.js | 17 + js/src/views/Application/TabBar/Tab/tab.js | 75 + .../views/Application/TabBar/Tab/tabs.spec.js | 77 + js/src/views/Application/TabBar/index.js | 17 + js/src/views/Application/TabBar/tabBar.css | 100 + js/src/views/Application/TabBar/tabBar.js | 152 ++ .../views/Application/TabBar/tabBar.spec.js | 74 + js/src/views/Application/application.css | 26 + js/src/views/Application/application.js | 145 ++ js/src/views/Application/index.js | 17 + js/src/views/Application/store.js | 95 + js/src/views/Connection/connection.css | 121 + js/src/views/Connection/connection.js | 206 ++ js/src/views/Connection/connection.spec.js | 156 ++ js/src/views/Connection/index.js | 17 + js/src/views/Contract/Events/Event/event.js | 164 ++ js/src/views/Contract/Events/Event/index.js | 17 + js/src/views/Contract/Events/events.js | 112 + js/src/views/Contract/Events/index.js | 17 + js/src/views/Contract/Queries/index.js | 17 + js/src/views/Contract/Queries/inputQuery.js | 240 ++ js/src/views/Contract/Queries/queries.css | 79 + js/src/views/Contract/Queries/queries.js | 168 ++ js/src/views/Contract/contract.css | 111 + js/src/views/Contract/contract.js | 554 +++++ js/src/views/Contract/index.js | 17 + js/src/views/Contracts/contracts.js | 285 +++ js/src/views/Contracts/index.js | 17 + js/src/views/Dapp/dapp.css | 43 + js/src/views/Dapp/dapp.js | 132 ++ js/src/views/Dapp/index.js | 17 + js/src/views/Dapps/builtin.json | 101 + js/src/views/Dapps/dappStore.spec.js | 204 ++ js/src/views/Dapps/dapps.css | 27 + js/src/views/Dapps/dapps.js | 193 ++ js/src/views/Dapps/dappsStore.js | 313 +++ js/src/views/Dapps/index.js | 17 + js/src/views/Home/Accounts/accounts.css | 50 + js/src/views/Home/Accounts/accounts.js | 144 ++ js/src/views/Home/Accounts/accounts.spec.js | 71 + js/src/views/Home/Accounts/index.js | 17 + js/src/views/Home/Dapps/dapp.js | 98 + js/src/views/Home/Dapps/dapp.spec.js | 55 + js/src/views/Home/Dapps/dapps.css | 48 + js/src/views/Home/Dapps/dapps.js | 86 + js/src/views/Home/Dapps/dapps.spec.js | 68 + js/src/views/Home/Dapps/dapps.test.js | 27 + js/src/views/Home/Dapps/index.js | 17 + js/src/views/Home/News/index.js | 17 + js/src/views/Home/News/news.css | 73 + js/src/views/Home/News/news.js | 92 + js/src/views/Home/News/news.spec.js | 54 + js/src/views/Home/News/news.test.js | 54 + js/src/views/Home/News/renderers.js | 37 + js/src/views/Home/News/store.js | 67 + js/src/views/Home/News/store.spec.js | 57 + js/src/views/Home/Urls/index.js | 17 + js/src/views/Home/Urls/urls.css | 81 + js/src/views/Home/Urls/urls.js | 139 ++ js/src/views/Home/Urls/urls.spec.js | 124 + js/src/views/Home/home.css | 40 + js/src/views/Home/home.js | 103 + js/src/views/Home/home.spec.js | 119 + js/src/views/Home/index.js | 17 + js/src/views/ParityBar/accountStore.js | 121 + js/src/views/ParityBar/accountStore.spec.js | 112 + js/src/views/ParityBar/index.js | 17 + js/src/views/ParityBar/parityBar.css | 267 +++ js/src/views/ParityBar/parityBar.js | 721 ++++++ js/src/views/ParityBar/parityBar.spec.js | 182 ++ js/src/views/ParityBar/parityBar.test.js | 56 + js/src/views/RpcCalls/actions/localstorage.js | 19 + js/src/views/RpcCalls/actions/logger.js | 24 + js/src/views/RpcCalls/actions/rpc.js | 28 + .../components/AutoComplete/AutoComplete.js | 42 + .../AutoComplete/AutoComplete.spec.js | 44 + .../RpcCalls/components/AutoComplete/index.js | 17 + js/src/views/RpcCalls/components/Box/Box.js | 45 + .../views/RpcCalls/components/Box/Box.spec.js | 70 + js/src/views/RpcCalls/components/Box/index.js | 17 + .../views/RpcCalls/components/Call/Call.css | 40 + js/src/views/RpcCalls/components/Call/Call.js | 68 + .../RpcCalls/components/Call/Call.spec.js | 92 + .../views/RpcCalls/components/Call/index.js | 17 + .../views/RpcCalls/components/Calls/Calls.css | 44 + .../views/RpcCalls/components/Calls/Calls.js | 138 ++ .../RpcCalls/components/Calls/Calls.spec.js | 135 ++ .../views/RpcCalls/components/Calls/index.js | 17 + .../components/CallsToolbar/CallsToolbar.css | 66 + .../components/CallsToolbar/CallsToolbar.js | 153 ++ .../CallsToolbar/CallsToolbar.spec.js | 118 + .../RpcCalls/components/CallsToolbar/index.js | 17 + .../EditableValue/EditableValue.css | 74 + .../components/EditableValue/EditableValue.js | 204 ++ .../components/EditableValue/index.js | 17 + .../components/JsonEditor/JsonEditor.css | 28 + .../components/JsonEditor/JsonEditor.js | 99 + .../RpcCalls/components/JsonEditor/index.js | 17 + .../RpcCalls/components/Markdown/Markdown.css | 20 + .../RpcCalls/components/Markdown/Markdown.js | 57 + .../RpcCalls/components/Markdown/index.js | 17 + .../RpcCalls/components/Response/Response.css | 20 + .../RpcCalls/components/Response/Response.js | 65 + .../components/Response/Response.spec.js | 47 + .../RpcCalls/components/Response/index.js | 17 + .../RpcCalls/components/RpcCalls/RpcCalls.css | 32 + .../RpcCalls/components/RpcCalls/RpcCalls.js | 373 +++ .../RpcCalls/components/RpcCalls/index.js | 17 + .../RpcCalls/components/RpcDocs/RpcDocs.css | 35 + .../RpcCalls/components/RpcDocs/RpcDocs.js | 142 ++ .../RpcCalls/components/RpcDocs/index.js | 17 + .../RpcCalls/components/RpcNav/RpcNav.css | 28 + .../RpcCalls/components/RpcNav/RpcNav.js | 34 + .../views/RpcCalls/components/RpcNav/index.js | 17 + .../ScrollTopButton/ScrollTopButton.css | 41 + .../ScrollTopButton/ScrollTopButton.js | 70 + .../components/ScrollTopButton/index.js | 17 + .../components/ScrollTopButton/util.js | 48 + js/src/views/RpcCalls/constants/index.js | 17 + .../RpcCalls/containers/RpcPage/RpcPage.js | 57 + .../RpcCalls/containers/RpcPage/index.js | 17 + js/src/views/RpcCalls/data/rpc.json | 1093 +++++++++ js/src/views/RpcCalls/middleware/index.js | 25 + .../views/RpcCalls/middleware/localstorage.js | 75 + .../RpcCalls/middleware/localstorage.spec.js | 205 ++ js/src/views/RpcCalls/reducers/index.js | 23 + js/src/views/RpcCalls/reducers/logger.js | 32 + js/src/views/RpcCalls/reducers/rpc.js | 65 + js/src/views/RpcCalls/util/error.js | 30 + js/src/views/RpcCalls/util/error.spec.js | 109 + js/src/views/RpcCalls/util/index.js | 38 + js/src/views/RpcCalls/util/index.spec.js | 51 + js/src/views/RpcCalls/util/react.js | 21 + js/src/views/RpcCalls/util/rpc-md.js | 27 + .../views/Settings/Background/background.css | 46 + .../views/Settings/Background/background.js | 168 ++ js/src/views/Settings/Background/index.js | 17 + js/src/views/Settings/Parity/index.js | 17 + js/src/views/Settings/Parity/parity.js | 285 +++ js/src/views/Settings/Parity/parity.spec.js | 126 + js/src/views/Settings/Parity/parity.test.js | 32 + js/src/views/Settings/Parity/store.js | 135 ++ js/src/views/Settings/Parity/store.spec.js | 125 + js/src/views/Settings/Proxy/index.js | 17 + js/src/views/Settings/Proxy/proxy.css | 24 + js/src/views/Settings/Proxy/proxy.js | 80 + js/src/views/Settings/Views/defaults.js | 85 + js/src/views/Settings/Views/index.js | 23 + js/src/views/Settings/Views/views.css | 55 + js/src/views/Settings/Views/views.js | 205 ++ js/src/views/Settings/actions.js | 29 + js/src/views/Settings/index.js | 35 + js/src/views/Settings/layout.css | 69 + js/src/views/Settings/middleware.js | 128 + js/src/views/Settings/reducers.js | 40 + js/src/views/Settings/settings.css | 65 + js/src/views/Settings/settings.js | 98 + js/src/views/Signer/_layout.css | 24 + .../Account/AccountLink/accountLink.css | 20 + .../Account/AccountLink/accountLink.js | 105 + .../components/Account/AccountLink/index.js | 17 + .../Signer/components/Account/account.css | 50 + .../Signer/components/Account/account.js | 128 + .../views/Signer/components/Account/index.js | 17 + .../DecryptRequest/decryptRequest.js | 184 ++ .../Signer/components/DecryptRequest/index.js | 17 + .../Signer/components/RequestOrigin/index.js | 17 + .../RequestOrigin/requestOrigin.css | 43 + .../components/RequestOrigin/requestOrigin.js | 170 ++ .../RequestOrigin/requestOrigin.spec.js | 72 + .../Signer/components/RequestPending/index.js | 17 + .../RequestPending/requestPending.js | 125 + .../RequestPending/requestPending.spec.js | 132 ++ .../Signer/components/SignRequest/index.js | 17 + .../components/SignRequest/signRequest.css | 91 + .../components/SignRequest/signRequest.js | 279 +++ .../SignRequest/signRequest.spec.js | 84 + .../TransactionMainDetails/index.js | 17 + .../transactionMainDetails.css | 80 + .../transactionMainDetails.js | 201 ++ .../components/TransactionPending/index.js | 17 + .../TransactionPending/transactionPending.css | 27 + .../TransactionPending/transactionPending.js | 203 ++ .../TransactionPendingFormConfirm/index.js | 17 + .../transactionPendingFormConfirm.css | 51 + .../transactionPendingFormConfirm.js | 588 +++++ .../transactionPendingFormConfirm.spec.js | 139 ++ .../TransactionPendingFormReject/index.js | 17 + .../transactionPendingFormReject.css | 26 + .../transactionPendingFormReject.js | 62 + .../TransactionPendingForm/index.js | 17 + .../transactionPendingForm.css | 44 + .../transactionPendingForm.js | 135 ++ .../Signer/components/TxHashLink/index.js | 17 + .../components/TxHashLink/txHashLink.js | 42 + js/src/views/Signer/components/util/logger.js | 38 + js/src/views/Signer/components/util/react.js | 21 + .../Signer/components/util/transaction.js | 115 + .../components/util/transaction.spec.js | 79 + js/src/views/Signer/components/util/util.js | 35 + .../Signer/containers/Embedded/embedded.css | 38 + .../Signer/containers/Embedded/embedded.js | 135 ++ .../views/Signer/containers/Embedded/index.js | 17 + .../Signer/containers/RequestsPage/index.js | 17 + .../containers/RequestsPage/requestsPage.css | 26 + .../containers/RequestsPage/requestsPage.js | 178 ++ js/src/views/Signer/index.js | 23 + js/src/views/Signer/signer.js | 39 + js/src/views/Signer/store.js | 103 + js/src/views/Signer/utils/extension.js | 19 + js/src/views/Signer/utils/utils.js | 19 + js/src/views/Status/Debug/debug.css | 82 + js/src/views/Status/Debug/debug.js | 138 ++ js/src/views/Status/Debug/index.js | 17 + js/src/views/Status/Debug/store.js | 128 + js/src/views/Status/Health/health.js | 152 ++ js/src/views/Status/Health/index.js | 17 + .../Status/MiningSettings/decodeExtraData.js | 34 + .../MiningSettings/decodeExtraData.spec.js | 28 + js/src/views/Status/MiningSettings/index.js | 17 + .../Status/MiningSettings/miningSettings.js | 174 ++ .../Status/MiningSettings/numberFromString.js | 25 + .../MiningSettings/numberFromString.spec.js | 36 + js/src/views/Status/NodeStatus/index.js | 17 + js/src/views/Status/NodeStatus/nodeStatus.css | 83 + js/src/views/Status/NodeStatus/nodeStatus.js | 274 +++ js/src/views/Status/NodeStatus/store.js | 139 ++ js/src/views/Status/Peers/index.js | 17 + js/src/views/Status/Peers/peers.css | 60 + js/src/views/Status/Peers/peers.js | 364 +++ js/src/views/Status/index.js | 17 + js/src/views/Status/status.css | 22 + js/src/views/Status/status.js | 45 + js/src/views/SyncWarning/index.js | 17 + js/src/views/SyncWarning/syncWarning.css | 64 + js/src/views/SyncWarning/syncWarning.js | 131 ++ js/src/views/SyncWarning/syncWarning.spec.js | 62 + js/src/views/Vaults/index.js | 17 + js/src/views/Vaults/store.js | 431 ++++ js/src/views/Vaults/store.spec.js | 686 ++++++ js/src/views/Vaults/vaults.css | 25 + js/src/views/Vaults/vaults.js | 217 ++ js/src/views/Vaults/vaults.spec.js | 201 ++ js/src/views/Vaults/vaults.test.js | 91 + .../Wallet/Confirmations/confirmations.js | 421 ++++ js/src/views/Wallet/Confirmations/index.js | 17 + js/src/views/Wallet/Details/details.js | 120 + js/src/views/Wallet/Details/index.js | 17 + js/src/views/Wallet/Transactions/index.js | 17 + .../views/Wallet/Transactions/transactions.js | 98 + js/src/views/Wallet/index.js | 17 + js/src/views/Wallet/wallet.css | 139 ++ js/src/views/Wallet/wallet.js | 417 ++++ js/src/views/Web/AddressBar/addressBar.js | 75 + .../views/Web/AddressBar/addressBar.spec.js | 48 + js/src/views/Web/AddressBar/index.js | 17 + js/src/views/Web/index.js | 17 + js/src/views/Web/store.js | 180 ++ js/src/views/Web/store.spec.js | 228 ++ js/src/views/Web/web.css | 97 + js/src/views/Web/web.js | 123 + js/src/views/Web/web.spec.js | 55 + js/src/views/WriteContract/index.js | 17 + js/src/views/WriteContract/writeContract.css | 198 ++ js/src/views/WriteContract/writeContract.js | 739 ++++++ .../views/WriteContract/writeContractStore.js | 572 +++++ js/src/views/index.js | 34 + js/src/web3.js | 36 + js/src/webWorker.js | 108 + js/webpack/vendor.js | 91 + json/src/vm/log.rs | 54 + parity/boot.rs | 119 + parity/sync.rs | 103 + scripts/contractABI.js | 254 ++ scripts/deploy.sh | 6 + scripts/fmt.sh | 16 + secret_store/build.rs | 22 + .../key_server_cluster/decryption_session.rs | 943 ++++++++ .../key_server_cluster/encryption_session.rs | 322 +++ .../key_server_cluster/generation_session.rs | 1256 ++++++++++ .../src/key_server_cluster/signing_session.rs | 986 ++++++++ secret_store/src/types/mod.rs.in | 17 + stratum/build.rs | 21 + sync/build.rs | 25 + updater/build.rs | 22 + updater/src/types/mod.rs.in | 17 + util/src/bytes.rs | 179 ++ util/src/cache.rs | 110 + util/src/common.rs | 104 + util/src/error.rs | 66 + util/src/hashdb.rs | 144 ++ util/src/journaldb/archivedb.rs | 487 ++++ util/src/journaldb/earlymergedb.rs | 1099 +++++++++ util/src/journaldb/mod.rs | 187 ++ util/src/journaldb/overlayrecentdb.rs | 1047 +++++++++ util/src/journaldb/refcounteddb.rs | 337 +++ util/src/journaldb/traits.rs | 102 + util/src/kvdb.rs | 1029 ++++++++ util/src/memorydb.rs | 314 +++ util/src/migration/mod.rs | 367 +++ util/src/migration/tests.rs | 251 ++ util/src/nibbleslice.rs | 303 +++ util/src/nibblevec.rs | 146 ++ util/src/overlaydb.rs | 307 +++ util/src/snappy.rs | 162 ++ util/src/trie/fatdb.rs | 119 + util/src/trie/fatdbmut.rs | 118 + util/src/trie/lookup.rs | 94 + util/src/trie/mod.rs | 286 +++ util/src/trie/node.rs | 166 ++ util/src/trie/recorder.rs | 207 ++ util/src/trie/sectriedb.rs | 84 + util/src/trie/sectriedbmut.rs | 94 + util/src/trie/standardmap.rs | 118 + util/src/trie/triedb.rs | 485 ++++ util/src/trie/triedbmut.rs | 1302 +++++++++++ 1912 files changed, 170421 insertions(+) create mode 100644 dapps/src/handlers/async.rs create mode 100644 dapps/src/url.rs create mode 100644 ethcore/build.rs create mode 100644 ethcore/light/build.rs create mode 100644 ethcore/light/src/types/mod.rs.in create mode 100644 ethcore/light/src/types/request/builder.rs create mode 100644 ethcore/res/ethereum/metropolis_test.json create mode 100644 ethcore/res/ethereum/tobalaba.json create mode 100644 ethcore/src/json_tests/homestead_chain.rs create mode 100644 ethcore/src/snapshot/snapshot_service_trait.rs create mode 100644 ethcore/src/tests/rpc.rs create mode 100644 ethcore/wasm/src/call_args.rs create mode 100644 ipc-common-types/Cargo.toml create mode 100644 ipc-common-types/build.rs create mode 100644 ipc-common-types/src/lib.rs create mode 100644 ipc-common-types/src/types/mod.rs create mode 100644 ipc-common-types/src/types/mod.rs.in create mode 100644 ipc-common-types/src/types/release_track.rs create mode 100644 ipc-common-types/src/types/version_info.rs create mode 100644 ipc/codegen/Cargo.toml create mode 100644 ipc/codegen/build.rs create mode 100644 ipc/codegen/src/codegen.rs create mode 100644 ipc/codegen/src/lib.rs create mode 100644 ipc/codegen/src/lib.rs.in create mode 100644 ipc/codegen/src/serialization.rs create mode 100644 ipc/hypervisor/Cargo.toml create mode 100644 ipc/hypervisor/build.rs create mode 100644 ipc/hypervisor/src/lib.rs create mode 100644 ipc/hypervisor/src/service.rs create mode 100644 ipc/hypervisor/src/service.rs.in create mode 100644 ipc/nano/Cargo.toml create mode 100644 ipc/nano/src/lib.rs create mode 100644 ipc/rpc/Cargo.toml create mode 100644 ipc/rpc/src/binary.rs create mode 100644 ipc/rpc/src/interface.rs create mode 100644 ipc/rpc/src/lib.rs create mode 100644 ipc/tests/Cargo.toml create mode 100644 ipc/tests/binary.rs create mode 100644 ipc/tests/binary.rs.in create mode 100644 ipc/tests/build.rs create mode 100644 ipc/tests/examples.rs create mode 100644 ipc/tests/nested.rs create mode 100644 ipc/tests/nested.rs.in create mode 100644 ipc/tests/over_nano.rs create mode 100644 ipc/tests/run.rs create mode 100644 ipc/tests/service.rs create mode 100644 ipc/tests/service.rs.in create mode 100644 ipc/tests/with_attrs.rs create mode 100644 ipc/tests/with_attrs.rs.in create mode 100755 js/assets/fonts/Roboto/LICENSE.txt create mode 100644 js/assets/fonts/Roboto/font.css create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Black.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-BlackItalic.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Bold.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-BoldItalic.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Italic.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Light.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-LightItalic.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Medium.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-MediumItalic.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Regular.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-Thin.ttf create mode 100755 js/assets/fonts/Roboto/ttf/Roboto-ThinItalic.ttf create mode 100644 js/assets/fonts/Roboto/v15/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2 create mode 100644 js/assets/fonts/Roboto/v15/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2 create mode 100644 js/assets/fonts/Roboto/v15/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2 create mode 100644 js/assets/fonts/Roboto/v15/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2 create mode 100644 js/assets/fonts/Roboto/v15/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2 create mode 100644 js/assets/fonts/Roboto/v15/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2 create mode 100644 js/assets/fonts/Roboto/v15/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2 create mode 100755 js/assets/fonts/RobotoMono/LICENSE.txt create mode 100644 js/assets/fonts/RobotoMono/font.css create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-Bold.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-BoldItalic.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-Italic.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-Light.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-LightItalic.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-Medium.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-MediumItalic.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-Regular.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-Thin.ttf create mode 100755 js/assets/fonts/RobotoMono/ttf/RobotoMono-ThinItalic.ttf create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz-pRBTtN4E2_qSPBnw6AgMc.woff2 create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz0ExlR2MysFCBK8OirNw2kM.woff2 create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz2MSHb9EAJwuSzGfuRChQzQ.woff2 create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz2dsm03krrxlabhmVQFB99s.woff2 create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz9Dnm4qiMZlH5rhYv_7LI2Y.woff2 create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz9TIkQYohD4BpHvJ3NvbHoA.woff2 create mode 100644 js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59FzyJ0caWjaSBdV-xZbEgst_k.woff2 create mode 100644 js/assets/images/certifications/unknown.svg create mode 100644 js/assets/images/contracts/ethereum-black-64x64.png create mode 100644 js/assets/images/contracts/ethereum-black.png create mode 100644 js/assets/images/contracts/ethereum-white.png create mode 100644 js/assets/images/contracts/unknown-64x64.png create mode 100644 js/assets/images/contracts/unknown.png create mode 100644 js/assets/images/dapps/blocks-350.jpg create mode 100644 js/assets/images/dapps/close.svg create mode 100644 js/assets/images/dapps/plus.svg create mode 100644 js/assets/images/dapps/signature.png create mode 100644 js/assets/images/parity-logo-black-no-text.ico create mode 100644 js/assets/images/parity-logo-black-no-text.png create mode 100644 js/assets/images/parity-logo-black-no-text.svg create mode 100644 js/assets/images/parity-logo-black.svg create mode 100644 js/assets/images/parity-logo-white-no-text.svg create mode 100644 js/assets/images/parity-logo-white.svg create mode 100644 js/assets/images/paritybar.png create mode 100644 js/assets/images/shapeshift-btn.png create mode 100644 js/assets/images/shapeshift-logo.png create mode 100644 js/npm/etherscan/README.md create mode 100644 js/npm/etherscan/package.json create mode 100644 js/npm/jsonrpc/README.md create mode 100644 js/npm/jsonrpc/package.json create mode 100644 js/npm/parity/README.md create mode 100644 js/npm/parity/package.json create mode 100644 js/npm/parity/test/smoke.spec.js create mode 100644 js/npm/shapeshift/README.md create mode 100644 js/npm/shapeshift/package.json create mode 100644 js/npm/test/mocha.config.js create mode 100644 js/npm/test/mocha.opts create mode 100644 js/scripts/build-rpc-json.js create mode 100644 js/scripts/build-rpc-markdown.js create mode 100644 js/scripts/helpers/log.js create mode 100644 js/scripts/helpers/parsed-rpc-traits.js create mode 100644 js/src/3rdparty/email-verification/index.js create mode 100644 js/src/3rdparty/email-verification/terms-of-service.js create mode 100644 js/src/3rdparty/etherscan/account.js create mode 100644 js/src/3rdparty/etherscan/account.spec.js create mode 100644 js/src/3rdparty/etherscan/call.js create mode 100644 js/src/3rdparty/etherscan/helpers.spec.js create mode 100644 js/src/3rdparty/etherscan/index.js create mode 100644 js/src/3rdparty/etherscan/links.js create mode 100644 js/src/3rdparty/etherscan/links.spec.js create mode 100644 js/src/3rdparty/etherscan/stats.js create mode 100644 js/src/3rdparty/etherscan/stats.spec.js create mode 100644 js/src/3rdparty/ledger/index.js create mode 100644 js/src/3rdparty/ledger/ledger.js create mode 100644 js/src/3rdparty/ledger/ledger.spec.js create mode 100644 js/src/3rdparty/ledger/vendor/README.md create mode 100644 js/src/3rdparty/ledger/vendor/ledger-eth.js create mode 100644 js/src/3rdparty/ledger/vendor/ledger3.js create mode 100644 js/src/3rdparty/shapeshift/helpers.spec.js create mode 100644 js/src/3rdparty/shapeshift/index.js create mode 100644 js/src/3rdparty/shapeshift/rpc.js create mode 100644 js/src/3rdparty/shapeshift/rpc.spec.js create mode 100644 js/src/3rdparty/shapeshift/shapeshift.js create mode 100644 js/src/3rdparty/shapeshift/shapeshift.spec.js create mode 100644 js/src/3rdparty/sms-verification/index.js create mode 100644 js/src/3rdparty/sms-verification/terms-of-service.js create mode 100644 js/src/abi/README.md create mode 100644 js/src/abi/abi.js create mode 100644 js/src/abi/decoder/bytesTaken.js create mode 100644 js/src/abi/decoder/bytesTaken.spec.js create mode 100644 js/src/abi/decoder/decodeResult.js create mode 100644 js/src/abi/decoder/decodeResult.spec.js create mode 100644 js/src/abi/decoder/decoder.js create mode 100644 js/src/abi/decoder/decoder.spec.js create mode 100644 js/src/abi/decoder/index.js create mode 100644 js/src/abi/encoder/encoder.js create mode 100644 js/src/abi/encoder/encoder.spec.js create mode 100644 js/src/abi/encoder/index.js create mode 100644 js/src/abi/encoder/mediate.js create mode 100644 js/src/abi/encoder/mediate.spec.js create mode 100644 js/src/abi/index.js create mode 100644 js/src/abi/spec/constructor.js create mode 100644 js/src/abi/spec/constructor.spec.js create mode 100644 js/src/abi/spec/event/decodedLog.js create mode 100644 js/src/abi/spec/event/decodedLog.spec.js create mode 100644 js/src/abi/spec/event/decodedLogParam.js create mode 100644 js/src/abi/spec/event/decodedLogParam.spec.js create mode 100644 js/src/abi/spec/event/event.js create mode 100644 js/src/abi/spec/event/event.spec.js create mode 100644 js/src/abi/spec/event/eventParam.js create mode 100644 js/src/abi/spec/event/eventParam.spec.js create mode 100644 js/src/abi/spec/event/index.js create mode 100644 js/src/abi/spec/function.js create mode 100644 js/src/abi/spec/function.spec.js create mode 100644 js/src/abi/spec/index.js create mode 100644 js/src/abi/spec/interface.js create mode 100644 js/src/abi/spec/interface.spec.js create mode 100644 js/src/abi/spec/param.js create mode 100644 js/src/abi/spec/param.spec.js create mode 100644 js/src/abi/spec/paramType/format.js create mode 100644 js/src/abi/spec/paramType/format.spec.js create mode 100644 js/src/abi/spec/paramType/index.js create mode 100644 js/src/abi/spec/paramType/paramType.js create mode 100644 js/src/abi/spec/paramType/paramType.spec.js create mode 100644 js/src/abi/spec/paramType/types.js create mode 100644 js/src/abi/token/index.js create mode 100644 js/src/abi/token/token.js create mode 100644 js/src/abi/token/token.spec.js create mode 100644 js/src/abi/util/address.js create mode 100644 js/src/abi/util/address.spec.js create mode 100644 js/src/abi/util/pad.js create mode 100644 js/src/abi/util/pad.spec.js create mode 100644 js/src/abi/util/signature.js create mode 100644 js/src/abi/util/signature.spec.js create mode 100644 js/src/abi/util/slice.js create mode 100644 js/src/abi/util/slice.spec.js create mode 100644 js/src/abi/util/sliceAs.js create mode 100644 js/src/abi/util/sliceAs.spec.js create mode 100644 js/src/abi/util/types.js create mode 100644 js/src/abi/util/types.spec.js create mode 100644 js/src/api/README.md create mode 100644 js/src/api/api.js create mode 100644 js/src/api/api.spec.js create mode 100644 js/src/api/contract/contract.js create mode 100644 js/src/api/contract/contract.spec.js create mode 100644 js/src/api/contract/index.js create mode 100644 js/src/api/format/input.js create mode 100644 js/src/api/format/input.spec.js create mode 100644 js/src/api/format/output.js create mode 100644 js/src/api/format/output.spec.js create mode 100644 js/src/api/index.js create mode 100644 js/src/api/local/accounts/account.js create mode 100644 js/src/api/local/accounts/accounts.js create mode 100644 js/src/api/local/accounts/index.js create mode 100644 js/src/api/local/ethkey/ethkey.js create mode 100644 js/src/api/local/ethkey/ethkey.wasm.js create mode 100644 js/src/api/local/ethkey/index.js create mode 100644 js/src/api/local/ethkey/index.spec.js create mode 100644 js/src/api/local/ethkey/worker.js create mode 100644 js/src/api/local/ethkey/workerPool.js create mode 100644 js/src/api/local/index.js create mode 100644 js/src/api/local/localAccountsMiddleware.js create mode 100644 js/src/api/local/localAccountsMiddleware.spec.js create mode 100644 js/src/api/local/transactions.js create mode 100644 js/src/api/local/transactions.spec.js create mode 100644 js/src/api/pubsub/eth/eth.js create mode 100644 js/src/api/pubsub/eth/index.js create mode 100644 js/src/api/pubsub/index.js create mode 100644 js/src/api/pubsub/net/index.js create mode 100644 js/src/api/pubsub/net/net.js create mode 100644 js/src/api/pubsub/parity/index.js create mode 100644 js/src/api/pubsub/parity/parity.js create mode 100644 js/src/api/pubsub/pubsub.js create mode 100644 js/src/api/pubsub/pubsub.spec.js create mode 100644 js/src/api/pubsub/pubsubBase.js create mode 100644 js/src/api/pubsub/signer/index.js create mode 100644 js/src/api/pubsub/signer/signer.js create mode 100644 js/src/api/rpc/db/db.js create mode 100644 js/src/api/rpc/db/db.spec.js create mode 100644 js/src/api/rpc/db/index.js create mode 100644 js/src/api/rpc/eth/eth.e2e.js create mode 100644 js/src/api/rpc/eth/eth.js create mode 100644 js/src/api/rpc/eth/eth.spec.js create mode 100644 js/src/api/rpc/eth/index.js create mode 100644 js/src/api/rpc/index.js create mode 100644 js/src/api/rpc/net/index.js create mode 100644 js/src/api/rpc/net/net.e2e.js create mode 100644 js/src/api/rpc/net/net.js create mode 100644 js/src/api/rpc/net/net.spec.js create mode 100644 js/src/api/rpc/parity/index.js create mode 100644 js/src/api/rpc/parity/parity.e2e.js create mode 100644 js/src/api/rpc/parity/parity.js create mode 100644 js/src/api/rpc/parity/parity.spec.js create mode 100644 js/src/api/rpc/personal/index.js create mode 100644 js/src/api/rpc/personal/personal.e2e.js create mode 100644 js/src/api/rpc/personal/personal.js create mode 100644 js/src/api/rpc/personal/personal.spec.js create mode 100644 js/src/api/rpc/shh/index.js create mode 100644 js/src/api/rpc/shh/shh.js create mode 100644 js/src/api/rpc/signer/index.js create mode 100644 js/src/api/rpc/signer/signer.js create mode 100644 js/src/api/rpc/trace/index.js create mode 100644 js/src/api/rpc/trace/trace.e2e.js create mode 100644 js/src/api/rpc/trace/trace.js create mode 100644 js/src/api/rpc/trace/trace.spec.js create mode 100644 js/src/api/rpc/web3/index.js create mode 100644 js/src/api/rpc/web3/web3.e2e.js create mode 100644 js/src/api/rpc/web3/web3.js create mode 100644 js/src/api/rpc/web3/web3.spec.js create mode 100644 js/src/api/subscriptions/eth.js create mode 100644 js/src/api/subscriptions/eth.spec.js create mode 100644 js/src/api/subscriptions/index.js create mode 100644 js/src/api/subscriptions/logging.js create mode 100644 js/src/api/subscriptions/logging.spec.js create mode 100644 js/src/api/subscriptions/manager.js create mode 100644 js/src/api/subscriptions/manager.spec.js create mode 100644 js/src/api/subscriptions/personal.js create mode 100644 js/src/api/subscriptions/personal.spec.js create mode 100644 js/src/api/subscriptions/signer.js create mode 100644 js/src/api/transport/error.js create mode 100644 js/src/api/transport/http/http.e2e.js create mode 100644 js/src/api/transport/http/http.js create mode 100644 js/src/api/transport/http/http.spec.js create mode 100644 js/src/api/transport/http/index.js create mode 100644 js/src/api/transport/index.js create mode 100644 js/src/api/transport/jsonRpcBase.js create mode 100644 js/src/api/transport/jsonRpcBase.spec.js create mode 100644 js/src/api/transport/logger.js create mode 100644 js/src/api/transport/middleware.js create mode 100644 js/src/api/transport/middleware.spec.js create mode 100644 js/src/api/transport/ws/index.js create mode 100644 js/src/api/transport/ws/ws.e2e.js create mode 100644 js/src/api/transport/ws/ws.js create mode 100644 js/src/api/transport/ws/ws.spec.js create mode 100644 js/src/api/util/decode.js create mode 100644 js/src/api/util/decode.spec.js create mode 100644 js/src/api/util/encode.js create mode 100644 js/src/api/util/encode.spec.js create mode 100644 js/src/api/util/format.js create mode 100644 js/src/api/util/format.spec.js create mode 100644 js/src/api/util/identity.js create mode 100644 js/src/api/util/index.js create mode 100644 js/src/api/util/sha3.js create mode 100644 js/src/api/util/sha3.spec.js create mode 100644 js/src/api/util/types.js create mode 100644 js/src/api/util/types.spec.js create mode 100644 js/src/api/util/wei.js create mode 100644 js/src/api/util/wei.spec.js create mode 100644 js/src/config.js create mode 100644 js/src/contracts/abi/badgereg.json create mode 100644 js/src/contracts/abi/basiccoin.json create mode 100644 js/src/contracts/abi/basiccoinmanager.json create mode 100644 js/src/contracts/abi/certifier.json create mode 100644 js/src/contracts/abi/consensys-multisig-wallet.json create mode 100644 js/src/contracts/abi/dappreg.json create mode 100644 js/src/contracts/abi/eip20.json create mode 100644 js/src/contracts/abi/email-verification.json create mode 100644 js/src/contracts/abi/foundation-multisig-wallet.json create mode 100644 js/src/contracts/abi/gavcoin.json create mode 100644 js/src/contracts/abi/githubhint.json create mode 100644 js/src/contracts/abi/index.js create mode 100644 js/src/contracts/abi/old-wallet.json create mode 100644 js/src/contracts/abi/owned.json create mode 100644 js/src/contracts/abi/registry.json create mode 100644 js/src/contracts/abi/registry2.json create mode 100644 js/src/contracts/abi/signaturereg.json create mode 100644 js/src/contracts/abi/sms-verification.json create mode 100644 js/src/contracts/abi/tokenreg.json create mode 100644 js/src/contracts/badgereg.js create mode 100644 js/src/contracts/code/index.js create mode 100644 js/src/contracts/code/wallet.js create mode 100644 js/src/contracts/contracts.js create mode 100644 js/src/contracts/dappreg.js create mode 100644 js/src/contracts/githubhint.js create mode 100644 js/src/contracts/githubhint.spec.js create mode 100644 js/src/contracts/index.js create mode 100644 js/src/contracts/registry.js create mode 100644 js/src/contracts/registry.spec.js create mode 100644 js/src/contracts/signaturereg.js create mode 100644 js/src/contracts/snippets/enhanced-wallet.sol create mode 100644 js/src/contracts/snippets/human-standard-token.sol create mode 100644 js/src/contracts/snippets/standard-token.sol create mode 100644 js/src/contracts/snippets/token.sol create mode 100644 js/src/contracts/snippets/wallet.sol create mode 100644 js/src/contracts/tokenreg.js create mode 100644 js/src/contracts/verification.js create mode 100644 js/src/dapps/chaindeploy.js create mode 100644 js/src/dapps/chaindeploy/Application/application.css create mode 100644 js/src/dapps/chaindeploy/Application/application.js create mode 100644 js/src/dapps/chaindeploy/Application/index.js create mode 100644 js/src/dapps/chaindeploy/Contract/contract.js create mode 100644 js/src/dapps/chaindeploy/Contract/index.js create mode 100644 js/src/dapps/chaindeploy/Dapp/dapp.js create mode 100644 js/src/dapps/chaindeploy/Dapp/index.js create mode 100644 js/src/dapps/chaindeploy/ListItem/Header/header.js create mode 100644 js/src/dapps/chaindeploy/ListItem/Header/index.js create mode 100644 js/src/dapps/chaindeploy/ListItem/Icon/icon.js create mode 100644 js/src/dapps/chaindeploy/ListItem/Icon/index.js create mode 100644 js/src/dapps/chaindeploy/ListItem/Row/index.js create mode 100644 js/src/dapps/chaindeploy/ListItem/Row/row.js create mode 100644 js/src/dapps/chaindeploy/ListItem/index.js create mode 100644 js/src/dapps/chaindeploy/ListItem/listItem.css create mode 100644 js/src/dapps/chaindeploy/ListItem/listItem.js create mode 100644 js/src/dapps/chaindeploy/_dapps.js create mode 100644 js/src/dapps/chaindeploy/contracts/abi/jg-voting.json create mode 100644 js/src/dapps/chaindeploy/contracts/badgereg.js create mode 100644 js/src/dapps/chaindeploy/contracts/code/badgereg.json create mode 100644 js/src/dapps/chaindeploy/contracts/code/dappreg.json create mode 100644 js/src/dapps/chaindeploy/contracts/code/gavcoin.json create mode 100644 js/src/dapps/chaindeploy/contracts/code/githubhint.json create mode 100644 js/src/dapps/chaindeploy/contracts/code/jg-voting.json create mode 100644 js/src/dapps/chaindeploy/contracts/code/registry.json create mode 100644 js/src/dapps/chaindeploy/contracts/code/signaturereg.json create mode 100644 js/src/dapps/chaindeploy/contracts/code/tokendeploy.json create mode 100644 js/src/dapps/chaindeploy/contracts/code/tokenreg.json create mode 100644 js/src/dapps/chaindeploy/contracts/code/verifyEmail.json create mode 100644 js/src/dapps/chaindeploy/contracts/code/verifySms.json create mode 100644 js/src/dapps/chaindeploy/contracts/dappreg.js create mode 100644 js/src/dapps/chaindeploy/contracts/gavcoin.js create mode 100644 js/src/dapps/chaindeploy/contracts/githubhint.js create mode 100644 js/src/dapps/chaindeploy/contracts/index.js create mode 100644 js/src/dapps/chaindeploy/contracts/jg-voting.js create mode 100644 js/src/dapps/chaindeploy/contracts/registry.js create mode 100644 js/src/dapps/chaindeploy/contracts/signaturereg.js create mode 100644 js/src/dapps/chaindeploy/contracts/tokendeployMgr.js create mode 100644 js/src/dapps/chaindeploy/contracts/tokendeployReg.js create mode 100644 js/src/dapps/chaindeploy/contracts/tokenreg.js create mode 100644 js/src/dapps/chaindeploy/contracts/verifyEmail.js create mode 100644 js/src/dapps/chaindeploy/contracts/verifySms.js create mode 100644 js/src/dapps/chaindeploy/contracts/wallet.js create mode 100644 js/src/dapps/chaindeploy/dapps/console.js create mode 100644 js/src/dapps/chaindeploy/dapps/dappreg.js create mode 100644 js/src/dapps/chaindeploy/dapps/gavcoin.js create mode 100644 js/src/dapps/chaindeploy/dapps/githubhint.js create mode 100644 js/src/dapps/chaindeploy/dapps/index.js create mode 100644 js/src/dapps/chaindeploy/dapps/jg-voting.js create mode 100644 js/src/dapps/chaindeploy/dapps/jg-whenblock.js create mode 100644 js/src/dapps/chaindeploy/dapps/localtx.js create mode 100644 js/src/dapps/chaindeploy/dapps/registry.js create mode 100644 js/src/dapps/chaindeploy/dapps/signaturereg.js create mode 100644 js/src/dapps/chaindeploy/dapps/tokendeploy.js create mode 100644 js/src/dapps/chaindeploy/dapps/tokenreg.js create mode 100644 js/src/dapps/chaindeploy/dapps/web.js create mode 100644 js/src/dapps/chaindeploy/parity.js create mode 100644 js/src/dapps/chaindeploy/store.js create mode 100644 js/src/dapps/chaindeploy/utils.js create mode 100644 js/src/dapps/console.js create mode 100644 js/src/dapps/console/Application/application.css create mode 100644 js/src/dapps/console/Application/application.js create mode 100644 js/src/dapps/console/Application/application.store.js create mode 100644 js/src/dapps/console/Application/index.js create mode 100644 js/src/dapps/console/Autocomplete/autocomplete.css create mode 100644 js/src/dapps/console/Autocomplete/autocomplete.js create mode 100644 js/src/dapps/console/Autocomplete/autocomplete.store.js create mode 100644 js/src/dapps/console/Autocomplete/index.js create mode 100644 js/src/dapps/console/Console/console.css create mode 100644 js/src/dapps/console/Console/console.js create mode 100644 js/src/dapps/console/Console/console.store.js create mode 100644 js/src/dapps/console/Console/index.js create mode 100644 js/src/dapps/console/Header/header.css create mode 100644 js/src/dapps/console/Header/header.js create mode 100644 js/src/dapps/console/Header/index.js create mode 100644 js/src/dapps/console/Input/index.js create mode 100644 js/src/dapps/console/Input/input.css create mode 100644 js/src/dapps/console/Input/input.js create mode 100644 js/src/dapps/console/Input/input.store.js create mode 100644 js/src/dapps/console/Settings/index.js create mode 100644 js/src/dapps/console/Settings/settings.css create mode 100644 js/src/dapps/console/Settings/settings.js create mode 100644 js/src/dapps/console/Settings/settings.store.js create mode 100644 js/src/dapps/console/Snippets/index.js create mode 100644 js/src/dapps/console/Snippets/snippets.css create mode 100644 js/src/dapps/console/Snippets/snippets.js create mode 100644 js/src/dapps/console/Snippets/snippets.store.js create mode 100644 js/src/dapps/console/Watches/index.js create mode 100644 js/src/dapps/console/Watches/watches.css create mode 100644 js/src/dapps/console/Watches/watches.js create mode 100644 js/src/dapps/console/Watches/watches.store.js create mode 100644 js/src/dapps/console/codemirror.css create mode 100644 js/src/dapps/console/parity.js create mode 100644 js/src/dapps/console/utils.js create mode 100644 js/src/dapps/dappreg.js create mode 100644 js/src/dapps/dappreg/Application/application.css create mode 100644 js/src/dapps/dappreg/Application/application.js create mode 100644 js/src/dapps/dappreg/Application/index.js create mode 100644 js/src/dapps/dappreg/Button/button.css create mode 100644 js/src/dapps/dappreg/Button/button.js create mode 100644 js/src/dapps/dappreg/Button/index.js create mode 100644 js/src/dapps/dappreg/Card/card.css create mode 100644 js/src/dapps/dappreg/Card/card.js create mode 100644 js/src/dapps/dappreg/Card/index.js create mode 100644 js/src/dapps/dappreg/CreateDappCard/createDappCard.js create mode 100644 js/src/dapps/dappreg/CreateDappCard/index.js create mode 100644 js/src/dapps/dappreg/DappCard/dappCard.css create mode 100644 js/src/dapps/dappreg/DappCard/dappCard.js create mode 100644 js/src/dapps/dappreg/DappCard/index.js create mode 100644 js/src/dapps/dappreg/DappModal/dappModal.css create mode 100644 js/src/dapps/dappreg/DappModal/dappModal.js create mode 100644 js/src/dapps/dappreg/DappModal/index.js create mode 100644 js/src/dapps/dappreg/Dapps/dapps.css create mode 100644 js/src/dapps/dappreg/Dapps/dapps.js create mode 100644 js/src/dapps/dappreg/Dapps/index.js create mode 100644 js/src/dapps/dappreg/Input/index.js create mode 100644 js/src/dapps/dappreg/Input/input.css create mode 100644 js/src/dapps/dappreg/Input/input.js create mode 100644 js/src/dapps/dappreg/Modal/index.js create mode 100644 js/src/dapps/dappreg/Modal/modal.css create mode 100644 js/src/dapps/dappreg/Modal/modal.js create mode 100644 js/src/dapps/dappreg/ModalDelete/index.js create mode 100644 js/src/dapps/dappreg/ModalDelete/modalDelete.js create mode 100644 js/src/dapps/dappreg/ModalRegister/index.js create mode 100644 js/src/dapps/dappreg/ModalRegister/modalRegister.js create mode 100644 js/src/dapps/dappreg/ModalUpdate/index.js create mode 100644 js/src/dapps/dappreg/ModalUpdate/modalUpdate.js create mode 100644 js/src/dapps/dappreg/SelectAccount/index.js create mode 100644 js/src/dapps/dappreg/SelectAccount/selectAccount.js create mode 100644 js/src/dapps/dappreg/Transactions/index.js create mode 100644 js/src/dapps/dappreg/Transactions/transactions.css create mode 100644 js/src/dapps/dappreg/Transactions/transactions.js create mode 100644 js/src/dapps/dappreg/Warning/index.js create mode 100644 js/src/dapps/dappreg/Warning/warning.css create mode 100644 js/src/dapps/dappreg/Warning/warning.js create mode 100644 js/src/dapps/dappreg/_colors.css create mode 100644 js/src/dapps/dappreg/_utils.css create mode 100644 js/src/dapps/dappreg/dappStore.js create mode 100644 js/src/dapps/dappreg/dappsStore.js create mode 100644 js/src/dapps/dappreg/parity.js create mode 100644 js/src/dapps/dappreg/utils.js create mode 100644 js/src/dapps/dappreg/utils.spec.js create mode 100644 js/src/dapps/githubhint.js create mode 100644 js/src/dapps/githubhint/Application/application.css create mode 100644 js/src/dapps/githubhint/Application/application.js create mode 100644 js/src/dapps/githubhint/Application/index.js create mode 100644 js/src/dapps/githubhint/Button/button.css create mode 100644 js/src/dapps/githubhint/Button/button.js create mode 100644 js/src/dapps/githubhint/Button/index.js create mode 100644 js/src/dapps/githubhint/Events/events.css create mode 100644 js/src/dapps/githubhint/Events/events.js create mode 100644 js/src/dapps/githubhint/Events/index.js create mode 100644 js/src/dapps/githubhint/Loading/index.js create mode 100644 js/src/dapps/githubhint/Loading/loading.css create mode 100644 js/src/dapps/githubhint/Loading/loading.js create mode 100644 js/src/dapps/githubhint/parity.js create mode 100644 js/src/dapps/githubhint/services.js create mode 100644 js/src/dapps/index.ejs create mode 100644 js/src/dapps/localtx.js create mode 100644 js/src/dapps/localtx/Application/application.css create mode 100644 js/src/dapps/localtx/Application/application.js create mode 100644 js/src/dapps/localtx/Application/application.spec.js create mode 100644 js/src/dapps/localtx/Application/index.js create mode 100644 js/src/dapps/localtx/IdentityIcon/identityIcon.css create mode 100644 js/src/dapps/localtx/IdentityIcon/identityIcon.js create mode 100644 js/src/dapps/localtx/IdentityIcon/index.js create mode 100644 js/src/dapps/localtx/Transaction/index.js create mode 100644 js/src/dapps/localtx/Transaction/transaction.css create mode 100644 js/src/dapps/localtx/Transaction/transaction.js create mode 100644 js/src/dapps/localtx/Transaction/transaction.spec.js create mode 100644 js/src/dapps/localtx/parity.js create mode 100644 js/src/dapps/registry.js create mode 100644 js/src/dapps/registry/Accounts/accounts.css create mode 100644 js/src/dapps/registry/Accounts/accounts.js create mode 100644 js/src/dapps/registry/Accounts/actions.js create mode 100644 js/src/dapps/registry/Accounts/index.js create mode 100644 js/src/dapps/registry/Application/application.css create mode 100644 js/src/dapps/registry/Application/application.js create mode 100644 js/src/dapps/registry/Application/index.js create mode 100644 js/src/dapps/registry/Container.js create mode 100644 js/src/dapps/registry/Events/actions.js create mode 100644 js/src/dapps/registry/Events/events.css create mode 100644 js/src/dapps/registry/Events/events.js create mode 100644 js/src/dapps/registry/Events/index.js create mode 100644 js/src/dapps/registry/Events/reducers.js create mode 100644 js/src/dapps/registry/IdentityIcon/identityIcon.css create mode 100644 js/src/dapps/registry/IdentityIcon/identityIcon.js create mode 100644 js/src/dapps/registry/IdentityIcon/index.js create mode 100644 js/src/dapps/registry/Lookup/actions.js create mode 100644 js/src/dapps/registry/Lookup/index.js create mode 100644 js/src/dapps/registry/Lookup/lookup.css create mode 100644 js/src/dapps/registry/Lookup/lookup.js create mode 100644 js/src/dapps/registry/Lookup/reducers.js create mode 100644 js/src/dapps/registry/Names/actions.js create mode 100644 js/src/dapps/registry/Names/index.js create mode 100644 js/src/dapps/registry/Names/names.css create mode 100644 js/src/dapps/registry/Names/names.js create mode 100644 js/src/dapps/registry/Names/reducers.js create mode 100644 js/src/dapps/registry/Records/actions.js create mode 100644 js/src/dapps/registry/Records/index.js create mode 100644 js/src/dapps/registry/Records/records.css create mode 100644 js/src/dapps/registry/Records/records.js create mode 100644 js/src/dapps/registry/Records/reducers.js create mode 100644 js/src/dapps/registry/Reverse/actions.js create mode 100644 js/src/dapps/registry/Reverse/index.js create mode 100644 js/src/dapps/registry/Reverse/reducers.js create mode 100644 js/src/dapps/registry/Reverse/reverse.css create mode 100644 js/src/dapps/registry/Reverse/reverse.js create mode 100644 js/src/dapps/registry/actions.js create mode 100644 js/src/dapps/registry/addresses/accounts-reducer.js create mode 100644 js/src/dapps/registry/addresses/actions.js create mode 100644 js/src/dapps/registry/addresses/contacts-reducer.js create mode 100644 js/src/dapps/registry/parity.js create mode 100644 js/src/dapps/registry/reducers.js create mode 100644 js/src/dapps/registry/store.js create mode 100644 js/src/dapps/registry/ui/address.css create mode 100644 js/src/dapps/registry/ui/address.js create mode 100644 js/src/dapps/registry/ui/hash.css create mode 100644 js/src/dapps/registry/ui/hash.js create mode 100644 js/src/dapps/registry/ui/image.js create mode 100644 js/src/dapps/registry/util/actions.js create mode 100644 js/src/dapps/registry/util/etherscan-url.js create mode 100644 js/src/dapps/registry/util/post-tx.js create mode 100644 js/src/dapps/registry/util/registry.js create mode 100644 js/src/dapps/signaturereg.js create mode 100644 js/src/dapps/signaturereg/Application/application.css create mode 100644 js/src/dapps/signaturereg/Application/application.js create mode 100644 js/src/dapps/signaturereg/Application/index.js create mode 100644 js/src/dapps/signaturereg/Button/button.css create mode 100644 js/src/dapps/signaturereg/Button/button.js create mode 100644 js/src/dapps/signaturereg/Button/index.js create mode 100644 js/src/dapps/signaturereg/Events/events.css create mode 100644 js/src/dapps/signaturereg/Events/events.js create mode 100644 js/src/dapps/signaturereg/Events/index.js create mode 100644 js/src/dapps/signaturereg/Header/header.css create mode 100644 js/src/dapps/signaturereg/Header/header.js create mode 100644 js/src/dapps/signaturereg/Header/index.js create mode 100644 js/src/dapps/signaturereg/IdentityIcon/identityIcon.css create mode 100644 js/src/dapps/signaturereg/IdentityIcon/identityIcon.js create mode 100644 js/src/dapps/signaturereg/IdentityIcon/index.js create mode 100644 js/src/dapps/signaturereg/Import/import.css create mode 100644 js/src/dapps/signaturereg/Import/import.js create mode 100644 js/src/dapps/signaturereg/Import/index.js create mode 100644 js/src/dapps/signaturereg/Loading/index.js create mode 100644 js/src/dapps/signaturereg/Loading/loading.css create mode 100644 js/src/dapps/signaturereg/Loading/loading.js create mode 100644 js/src/dapps/signaturereg/format.js create mode 100644 js/src/dapps/signaturereg/parity.js create mode 100644 js/src/dapps/signaturereg/services.js create mode 100644 js/src/dapps/static/.gitkeep create mode 100644 js/src/dapps/style.css create mode 100644 js/src/dapps/tokendeploy.js create mode 100644 js/src/dapps/tokendeploy/AddressSelect/addressSelect.css create mode 100644 js/src/dapps/tokendeploy/AddressSelect/addressSelect.js create mode 100644 js/src/dapps/tokendeploy/AddressSelect/index.js create mode 100644 js/src/dapps/tokendeploy/Application/Header/header.css create mode 100644 js/src/dapps/tokendeploy/Application/Header/header.js create mode 100644 js/src/dapps/tokendeploy/Application/Header/index.js create mode 100644 js/src/dapps/tokendeploy/Application/Loading/index.js create mode 100644 js/src/dapps/tokendeploy/Application/Loading/loading.css create mode 100644 js/src/dapps/tokendeploy/Application/Loading/loading.js create mode 100644 js/src/dapps/tokendeploy/Application/application.css create mode 100644 js/src/dapps/tokendeploy/Application/application.js create mode 100644 js/src/dapps/tokendeploy/Application/index.js create mode 100644 js/src/dapps/tokendeploy/Application/pages.js create mode 100644 js/src/dapps/tokendeploy/Container/container.css create mode 100644 js/src/dapps/tokendeploy/Container/container.js create mode 100644 js/src/dapps/tokendeploy/Container/index.js create mode 100644 js/src/dapps/tokendeploy/Deploy/Deployment/deployment.css create mode 100644 js/src/dapps/tokendeploy/Deploy/Deployment/deployment.js create mode 100644 js/src/dapps/tokendeploy/Deploy/Deployment/index.js create mode 100644 js/src/dapps/tokendeploy/Deploy/Event/event.css create mode 100644 js/src/dapps/tokendeploy/Deploy/Event/event.js create mode 100644 js/src/dapps/tokendeploy/Deploy/Event/index.js create mode 100644 js/src/dapps/tokendeploy/Deploy/Events/events.css create mode 100644 js/src/dapps/tokendeploy/Deploy/Events/events.js create mode 100644 js/src/dapps/tokendeploy/Deploy/Events/index.js create mode 100644 js/src/dapps/tokendeploy/Deploy/deploy.js create mode 100644 js/src/dapps/tokendeploy/Deploy/index.js create mode 100644 js/src/dapps/tokendeploy/IdentityIcon/identityIcon.css create mode 100644 js/src/dapps/tokendeploy/IdentityIcon/identityIcon.js create mode 100644 js/src/dapps/tokendeploy/IdentityIcon/index.js create mode 100644 js/src/dapps/tokendeploy/Overview/Owner/index.js create mode 100644 js/src/dapps/tokendeploy/Overview/Owner/owner.css create mode 100644 js/src/dapps/tokendeploy/Overview/Owner/owner.js create mode 100644 js/src/dapps/tokendeploy/Overview/Token/index.js create mode 100644 js/src/dapps/tokendeploy/Overview/Token/token.css create mode 100644 js/src/dapps/tokendeploy/Overview/Token/token.js create mode 100644 js/src/dapps/tokendeploy/Overview/index.js create mode 100644 js/src/dapps/tokendeploy/Overview/overview.css create mode 100644 js/src/dapps/tokendeploy/Overview/overview.js create mode 100644 js/src/dapps/tokendeploy/Transfer/Event/event.js create mode 100644 js/src/dapps/tokendeploy/Transfer/Event/index.js create mode 100644 js/src/dapps/tokendeploy/Transfer/Events/events.js create mode 100644 js/src/dapps/tokendeploy/Transfer/Events/index.js create mode 100644 js/src/dapps/tokendeploy/Transfer/Send/index.js create mode 100644 js/src/dapps/tokendeploy/Transfer/Send/send.css create mode 100644 js/src/dapps/tokendeploy/Transfer/Send/send.js create mode 100644 js/src/dapps/tokendeploy/Transfer/index.js create mode 100644 js/src/dapps/tokendeploy/Transfer/transfer.js create mode 100644 js/src/dapps/tokendeploy/_form.css create mode 100644 js/src/dapps/tokendeploy/_status.css create mode 100644 js/src/dapps/tokendeploy/background.jpg create mode 100644 js/src/dapps/tokendeploy/parity.js create mode 100644 js/src/dapps/tokendeploy/services.js create mode 100644 js/src/dapps/tokenreg.js create mode 100644 js/src/dapps/tokenreg/Accounts/AccountSelector/account-selector.css create mode 100644 js/src/dapps/tokenreg/Accounts/AccountSelector/account-selector.js create mode 100644 js/src/dapps/tokenreg/Accounts/AccountSelector/container.js create mode 100644 js/src/dapps/tokenreg/Accounts/AccountSelector/index.js create mode 100644 js/src/dapps/tokenreg/Accounts/actions.js create mode 100644 js/src/dapps/tokenreg/Accounts/reducer.js create mode 100644 js/src/dapps/tokenreg/Actions/Query/index.js create mode 100644 js/src/dapps/tokenreg/Actions/Query/query.js create mode 100644 js/src/dapps/tokenreg/Actions/Register/index.js create mode 100644 js/src/dapps/tokenreg/Actions/Register/register.js create mode 100644 js/src/dapps/tokenreg/Actions/actions.css create mode 100644 js/src/dapps/tokenreg/Actions/actions.js create mode 100644 js/src/dapps/tokenreg/Actions/component.js create mode 100644 js/src/dapps/tokenreg/Actions/container.js create mode 100644 js/src/dapps/tokenreg/Actions/index.js create mode 100644 js/src/dapps/tokenreg/Actions/reducer.js create mode 100644 js/src/dapps/tokenreg/Application/application.css create mode 100644 js/src/dapps/tokenreg/Application/application.js create mode 100644 js/src/dapps/tokenreg/Application/index.js create mode 100644 js/src/dapps/tokenreg/Chip/chip.css create mode 100644 js/src/dapps/tokenreg/Chip/chip.js create mode 100644 js/src/dapps/tokenreg/Chip/index.js create mode 100644 js/src/dapps/tokenreg/Container.js create mode 100644 js/src/dapps/tokenreg/IdentityIcon/identityIcon.css create mode 100644 js/src/dapps/tokenreg/IdentityIcon/identityIcon.js create mode 100644 js/src/dapps/tokenreg/IdentityIcon/index.js create mode 100644 js/src/dapps/tokenreg/Inputs/Text/container.js create mode 100644 js/src/dapps/tokenreg/Inputs/Text/index.js create mode 100644 js/src/dapps/tokenreg/Inputs/Text/input-text.js create mode 100644 js/src/dapps/tokenreg/Inputs/inputs.css create mode 100644 js/src/dapps/tokenreg/Inputs/validation.js create mode 100644 js/src/dapps/tokenreg/Loading/index.js create mode 100644 js/src/dapps/tokenreg/Loading/loading.css create mode 100644 js/src/dapps/tokenreg/Loading/loading.js create mode 100644 js/src/dapps/tokenreg/Status/actions.js create mode 100644 js/src/dapps/tokenreg/Status/index.js create mode 100644 js/src/dapps/tokenreg/Status/reducer.js create mode 100644 js/src/dapps/tokenreg/Status/status.css create mode 100644 js/src/dapps/tokenreg/Status/status.js create mode 100644 js/src/dapps/tokenreg/Tokens/Token/add-meta.js create mode 100644 js/src/dapps/tokenreg/Tokens/Token/index.js create mode 100644 js/src/dapps/tokenreg/Tokens/Token/token.css create mode 100644 js/src/dapps/tokenreg/Tokens/Token/token.js create mode 100644 js/src/dapps/tokenreg/Tokens/Token/tokenContainer.js create mode 100644 js/src/dapps/tokenreg/Tokens/actions.js create mode 100644 js/src/dapps/tokenreg/Tokens/container.js create mode 100644 js/src/dapps/tokenreg/Tokens/index.js create mode 100644 js/src/dapps/tokenreg/Tokens/reducer.js create mode 100644 js/src/dapps/tokenreg/Tokens/tokens.css create mode 100644 js/src/dapps/tokenreg/Tokens/tokens.js create mode 100644 js/src/dapps/tokenreg/constants.js create mode 100644 js/src/dapps/tokenreg/parity.js create mode 100644 js/src/dapps/tokenreg/reducers.js create mode 100644 js/src/dapps/tokenreg/store.js create mode 100644 js/src/dapps/tokenreg/utils.js create mode 100644 js/src/environment/empty.js create mode 100644 js/src/environment/index.js create mode 100644 js/src/environment/integration-tests/fake-backend.js create mode 100644 js/src/environment/integration-tests/index.js create mode 100644 js/src/environment/perf-debug/index.js create mode 100644 js/src/environment/perf-debug/why-update.js create mode 100644 js/src/environment/tests/index.js create mode 100644 js/src/environment/tests/test-utils.js create mode 100644 js/src/i18n/_default/account.js create mode 100644 js/src/i18n/_default/accounts.js create mode 100644 js/src/i18n/_default/addAddress.js create mode 100644 js/src/i18n/_default/addContract.js create mode 100644 js/src/i18n/_default/address.js create mode 100644 js/src/i18n/_default/addressSelect.js create mode 100644 js/src/i18n/_default/addresses.js create mode 100644 js/src/i18n/_default/application.js create mode 100644 js/src/i18n/_default/connection.js create mode 100644 js/src/i18n/_default/contract.js create mode 100644 js/src/i18n/_default/contracts.js create mode 100644 js/src/i18n/_default/createAccount.js create mode 100644 js/src/i18n/_default/createWallet.js create mode 100644 js/src/i18n/_default/dapp.js create mode 100644 js/src/i18n/_default/dapps.js create mode 100644 js/src/i18n/_default/deleteAccount.js create mode 100644 js/src/i18n/_default/deployContract.js create mode 100644 js/src/i18n/_default/editMeta.js create mode 100644 js/src/i18n/_default/errors.js create mode 100644 js/src/i18n/_default/executeContract.js create mode 100644 js/src/i18n/_default/extension.js create mode 100644 js/src/i18n/_default/faucet.js create mode 100644 js/src/i18n/_default/firstRun.js create mode 100644 js/src/i18n/_default/home.js create mode 100644 js/src/i18n/_default/index.js create mode 100644 js/src/i18n/_default/loadContract.js create mode 100644 js/src/i18n/_default/parityBar.js create mode 100644 js/src/i18n/_default/passwordChange.js create mode 100644 js/src/i18n/_default/peers.js create mode 100644 js/src/i18n/_default/requests.js create mode 100644 js/src/i18n/_default/saveContract.js create mode 100644 js/src/i18n/_default/settings.js create mode 100644 js/src/i18n/_default/shapeshift.js create mode 100644 js/src/i18n/_default/signer.js create mode 100644 js/src/i18n/_default/status.js create mode 100644 js/src/i18n/_default/syncWarning.js create mode 100644 js/src/i18n/_default/tabBar.js create mode 100644 js/src/i18n/_default/transfer.js create mode 100644 js/src/i18n/_default/txEditor.js create mode 100644 js/src/i18n/_default/ui.js create mode 100644 js/src/i18n/_default/upgradeParity.js create mode 100644 js/src/i18n/_default/vaults.js create mode 100644 js/src/i18n/_default/verification.js create mode 100644 js/src/i18n/_default/wallet.js create mode 100644 js/src/i18n/_default/walletSettings.js create mode 100644 js/src/i18n/_default/web.js create mode 100644 js/src/i18n/_default/writeContract.js create mode 100644 js/src/i18n/constants.js create mode 100644 js/src/i18n/de/index.js create mode 100644 js/src/i18n/de/settings.js create mode 100644 js/src/i18n/en/index.js create mode 100644 js/src/i18n/en/settings.js create mode 100644 js/src/i18n/index.js create mode 100644 js/src/i18n/languages.js create mode 100644 js/src/i18n/languages.spec.js create mode 100755 js/src/i18n/nl/account.js create mode 100755 js/src/i18n/nl/accounts.js create mode 100755 js/src/i18n/nl/addAddress.js create mode 100755 js/src/i18n/nl/addContract.js create mode 100644 js/src/i18n/nl/address.js create mode 100755 js/src/i18n/nl/addressSelect.js create mode 100644 js/src/i18n/nl/addresses.js create mode 100755 js/src/i18n/nl/application.js create mode 100755 js/src/i18n/nl/connection.js create mode 100755 js/src/i18n/nl/contract.js create mode 100644 js/src/i18n/nl/contracts.js create mode 100755 js/src/i18n/nl/createAccount.js create mode 100644 js/src/i18n/nl/createWallet.js create mode 100755 js/src/i18n/nl/dapp.js create mode 100644 js/src/i18n/nl/dapps.js create mode 100755 js/src/i18n/nl/deleteAccount.js create mode 100644 js/src/i18n/nl/deployContract.js create mode 100644 js/src/i18n/nl/details_windows.js create mode 100644 js/src/i18n/nl/editMeta.js create mode 100644 js/src/i18n/nl/errors.js create mode 100644 js/src/i18n/nl/executeContract.js create mode 100644 js/src/i18n/nl/extension.js create mode 100644 js/src/i18n/nl/faucet.js create mode 100755 js/src/i18n/nl/firstRun.js create mode 100644 js/src/i18n/nl/home.js create mode 100755 js/src/i18n/nl/index.js create mode 100644 js/src/i18n/nl/loadContract.js create mode 100644 js/src/i18n/nl/parityBar.js create mode 100644 js/src/i18n/nl/passwordChange.js create mode 100644 js/src/i18n/nl/saveContract.js create mode 100644 js/src/i18n/nl/settings.js create mode 100755 js/src/i18n/nl/shapeshift.js create mode 100644 js/src/i18n/nl/signer.js create mode 100644 js/src/i18n/nl/status.js create mode 100644 js/src/i18n/nl/tabBar.js create mode 100644 js/src/i18n/nl/transfer.js create mode 100644 js/src/i18n/nl/txEditor.js create mode 100644 js/src/i18n/nl/ui.js create mode 100644 js/src/i18n/nl/upgradeParity.js create mode 100644 js/src/i18n/nl/vaults.js create mode 100644 js/src/i18n/nl/verification.js create mode 100644 js/src/i18n/nl/wallet.js create mode 100644 js/src/i18n/nl/walletSettings.js create mode 100644 js/src/i18n/nl/web.js create mode 100644 js/src/i18n/nl/writeContract.js create mode 100644 js/src/i18n/store.js create mode 100644 js/src/i18n/store.spec.js create mode 100644 js/src/i18n/zh-Hant-TW/account.js create mode 100644 js/src/i18n/zh-Hant-TW/accounts.js create mode 100644 js/src/i18n/zh-Hant-TW/addAddress.js create mode 100644 js/src/i18n/zh-Hant-TW/addContract.js create mode 100644 js/src/i18n/zh-Hant-TW/address.js create mode 100644 js/src/i18n/zh-Hant-TW/addressSelect.js create mode 100644 js/src/i18n/zh-Hant-TW/addresses.js create mode 100644 js/src/i18n/zh-Hant-TW/application.js create mode 100644 js/src/i18n/zh-Hant-TW/connection.js create mode 100644 js/src/i18n/zh-Hant-TW/contract.js create mode 100644 js/src/i18n/zh-Hant-TW/contracts.js create mode 100644 js/src/i18n/zh-Hant-TW/createAccount.js create mode 100644 js/src/i18n/zh-Hant-TW/createWallet.js create mode 100644 js/src/i18n/zh-Hant-TW/dapp.js create mode 100644 js/src/i18n/zh-Hant-TW/dapps.js create mode 100644 js/src/i18n/zh-Hant-TW/deleteAccount.js create mode 100644 js/src/i18n/zh-Hant-TW/deployContract.js create mode 100644 js/src/i18n/zh-Hant-TW/details_windows.js create mode 100644 js/src/i18n/zh-Hant-TW/editMeta.js create mode 100644 js/src/i18n/zh-Hant-TW/errors.js create mode 100644 js/src/i18n/zh-Hant-TW/executeContract.js create mode 100644 js/src/i18n/zh-Hant-TW/extension.js create mode 100644 js/src/i18n/zh-Hant-TW/faucet.js create mode 100644 js/src/i18n/zh-Hant-TW/firstRun.js create mode 100644 js/src/i18n/zh-Hant-TW/home.js create mode 100644 js/src/i18n/zh-Hant-TW/index.js create mode 100644 js/src/i18n/zh-Hant-TW/loadContract.js create mode 100644 js/src/i18n/zh-Hant-TW/parityBar.js create mode 100644 js/src/i18n/zh-Hant-TW/passwordChange.js create mode 100644 js/src/i18n/zh-Hant-TW/saveContract.js create mode 100644 js/src/i18n/zh-Hant-TW/settings.js create mode 100644 js/src/i18n/zh-Hant-TW/shapeshift.js create mode 100644 js/src/i18n/zh-Hant-TW/signer.js create mode 100644 js/src/i18n/zh-Hant-TW/status.js create mode 100644 js/src/i18n/zh-Hant-TW/tabBar.js create mode 100644 js/src/i18n/zh-Hant-TW/transfer.js create mode 100644 js/src/i18n/zh-Hant-TW/txEditor.js create mode 100644 js/src/i18n/zh-Hant-TW/ui.js create mode 100644 js/src/i18n/zh-Hant-TW/upgradeParity.js create mode 100644 js/src/i18n/zh-Hant-TW/vaults.js create mode 100644 js/src/i18n/zh-Hant-TW/verification.js create mode 100644 js/src/i18n/zh-Hant-TW/wallet.js create mode 100644 js/src/i18n/zh-Hant-TW/walletSettings.js create mode 100644 js/src/i18n/zh-Hant-TW/web.js create mode 100644 js/src/i18n/zh-Hant-TW/writeContract.js create mode 100644 js/src/i18n/zh/account.js create mode 100644 js/src/i18n/zh/accounts.js create mode 100644 js/src/i18n/zh/addAddress.js create mode 100644 js/src/i18n/zh/addContract.js create mode 100644 js/src/i18n/zh/address.js create mode 100644 js/src/i18n/zh/addressSelect.js create mode 100644 js/src/i18n/zh/addresses.js create mode 100644 js/src/i18n/zh/application.js create mode 100644 js/src/i18n/zh/connection.js create mode 100644 js/src/i18n/zh/contract.js create mode 100644 js/src/i18n/zh/contracts.js create mode 100644 js/src/i18n/zh/createAccount.js create mode 100644 js/src/i18n/zh/createWallet.js create mode 100644 js/src/i18n/zh/dapp.js create mode 100644 js/src/i18n/zh/dapps.js create mode 100644 js/src/i18n/zh/deleteAccount.js create mode 100644 js/src/i18n/zh/deployContract.js create mode 100644 js/src/i18n/zh/details_windows.js create mode 100644 js/src/i18n/zh/editMeta.js create mode 100644 js/src/i18n/zh/errors.js create mode 100644 js/src/i18n/zh/executeContract.js create mode 100644 js/src/i18n/zh/extension.js create mode 100644 js/src/i18n/zh/faucet.js create mode 100644 js/src/i18n/zh/firstRun.js create mode 100644 js/src/i18n/zh/home.js create mode 100644 js/src/i18n/zh/index.js create mode 100644 js/src/i18n/zh/loadContract.js create mode 100644 js/src/i18n/zh/parityBar.js create mode 100644 js/src/i18n/zh/passwordChange.js create mode 100644 js/src/i18n/zh/saveContract.js create mode 100644 js/src/i18n/zh/settings.js create mode 100644 js/src/i18n/zh/shapeshift.js create mode 100644 js/src/i18n/zh/signer.js create mode 100644 js/src/i18n/zh/status.js create mode 100644 js/src/i18n/zh/tabBar.js create mode 100644 js/src/i18n/zh/transfer.js create mode 100644 js/src/i18n/zh/txEditor.js create mode 100644 js/src/i18n/zh/ui.js create mode 100644 js/src/i18n/zh/upgradeParity.js create mode 100644 js/src/i18n/zh/vaults.js create mode 100644 js/src/i18n/zh/verification.js create mode 100644 js/src/i18n/zh/wallet.js create mode 100644 js/src/i18n/zh/walletSettings.js create mode 100644 js/src/i18n/zh/web.js create mode 100644 js/src/i18n/zh/writeContract.js create mode 100644 js/src/index.ejs create mode 100644 js/src/index.js create mode 100644 js/src/jsonrpc/.gitignore create mode 100644 js/src/jsonrpc/README.md create mode 100644 js/src/jsonrpc/helpers.js create mode 100644 js/src/jsonrpc/index.js create mode 100644 js/src/jsonrpc/index.spec.js create mode 100644 js/src/jsonrpc/interfaces/db.js create mode 100644 js/src/jsonrpc/interfaces/eth.js create mode 100644 js/src/jsonrpc/interfaces/net.js create mode 100644 js/src/jsonrpc/interfaces/parity.js create mode 100644 js/src/jsonrpc/interfaces/personal.js create mode 100644 js/src/jsonrpc/interfaces/shh.js create mode 100644 js/src/jsonrpc/interfaces/signer.js create mode 100644 js/src/jsonrpc/interfaces/trace.js create mode 100644 js/src/jsonrpc/interfaces/web3.js create mode 100644 js/src/jsonrpc/types.js create mode 100644 js/src/library.etherscan.js create mode 100644 js/src/library.jsonrpc.js create mode 100644 js/src/library.shapeshift.js create mode 100644 js/src/main.js create mode 100644 js/src/mobx/hardwareStore.js create mode 100644 js/src/mobx/hardwareStore.spec.js create mode 100644 js/src/mobx/historyStore.js create mode 100644 js/src/mobx/historyStore.spec.js create mode 100644 js/src/modals/AddAddress/addAddress.js create mode 100644 js/src/modals/AddAddress/addAddress.spec.js create mode 100644 js/src/modals/AddAddress/index.js create mode 100644 js/src/modals/AddAddress/store.js create mode 100644 js/src/modals/AddAddress/store.spec.js create mode 100644 js/src/modals/AddAddress/store.test.js create mode 100644 js/src/modals/AddContract/addContract.css create mode 100644 js/src/modals/AddContract/addContract.js create mode 100644 js/src/modals/AddContract/addContract.spec.js create mode 100644 js/src/modals/AddContract/addContract.test.js create mode 100644 js/src/modals/AddContract/index.js create mode 100644 js/src/modals/AddContract/store.js create mode 100644 js/src/modals/AddContract/store.spec.js create mode 100644 js/src/modals/AddContract/types.js create mode 100644 js/src/modals/AddDapps/addDapps.css create mode 100644 js/src/modals/AddDapps/addDapps.js create mode 100644 js/src/modals/AddDapps/addDapps.spec.js create mode 100644 js/src/modals/AddDapps/index.js create mode 100644 js/src/modals/CreateAccount/AccountDetails/accountDetails.js create mode 100644 js/src/modals/CreateAccount/AccountDetails/accountDetails.spec.js create mode 100644 js/src/modals/CreateAccount/AccountDetails/index.js create mode 100644 js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.js create mode 100644 js/src/modals/CreateAccount/AccountDetailsGeth/accountDetailsGeth.spec.js create mode 100644 js/src/modals/CreateAccount/AccountDetailsGeth/index.js create mode 100644 js/src/modals/CreateAccount/ChangeVault/changeVault.js create mode 100644 js/src/modals/CreateAccount/ChangeVault/changeVault.spec.js create mode 100644 js/src/modals/CreateAccount/ChangeVault/index.js create mode 100644 js/src/modals/CreateAccount/CreationType/creationType.js create mode 100644 js/src/modals/CreateAccount/CreationType/creationType.spec.js create mode 100644 js/src/modals/CreateAccount/CreationType/index.js create mode 100644 js/src/modals/CreateAccount/GethCard/gethCard.js create mode 100644 js/src/modals/CreateAccount/GethCard/index.js create mode 100644 js/src/modals/CreateAccount/NewAccount/index.js create mode 100644 js/src/modals/CreateAccount/NewAccount/newAccount.js create mode 100644 js/src/modals/CreateAccount/NewAccount/newAccount.spec.js create mode 100644 js/src/modals/CreateAccount/NewGeth/index.js create mode 100644 js/src/modals/CreateAccount/NewGeth/newGeth.js create mode 100644 js/src/modals/CreateAccount/NewGeth/newGeth.spec.js create mode 100644 js/src/modals/CreateAccount/NewImport/index.js create mode 100644 js/src/modals/CreateAccount/NewImport/newImport.js create mode 100644 js/src/modals/CreateAccount/NewImport/newImport.spec.js create mode 100644 js/src/modals/CreateAccount/NewQr/index.js create mode 100644 js/src/modals/CreateAccount/NewQr/newQr.js create mode 100644 js/src/modals/CreateAccount/NewQr/newQr.spec.js create mode 100644 js/src/modals/CreateAccount/RawKey/index.js create mode 100644 js/src/modals/CreateAccount/RawKey/rawKey.js create mode 100644 js/src/modals/CreateAccount/RawKey/rawKey.spec.js create mode 100644 js/src/modals/CreateAccount/RecoveryPhrase/index.js create mode 100644 js/src/modals/CreateAccount/RecoveryPhrase/recoveryPhrase.js create mode 100644 js/src/modals/CreateAccount/RecoveryPhrase/recoveryPhrase.spec.js create mode 100644 js/src/modals/CreateAccount/TypeIcon/index.js create mode 100644 js/src/modals/CreateAccount/TypeIcon/typeIcon.js create mode 100644 js/src/modals/CreateAccount/createAccount.css create mode 100644 js/src/modals/CreateAccount/createAccount.js create mode 100644 js/src/modals/CreateAccount/createAccount.spec.js create mode 100644 js/src/modals/CreateAccount/createAccount.test.js create mode 100644 js/src/modals/CreateAccount/errors.js create mode 100644 js/src/modals/CreateAccount/index.js create mode 100644 js/src/modals/CreateAccount/print.js create mode 100644 js/src/modals/CreateAccount/recoveryPage.ejs create mode 100644 js/src/modals/CreateAccount/store.js create mode 100644 js/src/modals/CreateAccount/store.spec.js create mode 100644 js/src/modals/CreateWallet/WalletDetails/index.js create mode 100644 js/src/modals/CreateWallet/WalletDetails/walletDetails.js create mode 100644 js/src/modals/CreateWallet/WalletDetails/walletDetails.spec.js create mode 100644 js/src/modals/CreateWallet/WalletInfo/index.js create mode 100644 js/src/modals/CreateWallet/WalletInfo/walletInfo.js create mode 100644 js/src/modals/CreateWallet/WalletInfo/walletInfo.spec.js create mode 100644 js/src/modals/CreateWallet/WalletType/index.js create mode 100644 js/src/modals/CreateWallet/WalletType/walletType.js create mode 100644 js/src/modals/CreateWallet/WalletType/walletType.spec.js create mode 100644 js/src/modals/CreateWallet/createWallet.css create mode 100644 js/src/modals/CreateWallet/createWallet.js create mode 100644 js/src/modals/CreateWallet/createWallet.spec.js create mode 100644 js/src/modals/CreateWallet/createWallet.test.js create mode 100644 js/src/modals/CreateWallet/createWalletStore.js create mode 100644 js/src/modals/CreateWallet/index.js create mode 100644 js/src/modals/DappPermissions/dappPermissions.js create mode 100644 js/src/modals/DappPermissions/dappPermissions.spec.js create mode 100644 js/src/modals/DappPermissions/index.js create mode 100644 js/src/modals/DappPermissions/store.js create mode 100644 js/src/modals/DappPermissions/store.spec.js create mode 100644 js/src/modals/DeleteAccount/deleteAccount.css create mode 100644 js/src/modals/DeleteAccount/deleteAccount.js create mode 100644 js/src/modals/DeleteAccount/deleteAccount.spec.js create mode 100644 js/src/modals/DeleteAccount/index.js create mode 100644 js/src/modals/DeployContract/DetailsStep/detailsStep.js create mode 100644 js/src/modals/DeployContract/DetailsStep/index.js create mode 100644 js/src/modals/DeployContract/ParametersStep/index.js create mode 100644 js/src/modals/DeployContract/ParametersStep/parametersStep.js create mode 100644 js/src/modals/DeployContract/deployContract.css create mode 100644 js/src/modals/DeployContract/deployContract.js create mode 100644 js/src/modals/DeployContract/deployContract.spec.js create mode 100644 js/src/modals/DeployContract/index.js create mode 100644 js/src/modals/EditMeta/editMeta.js create mode 100644 js/src/modals/EditMeta/editMeta.spec.js create mode 100644 js/src/modals/EditMeta/editMeta.test.js create mode 100644 js/src/modals/EditMeta/index.js create mode 100644 js/src/modals/EditMeta/store.js create mode 100644 js/src/modals/EditMeta/store.spec.js create mode 100644 js/src/modals/ExecuteContract/AdvancedStep/advancedStep.js create mode 100644 js/src/modals/ExecuteContract/AdvancedStep/index.js create mode 100644 js/src/modals/ExecuteContract/DetailsStep/detailsStep.js create mode 100644 js/src/modals/ExecuteContract/DetailsStep/detailsStep.spec.js create mode 100644 js/src/modals/ExecuteContract/DetailsStep/index.js create mode 100644 js/src/modals/ExecuteContract/executeContract.css create mode 100644 js/src/modals/ExecuteContract/executeContract.js create mode 100644 js/src/modals/ExecuteContract/executeContract.spec.js create mode 100644 js/src/modals/ExecuteContract/executeContract.test.js create mode 100644 js/src/modals/ExecuteContract/index.js create mode 100644 js/src/modals/ExportAccount/exportAccount.js create mode 100644 js/src/modals/ExportAccount/exportAccount.spec.js create mode 100644 js/src/modals/ExportAccount/exportInput/exportInput.js create mode 100644 js/src/modals/ExportAccount/exportInput/index.js create mode 100644 js/src/modals/ExportAccount/exportStore.js create mode 100644 js/src/modals/ExportAccount/exportStore.spec.js create mode 100644 js/src/modals/ExportAccount/index.js create mode 100644 js/src/modals/Faucet/faucet.js create mode 100644 js/src/modals/Faucet/index.js create mode 100644 js/src/modals/Faucet/store.js create mode 100644 js/src/modals/FirstRun/Completed/completed.js create mode 100644 js/src/modals/FirstRun/Completed/index.js create mode 100644 js/src/modals/FirstRun/TnC/index.js create mode 100644 js/src/modals/FirstRun/TnC/tnc.js create mode 100644 js/src/modals/FirstRun/TnC/tnc.md create mode 100644 js/src/modals/FirstRun/Welcome/index.js create mode 100644 js/src/modals/FirstRun/Welcome/welcome.js create mode 100644 js/src/modals/FirstRun/firstRun.css create mode 100644 js/src/modals/FirstRun/firstRun.js create mode 100644 js/src/modals/FirstRun/firstRun.spec.js create mode 100644 js/src/modals/FirstRun/index.js create mode 100644 js/src/modals/LoadContract/index.js create mode 100644 js/src/modals/LoadContract/loadContract.css create mode 100644 js/src/modals/LoadContract/loadContract.js create mode 100644 js/src/modals/LoadContract/loadContract.spec.js create mode 100644 js/src/modals/PasswordManager/index.js create mode 100644 js/src/modals/PasswordManager/passwordManager.css create mode 100644 js/src/modals/PasswordManager/passwordManager.js create mode 100644 js/src/modals/PasswordManager/passwordManager.spec.js create mode 100644 js/src/modals/PasswordManager/passwordManager.test.js create mode 100644 js/src/modals/PasswordManager/store.js create mode 100644 js/src/modals/PasswordManager/store.spec.js create mode 100644 js/src/modals/SaveContract/index.js create mode 100644 js/src/modals/SaveContract/saveContract.css create mode 100644 js/src/modals/SaveContract/saveContract.js create mode 100644 js/src/modals/Shapeshift/AwaitingDepositStep/awaitingDepositStep.js create mode 100644 js/src/modals/Shapeshift/AwaitingDepositStep/awaitingDepositStep.spec.js create mode 100644 js/src/modals/Shapeshift/AwaitingDepositStep/index.js create mode 100644 js/src/modals/Shapeshift/AwaitingExchangeStep/awaitingExchangeStep.js create mode 100644 js/src/modals/Shapeshift/AwaitingExchangeStep/awaitingExchangeStep.spec.js create mode 100644 js/src/modals/Shapeshift/AwaitingExchangeStep/index.js create mode 100644 js/src/modals/Shapeshift/CompletedStep/completedStep.js create mode 100644 js/src/modals/Shapeshift/CompletedStep/completedStep.spec.js create mode 100644 js/src/modals/Shapeshift/CompletedStep/index.js create mode 100644 js/src/modals/Shapeshift/ErrorStep/errorStep.js create mode 100644 js/src/modals/Shapeshift/ErrorStep/errorStep.spec.js create mode 100644 js/src/modals/Shapeshift/ErrorStep/index.js create mode 100644 js/src/modals/Shapeshift/OptionsStep/index.js create mode 100644 js/src/modals/Shapeshift/OptionsStep/optionsStep.css create mode 100644 js/src/modals/Shapeshift/OptionsStep/optionsStep.js create mode 100644 js/src/modals/Shapeshift/OptionsStep/optionsSteps.spec.js create mode 100644 js/src/modals/Shapeshift/Price/index.js create mode 100644 js/src/modals/Shapeshift/Price/price.js create mode 100644 js/src/modals/Shapeshift/Price/price.spec.js create mode 100644 js/src/modals/Shapeshift/Value/index.js create mode 100644 js/src/modals/Shapeshift/Value/value.css create mode 100644 js/src/modals/Shapeshift/Value/value.js create mode 100644 js/src/modals/Shapeshift/Value/value.spec.js create mode 100644 js/src/modals/Shapeshift/index.js create mode 100644 js/src/modals/Shapeshift/shapeshift.css create mode 100644 js/src/modals/Shapeshift/shapeshift.js create mode 100644 js/src/modals/Shapeshift/shapeshift.spec.js create mode 100644 js/src/modals/Shapeshift/store.js create mode 100644 js/src/modals/Shapeshift/store.spec.js create mode 100644 js/src/modals/Transfer/Details/details.js create mode 100644 js/src/modals/Transfer/Details/index.js create mode 100644 js/src/modals/Transfer/Details/tokenSelect.js create mode 100644 js/src/modals/Transfer/Extras/extras.js create mode 100644 js/src/modals/Transfer/Extras/index.js create mode 100644 js/src/modals/Transfer/errors.js create mode 100644 js/src/modals/Transfer/index.js create mode 100644 js/src/modals/Transfer/store.js create mode 100644 js/src/modals/Transfer/transfer.css create mode 100644 js/src/modals/Transfer/transfer.js create mode 100644 js/src/modals/UpgradeParity/index.js create mode 100644 js/src/modals/UpgradeParity/store.js create mode 100644 js/src/modals/UpgradeParity/store.spec.js create mode 100644 js/src/modals/UpgradeParity/upgradeParity.css create mode 100644 js/src/modals/UpgradeParity/upgradeParity.js create mode 100644 js/src/modals/VaultAccounts/index.js create mode 100644 js/src/modals/VaultAccounts/vaultAccounts.js create mode 100644 js/src/modals/VaultAccounts/vaultAccounts.spec.js create mode 100644 js/src/modals/VaultCreate/index.js create mode 100644 js/src/modals/VaultCreate/vaultCreate.css create mode 100644 js/src/modals/VaultCreate/vaultCreate.js create mode 100644 js/src/modals/VaultCreate/vaultCreate.spec.js create mode 100644 js/src/modals/VaultLock/index.js create mode 100644 js/src/modals/VaultLock/vaultLock.js create mode 100644 js/src/modals/VaultLock/vaultLock.spec.js create mode 100644 js/src/modals/VaultMeta/index.js create mode 100644 js/src/modals/VaultMeta/vaultMeta.js create mode 100644 js/src/modals/VaultMeta/vaultMeta.spec.js create mode 100644 js/src/modals/VaultSelector/index.js create mode 100644 js/src/modals/VaultSelector/vaultSelector.js create mode 100644 js/src/modals/VaultSelector/vaultSelector.spec.js create mode 100644 js/src/modals/VaultUnlock/index.js create mode 100644 js/src/modals/VaultUnlock/vaultUnlock.css create mode 100644 js/src/modals/VaultUnlock/vaultUnlock.js create mode 100644 js/src/modals/VaultUnlock/vaultUnlock.spec.js create mode 100644 js/src/modals/Verification/Done/done.css create mode 100644 js/src/modals/Verification/Done/done.js create mode 100644 js/src/modals/Verification/Done/index.js create mode 100644 js/src/modals/Verification/GatherData/gatherData.css create mode 100644 js/src/modals/Verification/GatherData/gatherData.js create mode 100644 js/src/modals/Verification/GatherData/index.js create mode 100644 js/src/modals/Verification/QueryCode/index.js create mode 100644 js/src/modals/Verification/QueryCode/queryCode.js create mode 100644 js/src/modals/Verification/SendConfirmation/index.js create mode 100644 js/src/modals/Verification/SendConfirmation/sendConfirmation.css create mode 100644 js/src/modals/Verification/SendConfirmation/sendConfirmation.js create mode 100644 js/src/modals/Verification/SendRequest/index.js create mode 100644 js/src/modals/Verification/SendRequest/sendRequest.css create mode 100644 js/src/modals/Verification/SendRequest/sendRequest.js create mode 100644 js/src/modals/Verification/email-store.js create mode 100644 js/src/modals/Verification/how-it-works.js create mode 100644 js/src/modals/Verification/index.js create mode 100644 js/src/modals/Verification/sms-store.js create mode 100644 js/src/modals/Verification/store.js create mode 100644 js/src/modals/Verification/verification.css create mode 100644 js/src/modals/Verification/verification.js create mode 100644 js/src/modals/WalletSettings/index.js create mode 100644 js/src/modals/WalletSettings/walletSettings.css create mode 100644 js/src/modals/WalletSettings/walletSettings.js create mode 100644 js/src/modals/WalletSettings/walletSettingsStore.js create mode 100644 js/src/modals/index.js create mode 100644 js/src/parity.js create mode 100644 js/src/playground/index.js create mode 100644 js/src/playground/playground.css create mode 100644 js/src/playground/playground.js create mode 100644 js/src/playground/playground.spec.js create mode 100644 js/src/playground/playgroundExample.js create mode 100644 js/src/playground/store.js create mode 100644 js/src/playground/store.spec.js create mode 100644 js/src/redux/actions.js create mode 100644 js/src/redux/index.js create mode 100644 js/src/redux/middleware.js create mode 100644 js/src/redux/providers/apiActions.js create mode 100644 js/src/redux/providers/apiReducer.js create mode 100644 js/src/redux/providers/balances.js create mode 100644 js/src/redux/providers/balancesActions.js create mode 100644 js/src/redux/providers/balancesReducer.js create mode 100644 js/src/redux/providers/certifications/actions.js create mode 100644 js/src/redux/providers/certifications/middleware.js create mode 100644 js/src/redux/providers/certifications/reducer.js create mode 100644 js/src/redux/providers/chainMiddleware.js create mode 100644 js/src/redux/providers/chainMiddleware.spec.js create mode 100644 js/src/redux/providers/imagesActions.js create mode 100644 js/src/redux/providers/imagesReducer.js create mode 100644 js/src/redux/providers/index.js create mode 100644 js/src/redux/providers/personal.js create mode 100644 js/src/redux/providers/personalActions.js create mode 100644 js/src/redux/providers/personalReducer.js create mode 100644 js/src/redux/providers/registry/actions.js create mode 100644 js/src/redux/providers/registry/middleware.js create mode 100644 js/src/redux/providers/registry/reducer.js create mode 100644 js/src/redux/providers/requestsActions.js create mode 100644 js/src/redux/providers/requestsActions.spec.js create mode 100644 js/src/redux/providers/requestsReducer.js create mode 100644 js/src/redux/providers/signer.js create mode 100644 js/src/redux/providers/signerActions.js create mode 100644 js/src/redux/providers/signerMiddleware.js create mode 100644 js/src/redux/providers/signerMiddleware.spec.js create mode 100644 js/src/redux/providers/signerReducer.js create mode 100644 js/src/redux/providers/snackbarActions.js create mode 100644 js/src/redux/providers/snackbarReducer.js create mode 100644 js/src/redux/providers/status.js create mode 100644 js/src/redux/providers/statusActions.js create mode 100644 js/src/redux/providers/statusReducer.js create mode 100644 js/src/redux/providers/tokens.js create mode 100644 js/src/redux/providers/tokensReducer.js create mode 100644 js/src/redux/providers/walletActions.js create mode 100644 js/src/redux/providers/walletReducer.js create mode 100644 js/src/redux/providers/worker.js create mode 100644 js/src/redux/providers/workerActions.js create mode 100644 js/src/redux/providers/workerReducer.js create mode 100644 js/src/redux/providers/workerWrapper.js create mode 100644 js/src/redux/reducers.js create mode 100644 js/src/redux/store.js create mode 100644 js/src/redux/util.js create mode 100644 js/src/reset.css create mode 100644 js/src/routes.js create mode 100644 js/src/serviceWorker.js create mode 100644 js/src/ui/AccountCard/accountCard.css create mode 100644 js/src/ui/AccountCard/accountCard.example.js create mode 100644 js/src/ui/AccountCard/accountCard.js create mode 100644 js/src/ui/AccountCard/accountCard.spec.js create mode 100644 js/src/ui/AccountCard/index.js create mode 100644 js/src/ui/Actionbar/Export/export.js create mode 100644 js/src/ui/Actionbar/Export/index.js create mode 100644 js/src/ui/Actionbar/Import/import.css create mode 100644 js/src/ui/Actionbar/Import/import.js create mode 100644 js/src/ui/Actionbar/Import/index.js create mode 100644 js/src/ui/Actionbar/Search/index.js create mode 100644 js/src/ui/Actionbar/Search/search.css create mode 100644 js/src/ui/Actionbar/Search/search.js create mode 100644 js/src/ui/Actionbar/Sort/index.js create mode 100644 js/src/ui/Actionbar/Sort/sort.css create mode 100644 js/src/ui/Actionbar/Sort/sort.js create mode 100644 js/src/ui/Actionbar/Sort/sortStore.js create mode 100644 js/src/ui/Actionbar/actionbar.css create mode 100644 js/src/ui/Actionbar/actionbar.js create mode 100644 js/src/ui/Actionbar/actionbar.spec.js create mode 100644 js/src/ui/Actionbar/index.js create mode 100644 js/src/ui/Badge/badge.css create mode 100644 js/src/ui/Badge/badge.js create mode 100644 js/src/ui/Badge/badge.spec.js create mode 100644 js/src/ui/Badge/index.js create mode 100644 js/src/ui/Balance/balance.css create mode 100644 js/src/ui/Balance/balance.js create mode 100644 js/src/ui/Balance/balance.spec.js create mode 100644 js/src/ui/Balance/index.js create mode 100644 js/src/ui/BlockStatus/blockStatus.css create mode 100644 js/src/ui/BlockStatus/blockStatus.js create mode 100644 js/src/ui/BlockStatus/blockStatus.spec.js create mode 100644 js/src/ui/BlockStatus/index.js create mode 100644 js/src/ui/Button/button.css create mode 100644 js/src/ui/Button/button.js create mode 100644 js/src/ui/Button/button.spec.js create mode 100644 js/src/ui/Button/index.js create mode 100644 js/src/ui/Certifications/certifications.css create mode 100644 js/src/ui/Certifications/certifications.js create mode 100644 js/src/ui/Certifications/index.js create mode 100644 js/src/ui/ConfirmDialog/confirmDialog.css create mode 100644 js/src/ui/ConfirmDialog/confirmDialog.js create mode 100644 js/src/ui/ConfirmDialog/confirmDialog.spec.js create mode 100644 js/src/ui/ConfirmDialog/index.js create mode 100644 js/src/ui/Container/Title/index.js create mode 100644 js/src/ui/Container/Title/title.css create mode 100644 js/src/ui/Container/Title/title.js create mode 100644 js/src/ui/Container/Title/title.spec.js create mode 100644 js/src/ui/Container/container.css create mode 100644 js/src/ui/Container/container.js create mode 100644 js/src/ui/Container/container.spec.js create mode 100644 js/src/ui/Container/index.js create mode 100644 js/src/ui/ContextProvider/contextProvider.js create mode 100644 js/src/ui/ContextProvider/index.js create mode 100644 js/src/ui/CopyToClipboard/copyToClipboard.css create mode 100644 js/src/ui/CopyToClipboard/copyToClipboard.js create mode 100644 js/src/ui/CopyToClipboard/index.js create mode 100644 js/src/ui/CurrencySymbol/currencySymbol.example.js create mode 100644 js/src/ui/CurrencySymbol/currencySymbol.js create mode 100644 js/src/ui/CurrencySymbol/currencySymbol.spec.js create mode 100644 js/src/ui/CurrencySymbol/index.js create mode 100644 js/src/ui/DappCard/dappCard.css create mode 100644 js/src/ui/DappCard/dappCard.js create mode 100644 js/src/ui/DappCard/index.js create mode 100644 js/src/ui/DappIcon/dappIcon.css create mode 100644 js/src/ui/DappIcon/dappIcon.js create mode 100644 js/src/ui/DappIcon/dappIcon.spec.js create mode 100644 js/src/ui/DappIcon/index.js create mode 100644 js/src/ui/Editor/editor.js create mode 100644 js/src/ui/Editor/index.js create mode 100644 js/src/ui/Editor/mode-solidity.js create mode 100644 js/src/ui/Errors/actions.js create mode 100644 js/src/ui/Errors/errors.css create mode 100644 js/src/ui/Errors/errors.js create mode 100644 js/src/ui/Errors/index.js create mode 100644 js/src/ui/Errors/middleware.js create mode 100644 js/src/ui/Errors/reducers.js create mode 100644 js/src/ui/Features/constants.js create mode 100644 js/src/ui/Features/defaults.js create mode 100644 js/src/ui/Features/defaults.spec.js create mode 100644 js/src/ui/Features/features.css create mode 100644 js/src/ui/Features/features.js create mode 100644 js/src/ui/Features/features.spec.js create mode 100644 js/src/ui/Features/index.js create mode 100644 js/src/ui/Features/store.js create mode 100644 js/src/ui/Features/store.spec.js create mode 100644 js/src/ui/Form/AddressSelect/addressSelect.css create mode 100644 js/src/ui/Form/AddressSelect/addressSelect.js create mode 100644 js/src/ui/Form/AddressSelect/addressSelectStore.js create mode 100644 js/src/ui/Form/AddressSelect/index.js create mode 100644 js/src/ui/Form/AutoComplete/autocomplete.css create mode 100644 js/src/ui/Form/AutoComplete/autocomplete.js create mode 100644 js/src/ui/Form/AutoComplete/index.js create mode 100644 js/src/ui/Form/DappUrlInput/dappUrlInput.js create mode 100644 js/src/ui/Form/DappUrlInput/dappUrlInput.spec.js create mode 100644 js/src/ui/Form/DappUrlInput/index.js create mode 100644 js/src/ui/Form/FileSelect/fileSelect.css create mode 100644 js/src/ui/Form/FileSelect/fileSelect.js create mode 100644 js/src/ui/Form/FileSelect/fileSelect.spec.js create mode 100644 js/src/ui/Form/FileSelect/index.js create mode 100644 js/src/ui/Form/FormWrap/formWrap.css create mode 100644 js/src/ui/Form/FormWrap/formWrap.js create mode 100644 js/src/ui/Form/FormWrap/index.js create mode 100644 js/src/ui/Form/Input/index.js create mode 100644 js/src/ui/Form/Input/input.css create mode 100644 js/src/ui/Form/Input/input.js create mode 100644 js/src/ui/Form/InputAddress/index.js create mode 100644 js/src/ui/Form/InputAddress/inputAddress.css create mode 100644 js/src/ui/Form/InputAddress/inputAddress.js create mode 100644 js/src/ui/Form/InputAddressSelect/index.js create mode 100644 js/src/ui/Form/InputAddressSelect/inputAddressSelect.js create mode 100644 js/src/ui/Form/InputChip/index.js create mode 100644 js/src/ui/Form/InputChip/inputChip.css create mode 100644 js/src/ui/Form/InputChip/inputChip.js create mode 100644 js/src/ui/Form/InputDate/index.js create mode 100644 js/src/ui/Form/InputDate/inputDate.css create mode 100644 js/src/ui/Form/InputDate/inputDate.js create mode 100644 js/src/ui/Form/InputInline/index.js create mode 100644 js/src/ui/Form/InputInline/inputInline.css create mode 100644 js/src/ui/Form/InputInline/inputInline.js create mode 100644 js/src/ui/Form/InputTime/index.js create mode 100644 js/src/ui/Form/InputTime/inputTime.css create mode 100644 js/src/ui/Form/InputTime/inputTime.js create mode 100644 js/src/ui/Form/Label/index.js create mode 100644 js/src/ui/Form/Label/label.css create mode 100644 js/src/ui/Form/Label/label.js create mode 100644 js/src/ui/Form/PasswordStrength/index.js create mode 100644 js/src/ui/Form/PasswordStrength/passwordStrength.css create mode 100644 js/src/ui/Form/PasswordStrength/passwordStrength.js create mode 100644 js/src/ui/Form/PasswordStrength/passwordStrength.spec.js create mode 100644 js/src/ui/Form/RadioButtons/index.js create mode 100644 js/src/ui/Form/RadioButtons/radioButtons.css create mode 100644 js/src/ui/Form/RadioButtons/radioButtons.js create mode 100644 js/src/ui/Form/Select/index.js create mode 100644 js/src/ui/Form/Select/select.js create mode 100644 js/src/ui/Form/TypedInput/index.js create mode 100644 js/src/ui/Form/TypedInput/typedInput.css create mode 100644 js/src/ui/Form/TypedInput/typedInput.js create mode 100644 js/src/ui/Form/TypedInput/typedInput.spec.js create mode 100644 js/src/ui/Form/VaultSelect/index.js create mode 100644 js/src/ui/Form/VaultSelect/vaultSelect.js create mode 100644 js/src/ui/Form/VaultSelect/vaultSelect.spec.js create mode 100644 js/src/ui/Form/form.css create mode 100644 js/src/ui/Form/form.js create mode 100644 js/src/ui/Form/index.js create mode 100644 js/src/ui/GasPriceEditor/gasPriceEditor.css create mode 100644 js/src/ui/GasPriceEditor/gasPriceEditor.js create mode 100644 js/src/ui/GasPriceEditor/gasPriceEditor.spec.js create mode 100644 js/src/ui/GasPriceEditor/index.js create mode 100644 js/src/ui/GasPriceEditor/store.js create mode 100644 js/src/ui/GasPriceEditor/store.spec.js create mode 100644 js/src/ui/GasPriceSelector/CustomBar/customBar.js create mode 100644 js/src/ui/GasPriceSelector/CustomBar/index.js create mode 100644 js/src/ui/GasPriceSelector/CustomCursor/customCursor.js create mode 100644 js/src/ui/GasPriceSelector/CustomCursor/index.js create mode 100644 js/src/ui/GasPriceSelector/CustomShape/customShape.js create mode 100644 js/src/ui/GasPriceSelector/CustomShape/index.js create mode 100644 js/src/ui/GasPriceSelector/CustomTooltip/customTooltip.js create mode 100644 js/src/ui/GasPriceSelector/CustomTooltip/index.js create mode 100644 js/src/ui/GasPriceSelector/gasPriceSelector.css create mode 100644 js/src/ui/GasPriceSelector/gasPriceSelector.js create mode 100644 js/src/ui/GasPriceSelector/index.js create mode 100644 js/src/ui/GasPriceSelector/util.js create mode 100644 js/src/ui/Icons/index.js create mode 100644 js/src/ui/Icons/index.spec.js create mode 100644 js/src/ui/IdentityIcon/identityIcon.css create mode 100644 js/src/ui/IdentityIcon/identityIcon.js create mode 100644 js/src/ui/IdentityIcon/identityIcon.spec.js create mode 100644 js/src/ui/IdentityIcon/index.js create mode 100644 js/src/ui/IdentityName/identityName.js create mode 100644 js/src/ui/IdentityName/identityName.spec.js create mode 100644 js/src/ui/IdentityName/index.js create mode 100644 js/src/ui/LanguageSelector/index.js create mode 100644 js/src/ui/LanguageSelector/languageSelector.js create mode 100644 js/src/ui/LanguageSelector/langugeSelector.spec.js create mode 100644 js/src/ui/Loading/index.js create mode 100644 js/src/ui/Loading/loading.css create mode 100644 js/src/ui/Loading/loading.js create mode 100644 js/src/ui/MethodDecoding/index.js create mode 100644 js/src/ui/MethodDecoding/methodDecoding.css create mode 100644 js/src/ui/MethodDecoding/methodDecoding.js create mode 100644 js/src/ui/MethodDecoding/methodDecodingStore.js create mode 100644 js/src/ui/Modal/Busy/busy.css create mode 100644 js/src/ui/Modal/Busy/busy.js create mode 100644 js/src/ui/Modal/Busy/index.js create mode 100644 js/src/ui/Modal/Completed/completed.css create mode 100644 js/src/ui/Modal/Completed/completed.js create mode 100644 js/src/ui/Modal/Completed/index.js create mode 100644 js/src/ui/Modal/index.js create mode 100644 js/src/ui/ModalBox/body.js create mode 100644 js/src/ui/ModalBox/index.js create mode 100644 js/src/ui/ModalBox/modalBox.css create mode 100644 js/src/ui/ModalBox/modalBox.js create mode 100644 js/src/ui/ModalBox/modalBox.spec.js create mode 100644 js/src/ui/ModalBox/summary.js create mode 100644 js/src/ui/Page/index.js create mode 100644 js/src/ui/Page/page.css create mode 100644 js/src/ui/Page/page.js create mode 100644 js/src/ui/Page/page.spec.js create mode 100644 js/src/ui/ParityBackground/index.js create mode 100644 js/src/ui/ParityBackground/parityBackground.js create mode 100644 js/src/ui/Portal/index.js create mode 100644 js/src/ui/Portal/portal.css create mode 100644 js/src/ui/Portal/portal.example.js create mode 100644 js/src/ui/Portal/portal.js create mode 100644 js/src/ui/Portal/portal.spec.js create mode 100644 js/src/ui/QrCode/index.js create mode 100644 js/src/ui/QrCode/qrCode.css create mode 100644 js/src/ui/QrCode/qrCode.example.js create mode 100644 js/src/ui/QrCode/qrCode.js create mode 100644 js/src/ui/QrCode/qrCode.spec.js create mode 100644 js/src/ui/QrCode/qrSize.js create mode 100644 js/src/ui/QrScan/index.js create mode 100644 js/src/ui/QrScan/qrScan.css create mode 100644 js/src/ui/QrScan/qrScan.js create mode 100644 js/src/ui/QrScan/qrScan.spec.js create mode 100644 js/src/ui/ScrollableText/index.js create mode 100644 js/src/ui/ScrollableText/scrollableText.css create mode 100644 js/src/ui/ScrollableText/scrollableText.js create mode 100644 js/src/ui/SectionList/index.js create mode 100644 js/src/ui/SectionList/sectionList.css create mode 100644 js/src/ui/SectionList/sectionList.example.js create mode 100644 js/src/ui/SectionList/sectionList.js create mode 100644 js/src/ui/SectionList/sectionList.spec.js create mode 100644 js/src/ui/SelectionList/index.js create mode 100644 js/src/ui/SelectionList/selectionList.css create mode 100644 js/src/ui/SelectionList/selectionList.js create mode 100644 js/src/ui/SelectionList/selectionList.spec.js create mode 100644 js/src/ui/ShortenedHash/index.js create mode 100644 js/src/ui/ShortenedHash/shortenedHash.css create mode 100644 js/src/ui/ShortenedHash/shortenedHash.js create mode 100644 js/src/ui/SignerIcon/index.js create mode 100644 js/src/ui/SignerIcon/signerIcon.js create mode 100644 js/src/ui/StackEventListener/index.js create mode 100644 js/src/ui/StackEventListener/stackEventListener.js create mode 100644 js/src/ui/StatusIndicator/index.js create mode 100644 js/src/ui/StatusIndicator/statusIndicator.css create mode 100644 js/src/ui/StatusIndicator/statusIndicator.js create mode 100644 js/src/ui/Tags/index.js create mode 100644 js/src/ui/Tags/tags.css create mode 100644 js/src/ui/Tags/tags.js create mode 100644 js/src/ui/Theme/index.js create mode 100644 js/src/ui/Theme/theme.js create mode 100644 js/src/ui/Theme/theme.spec.js create mode 100644 js/src/ui/Title/index.js create mode 100644 js/src/ui/Title/title.css create mode 100644 js/src/ui/Title/title.js create mode 100644 js/src/ui/Title/title.spec.js create mode 100644 js/src/ui/TokenImage/index.js create mode 100644 js/src/ui/TokenImage/tokenImage.js create mode 100644 js/src/ui/Tooltips/Tooltip/index.js create mode 100644 js/src/ui/Tooltips/Tooltip/tooltip.js create mode 100644 js/src/ui/Tooltips/Tooltip/tooltip.spec.js create mode 100644 js/src/ui/Tooltips/actions.js create mode 100644 js/src/ui/Tooltips/index.js create mode 100644 js/src/ui/Tooltips/reducers.js create mode 100644 js/src/ui/Tooltips/tooltips.css create mode 100644 js/src/ui/Tooltips/tooltips.js create mode 100644 js/src/ui/Tooltips/tooltips.spec.js create mode 100644 js/src/ui/TxHash/index.js create mode 100644 js/src/ui/TxHash/txHash.css create mode 100644 js/src/ui/TxHash/txHash.js create mode 100644 js/src/ui/TxHash/txHash.spec.js create mode 100644 js/src/ui/TxList/TxRow/index.js create mode 100644 js/src/ui/TxList/TxRow/txRow.js create mode 100644 js/src/ui/TxList/TxRow/txRow.spec.js create mode 100644 js/src/ui/TxList/index.js create mode 100644 js/src/ui/TxList/store.js create mode 100644 js/src/ui/TxList/store.spec.js create mode 100644 js/src/ui/TxList/txList.css create mode 100644 js/src/ui/TxList/txList.js create mode 100644 js/src/ui/TxList/txList.spec.js create mode 100644 js/src/ui/VaultCard/Layout/index.js create mode 100644 js/src/ui/VaultCard/Layout/layout.css create mode 100644 js/src/ui/VaultCard/Layout/layout.js create mode 100644 js/src/ui/VaultCard/Layout/layout.spec.js create mode 100644 js/src/ui/VaultCard/index.js create mode 100644 js/src/ui/VaultCard/vaultCard.css create mode 100644 js/src/ui/VaultCard/vaultCard.js create mode 100644 js/src/ui/VaultCard/vaultCard.spec.js create mode 100644 js/src/ui/VaultTag/index.js create mode 100644 js/src/ui/VaultTag/vaultTag.css create mode 100644 js/src/ui/VaultTag/vaultTag.js create mode 100644 js/src/ui/Warning/index.js create mode 100644 js/src/ui/Warning/warning.css create mode 100644 js/src/ui/Warning/warning.js create mode 100644 js/src/ui/index.js create mode 100644 js/src/util/abi.js create mode 100644 js/src/util/array.js create mode 100644 js/src/util/array.spec.js create mode 100644 js/src/util/constants.js create mode 100644 js/src/util/dapplink.js create mode 100644 js/src/util/dapplink.spec.js create mode 100644 js/src/util/dapps.js create mode 100644 js/src/util/messages.js create mode 100644 js/src/util/notifications.js create mode 100644 js/src/util/proptypes.js create mode 100644 js/src/util/qrscan.js create mode 100644 js/src/util/signer.js create mode 100644 js/src/util/solidity.js create mode 100644 js/src/util/subscribe-to-events.js create mode 100644 js/src/util/subscribe-to-events.spec.js create mode 100644 js/src/util/subscribe-to-events.test.js create mode 100644 js/src/util/tokens/bytecodes.js create mode 100644 js/src/util/tx.js create mode 100644 js/src/util/validation.js create mode 100644 js/src/util/validation.spec.js create mode 100644 js/src/util/wallets.js create mode 100644 js/src/util/wallets/consensys-wallet.js create mode 100644 js/src/util/wallets/foundation-wallet.js create mode 100644 js/src/util/wallets/pending-contracts.js create mode 100644 js/src/util/wallets/updates.js create mode 100644 js/src/util/web3.extensions.js create mode 100644 js/src/views/Account/Header/header.css create mode 100644 js/src/views/Account/Header/header.js create mode 100644 js/src/views/Account/Header/header.spec.js create mode 100644 js/src/views/Account/Header/index.js create mode 100644 js/src/views/Account/Transactions/index.js create mode 100644 js/src/views/Account/Transactions/store.js create mode 100644 js/src/views/Account/Transactions/store.spec.js create mode 100644 js/src/views/Account/Transactions/transactions.css create mode 100644 js/src/views/Account/Transactions/transactions.js create mode 100644 js/src/views/Account/Transactions/transactions.spec.js create mode 100644 js/src/views/Account/Transactions/transactions.test.js create mode 100644 js/src/views/Account/account.css create mode 100644 js/src/views/Account/account.js create mode 100644 js/src/views/Account/account.spec.js create mode 100644 js/src/views/Account/account.test.js create mode 100644 js/src/views/Account/index.js create mode 100644 js/src/views/Account/store.js create mode 100644 js/src/views/Account/store.spec.js create mode 100644 js/src/views/Accounts/List/index.js create mode 100644 js/src/views/Accounts/List/list.css create mode 100644 js/src/views/Accounts/List/list.js create mode 100644 js/src/views/Accounts/Summary/index.js create mode 100644 js/src/views/Accounts/Summary/summary.js create mode 100644 js/src/views/Accounts/accounts.css create mode 100644 js/src/views/Accounts/accounts.js create mode 100644 js/src/views/Accounts/accounts.spec.js create mode 100644 js/src/views/Accounts/index.js create mode 100644 js/src/views/Address/Delete/delete.js create mode 100644 js/src/views/Address/Delete/index.js create mode 100644 js/src/views/Address/address.css create mode 100644 js/src/views/Address/address.js create mode 100644 js/src/views/Address/index.js create mode 100644 js/src/views/Addresses/addresses.css create mode 100644 js/src/views/Addresses/addresses.js create mode 100644 js/src/views/Addresses/index.js create mode 100644 js/src/views/Application/Container/container.js create mode 100644 js/src/views/Application/Container/index.js create mode 100644 js/src/views/Application/DappContainer/dappContainer.js create mode 100644 js/src/views/Application/DappContainer/index.js create mode 100644 js/src/views/Application/Extension/extension.css create mode 100644 js/src/views/Application/Extension/extension.js create mode 100644 js/src/views/Application/Extension/index.js create mode 100644 js/src/views/Application/Extension/store.js create mode 100644 js/src/views/Application/FrameError/frameError.css create mode 100644 js/src/views/Application/FrameError/frameError.js create mode 100644 js/src/views/Application/FrameError/index.js create mode 100644 js/src/views/Application/Requests/index.js create mode 100644 js/src/views/Application/Requests/requests.css create mode 100644 js/src/views/Application/Requests/requests.js create mode 100644 js/src/views/Application/Requests/savedRequests.js create mode 100644 js/src/views/Application/Requests/savedRequests.spec.js create mode 100644 js/src/views/Application/Snackbar/index.js create mode 100644 js/src/views/Application/Snackbar/snackbar.js create mode 100644 js/src/views/Application/Status/index.js create mode 100644 js/src/views/Application/Status/status.css create mode 100644 js/src/views/Application/Status/status.js create mode 100644 js/src/views/Application/TabBar/Tab/index.js create mode 100644 js/src/views/Application/TabBar/Tab/tab.js create mode 100644 js/src/views/Application/TabBar/Tab/tabs.spec.js create mode 100644 js/src/views/Application/TabBar/index.js create mode 100644 js/src/views/Application/TabBar/tabBar.css create mode 100644 js/src/views/Application/TabBar/tabBar.js create mode 100644 js/src/views/Application/TabBar/tabBar.spec.js create mode 100644 js/src/views/Application/application.css create mode 100644 js/src/views/Application/application.js create mode 100644 js/src/views/Application/index.js create mode 100644 js/src/views/Application/store.js create mode 100644 js/src/views/Connection/connection.css create mode 100644 js/src/views/Connection/connection.js create mode 100644 js/src/views/Connection/connection.spec.js create mode 100644 js/src/views/Connection/index.js create mode 100644 js/src/views/Contract/Events/Event/event.js create mode 100644 js/src/views/Contract/Events/Event/index.js create mode 100644 js/src/views/Contract/Events/events.js create mode 100644 js/src/views/Contract/Events/index.js create mode 100644 js/src/views/Contract/Queries/index.js create mode 100644 js/src/views/Contract/Queries/inputQuery.js create mode 100644 js/src/views/Contract/Queries/queries.css create mode 100644 js/src/views/Contract/Queries/queries.js create mode 100644 js/src/views/Contract/contract.css create mode 100644 js/src/views/Contract/contract.js create mode 100644 js/src/views/Contract/index.js create mode 100644 js/src/views/Contracts/contracts.js create mode 100644 js/src/views/Contracts/index.js create mode 100644 js/src/views/Dapp/dapp.css create mode 100644 js/src/views/Dapp/dapp.js create mode 100644 js/src/views/Dapp/index.js create mode 100644 js/src/views/Dapps/builtin.json create mode 100644 js/src/views/Dapps/dappStore.spec.js create mode 100644 js/src/views/Dapps/dapps.css create mode 100644 js/src/views/Dapps/dapps.js create mode 100644 js/src/views/Dapps/dappsStore.js create mode 100644 js/src/views/Dapps/index.js create mode 100644 js/src/views/Home/Accounts/accounts.css create mode 100644 js/src/views/Home/Accounts/accounts.js create mode 100644 js/src/views/Home/Accounts/accounts.spec.js create mode 100644 js/src/views/Home/Accounts/index.js create mode 100644 js/src/views/Home/Dapps/dapp.js create mode 100644 js/src/views/Home/Dapps/dapp.spec.js create mode 100644 js/src/views/Home/Dapps/dapps.css create mode 100644 js/src/views/Home/Dapps/dapps.js create mode 100644 js/src/views/Home/Dapps/dapps.spec.js create mode 100644 js/src/views/Home/Dapps/dapps.test.js create mode 100644 js/src/views/Home/Dapps/index.js create mode 100644 js/src/views/Home/News/index.js create mode 100644 js/src/views/Home/News/news.css create mode 100644 js/src/views/Home/News/news.js create mode 100644 js/src/views/Home/News/news.spec.js create mode 100644 js/src/views/Home/News/news.test.js create mode 100644 js/src/views/Home/News/renderers.js create mode 100644 js/src/views/Home/News/store.js create mode 100644 js/src/views/Home/News/store.spec.js create mode 100644 js/src/views/Home/Urls/index.js create mode 100644 js/src/views/Home/Urls/urls.css create mode 100644 js/src/views/Home/Urls/urls.js create mode 100644 js/src/views/Home/Urls/urls.spec.js create mode 100644 js/src/views/Home/home.css create mode 100644 js/src/views/Home/home.js create mode 100644 js/src/views/Home/home.spec.js create mode 100644 js/src/views/Home/index.js create mode 100644 js/src/views/ParityBar/accountStore.js create mode 100644 js/src/views/ParityBar/accountStore.spec.js create mode 100644 js/src/views/ParityBar/index.js create mode 100644 js/src/views/ParityBar/parityBar.css create mode 100644 js/src/views/ParityBar/parityBar.js create mode 100644 js/src/views/ParityBar/parityBar.spec.js create mode 100644 js/src/views/ParityBar/parityBar.test.js create mode 100644 js/src/views/RpcCalls/actions/localstorage.js create mode 100644 js/src/views/RpcCalls/actions/logger.js create mode 100644 js/src/views/RpcCalls/actions/rpc.js create mode 100644 js/src/views/RpcCalls/components/AutoComplete/AutoComplete.js create mode 100644 js/src/views/RpcCalls/components/AutoComplete/AutoComplete.spec.js create mode 100644 js/src/views/RpcCalls/components/AutoComplete/index.js create mode 100644 js/src/views/RpcCalls/components/Box/Box.js create mode 100644 js/src/views/RpcCalls/components/Box/Box.spec.js create mode 100644 js/src/views/RpcCalls/components/Box/index.js create mode 100644 js/src/views/RpcCalls/components/Call/Call.css create mode 100644 js/src/views/RpcCalls/components/Call/Call.js create mode 100644 js/src/views/RpcCalls/components/Call/Call.spec.js create mode 100644 js/src/views/RpcCalls/components/Call/index.js create mode 100644 js/src/views/RpcCalls/components/Calls/Calls.css create mode 100644 js/src/views/RpcCalls/components/Calls/Calls.js create mode 100644 js/src/views/RpcCalls/components/Calls/Calls.spec.js create mode 100644 js/src/views/RpcCalls/components/Calls/index.js create mode 100644 js/src/views/RpcCalls/components/CallsToolbar/CallsToolbar.css create mode 100644 js/src/views/RpcCalls/components/CallsToolbar/CallsToolbar.js create mode 100644 js/src/views/RpcCalls/components/CallsToolbar/CallsToolbar.spec.js create mode 100644 js/src/views/RpcCalls/components/CallsToolbar/index.js create mode 100644 js/src/views/RpcCalls/components/EditableValue/EditableValue.css create mode 100644 js/src/views/RpcCalls/components/EditableValue/EditableValue.js create mode 100644 js/src/views/RpcCalls/components/EditableValue/index.js create mode 100644 js/src/views/RpcCalls/components/JsonEditor/JsonEditor.css create mode 100644 js/src/views/RpcCalls/components/JsonEditor/JsonEditor.js create mode 100644 js/src/views/RpcCalls/components/JsonEditor/index.js create mode 100644 js/src/views/RpcCalls/components/Markdown/Markdown.css create mode 100644 js/src/views/RpcCalls/components/Markdown/Markdown.js create mode 100644 js/src/views/RpcCalls/components/Markdown/index.js create mode 100644 js/src/views/RpcCalls/components/Response/Response.css create mode 100644 js/src/views/RpcCalls/components/Response/Response.js create mode 100644 js/src/views/RpcCalls/components/Response/Response.spec.js create mode 100644 js/src/views/RpcCalls/components/Response/index.js create mode 100644 js/src/views/RpcCalls/components/RpcCalls/RpcCalls.css create mode 100644 js/src/views/RpcCalls/components/RpcCalls/RpcCalls.js create mode 100644 js/src/views/RpcCalls/components/RpcCalls/index.js create mode 100644 js/src/views/RpcCalls/components/RpcDocs/RpcDocs.css create mode 100644 js/src/views/RpcCalls/components/RpcDocs/RpcDocs.js create mode 100644 js/src/views/RpcCalls/components/RpcDocs/index.js create mode 100644 js/src/views/RpcCalls/components/RpcNav/RpcNav.css create mode 100644 js/src/views/RpcCalls/components/RpcNav/RpcNav.js create mode 100644 js/src/views/RpcCalls/components/RpcNav/index.js create mode 100644 js/src/views/RpcCalls/components/ScrollTopButton/ScrollTopButton.css create mode 100644 js/src/views/RpcCalls/components/ScrollTopButton/ScrollTopButton.js create mode 100644 js/src/views/RpcCalls/components/ScrollTopButton/index.js create mode 100644 js/src/views/RpcCalls/components/ScrollTopButton/util.js create mode 100644 js/src/views/RpcCalls/constants/index.js create mode 100644 js/src/views/RpcCalls/containers/RpcPage/RpcPage.js create mode 100644 js/src/views/RpcCalls/containers/RpcPage/index.js create mode 100644 js/src/views/RpcCalls/data/rpc.json create mode 100644 js/src/views/RpcCalls/middleware/index.js create mode 100644 js/src/views/RpcCalls/middleware/localstorage.js create mode 100644 js/src/views/RpcCalls/middleware/localstorage.spec.js create mode 100644 js/src/views/RpcCalls/reducers/index.js create mode 100644 js/src/views/RpcCalls/reducers/logger.js create mode 100644 js/src/views/RpcCalls/reducers/rpc.js create mode 100644 js/src/views/RpcCalls/util/error.js create mode 100644 js/src/views/RpcCalls/util/error.spec.js create mode 100644 js/src/views/RpcCalls/util/index.js create mode 100644 js/src/views/RpcCalls/util/index.spec.js create mode 100644 js/src/views/RpcCalls/util/react.js create mode 100644 js/src/views/RpcCalls/util/rpc-md.js create mode 100644 js/src/views/Settings/Background/background.css create mode 100644 js/src/views/Settings/Background/background.js create mode 100644 js/src/views/Settings/Background/index.js create mode 100644 js/src/views/Settings/Parity/index.js create mode 100644 js/src/views/Settings/Parity/parity.js create mode 100644 js/src/views/Settings/Parity/parity.spec.js create mode 100644 js/src/views/Settings/Parity/parity.test.js create mode 100644 js/src/views/Settings/Parity/store.js create mode 100644 js/src/views/Settings/Parity/store.spec.js create mode 100644 js/src/views/Settings/Proxy/index.js create mode 100644 js/src/views/Settings/Proxy/proxy.css create mode 100644 js/src/views/Settings/Proxy/proxy.js create mode 100644 js/src/views/Settings/Views/defaults.js create mode 100644 js/src/views/Settings/Views/index.js create mode 100644 js/src/views/Settings/Views/views.css create mode 100644 js/src/views/Settings/Views/views.js create mode 100644 js/src/views/Settings/actions.js create mode 100644 js/src/views/Settings/index.js create mode 100644 js/src/views/Settings/layout.css create mode 100644 js/src/views/Settings/middleware.js create mode 100644 js/src/views/Settings/reducers.js create mode 100644 js/src/views/Settings/settings.css create mode 100644 js/src/views/Settings/settings.js create mode 100644 js/src/views/Signer/_layout.css create mode 100644 js/src/views/Signer/components/Account/AccountLink/accountLink.css create mode 100644 js/src/views/Signer/components/Account/AccountLink/accountLink.js create mode 100644 js/src/views/Signer/components/Account/AccountLink/index.js create mode 100644 js/src/views/Signer/components/Account/account.css create mode 100644 js/src/views/Signer/components/Account/account.js create mode 100644 js/src/views/Signer/components/Account/index.js create mode 100644 js/src/views/Signer/components/DecryptRequest/decryptRequest.js create mode 100644 js/src/views/Signer/components/DecryptRequest/index.js create mode 100644 js/src/views/Signer/components/RequestOrigin/index.js create mode 100644 js/src/views/Signer/components/RequestOrigin/requestOrigin.css create mode 100644 js/src/views/Signer/components/RequestOrigin/requestOrigin.js create mode 100644 js/src/views/Signer/components/RequestOrigin/requestOrigin.spec.js create mode 100644 js/src/views/Signer/components/RequestPending/index.js create mode 100644 js/src/views/Signer/components/RequestPending/requestPending.js create mode 100644 js/src/views/Signer/components/RequestPending/requestPending.spec.js create mode 100644 js/src/views/Signer/components/SignRequest/index.js create mode 100644 js/src/views/Signer/components/SignRequest/signRequest.css create mode 100644 js/src/views/Signer/components/SignRequest/signRequest.js create mode 100644 js/src/views/Signer/components/SignRequest/signRequest.spec.js create mode 100644 js/src/views/Signer/components/TransactionMainDetails/index.js create mode 100644 js/src/views/Signer/components/TransactionMainDetails/transactionMainDetails.css create mode 100644 js/src/views/Signer/components/TransactionMainDetails/transactionMainDetails.js create mode 100644 js/src/views/Signer/components/TransactionPending/index.js create mode 100644 js/src/views/Signer/components/TransactionPending/transactionPending.css create mode 100644 js/src/views/Signer/components/TransactionPending/transactionPending.js create mode 100644 js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/index.js create mode 100644 js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/transactionPendingFormConfirm.css create mode 100644 js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/transactionPendingFormConfirm.js create mode 100644 js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormConfirm/transactionPendingFormConfirm.spec.js create mode 100644 js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/index.js create mode 100644 js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/transactionPendingFormReject.css create mode 100644 js/src/views/Signer/components/TransactionPendingForm/TransactionPendingFormReject/transactionPendingFormReject.js create mode 100644 js/src/views/Signer/components/TransactionPendingForm/index.js create mode 100644 js/src/views/Signer/components/TransactionPendingForm/transactionPendingForm.css create mode 100644 js/src/views/Signer/components/TransactionPendingForm/transactionPendingForm.js create mode 100644 js/src/views/Signer/components/TxHashLink/index.js create mode 100644 js/src/views/Signer/components/TxHashLink/txHashLink.js create mode 100644 js/src/views/Signer/components/util/logger.js create mode 100644 js/src/views/Signer/components/util/react.js create mode 100644 js/src/views/Signer/components/util/transaction.js create mode 100644 js/src/views/Signer/components/util/transaction.spec.js create mode 100644 js/src/views/Signer/components/util/util.js create mode 100644 js/src/views/Signer/containers/Embedded/embedded.css create mode 100644 js/src/views/Signer/containers/Embedded/embedded.js create mode 100644 js/src/views/Signer/containers/Embedded/index.js create mode 100644 js/src/views/Signer/containers/RequestsPage/index.js create mode 100644 js/src/views/Signer/containers/RequestsPage/requestsPage.css create mode 100644 js/src/views/Signer/containers/RequestsPage/requestsPage.js create mode 100644 js/src/views/Signer/index.js create mode 100644 js/src/views/Signer/signer.js create mode 100644 js/src/views/Signer/store.js create mode 100644 js/src/views/Signer/utils/extension.js create mode 100644 js/src/views/Signer/utils/utils.js create mode 100644 js/src/views/Status/Debug/debug.css create mode 100644 js/src/views/Status/Debug/debug.js create mode 100644 js/src/views/Status/Debug/index.js create mode 100644 js/src/views/Status/Debug/store.js create mode 100644 js/src/views/Status/Health/health.js create mode 100644 js/src/views/Status/Health/index.js create mode 100644 js/src/views/Status/MiningSettings/decodeExtraData.js create mode 100644 js/src/views/Status/MiningSettings/decodeExtraData.spec.js create mode 100644 js/src/views/Status/MiningSettings/index.js create mode 100644 js/src/views/Status/MiningSettings/miningSettings.js create mode 100644 js/src/views/Status/MiningSettings/numberFromString.js create mode 100644 js/src/views/Status/MiningSettings/numberFromString.spec.js create mode 100644 js/src/views/Status/NodeStatus/index.js create mode 100644 js/src/views/Status/NodeStatus/nodeStatus.css create mode 100644 js/src/views/Status/NodeStatus/nodeStatus.js create mode 100644 js/src/views/Status/NodeStatus/store.js create mode 100644 js/src/views/Status/Peers/index.js create mode 100644 js/src/views/Status/Peers/peers.css create mode 100644 js/src/views/Status/Peers/peers.js create mode 100644 js/src/views/Status/index.js create mode 100644 js/src/views/Status/status.css create mode 100644 js/src/views/Status/status.js create mode 100644 js/src/views/SyncWarning/index.js create mode 100644 js/src/views/SyncWarning/syncWarning.css create mode 100644 js/src/views/SyncWarning/syncWarning.js create mode 100644 js/src/views/SyncWarning/syncWarning.spec.js create mode 100644 js/src/views/Vaults/index.js create mode 100644 js/src/views/Vaults/store.js create mode 100644 js/src/views/Vaults/store.spec.js create mode 100644 js/src/views/Vaults/vaults.css create mode 100644 js/src/views/Vaults/vaults.js create mode 100644 js/src/views/Vaults/vaults.spec.js create mode 100644 js/src/views/Vaults/vaults.test.js create mode 100644 js/src/views/Wallet/Confirmations/confirmations.js create mode 100644 js/src/views/Wallet/Confirmations/index.js create mode 100644 js/src/views/Wallet/Details/details.js create mode 100644 js/src/views/Wallet/Details/index.js create mode 100644 js/src/views/Wallet/Transactions/index.js create mode 100644 js/src/views/Wallet/Transactions/transactions.js create mode 100644 js/src/views/Wallet/index.js create mode 100644 js/src/views/Wallet/wallet.css create mode 100644 js/src/views/Wallet/wallet.js create mode 100644 js/src/views/Web/AddressBar/addressBar.js create mode 100644 js/src/views/Web/AddressBar/addressBar.spec.js create mode 100644 js/src/views/Web/AddressBar/index.js create mode 100644 js/src/views/Web/index.js create mode 100644 js/src/views/Web/store.js create mode 100644 js/src/views/Web/store.spec.js create mode 100644 js/src/views/Web/web.css create mode 100644 js/src/views/Web/web.js create mode 100644 js/src/views/Web/web.spec.js create mode 100644 js/src/views/WriteContract/index.js create mode 100644 js/src/views/WriteContract/writeContract.css create mode 100644 js/src/views/WriteContract/writeContract.js create mode 100644 js/src/views/WriteContract/writeContractStore.js create mode 100644 js/src/views/index.js create mode 100644 js/src/web3.js create mode 100644 js/src/webWorker.js create mode 100644 js/webpack/vendor.js create mode 100644 json/src/vm/log.rs create mode 100644 parity/boot.rs create mode 100644 parity/sync.rs create mode 100644 scripts/contractABI.js create mode 100755 scripts/deploy.sh create mode 100755 scripts/fmt.sh create mode 100644 secret_store/build.rs create mode 100644 secret_store/src/key_server_cluster/decryption_session.rs create mode 100644 secret_store/src/key_server_cluster/encryption_session.rs create mode 100644 secret_store/src/key_server_cluster/generation_session.rs create mode 100644 secret_store/src/key_server_cluster/signing_session.rs create mode 100644 secret_store/src/types/mod.rs.in create mode 100644 stratum/build.rs create mode 100644 sync/build.rs create mode 100644 updater/build.rs create mode 100644 updater/src/types/mod.rs.in create mode 100644 util/src/bytes.rs create mode 100644 util/src/cache.rs create mode 100644 util/src/common.rs create mode 100644 util/src/error.rs create mode 100644 util/src/hashdb.rs create mode 100644 util/src/journaldb/archivedb.rs create mode 100644 util/src/journaldb/earlymergedb.rs create mode 100644 util/src/journaldb/mod.rs create mode 100644 util/src/journaldb/overlayrecentdb.rs create mode 100644 util/src/journaldb/refcounteddb.rs create mode 100644 util/src/journaldb/traits.rs create mode 100644 util/src/kvdb.rs create mode 100644 util/src/memorydb.rs create mode 100644 util/src/migration/mod.rs create mode 100644 util/src/migration/tests.rs create mode 100644 util/src/nibbleslice.rs create mode 100644 util/src/nibblevec.rs create mode 100644 util/src/overlaydb.rs create mode 100644 util/src/snappy.rs create mode 100644 util/src/trie/fatdb.rs create mode 100644 util/src/trie/fatdbmut.rs create mode 100644 util/src/trie/lookup.rs create mode 100644 util/src/trie/mod.rs create mode 100644 util/src/trie/node.rs create mode 100644 util/src/trie/recorder.rs create mode 100644 util/src/trie/sectriedb.rs create mode 100644 util/src/trie/sectriedbmut.rs create mode 100644 util/src/trie/standardmap.rs create mode 100644 util/src/trie/triedb.rs create mode 100644 util/src/trie/triedbmut.rs diff --git a/dapps/src/handlers/async.rs b/dapps/src/handlers/async.rs new file mode 100644 index 000000000..d68c55cce --- /dev/null +++ b/dapps/src/handlers/async.rs @@ -0,0 +1,112 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Async Content Handler +//! Temporary solution until we switch to future-based server. +//! Wraps a future and converts it to hyper::server::Handler; + +use std::{mem, time}; +use std::sync::mpsc; +use futures::Future; +use hyper::{server, Decoder, Encoder, Next, Control}; +use hyper::net::HttpStream; + +use handlers::ContentHandler; +use parity_reactor::Remote; + +const TIMEOUT_SECS: u64 = 15; + +enum State { + Initial(F, M, Remote, Control), + Waiting(mpsc::Receiver>, M), + Done(ContentHandler), + Invalid, +} + +pub struct AsyncHandler { + state: State, +} + +impl AsyncHandler { + pub fn new(future: F, map: M, remote: Remote, control: Control) -> Self { + AsyncHandler { + state: State::Initial(future, map, remote, control), + } + } +} + +impl server::Handler for AsyncHandler, M> where + F: Future + Send + 'static, + M: FnOnce(Result, ()>) -> ContentHandler, + T: Send + 'static, + E: Send + 'static, +{ + fn on_request(&mut self, _request: server::Request) -> Next { + if let State::Initial(future, map, remote, control) = mem::replace(&mut self.state, State::Invalid) { + let (tx, rx) = mpsc::sync_channel(1); + let control2 = control.clone(); + let tx2 = tx.clone(); + remote.spawn_with_timeout(move || future.then(move |result| { + // Send a result (ignore errors if the connection was dropped) + let _ = tx.send(Ok(result)); + // Resume handler + let _ = control.ready(Next::read()); + + Ok(()) + }), time::Duration::from_secs(TIMEOUT_SECS), move || { + // Notify about error + let _ = tx2.send(Err(())); + // Resume handler + let _ = control2.ready(Next::read()); + }); + + self.state = State::Waiting(rx, map); + } + + Next::wait() + } + + fn on_request_readable(&mut self, _decoder: &mut Decoder) -> Next { + if let State::Waiting(rx, map) = mem::replace(&mut self.state, State::Invalid) { + match rx.try_recv() { + Ok(result) => { + self.state = State::Done(map(result)); + }, + Err(err) => { + warn!("Resuming handler in incorrect state: {:?}", err); + } + } + } + + Next::write() + } + + fn on_response(&mut self, res: &mut server::Response) -> Next { + if let State::Done(ref mut handler) = self.state { + handler.on_response(res) + } else { + Next::end() + } + } + + fn on_response_writable(&mut self, encoder: &mut Encoder) -> Next { + if let State::Done(ref mut handler) = self.state { + handler.on_response_writable(encoder) + } else { + Next::end() + } + } +} diff --git a/dapps/src/url.rs b/dapps/src/url.rs new file mode 100644 index 000000000..23dbfb4fc --- /dev/null +++ b/dapps/src/url.rs @@ -0,0 +1,150 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! HTTP/HTTPS URL type. Based on URL type from Iron library. + +use url_lib::{self}; +pub use url_lib::Host; + +/// HTTP/HTTPS URL type for Iron. +#[derive(PartialEq, Eq, Clone, Debug)] +pub struct Url { + /// Raw url of url + pub raw: url_lib::Url, + + /// The host field of the URL, probably a domain. + pub host: Host, + + /// The connection port. + pub port: u16, + + /// The URL path, the resource to be accessed. + /// + /// A *non-empty* vector encoding the parts of the URL path. + /// Empty entries of `""` correspond to trailing slashes. + pub path: Vec, + + /// The URL query. + pub query: Option, + + /// The URL username field, from the userinfo section of the URL. + /// + /// `None` if the `@` character was not part of the input OR + /// if a blank username was provided. + /// Otherwise, a non-empty string. + pub username: Option, + + /// The URL password field, from the userinfo section of the URL. + /// + /// `None` if the `@` character was not part of the input OR + /// if a blank password was provided. + /// Otherwise, a non-empty string. + pub password: Option, +} + +impl Url { + /// Create a URL from a string. + /// + /// The input must be a valid URL with a special scheme for this to succeed. + /// + /// HTTP and HTTPS are special schemes. + /// + /// See: http://url.spec.whatwg.org/#special-scheme + pub fn parse(input: &str) -> Result { + // Parse the string using rust-url, then convert. + match url_lib::Url::parse(input) { + Ok(raw_url) => Url::from_generic_url(raw_url), + Err(e) => Err(format!("{}", e)) + } + } + + /// Create a `Url` from a `rust-url` `Url`. + pub fn from_generic_url(raw_url: url_lib::Url) -> Result { + // Map empty usernames to None. + let username = match raw_url.username() { + "" => None, + username => Some(username.to_owned()) + }; + + // Map empty passwords to None. + let password = match raw_url.password() { + Some(password) if !password.is_empty() => Some(password.to_owned()), + _ => None, + }; + + let port = raw_url.port_or_known_default().ok_or_else(|| format!("Unknown port for scheme: `{}`", raw_url.scheme()))?; + let host = raw_url.host().ok_or_else(|| "Valid host, because only data:, mailto: protocols does not have host.".to_owned())?.to_owned(); + let path = raw_url.path_segments().ok_or_else(|| "Valid path segments. In HTTP we won't get cannot-be-a-base URLs".to_owned())? + .map(|part| part.to_owned()).collect(); + let query = raw_url.query().map(|x| x.to_owned()); + + Ok(Url { + port: port, + host: host, + path: path, + query: query, + raw: raw_url, + username: username, + password: password, + }) + } +} + +#[cfg(test)] +mod test { + use super::Url; + + #[test] + fn test_default_port() { + assert_eq!(Url::parse("http://example.com/wow").unwrap().port, 80u16); + assert_eq!(Url::parse("https://example.com/wow").unwrap().port, 443u16); + } + + #[test] + fn test_explicit_port() { + assert_eq!(Url::parse("http://localhost:3097").unwrap().port, 3097u16); + } + + #[test] + fn test_empty_username() { + assert!(Url::parse("http://@example.com").unwrap().username.is_none()); + assert!(Url::parse("http://:password@example.com").unwrap().username.is_none()); + } + + #[test] + fn test_not_empty_username() { + let user = Url::parse("http://john:pass@example.com").unwrap().username; + assert_eq!(user.unwrap(), "john"); + + let user = Url::parse("http://john:@example.com").unwrap().username; + assert_eq!(user.unwrap(), "john"); + } + + #[test] + fn test_empty_password() { + assert!(Url::parse("http://michael@example.com").unwrap().password.is_none()); + assert!(Url::parse("http://:@example.com").unwrap().password.is_none()); + } + + #[test] + fn test_not_empty_password() { + let pass = Url::parse("http://michael:pass@example.com").unwrap().password; + assert_eq!(pass.unwrap(), "pass"); + + let pass = Url::parse("http://:pass@example.com").unwrap().password; + assert_eq!(pass.unwrap(), "pass"); + } +} diff --git a/ethcore/build.rs b/ethcore/build.rs new file mode 100644 index 000000000..8fe38e757 --- /dev/null +++ b/ethcore/build.rs @@ -0,0 +1,23 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +extern crate ethcore_ipc_codegen; + +fn main() { + ethcore_ipc_codegen::derive_ipc_cond("src/client/traits.rs", cfg!(feature="ipc")).unwrap(); + ethcore_ipc_codegen::derive_ipc_cond("src/snapshot/snapshot_service_trait.rs", cfg!(feature="ipc")).unwrap(); + ethcore_ipc_codegen::derive_ipc_cond("src/client/chain_notify.rs", cfg!(feature="ipc")).unwrap(); +} diff --git a/ethcore/light/build.rs b/ethcore/light/build.rs new file mode 100644 index 000000000..b9c79f778 --- /dev/null +++ b/ethcore/light/build.rs @@ -0,0 +1,27 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +#[cfg(feature = "ipc")] +extern crate ethcore_ipc_codegen; + +#[cfg(feature = "ipc")] +fn main() { + ethcore_ipc_codegen::derive_binary("src/types/mod.rs.in").unwrap(); + ethcore_ipc_codegen::derive_ipc_cond("src/provider.rs", true).unwrap(); +} + +#[cfg(not(feature = "ipc"))] +fn main() { } \ No newline at end of file diff --git a/ethcore/light/src/types/mod.rs.in b/ethcore/light/src/types/mod.rs.in new file mode 100644 index 000000000..eba551b53 --- /dev/null +++ b/ethcore/light/src/types/mod.rs.in @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +pub mod request; diff --git a/ethcore/light/src/types/request/builder.rs b/ethcore/light/src/types/request/builder.rs new file mode 100644 index 000000000..74503f54f --- /dev/null +++ b/ethcore/light/src/types/request/builder.rs @@ -0,0 +1,258 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Request chain builder utility. +//! Push requests with `push`. Back-references and data required to verify responses must be +//! supplied as well. + +use std::collections::HashMap; +use std::ops::{Deref, DerefMut}; +use request::{ + IncompleteRequest, OutputKind, Output, NoSuchOutput, ResponseError, ResponseLike, +}; + +/// Build chained requests. Push them onto the series with `push`, +/// and produce a `Requests` object with `build`. Outputs are checked for consistency. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct RequestBuilder { + output_kinds: HashMap<(usize, usize), OutputKind>, + requests: Vec, +} + +impl Default for RequestBuilder { + fn default() -> Self { + RequestBuilder { + output_kinds: HashMap::new(), + requests: Vec::new(), + } + } +} + +impl RequestBuilder { + /// Attempt to push a request onto the request chain. Fails if the request + /// references a non-existent output of a prior request. + pub fn push(&mut self, request: T) -> Result<(), NoSuchOutput> { + request.check_outputs(|req, idx, kind| { + match self.output_kinds.get(&(req, idx)) { + Some(k) if k == &kind => Ok(()), + _ => Err(NoSuchOutput), + } + })?; + let req_idx = self.requests.len(); + request.note_outputs(|idx, kind| { self.output_kinds.insert((req_idx, idx), kind); }); + self.requests.push(request); + Ok(()) + } + + /// Get a reference to the output kinds map. + pub fn output_kinds(&self) -> &HashMap<(usize, usize), OutputKind> { + &self.output_kinds + } + + /// Convert this into a "requests" object. + pub fn build(self) -> Requests { + Requests { + outputs: HashMap::new(), + requests: self.requests, + answered: 0, + } + } +} + +/// Requests pending responses. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Requests { + outputs: HashMap<(usize, usize), Output>, + requests: Vec, + answered: usize, +} + +impl Requests { + /// Get access to the underlying slice of requests. + // TODO: unimplemented -> Vec, // do we _have to_ allocate? + pub fn requests(&self) -> &[T] { &self.requests } + + /// Get the number of answered requests. + pub fn num_answered(&self) -> usize { self.answered } + + /// Whether the batch is complete. + pub fn is_complete(&self) -> bool { + self.answered == self.requests.len() + } + + /// Map requests from one type into another. + pub fn map_requests(self, f: F) -> Requests + where F: FnMut(T) -> U, U: IncompleteRequest + { + Requests { + outputs: self.outputs, + requests: self.requests.into_iter().map(f).collect(), + answered: self.answered, + } + } +} + +impl Requests { + /// Get the next request as a filled request. Returns `None` when all requests answered. + pub fn next_complete(&self) -> Option { + if self.is_complete() { + None + } else { + Some(self.requests[self.answered].clone() + .complete() + .expect("All outputs checked as invariant of `Requests` object; qed")) + } + } + + /// Sweep through all unanswered requests, filling them as necessary. + pub fn fill_unanswered(&mut self) { + let outputs = &mut self.outputs; + + for req in self.requests.iter_mut().skip(self.answered) { + req.fill(|req_idx, out_idx| outputs.get(&(req_idx, out_idx)).cloned().ok_or(NoSuchOutput)) + } + } + + /// Supply a response, asserting its correctness. + /// Fill outputs based upon it. + pub fn supply_response_unchecked(&mut self, response: &R) { + if self.is_complete() { return } + + let outputs = &mut self.outputs; + let idx = self.answered; + response.fill_outputs(|out_idx, output| { + // we don't need to check output kinds here because all back-references + // are validated in the builder. + // TODO: optimization for only storing outputs we "care about"? + outputs.insert((idx, out_idx), output); + }); + + self.answered += 1; + + // fill as much of the next request as we can. + if let Some(ref mut req) = self.requests.get_mut(self.answered) { + req.fill(|req_idx, out_idx| outputs.get(&(req_idx, out_idx)).cloned().ok_or(NoSuchOutput)) + } + } +} + +impl Requests { + /// Supply a response for the next request. + /// Fails on: wrong request kind, all requests answered already. + pub fn supply_response(&mut self, env: &T::Environment, response: &T::Response) + -> Result> + { + let idx = self.answered; + + // check validity. + if idx == self.requests.len() { return Err(ResponseError::Unexpected) } + let completed = self.next_complete() + .expect("only fails when all requests have been answered; this just checked against; qed"); + + let extracted = self.requests[idx] + .check_response(&completed, env, response).map_err(ResponseError::Validity)?; + + self.supply_response_unchecked(response); + Ok(extracted) + } +} + +impl Requests { + /// For each request, produce a response. + /// The responses vector produced goes up to the point where the responder + /// first returns `None`, an invalid response, or until all requests have been responded to. + pub fn respond_to_all(mut self, responder: F) -> Vec + where F: Fn(super::CompleteRequest) -> Option + { + let mut responses = Vec::new(); + + while let Some(response) = self.next_complete().and_then(&responder) { + match self.supply_response(&(), &response) { + Ok(()) => responses.push(response), + Err(e) => { + debug!(target: "pip", "produced bad response to request: {:?}", e); + return responses; + } + } + } + + responses + } +} + +impl Deref for Requests { + type Target = [T]; + + fn deref(&self) -> &[T] { + &self.requests[..] + } +} + +impl DerefMut for Requests { + fn deref_mut(&mut self) -> &mut [T] { + &mut self.requests[..] + } +} + +#[cfg(test)] +mod tests { + use request::*; + use super::RequestBuilder; + use bigint::hash::H256; + + #[test] + fn all_scalar() { + let mut builder = RequestBuilder::default(); + builder.push(Request::HeaderProof(IncompleteHeaderProofRequest { + num: 100.into(), + })).unwrap(); + builder.push(Request::Receipts(IncompleteReceiptsRequest { + hash: H256::default().into(), + })).unwrap(); + } + + #[test] + #[should_panic] + fn missing_backref() { + let mut builder = RequestBuilder::default(); + builder.push(Request::HeaderProof(IncompleteHeaderProofRequest { + num: Field::BackReference(100, 3), + })).unwrap(); + } + + #[test] + #[should_panic] + fn wrong_kind() { + let mut builder = RequestBuilder::default(); + assert!(builder.push(Request::HeaderProof(IncompleteHeaderProofRequest { + num: 100.into(), + })).is_ok()); + builder.push(Request::HeaderProof(IncompleteHeaderProofRequest { + num: Field::BackReference(0, 0), + })).unwrap(); + } + + #[test] + fn good_backreference() { + let mut builder = RequestBuilder::default(); + builder.push(Request::HeaderProof(IncompleteHeaderProofRequest { + num: 100.into(), // header proof puts hash at output 0. + })).unwrap(); + builder.push(Request::Receipts(IncompleteReceiptsRequest { + hash: Field::BackReference(0, 0), + })).unwrap(); + } +} diff --git a/ethcore/res/ethereum/metropolis_test.json b/ethcore/res/ethereum/metropolis_test.json new file mode 100644 index 000000000..a452e5a80 --- /dev/null +++ b/ethcore/res/ethereum/metropolis_test.json @@ -0,0 +1,53 @@ +{ + "name": "Metropolis (Test)", + "engine": { + "Ethash": { + "params": { + "minimumDifficulty": "0x020000", + "difficultyBoundDivisor": "0x0800", + "durationLimit": "0x0d", + + "homesteadTransition": "0x0", + "eip150Transition": "0x0", + "eip160Transition": "0x0", + "eip161abcTransition": "0x0", + "eip161dTransition": "0x0", + "maxCodeSize": 24576 + } + } + }, + "params": { + "gasLimitBoundDivisor": "0x0400", + "blockReward": "0x4563918244F40000", + "registrar" : "0xc6d9d2cd449a754c494264e1809c50e34d64562b", + "accountStartNonce": "0x00", + "maximumExtraDataSize": "0x20", + "minGasLimit": "0x1388", + "networkID" : "0x1", + "eip98Transition": "0x0", + "eip86Transition": "0x0", + "eip140Transition": "0x0", + "eip210Transition": "0x0", + "eip155Transition": "0x0" + }, + "genesis": { + "seal": { + "ethereum": { + "nonce": "0x0000000000000042", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000" + } + }, + "difficulty": "0x400000000", + "author": "0x0000000000000000000000000000000000000000", + "timestamp": "0x00", + "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa", + "gasLimit": "0x1388" + }, + "accounts": { + "0000000000000000000000000000000000000001": { "balance": "1", "builtin": { "name": "ecrecover", "pricing": { "linear": { "base": 3000, "word": 0 } } } }, + "0000000000000000000000000000000000000002": { "balance": "1", "builtin": { "name": "sha256", "pricing": { "linear": { "base": 60, "word": 12 } } } }, + "0000000000000000000000000000000000000003": { "balance": "1", "builtin": { "name": "ripemd160", "pricing": { "linear": { "base": 600, "word": 120 } } } }, + "0000000000000000000000000000000000000004": { "balance": "1", "builtin": { "name": "identity", "pricing": { "linear": { "base": 15, "word": 3 } } } } + } +} diff --git a/ethcore/res/ethereum/tobalaba.json b/ethcore/res/ethereum/tobalaba.json new file mode 100644 index 000000000..f580a0a19 --- /dev/null +++ b/ethcore/res/ethereum/tobalaba.json @@ -0,0 +1,38 @@ +{ + "name": "Tobalaba", + "engine": { + "authorityRound": { + "params": { + "stepDuration": "3", + "validators": { + "safeContract": "0x1000000000000000000000000000000000000005" + } + } + } + }, + "params": { + "maximumExtraDataSize": "0x20", + "minGasLimit": "0x1388", + "networkID": "0x62121", + "gasLimitBoundDivisor": "0x400" + }, + "genesis": { + "seal": { + "authorityRound": { + "step": "0x0", + "signature": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + } + }, + "difficulty": "0x20000", + "gasLimit": "0x800000" + }, + "accounts": { + "0x1000000000000000000000000000000000000005": { + "balance": "1", + "constructor": "6060604052602060405190810160405280734ba15b56452521c0826a35a6f2022e1210fc519b73ffffffffffffffffffffffffffffffffffffffff16815250600190600161004e929190610100565b50602060405190810160405280734ba15b56452521c0826a35a6f2022e1210fc519b73ffffffffffffffffffffffffffffffffffffffff168152506002906001610099929190610100565b5034156100a557600080fd5b5b734ba15b56452521c0826a35a6f2022e1210fc519b6000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6101cd565b828054828255906000526020600020908101928215610179579160200282015b828111156101785782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190610120565b5b509050610186919061018a565b5090565b6101ca91905b808211156101c657600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550600101610190565b5090565b90565b610a07806101dc6000396000f30060606040523615610081576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806318def8ef1461009957806340a141ff146100e65780634d238c8e1461011f57806375286211146101585780638914d3041461016d5780638da5cb5b14610196578063b7ab4db5146101eb575b341561008c57600080fd5b6100975b600080fd5b565b005b34156100a457600080fd5b6100d0600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050610256565b6040518082815260200191505060405180910390f35b34156100f157600080fd5b61011d600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061026e565b005b341561012a57600080fd5b610156600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506105da565b005b341561016357600080fd5b61016b61079f565b005b341561017857600080fd5b6101806107ed565b6040518082815260200191505060405180910390f35b34156101a157600080fd5b6101a96107fb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101f657600080fd5b6101fe610820565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b838110156102425780820151818401525b602081019050610226565b505050509050019250505060405180910390f35b60036020528060005260406000206000915090505481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156102cb57600080fd5b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541415151561031a57600080fd5b6001806103256107ed565b0381548110151561033257fe5b906000526020600020900160005b9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050806002600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548154811015156103b057fe5b906000526020600020900160005b6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600260016002805490500381548110151561041157fe5b906000526020600020900160005b6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560016002805490500360028161045691906108b5565b50600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001430340600019167f55252fa6eee4741b4e24a74a70e9c11fd2c2281df8d6ea13126ff845f7825c896002604051808060200182810382528381815481526020019150805480156105c657602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831161057c575b50509250505060405180910390a25b5b5050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561063557600080fd5b6002805480600101828161064991906108e1565b916000526020600020900160005b83909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050600160028054905003600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001430340600019167f55252fa6eee4741b4e24a74a70e9c11fd2c2281df8d6ea13126ff845f7825c8960026040518080602001828103825283818154815260200191508054801561078c57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610742575b50509250505060405180910390a25b5b50565b73fffffffffffffffffffffffffffffffffffffffe3373ffffffffffffffffffffffffffffffffffffffff161415156107d757600080fd5b600260019080546107e992919061090d565b505b565b600060028054905090505b90565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61082861095f565b60018054806020026020016040519081016040528092919081815260200182805480156108aa57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610860575b505050505090505b90565b8154818355818115116108dc578183600052602060002091820191016108db9190610973565b5b505050565b815481835581811511610908578183600052602060002091820191016109079190610973565b5b505050565b82805482825590600052602060002090810192821561094e5760005260206000209182015b8281111561094d578254825591600101919060010190610932565b5b50905061095b9190610998565b5090565b602060405190810160405280600081525090565b61099591905b80821115610991576000816000905550600101610979565b5090565b90565b6109d891905b808211156109d457600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010161099e565b5090565b905600a165627a7a72305820f010290c3ae950b0bd158019fc7b606faa22bd57d199727172b91971312cfca20029" + }, + "0x4ba15b56452521c0826a35a6f2022e1210fc519b": { + "balance": "0x7E37BE2022B2B09472D89C0000" + } + } +} \ No newline at end of file diff --git a/ethcore/src/json_tests/homestead_chain.rs b/ethcore/src/json_tests/homestead_chain.rs new file mode 100644 index 000000000..5f0fe5769 --- /dev/null +++ b/ethcore/src/json_tests/homestead_chain.rs @@ -0,0 +1,39 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use super::chain::json_chain_test; +use tests::helpers::*; + +fn do_json_test(json_data: &[u8]) -> Vec { + json_chain_test(json_data, ChainEra::Homestead) +} + +declare_test!{BlockchainTests_Homestead_bcBlockGasLimitTest, "BlockchainTests/Homestead/bcBlockGasLimitTest"} +declare_test!{BlockchainTests_Homestead_bcForkStressTest, "BlockchainTests/Homestead/bcForkStressTest"} +declare_test!{BlockchainTests_Homestead_bcGasPricerTest, "BlockchainTests/Homestead/bcGasPricerTest"} +declare_test!{BlockchainTests_Homestead_bcInvalidHeaderTest, "BlockchainTests/Homestead/bcInvalidHeaderTest"} +declare_test!{BlockchainTests_Homestead_bcInvalidRLPTest, "BlockchainTests/Homestead/bcInvalidRLPTest"} +declare_test!{BlockchainTests_Homestead_bcMultiChainTest, "BlockchainTests/Homestead/bcMultiChainTest"} +declare_test!{BlockchainTests_Homestead_bcRPC_API_Test, "BlockchainTests/Homestead/bcRPC_API_Test"} +declare_test!{BlockchainTests_Homestead_bcStateTest, "BlockchainTests/Homestead/bcStateTest"} +declare_test!{BlockchainTests_Homestead_bcTotalDifficultyTest, "BlockchainTests/Homestead/bcTotalDifficultyTest"} +declare_test!{BlockchainTests_Homestead_bcUncleHeaderValiditiy, "BlockchainTests/Homestead/bcUncleHeaderValiditiy"} +declare_test!{BlockchainTests_Homestead_bcUncleTest, "BlockchainTests/Homestead/bcUncleTest"} +declare_test!{BlockchainTests_Homestead_bcValidBlockTest, "BlockchainTests/Homestead/bcValidBlockTest"} +declare_test!{BlockchainTests_Homestead_bcWalletTest, "BlockchainTests/Homestead/bcWalletTest"} +declare_test!{BlockchainTests_Homestead_bcShanghaiLove, "BlockchainTests/Homestead/bcShanghaiLove"} +declare_test!{BlockchainTests_Homestead_bcSuicideIssue, "BlockchainTests/Homestead/bcSuicideIssue"} +declare_test!{BlockchainTests_Homestead_bcExploitTest, "BlockchainTests/Homestead/bcExploitTest"} diff --git a/ethcore/src/snapshot/snapshot_service_trait.rs b/ethcore/src/snapshot/snapshot_service_trait.rs new file mode 100644 index 000000000..9ef7706b4 --- /dev/null +++ b/ethcore/src/snapshot/snapshot_service_trait.rs @@ -0,0 +1,58 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use super::{ManifestData, RestorationStatus}; +use bigint::hash::H256; +use util::Bytes; +use ipc::IpcConfig; + +/// The interface for a snapshot network service. +/// This handles: +/// - restoration of snapshots to temporary databases. +/// - responding to queries for snapshot manifests and chunks +#[ipc(client_ident="RemoteSnapshotService")] +pub trait SnapshotService : Sync + Send { + /// Query the most recent manifest data. + fn manifest(&self) -> Option; + + /// Get the supported range of snapshot version numbers. + /// `None` indicates warp sync isn't supported by the consensus engine. + fn supported_versions(&self) -> Option<(u64, u64)>; + + /// Get raw chunk for a given hash. + fn chunk(&self, hash: H256) -> Option; + + /// Ask the snapshot service for the restoration status. + fn status(&self) -> RestorationStatus; + + /// Begin snapshot restoration. + /// If restoration in-progress, this will reset it. + /// From this point on, any previous snapshot may become unavailable. + fn begin_restore(&self, manifest: ManifestData); + + /// Abort an in-progress restoration if there is one. + fn abort_restore(&self); + + /// Feed a raw state chunk to the service to be processed asynchronously. + /// no-op if not currently restoring. + fn restore_state_chunk(&self, hash: H256, chunk: Bytes); + + /// Feed a raw block chunk to the service to be processed asynchronously. + /// no-op if currently restoring. + fn restore_block_chunk(&self, hash: H256, chunk: Bytes); +} + +impl IpcConfig for SnapshotService { } diff --git a/ethcore/src/tests/rpc.rs b/ethcore/src/tests/rpc.rs new file mode 100644 index 000000000..6444daa56 --- /dev/null +++ b/ethcore/src/tests/rpc.rs @@ -0,0 +1,78 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Client RPC tests + +use nanoipc; +use std::sync::Arc; +use std::sync::atomic::{Ordering, AtomicBool}; +use client::{Client, BlockChainClient, ClientConfig, BlockId}; +use client::remote::RemoteClient; +use tests::helpers::*; +use devtools::*; +use miner::Miner; +use crossbeam; +use io::IoChannel; +use util::kvdb::DatabaseConfig; + +pub fn run_test_worker(scope: &crossbeam::Scope, stop: Arc, socket_path: &str) { + let socket_path = socket_path.to_owned(); + scope.spawn(move || { + let temp = RandomTempPath::create_dir(); + let spec = get_test_spec(); + let db_config = DatabaseConfig::with_columns(::db::NUM_COLUMNS); + + let client = Client::new( + ClientConfig::default(), + &spec, + temp.as_path(), + Arc::new(Miner::with_spec(&spec)), + IoChannel::disconnected(), + &db_config + ).unwrap(); + let mut worker = nanoipc::Worker::new(&(client as Arc)); + worker.add_reqrep(&socket_path).unwrap(); + while !stop.load(Ordering::Relaxed) { + worker.poll(); + } + }); +} + +#[test] +fn can_handshake() { + crossbeam::scope(|scope| { + let stop_guard = StopGuard::new(); + let socket_path = "ipc:///tmp/parity-client-rpc-10.ipc"; + run_test_worker(scope, stop_guard.share(), socket_path); + let remote_client = nanoipc::generic_client::>(socket_path).unwrap(); + + assert!(remote_client.handshake().is_ok()); + }) +} + +#[test] +fn can_query_block() { + crossbeam::scope(|scope| { + let stop_guard = StopGuard::new(); + let socket_path = "ipc:///tmp/parity-client-rpc-20.ipc"; + run_test_worker(scope, stop_guard.share(), socket_path); + let remote_client = nanoipc::generic_client::>(socket_path).unwrap(); + + let non_existant_block = remote_client.block_header(BlockId::Number(999)); + + assert!(non_existant_block.is_none()); + }) +} diff --git a/ethcore/wasm/src/call_args.rs b/ethcore/wasm/src/call_args.rs new file mode 100644 index 000000000..7fb50bff3 --- /dev/null +++ b/ethcore/wasm/src/call_args.rs @@ -0,0 +1,63 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Wasm evm call arguments helper + +use bigint::prelude::U256; +use bigint::hash::H160; + +/// Input part of the wasm call descriptor +pub struct CallArgs { + /// Receiver of the transaction + pub address: [u8; 20], + + /// Sender of the transaction + pub sender: [u8; 20], + + /// Original transaction initiator + pub origin: [u8; 20], + + /// Transfer value + pub value: [u8; 32], + + /// call/create params + pub data: Vec, +} + +impl CallArgs { + /// New contract call payload with known parameters + pub fn new(address: H160, sender: H160, origin: H160, value: U256, data: Vec) -> Self { + let mut descriptor = CallArgs { + address: [0u8; 20], + sender: [0u8; 20], + origin: [0u8; 20], + value: [0u8; 32], + data: data, + }; + + descriptor.address.copy_from_slice(&*address); + descriptor.sender.copy_from_slice(&*sender); + descriptor.origin.copy_from_slice(&*origin); + value.to_big_endian(&mut descriptor.value); + + descriptor + } + + /// Total call payload length in linear memory + pub fn len(&self) -> u32 { + self.data.len() as u32 + 92 + } +} diff --git a/ipc-common-types/Cargo.toml b/ipc-common-types/Cargo.toml new file mode 100644 index 000000000..a9efe1439 --- /dev/null +++ b/ipc-common-types/Cargo.toml @@ -0,0 +1,16 @@ +[package] +description = "Types that implement IPC and are common to multiple modules." +name = "ipc-common-types" +version = "1.8.0" +license = "GPL-3.0" +authors = ["Parity Technologies "] +build = "build.rs" + +[build-dependencies] +ethcore-ipc-codegen = { path = "../ipc/codegen" } + +[dependencies] +semver = "0.6" +ethcore-ipc = { path = "../ipc/rpc" } +ethcore-util = { path = "../util" } +ethcore-bigint = { path = "../util/bigint" } diff --git a/ipc-common-types/build.rs b/ipc-common-types/build.rs new file mode 100644 index 000000000..3a51d6a21 --- /dev/null +++ b/ipc-common-types/build.rs @@ -0,0 +1,21 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +extern crate ethcore_ipc_codegen; + +fn main() { + ethcore_ipc_codegen::derive_binary("src/types/mod.rs.in").unwrap(); +} diff --git a/ipc-common-types/src/lib.rs b/ipc-common-types/src/lib.rs new file mode 100644 index 000000000..c1d18a8d7 --- /dev/null +++ b/ipc-common-types/src/lib.rs @@ -0,0 +1,26 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Updater for Parity executables + +extern crate semver; +extern crate ethcore_util as util; +extern crate ethcore_bigint as bigint; +extern crate ethcore_ipc as ipc; + +mod types; + +pub use types::*; diff --git a/ipc-common-types/src/types/mod.rs b/ipc-common-types/src/types/mod.rs new file mode 100644 index 000000000..68dfe0b25 --- /dev/null +++ b/ipc-common-types/src/types/mod.rs @@ -0,0 +1,21 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Types used in the public api + +#![allow(dead_code, unused_assignments, unused_variables)] // codegen issues +include!(concat!(env!("OUT_DIR"), "/mod.rs.in")); + diff --git a/ipc-common-types/src/types/mod.rs.in b/ipc-common-types/src/types/mod.rs.in new file mode 100644 index 000000000..f137d1d60 --- /dev/null +++ b/ipc-common-types/src/types/mod.rs.in @@ -0,0 +1,21 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +pub mod release_track; +pub mod version_info; + +pub use release_track::{ReleaseTrack}; +pub use version_info::{VersionInfo}; \ No newline at end of file diff --git a/ipc-common-types/src/types/release_track.rs b/ipc-common-types/src/types/release_track.rs new file mode 100644 index 000000000..418f590c8 --- /dev/null +++ b/ipc-common-types/src/types/release_track.rs @@ -0,0 +1,83 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Types used in the public API + +use std::fmt; + +/// A release's track. +#[derive(PartialEq, Eq, Clone, Copy, Debug)] +#[binary] +pub enum ReleaseTrack { + /// Stable track. + Stable, + /// Beta track. + Beta, + /// Nightly track. + Nightly, + /// Testing track. + Testing, + /// No known track, also "current executable's track" when it's not yet known. + Unknown, +} + +impl fmt::Display for ReleaseTrack { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + write!(f, "{}", match *self { + ReleaseTrack::Stable => "stable", + ReleaseTrack::Beta => "beta", + ReleaseTrack::Nightly => "nightly", + ReleaseTrack::Testing => "testing", + ReleaseTrack::Unknown => "unknown", + }) + } +} + +impl<'a> From<&'a str> for ReleaseTrack { + fn from(s: &'a str) -> Self { + match s { + "stable" => ReleaseTrack::Stable, + "beta" => ReleaseTrack::Beta, + "nightly" => ReleaseTrack::Nightly, + "testing" => ReleaseTrack::Testing, + _ => ReleaseTrack::Unknown, + } + } +} + +impl From for ReleaseTrack { + fn from(i: u8) -> Self { + match i { + 1 => ReleaseTrack::Stable, + 2 => ReleaseTrack::Beta, + 3 => ReleaseTrack::Nightly, + 4 => ReleaseTrack::Testing, + _ => ReleaseTrack::Unknown, + } + } +} + +impl Into for ReleaseTrack { + fn into(self) -> u8 { + match self { + ReleaseTrack::Stable => 1, + ReleaseTrack::Beta => 2, + ReleaseTrack::Nightly => 3, + ReleaseTrack::Testing => 4, + ReleaseTrack::Unknown => 0, + } + } +} diff --git a/ipc-common-types/src/types/version_info.rs b/ipc-common-types/src/types/version_info.rs new file mode 100644 index 000000000..ef386824d --- /dev/null +++ b/ipc-common-types/src/types/version_info.rs @@ -0,0 +1,70 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Types used in the public API + +use std::fmt; +use std::str::FromStr; +use semver::{Version}; +use bigint::hash::H160; +use util::misc::raw_package_info; +use release_track::ReleaseTrack; + +/// Version information of a particular release. +#[derive(Debug, Clone, PartialEq)] +#[binary] +pub struct VersionInfo { + /// The track on which it was released. + pub track: ReleaseTrack, + /// The version. + pub version: Version, + /// The (SHA1?) 160-bit hash of this build's code base. + pub hash: H160, +} + +impl fmt::Display for VersionInfo { + fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { + write!(f, "{}.{}.{}-{}-{}", self.version.major, self.version.minor, self.version.patch, self.track, self.hash) + } +} + +impl VersionInfo { + /// Get information for this (currently running) binary. + pub fn this() -> Self { + let raw = raw_package_info(); + VersionInfo { + track: raw.0.into(), + version: { let mut v = Version::parse(raw.1).expect("Environment variables are known to be valid; qed"); v.build = vec![]; v.pre = vec![]; v }, + hash: H160::from_str(raw.2).unwrap_or_else(|_| H160::zero()), + } + } + + /// Compose the information from the provided raw fields. + pub fn from_raw(semver: u32, track: u8, hash: H160) -> Self { + let t = track.into(); + VersionInfo { + version: Version { + major: (semver >> 16) as u64, + minor: ((semver >> 8) & 0xff) as u64, + patch: (semver & 0xff) as u64, + build: vec![], + pre: vec![], + }, + track: t, + hash: hash, + } + } +} diff --git a/ipc/codegen/Cargo.toml b/ipc/codegen/Cargo.toml new file mode 100644 index 000000000..69580e08d --- /dev/null +++ b/ipc/codegen/Cargo.toml @@ -0,0 +1,26 @@ +[package] +name = "ethcore-ipc-codegen" +version = "1.8.0" +authors = ["Parity Technologies "] +license = "GPL-3.0" +description = "Macros to auto-generate implementations for ipc call" +build = "build.rs" +keywords = ["ipc", "codegen"] + +[features] +default = ["with-syntex"] +nightly = ["quasi_macros"] +nightly-testing = ["clippy"] +with-syntex = ["quasi/with-syntex", "quasi_codegen", "quasi_codegen/with-syntex", "syntex", "syntex_syntax"] + +[build-dependencies] +quasi_codegen = { version = "0.32", optional = true } +syntex = { version = "0.58", optional = true } + +[dependencies] +aster = { version = "0.41", default-features = false } +clippy = { version = "^0.*", optional = true } +quasi = { version = "0.32", default-features = false } +quasi_macros = { version = "0.32", optional = true } +syntex = { version = "0.58", optional = true } +syntex_syntax = { version = "0.58", optional = true } diff --git a/ipc/codegen/build.rs b/ipc/codegen/build.rs new file mode 100644 index 000000000..442abf7df --- /dev/null +++ b/ipc/codegen/build.rs @@ -0,0 +1,43 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + + +#[cfg(feature = "with-syntex")] +mod inner { + extern crate syntex; + extern crate quasi_codegen; + + use std::env; + use std::path::Path; + + pub fn main() { + let out_dir = env::var_os("OUT_DIR").unwrap(); + + let src = Path::new("src/lib.rs.in"); + let dst = Path::new(&out_dir).join("lib.rs"); + + quasi_codegen::expand(&src, &dst).unwrap(); + } +} + +#[cfg(not(feature = "with-syntex"))] +mod inner { + pub fn main() {} +} + +fn main() { + inner::main(); +} diff --git a/ipc/codegen/src/codegen.rs b/ipc/codegen/src/codegen.rs new file mode 100644 index 000000000..2f4752d97 --- /dev/null +++ b/ipc/codegen/src/codegen.rs @@ -0,0 +1,898 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +use aster; + +use syntax::ast::{ + MetaItem, + Item, + ImplItemKind, + MethodSig, + Arg, + PatKind, + FunctionRetTy, + Ty, + TraitRef, + Ident, + Generics, + TraitItemKind, +}; + +use syntax::ast; +use syntax::codemap::Span; +use syntax::ext::base::{Annotatable, ExtCtxt}; +use syntax::ptr::P; + +pub struct Error; + +const RESERVED_MESSAGE_IDS: u16 = 16; + +pub fn expand_ipc_implementation( + cx: &mut ExtCtxt, + span: Span, + meta_item: &MetaItem, + annotatable: &Annotatable, + push: &mut FnMut(Annotatable) +) { + let item = match *annotatable { + Annotatable::Item(ref item) => item, + _ => { + cx.span_err(meta_item.span, "`#[ipc]` may only be applied to implementations and traits"); + return; + }, + }; + + let builder = aster::AstBuilder::new().span(span); + + let interface_map = match implement_interface(cx, &builder, &item, push, meta_item) { + Ok(interface_map) => interface_map, + Err(Error) => { return; }, + }; + + push_client(cx, &builder, &interface_map, push); + + push(Annotatable::Item(interface_map.item)); +} + +macro_rules! literal { + ($builder:ident, $($arg:tt)*) => { + $builder.expr().lit().str::<&str>(&format!($($arg)*)) + } +} + +fn field_name(builder: &aster::AstBuilder, arg: &Arg) -> ast::Ident { + match arg.pat.node { + PatKind::Ident(_, ref ident, _) => builder.id(ident.node), + _ => { panic!("unexpected param in interface: {:?}", arg.pat.node) } + } +} + +pub fn replace_slice_u8(builder: &aster::AstBuilder, ty: &P) -> P { + if ::syntax::print::pprust::ty_to_string(&strip_ptr(ty)) == "[u8]" { + return builder.ty().id("Vec") + } + ty.clone() +} + +struct NamedSignature<'a> { + sig: &'a MethodSig, + ident: &'a Ident, +} + +fn push_invoke_signature_aster( + builder: &aster::AstBuilder, + named_signature: &NamedSignature, + push: &mut FnMut(Annotatable), +) -> Dispatch { + let inputs = &named_signature.sig.decl.inputs; + let (input_type_name, input_arg_names, input_arg_tys) = if inputs.len() > 0 { + let first_field_name = field_name(builder, &inputs[0]).name.as_str(); + if &*first_field_name == "self" && inputs.len() == 1 { (None, vec![], vec![]) } + else { + let skip = if &*first_field_name == "self" { 2 } else { 1 }; + let name_str = format!("{}_input", named_signature.ident.name.as_str()); + + let mut arg_names = Vec::new(); + let mut arg_tys = Vec::new(); + + let arg_name = format!("{}", field_name(builder, &inputs[skip-1]).name); + let arg_ty = &inputs[skip-1].ty; + + let mut tree = builder.item() + .attr().word("binary") + .attr().word("allow(non_camel_case_types)") + .struct_(name_str.as_str()) + .field(arg_name.as_str()) + .ty().build(replace_slice_u8(builder, &strip_ptr(arg_ty))); + + arg_names.push(arg_name); + arg_tys.push(arg_ty.clone()); + for arg in inputs.iter().skip(skip) { + let arg_name = format!("{}", field_name(builder, &arg)); + let arg_ty = &arg.ty; + + tree = tree.field(arg_name.as_str()).ty().build(replace_slice_u8(builder, &strip_ptr(arg_ty))); + arg_names.push(arg_name); + arg_tys.push(arg_ty.clone()); + } + + push(Annotatable::Item(tree.build())); + (Some(name_str.to_owned()), arg_names, arg_tys) + } + } + else { + (None, vec![], vec![]) + }; + + let return_type_ty = match named_signature.sig.decl.output { + FunctionRetTy::Ty(ref ty) => { + let name_str = format!("{}_output", named_signature.ident.name.as_str()); + let tree = builder.item() + .attr().word("binary") + .attr().word("allow(non_camel_case_types)") + .struct_(name_str.as_str()) + .field(format!("payload")).ty().build(ty.clone()); + push(Annotatable::Item(tree.build())); + Some(ty.clone()) + } + _ => None + }; + + Dispatch { + function_name: format!("{}", named_signature.ident.name.as_str()), + input_type_name: input_type_name, + input_arg_names: input_arg_names, + input_arg_tys: input_arg_tys, + return_type_ty: return_type_ty, + } +} + +struct Dispatch { + function_name: String, + input_type_name: Option, + input_arg_names: Vec, + input_arg_tys: Vec>, + return_type_ty: Option>, +} + +// This is the expanded version of this: +// +// let invoke_serialize_stmt = quote_stmt!(cx, { +// ::bincode::serde::serialize(& $output_type_id { payload: self. $function_name ($hand_param_a, $hand_param_b) }, ::bincode::SizeLimit::Infinite).unwrap() +// }); +// +// But the above does not allow comma-separated expressions for arbitrary number +// of parameters ...$hand_param_a, $hand_param_b, ... $hand_param_n +fn implement_dispatch_arm_invoke_stmt( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + dispatch: &Dispatch, +) -> ast::Stmt +{ + use ::syntax::tokenstream::TokenTree::Token; + let function_name = builder.id(dispatch.function_name.as_str()); + + let input_args_exprs = dispatch.input_arg_names.iter().enumerate().map(|(arg_index, arg_name)| { + let arg_ident = builder.id(arg_name); + let expr = quote_expr!(cx, input. $arg_ident); + if has_ptr(&dispatch.input_arg_tys[arg_index]) { quote_expr!(cx, & $expr) } + else { expr } + }).collect::>>(); + + let ext_cx = &*cx; + ::quasi::parse_stmt_panic(&mut ::syntax::parse::new_parser_from_tts( + ext_cx.parse_sess(), + { + let _sp = ext_cx.call_site(); + let mut tt = ::std::vec::Vec::new(); + + tt.push(Token(_sp, ::syntax::parse::token::OpenDelim(::syntax::parse::token::Brace))); + + if dispatch.return_type_ty.is_some() { + tt.push(Token(_sp, ::syntax::parse::token::ModSep)); + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("ipc")))); + tt.push(Token(_sp, ::syntax::parse::token::ModSep)); + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("binary")))); + tt.push(Token(_sp, ::syntax::parse::token::ModSep)); + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("serialize")))); + tt.push(Token(_sp, ::syntax::parse::token::OpenDelim(::syntax::parse::token::Paren))); + tt.push(Token(_sp, ::syntax::parse::token::BinOp(::syntax::parse::token::And))); + } + + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("self")))); + tt.push(Token(_sp, ::syntax::parse::token::Dot)); + tt.extend(::quasi::ToTokens::to_tokens(&function_name, ext_cx).into_iter()); + tt.push(Token(_sp, ::syntax::parse::token::OpenDelim(::syntax::parse::token::Paren))); + + for arg_expr in input_args_exprs { + tt.extend(::quasi::ToTokens::to_tokens(&arg_expr, ext_cx).into_iter()); + tt.push(Token(_sp, ::syntax::parse::token::Comma)); + } + + tt.push(Token(_sp, ::syntax::parse::token::CloseDelim(::syntax::parse::token::Paren))); + + if dispatch.return_type_ty.is_some() { + tt.push(Token(_sp, ::syntax::parse::token::CloseDelim(::syntax::parse::token::Paren))); + tt.push(Token(_sp, ::syntax::parse::token::Dot)); + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("unwrap")))); + tt.push(Token(_sp, ::syntax::parse::token::OpenDelim(::syntax::parse::token::Paren))); + tt.push(Token(_sp, ::syntax::parse::token::CloseDelim(::syntax::parse::token::Paren))); + } + else { + tt.push(Token(_sp, ::syntax::parse::token::Semi)); + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("Vec")))); + tt.push(Token(_sp, ::syntax::parse::token::ModSep)); + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("new")))); + tt.push(Token(_sp, ::syntax::parse::token::OpenDelim(::syntax::parse::token::Paren))); + tt.push(Token(_sp, ::syntax::parse::token::CloseDelim(::syntax::parse::token::Paren))); + + } + tt.push(Token(_sp, ::syntax::parse::token::CloseDelim(::syntax::parse::token::Brace))); + + tt + } + )).unwrap() +} + +fn implement_dispatch_arm_invoke( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + dispatch: &Dispatch, + buffer: bool, +) -> P +{ + let deserialize_expr = if buffer { + quote_expr!(cx, + ::ipc::binary::deserialize(buf) + .unwrap_or_else(|e| { panic!("ipc error while deserializing payload, aborting \n payload: {:?}, \n error: {:?}", buf, e); } ) + ) + } else { + quote_expr!(cx, + ::ipc::binary::deserialize_from(r) + .unwrap_or_else(|e| { panic!("ipc error while deserializing payload, aborting \n error: {:?}", e); } ) + ) + }; + + let invoke_serialize_stmt = implement_dispatch_arm_invoke_stmt(cx, builder, dispatch); + dispatch.input_type_name.as_ref().map(|val| { + let input_type_id = builder.id(val.clone().as_str()); + quote_expr!(cx, { + let input: $input_type_id = $deserialize_expr; + $invoke_serialize_stmt + }) + }).unwrap_or(quote_expr!(cx, { $invoke_serialize_stmt })) +} + +/// generates dispatch match for method id +fn implement_dispatch_arm( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + index: u32, + dispatch: &Dispatch, + buffer: bool, +) -> ast::Arm +{ + let index_ident = builder.id(format!("{}", index + (RESERVED_MESSAGE_IDS as u32)).as_str()); + let invoke_expr = implement_dispatch_arm_invoke(cx, builder, dispatch, buffer); + let trace = literal!(builder, "Dispatching: {}", &dispatch.function_name); + quote_arm!(cx, $index_ident => { + trace!(target: "ipc", $trace); + $invoke_expr + }) +} + +fn implement_dispatch_arms( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + dispatches: &[Dispatch], + buffer: bool, +) -> Vec +{ + let mut index = -1; + dispatches.iter() + .map(|dispatch| { index = index + 1; implement_dispatch_arm(cx, builder, index as u32, dispatch, buffer) }).collect() +} + +pub fn strip_ptr(ty: &P) -> P { + if let ast::TyKind::Rptr(_, ref ptr_mut) = ty.node { + ptr_mut.ty.clone() + } + else { ty.clone() } +} + +pub fn has_ptr(ty: &P) -> bool { + if let ast::TyKind::Rptr(_, ref _ptr_mut) = ty.node { + true + } + else { false } +} + +/// returns an expression with the body for single operation that is being sent to server +/// operation itself serializes input, writes to socket and waits for socket to respond +/// (the latter only if original method signature returns anyting) +/// +/// assuming expanded class contains method +/// fn commit(&self, f: u32) -> u32 +/// +/// the expanded implementation will generate method for the client like that +/// #[binary] +/// struct Request<'a> { +/// f: &'a u32, +/// } +/// let payload = Request{f: &f,}; +/// let mut socket_ref = self.socket.borrow_mut(); +/// let mut socket = socket_ref.deref_mut(); +/// let serialized_payload = ::bincode::serde::serialize(&payload, ::bincode::SizeLimit::Infinite).unwrap(); +/// ::ipc::invoke(0, &Some(serialized_payload), &mut socket); +/// while !socket.ready().load(::std::sync::atomic::Ordering::Relaxed) { } +/// ::bincode::serde::deserialize_from::<_, u32>(&mut socket, ::bincode::SizeLimit::Infinite).unwrap() +fn implement_client_method_body( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + index: u16, + interface_map: &InterfaceMap, +) -> P +{ + use ::syntax::tokenstream::TokenTree::Token; + + let dispatch = &interface_map.dispatches[index as usize]; + let index_ident = builder.id(format!("{}", index + RESERVED_MESSAGE_IDS).as_str()); + + let request = if dispatch.input_arg_names.len() > 0 { + + let arg_name = dispatch.input_arg_names[0].as_str(); + let static_ty = strip_ptr(&dispatch.input_arg_tys[0]); + let arg_ty = builder + .ty().ref_() + .lifetime("'a") + .ty() + .build(static_ty.clone()); + + let mut tree = builder.item() + .attr().word("binary") + .struct_("Request") + .generics() + .lifetime_name("'a") + .build() + .field(arg_name).ty() + .build(arg_ty); + + for arg_idx in 1..dispatch.input_arg_names.len() { + let arg_name = dispatch.input_arg_names[arg_idx].as_str(); + let static_ty = strip_ptr(&dispatch.input_arg_tys[arg_idx]); + + let arg_ty = builder + .ty().ref_() + .lifetime("'a") + .ty() + .build(static_ty); + tree = tree.field(arg_name).ty().build(arg_ty); + + } + let mut request_serialization_statements = Vec::new(); + + let struct_tree = tree.build(); + let struct_stmt = quote_stmt!(cx, $struct_tree); + request_serialization_statements.push(struct_stmt); + + // actually this is just expanded version of this: + // request_serialization_statements.push(quote_stmt!(cx, let payload = Request { p1: &p1, p2: &p2, ... pn: &pn, })); + // again, cannot dynamically create expression with arbitrary number of comma-separated members + request_serialization_statements.push({ + let ext_cx = &*cx; + ::quasi::parse_stmt_panic(&mut ::syntax::parse::new_parser_from_tts( + ext_cx.parse_sess(), + { + let _sp = ext_cx.call_site(); + let mut tt = ::std::vec::Vec::new(); + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("let")))); + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("payload")))); + tt.push(Token(_sp, ::syntax::parse::token::Eq)); + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("Request")))); + tt.push(Token(_sp, ::syntax::parse::token::OpenDelim(::syntax::parse::token::Brace))); + + for arg in dispatch.input_arg_names.iter() { + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of(arg.as_str())))); + tt.push(Token(_sp, ::syntax::parse::token::Colon)); + tt.push(Token(_sp, ::syntax::parse::token::BinOp(::syntax::parse::token::And))); + + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of(arg.as_str())))); + tt.push(Token(_sp, ::syntax::parse::token::Comma)); + } + + tt.push(Token(_sp, ::syntax::parse::token::CloseDelim(::syntax::parse::token::Brace))); + tt + })) + }); + + request_serialization_statements.push( + quote_stmt!(cx, let mut socket = self.socket.write().unwrap(); )); + + request_serialization_statements.push( + quote_stmt!(cx, let serialized_payload = ::ipc::binary::serialize(&payload).unwrap())); + + request_serialization_statements.push( + quote_stmt!(cx, ::ipc::invoke($index_ident, &Some(serialized_payload), &mut *socket))); + + + request_serialization_statements + } + else { + let mut request_serialization_statements = Vec::new(); + request_serialization_statements.push( + quote_stmt!(cx, let mut socket = self.socket.write().unwrap(); )); + request_serialization_statements.push( + quote_stmt!(cx, ::ipc::invoke($index_ident, &None, &mut *socket))); + request_serialization_statements + }; + + let trace = literal!(builder, "Invoking: {}", &dispatch.function_name); + if let Some(ref return_ty) = dispatch.return_type_ty { + let return_expr = quote_expr!(cx, + ::ipc::binary::deserialize_from::<$return_ty, _>(&mut *socket).unwrap() + ); + quote_expr!(cx, { + trace!(target: "ipc", $trace); + $request; + $return_expr + }) + } + else { + quote_expr!(cx, { + trace!(target: "ipc", $trace); + $request + }) + } +} + +/// Generates signature and body (see `implement_client_method_body`) +/// for the client (signature is identical to the original method) +fn implement_client_method( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + index: u16, + interface_map: &InterfaceMap, +) + -> ast::ImplItem +{ + use ::syntax::tokenstream::TokenTree::Token; + + let dispatch = &interface_map.dispatches[index as usize]; + let method_name = builder.id(dispatch.function_name.as_str()); + let body = implement_client_method_body(cx, builder, index, interface_map); + + let ext_cx = &*cx; + // expanded version of this + // pub fn $method_name(&self, p1: p1_ty, p2: p2_ty ... pn: pn_ty, ) [-> return_ty] { $body } + // looks like it's tricky to build function declaration with aster if body already generated + let signature = ::syntax::parse::parser::Parser::parse_impl_item( + &mut ::syntax::parse::new_parser_from_tts( + ext_cx.parse_sess(), + { + let _sp = ext_cx.call_site(); + let mut tt = ::std::vec::Vec::new(); + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("fn")))); + tt.extend(::quasi::ToTokens::to_tokens(&method_name, ext_cx).into_iter()); + tt.push(Token(_sp, ::syntax::parse::token::OpenDelim(::syntax::parse::token::Paren))); + tt.push(Token(_sp, ::syntax::parse::token::BinOp(::syntax::parse::token::And))); + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of("self")))); + tt.push(Token(_sp, ::syntax::parse::token::Comma)); + + for arg_idx in 0..dispatch.input_arg_names.len() { + let arg_name = dispatch.input_arg_names[arg_idx].as_str(); + let arg_ty = dispatch.input_arg_tys[arg_idx].clone(); + + tt.push(Token(_sp, ::syntax::parse::token::Ident(ext_cx.ident_of(arg_name)))); + tt.push(Token(_sp, ::syntax::parse::token::Colon)); + tt.extend(::quasi::ToTokens::to_tokens(&arg_ty, ext_cx).into_iter()); + tt.push(Token(_sp, ::syntax::parse::token::Comma)); + } + tt.push(Token(_sp, ::syntax::parse::token::CloseDelim(::syntax::parse::token::Paren))); + + if let Some(ref return_ty) = dispatch.return_type_ty { + tt.push(Token(_sp, ::syntax::parse::token::RArrow)); + tt.extend(::quasi::ToTokens::to_tokens(return_ty, ext_cx).into_iter()); + } + + tt.push(Token(_sp, ::syntax::parse::token::OpenDelim(::syntax::parse::token::Brace))); + tt.extend(::quasi::ToTokens::to_tokens(&body, ext_cx).into_iter()); + tt.push(Token(_sp, ::syntax::parse::token::CloseDelim(::syntax::parse::token::Brace))); + + tt + })); + + signature.unwrap() +} + +fn client_generics(builder: &aster::AstBuilder, interface_map: &InterfaceMap) -> Generics { + let ty_param = aster::ty_param::TyParamBuilder::new( + builder.id("S")).trait_bound( + builder.path().global().ids(&["ipc", "IpcSocket"]).build() + ).build().build(); + + builder.from_generics(interface_map.generics.clone()) + .with_ty_param(ty_param) + .build() +} + +fn client_qualified_ident(cx: &ExtCtxt, builder: &aster::AstBuilder, interface_map: &InterfaceMap) -> P { + let generics = client_generics(builder, interface_map); + aster::ty::TyBuilder::new().path().segment(interface_map.ident_map.client_ident(cx, builder)) + .with_generics(generics).build() + .build() +} + +fn client_phantom_ident(builder: &aster::AstBuilder, interface_map: &InterfaceMap) -> P { + let generics = client_generics(builder, interface_map); + aster::ty::TyBuilder::new().phantom_data() + .tuple().with_tys(generics.ty_params.iter().map(|x| aster::ty::TyBuilder::new().id(x.ident))) + .build() +} + +/// generates client type for specified server type +/// for say `Service` it generates `ServiceClient` +fn push_client_struct(cx: &ExtCtxt, builder: &aster::AstBuilder, interface_map: &InterfaceMap, push: &mut FnMut(Annotatable)) { + let generics = client_generics(builder, interface_map); + let client_short_ident = interface_map.ident_map.client_ident(cx, builder); + let phantom = client_phantom_ident(builder, interface_map); + + let client_struct_item = quote_item!(cx, + pub struct $client_short_ident $generics { + socket: ::std::sync::RwLock, + phantom: $phantom, + }); + + push(Annotatable::Item(client_struct_item.expect(&format!("could not generate client struct for {:?}", client_short_ident.name)))); +} + +/// pushes generated code for the client class (type declaration and method invocation implementations) +fn push_client( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + interface_map: &InterfaceMap, + push: &mut FnMut(Annotatable), +) { + push_client_struct(cx, builder, interface_map, push); + push_client_implementation(cx, builder, interface_map, push); + push_with_socket_client_implementation(cx, builder, interface_map, push); +} + +fn push_with_socket_client_implementation( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + interface_map: &InterfaceMap, + push: &mut FnMut(Annotatable)) +{ + let generics = client_generics(builder, interface_map); + let client_ident = client_qualified_ident(cx, builder, interface_map); + let where_clause = &generics.where_clause; + let client_short_ident = interface_map.ident_map.client_ident(cx, builder); + + let implement = quote_item!(cx, + impl $generics ::ipc::WithSocket for $client_ident $where_clause { + fn init(socket: S) -> $client_ident { + $client_short_ident { + socket: ::std::sync::RwLock::new(socket), + phantom: ::std::marker::PhantomData, + } + } + }).unwrap(); + push(Annotatable::Item(implement)); +} + +/// pushes full client side code for the original class exposed via ipc +fn push_client_implementation( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + interface_map: &InterfaceMap, + push: &mut FnMut(Annotatable), +) { + let mut index = -1i32; + let items = interface_map.dispatches.iter() + .map(|_| { index = index + 1; P(implement_client_method(cx, builder, index as u16, interface_map)) }) + .collect::>>(); + + let generics = client_generics(builder, interface_map); + let client_ident = client_qualified_ident(cx, builder, interface_map); + let where_clause = &generics.where_clause; + let endpoint = interface_map.endpoint; + + let handshake_item = quote_impl_item!(cx, + pub fn handshake(&self) -> Result<(), ::ipc::Error> { + let payload = ::ipc::Handshake { + protocol_version: $endpoint::protocol_version(), + api_version: $endpoint::api_version(), + }; + + ::ipc::invoke( + 0, + &Some(::ipc::binary::serialize(&::ipc::BinHandshake::from(payload)).unwrap()), + &mut *self.socket.write().unwrap()); + + let mut result = vec![0u8; 1]; + if try!(self.socket.write().unwrap().read(&mut result).map_err(|_| ::ipc::Error::HandshakeFailed)) == 1 { + match result[0] { + 1 => Ok(()), + _ => Err(::ipc::Error::RemoteServiceUnsupported), + } + } + else { Err(::ipc::Error::HandshakeFailed) } + }).unwrap(); + + let socket_item = quote_impl_item!(cx, + #[cfg(test)] + pub fn socket(&self) -> &::std::sync::RwLock { + &self.socket + }).unwrap(); + + let generic_items = vec![P(handshake_item), P(socket_item)]; + + if interface_map.impl_trait.is_some() { + let trait_ty = builder.id( + ::syntax::print::pprust::path_to_string( + &interface_map.impl_trait.as_ref().unwrap().path)); + + let implement_trait = + quote_item!(cx, + impl $generics $trait_ty for $client_ident $where_clause { + $items + } + ).unwrap(); + push(Annotatable::Item(implement_trait)); + + let implement = + quote_item!(cx, + impl $generics $client_ident $where_clause { + $generic_items + } + ).unwrap(); + push(Annotatable::Item(implement)); + } + else { + let pub_items = items.iter().map(|item| { + let pub_item = item.clone(); + pub_item.map(|mut val| { val.vis = ast::Visibility::Public; val }) + }).collect::>>(); + + let implement = quote_item!(cx, + impl $generics $client_ident $where_clause { + $pub_items + $generic_items + }).unwrap(); + push(Annotatable::Item(implement)); + } + +} + +/// implements dispatching of system handshake invocation (method_num 0) +fn implement_handshake_arm( + cx: &ExtCtxt, +) -> (ast::Arm, ast::Arm) +{ + let handshake_deserialize = quote_stmt!(&cx, + let handshake_payload = ::ipc::binary::deserialize_from::<::ipc::BinHandshake, _>(r).unwrap(); + ); + + let handshake_deserialize_buf = quote_stmt!(&cx, + let handshake_payload = ::ipc::binary::deserialize::<::ipc::BinHandshake>(buf).unwrap(); + ); + + let handshake_serialize = quote_expr!(&cx, + ::ipc::binary::serialize::(&Self::handshake(&handshake_payload.to_semver())).unwrap() + ); + + ( + quote_arm!(&cx, 0 => { + $handshake_deserialize + $handshake_serialize + }), + quote_arm!(&cx, 0 => { + $handshake_deserialize_buf + $handshake_serialize + }), + ) +} + +fn get_str_from_lit(cx: &ExtCtxt, name: &str, lit: &ast::Lit) -> Result { + match lit.node { + ast::LitKind::Str(ref s, _) => Ok(format!("{}", s)), + _ => { + cx.span_err( + lit.span, + &format!("ipc client_ident annotation `{}` must be a string, not `{}`", + name, + ::syntax::print::pprust::lit_to_string(lit))); + + return Err(()); + } + } +} + +fn client_ident_renamed(cx: &ExtCtxt, meta_item: &MetaItem) -> Option { + if let ast::MetaItemKind::List(ref list) = meta_item.node { + for nested in list { + match nested.node { + ast::NestedMetaItemKind::MetaItem(ref meta_item) => { + let is_client_ident = &*meta_item.name.as_str() == "client_ident"; + match meta_item.node { + ast::MetaItemKind::NameValue(ref lit) if is_client_ident => { + if let Ok(s) = get_str_from_lit(cx, "client_ident", lit) { + return Some(s); + } + } + _ => { + cx.span_err( + meta_item.span, + &format!("unknown client_ident container attribute `{}`", + ::syntax::print::pprust::meta_item_to_string(&meta_item))); + } + } + }, + _ => {}, + } + } + } + + None +} + +struct InterfaceMap { + pub original_item: Item, + pub item: P, + pub dispatches: Vec, + pub generics: Generics, + pub impl_trait: Option, + pub ident_map: IdentMap, + pub endpoint: Ident, +} + +struct IdentMap { + original_path: ast::Path, + meta_item: MetaItem, +} + +impl IdentMap { + fn ident(&self, builder: &aster::AstBuilder) -> Ident { + builder.id(format!("{}", ::syntax::print::pprust::path_to_string(&self.original_path))) + } + + fn client_ident(&self, cx: &ExtCtxt, builder: &aster::AstBuilder) -> Ident { + if let Some(new_name) = client_ident_renamed(cx, &self.meta_item) { + builder.id(new_name) + } + else { + builder.id(format!("{}Client", self.original_path.segments[0].identifier)) + } + } +} + +fn ty_ident_map(original_ty: &P, meta_item: &MetaItem) -> IdentMap { + let original_path = match original_ty.node { + ::syntax::ast::TyKind::Path(_, ref path) => path.clone(), + _ => { panic!("incompatible implementation"); } + }; + let ident_map = IdentMap { original_path: original_path, meta_item: meta_item.clone() }; + ident_map +} + +/// implements `IpcInterface` for the given class `C` +fn implement_interface( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + item: &Item, + push: &mut FnMut(Annotatable), + meta_item: &MetaItem, +) -> Result { + let (generics, impl_trait, original_ty, dispatch_table) = match item.node { + ast::ItemKind::Impl(_, _, ref generics, ref impl_trait, ref ty, ref impl_items) => { + let mut method_signatures = Vec::new(); + for impl_item in impl_items { + if let ImplItemKind::Method(ref signature, _) = impl_item.node { + method_signatures.push(NamedSignature { ident: &impl_item.ident, sig: signature }); + } + } + + let dispatch_table = method_signatures.iter().map(|named_signature| + push_invoke_signature_aster(builder, named_signature, push)) + .collect::>(); + + (generics, impl_trait.clone(), ty.clone(), dispatch_table) + }, + ast::ItemKind::Trait(_, ref generics, _, ref trait_items) => { + let mut method_signatures = Vec::new(); + for trait_item in trait_items { + if let TraitItemKind::Method(ref signature, _) = trait_item.node { + method_signatures.push(NamedSignature { ident: &trait_item.ident, sig: signature }); + } + } + + let dispatch_table = method_signatures.iter().map(|named_signature| + push_invoke_signature_aster(builder, named_signature, push)) + .collect::>(); + + ( + generics, + Some(ast::TraitRef { + path: builder.path().ids(&[item.ident.name]).build(), + ref_id: item.id, + }), + builder.ty().id(item.ident), + dispatch_table + ) + }, + _ => { + cx.span_err( + item.span, + "`#[ipc]` may only be applied to implementations and traits"); + return Err(Error); + }, + }; + let impl_generics = builder.from_generics(generics.clone()).build(); + let where_clause = &impl_generics.where_clause; + + let dispatch_arms = implement_dispatch_arms(cx, builder, &dispatch_table, false); + let dispatch_arms_buffered = implement_dispatch_arms(cx, builder, &dispatch_table, true); + + let (handshake_arm, handshake_arm_buf) = implement_handshake_arm(cx); + + let ty = ty_ident_map(&original_ty, meta_item).ident(builder); + let (interface_endpoint, host_generics) = match impl_trait { + Some(ref trait_) => (builder.id(::syntax::print::pprust::path_to_string(&trait_.path)), None), + None => (ty, Some(&impl_generics)), + }; + + let ipc_item = quote_item!(cx, + impl $host_generics ::ipc::IpcInterface for $interface_endpoint $where_clause { + fn dispatch(&self, r: &mut R) -> Vec + where R: ::std::io::Read + { + let mut method_num = vec![0u8;2]; + match r.read(&mut method_num) { + Ok(size) if size == 0 => { panic!("method id not supplied" ); } + Err(e) => { panic!("ipc read error: {:?}, aborting", e); } + _ => { } + } + + // method_num is a 16-bit little-endian unsigned number + match method_num[1] as u16 + (method_num[0] as u16)*256 { + // handshake + $handshake_arm + // user methods + $dispatch_arms + _ => vec![] + } + } + + fn dispatch_buf(&self, method_num: u16, buf: &[u8]) -> Vec + { + match method_num { + $handshake_arm_buf + $dispatch_arms_buffered + _ => vec![] + } + } + } + ).unwrap(); + + Ok(InterfaceMap { + ident_map: ty_ident_map(&original_ty, meta_item), + original_item: item.clone(), + item: ipc_item, + dispatches: dispatch_table, + generics: generics.clone(), + impl_trait: impl_trait.clone(), + endpoint: interface_endpoint, + }) +} diff --git a/ipc/codegen/src/lib.rs b/ipc/codegen/src/lib.rs new file mode 100644 index 000000000..6e7fc441b --- /dev/null +++ b/ipc/codegen/src/lib.rs @@ -0,0 +1,237 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Codegen for IPC RPC + +#![cfg_attr(feature = "nightly-testing", plugin(clippy))] +#![cfg_attr(feature = "nightly-testing", feature(plugin))] +#![cfg_attr(feature = "nightly-testing", allow(used_underscore_binding))] +#![cfg_attr(not(feature = "with-syntex"), feature(rustc_private, plugin))] +#![cfg_attr(not(feature = "with-syntex"), plugin(quasi_macros))] + +extern crate aster; +extern crate quasi; + +#[cfg(feature = "with-syntex")] +extern crate syntex; + +#[cfg(feature = "with-syntex")] +extern crate syntex_syntax as syntax; + +#[cfg(not(feature = "with-syntex"))] +#[macro_use] +extern crate syntax; + +#[cfg(not(feature = "with-syntex"))] +extern crate rustc_plugin; + +#[cfg(not(feature = "with-syntex"))] +use syntax::feature_gate::AttributeType; + +#[cfg(feature = "with-syntex")] +use syntax::{ast, fold}; + + +#[cfg(feature = "with-syntex")] +include!(concat!(env!("OUT_DIR"), "/lib.rs")); + +#[cfg(not(feature = "with-syntex"))] +include!("lib.rs.in"); + +#[cfg(feature = "with-syntex")] +pub fn expand(src: &std::path::Path, dst: &std::path::Path) { + let mut registry = syntex::Registry::new(); + register(&mut registry); + registry.expand("", src, dst).unwrap(); +} + +#[cfg(feature = "with-syntex")] +struct StripAttributeFolder<'a> { + attr_title: &'a str, +} + +#[cfg(feature = "with-syntex")] +impl<'a> fold::Folder for StripAttributeFolder<'a> { + fn fold_attribute(&mut self, attr: ast::Attribute) -> Option { + let is_self = &*attr.value.name.as_str() == self.attr_title; + + match attr.value.node { + ast::MetaItemKind::List(_) if is_self => { return None; } + ast::MetaItemKind::Word if is_self => { return None; } + _ => {} + } + + Some(attr) + } + + fn fold_mac(&mut self, mac: ast::Mac) -> ast::Mac { + fold::noop_fold_mac(mac, self) + } +} + +#[cfg(feature = "with-syntex")] +pub fn register_cleaner_ipc(reg: &mut syntex::Registry) { + #[cfg(feature = "with-syntex")] + fn strip_attributes(krate: ast::Crate) -> ast::Crate { + let mut folder = StripAttributeFolder { attr_title: "ipc" }; + fold::Folder::fold_crate(&mut folder, krate) + } + + reg.add_post_expansion_pass(strip_attributes); +} + +#[cfg(feature = "with-syntex")] +pub fn register_cleaner_binary(reg: &mut syntex::Registry) { + #[cfg(feature = "with-syntex")] + fn strip_attributes(krate: ast::Crate) -> ast::Crate { + let mut folder = StripAttributeFolder { attr_title: "binary" }; + fold::Folder::fold_crate(&mut folder, krate) + } + + reg.add_post_expansion_pass(strip_attributes); +} + +#[cfg(feature = "with-syntex")] +pub fn register(reg: &mut syntex::Registry) { + reg.add_attr("feature(custom_derive)"); + reg.add_attr("feature(custom_attribute)"); + + reg.add_decorator("ipc", codegen::expand_ipc_implementation); + reg.add_decorator("binary", serialization::expand_serialization_implementation); + + register_cleaner_ipc(reg); + register_cleaner_binary(reg); +} + +#[cfg(not(feature = "with-syntex"))] +pub fn register(reg: &mut rustc_plugin::Registry) { + reg.register_syntax_extension( + syntax::parse::token::intern("ipc"), + syntax::ext::base::MultiDecorator( + Box::new(codegen::expand_ipc_implementation))); + reg.register_syntax_extension( + syntax::parse::token::intern("binary"), + syntax::ext::base::MultiDecorator( + Box::new(serialization::expand_serialization_implementation))); + + reg.register_attribute("ipc".to_owned(), AttributeType::Normal); + reg.register_attribute("binary".to_owned(), AttributeType::Normal); +} + +#[derive(Debug)] +pub enum Error { InvalidFileName, ExpandFailure, Io(std::io::Error) } + +impl std::convert::From for Error { + fn from(err: std::io::Error) -> Self { + Error::Io(err) + } +} + +pub fn derive_ipc_cond(src_path: &str, has_feature: bool) -> Result<(), Error> { + if has_feature { derive_ipc(src_path) } + else { cleanup_ipc(src_path) } +} + +pub fn cleanup_ipc(src_path: &str) -> Result<(), Error> { + cleanup(src_path, AttributeKind::Ipc) +} + +pub fn cleanup_binary(src_path: &str) -> Result<(), Error> { + cleanup(src_path, AttributeKind::Binary) +} + +enum AttributeKind { + Ipc, + Binary, +} + +fn cleanup(src_path: &str, attr: AttributeKind) -> Result<(), Error> { + use std::env; + use std::path::{Path, PathBuf}; + + let out_dir = env::var_os("OUT_DIR").unwrap(); + let file_name = PathBuf::from(src_path).file_name().ok_or(Error::InvalidFileName).map(|val| val.to_str().unwrap().to_owned())?; + let mut registry = syntex::Registry::new(); + + match attr { + AttributeKind::Ipc => { register_cleaner_ipc(&mut registry); } + AttributeKind::Binary => { register_cleaner_binary(&mut registry); } + } + + if let Err(_) = registry.expand("", &Path::new(src_path), &Path::new(&out_dir).join(&file_name)) + { + // will be reported by compiler + return Err(Error::ExpandFailure) + } + Ok(()) +} + +pub fn derive_ipc(src_path: &str) -> Result<(), Error> { + use std::env; + use std::path::{Path, PathBuf}; + + let out_dir = env::var_os("OUT_DIR").unwrap(); + let file_name = PathBuf::from(src_path).file_name().ok_or(Error::InvalidFileName).map(|val| val.to_str().unwrap().to_owned())?; + + let final_path = Path::new(&out_dir).join(&file_name); + + let mut intermediate_file_name = file_name.clone(); + intermediate_file_name.push_str(".rpc.in"); + let intermediate_path = Path::new(&out_dir).join(&intermediate_file_name); + + { + let mut registry = syntex::Registry::new(); + register(&mut registry); + if let Err(_) = registry.expand("", &Path::new(src_path), &intermediate_path) { + // will be reported by compiler + return Err(Error::ExpandFailure) + } + } + + { + let mut registry = syntex::Registry::new(); + register(&mut registry); + if let Err(_) = registry.expand("", &intermediate_path, &final_path) { + // will be reported by compiler + return Err(Error::ExpandFailure) + } + } + + Ok(()) +} + +pub fn derive_binary(src_path: &str) -> Result<(), Error> { + use std::env; + use std::path::{Path, PathBuf}; + + let out_dir = env::var_os("OUT_DIR").unwrap(); + let file_name = PathBuf::from(src_path).file_name().ok_or(Error::InvalidFileName).map(|val| val.to_str().unwrap().to_owned())?; + let final_path = Path::new(&out_dir).join(&file_name); + + let mut registry = syntex::Registry::new(); + register(&mut registry); + if let Err(_) = registry.expand("", &Path::new(src_path), &final_path) { + // will be reported by compiler + return Err(Error::ExpandFailure) + } + + Ok(()) +} + +pub fn derive_binary_cond(src_path: &str, has_feature: bool) -> Result<(), Error> { + if has_feature { derive_binary(src_path) } + else { cleanup_binary(src_path) } +} diff --git a/ipc/codegen/src/lib.rs.in b/ipc/codegen/src/lib.rs.in new file mode 100644 index 000000000..c8aa8ebf2 --- /dev/null +++ b/ipc/codegen/src/lib.rs.in @@ -0,0 +1,18 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +mod codegen; +mod serialization; diff --git a/ipc/codegen/src/serialization.rs b/ipc/codegen/src/serialization.rs new file mode 100644 index 000000000..fd908725c --- /dev/null +++ b/ipc/codegen/src/serialization.rs @@ -0,0 +1,810 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +use aster; + +use syntax::ast::{ + MetaItem, + Item, + Ident, +}; + +use syntax::ast; +use syntax::codemap::Span; +use syntax::ext::base::{Annotatable, ExtCtxt}; +use syntax::ptr::P; + +pub struct Error; + +use super::codegen; + +pub fn expand_serialization_implementation( + cx: &mut ExtCtxt, + span: Span, + meta_item: &MetaItem, + annotatable: &Annotatable, + push: &mut FnMut(Annotatable) +) { + let item = match *annotatable { + Annotatable::Item(ref item) => item, + _ => { + cx.span_err(meta_item.span, "`#[derive(Binary)]` may only be applied to structs and enums"); + return; + }, + }; + + let builder = aster::AstBuilder::new().span(span); + + let impl_item = match serialize_item(cx, &builder, &item) { + Ok(item) => item, + Err(Error) => { + // An error occurred, but it should have been reported already. + return; + }, + }; + + push(Annotatable::Item(impl_item)) +} + +fn serialize_item( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + item: &Item, +) -> Result, Error> { + let generics = match item.node { + ast::ItemKind::Struct(_, ref generics) => generics, + ast::ItemKind::Enum(_, ref generics) => generics, + _ => { + cx.span_err( + item.span, + "`#[derive(Binary)]` may only be applied to structs and enums"); + return Err(Error); + }, + }; + + let ty = builder.ty().path() + .segment(item.ident).with_generics(generics.clone()).build() + .build(); + + let where_clause = &generics.where_clause; + + let binary_expressions = try!(binary_expr(cx, + &builder, + &item, + &generics, + ty.clone())); + + let (size_expr, read_expr, write_expr) = + (binary_expressions.size, binary_expressions.read, binary_expressions.write); + + match quote_item!(cx, + impl $generics ::ipc::BinaryConvertable for $ty $where_clause { + fn size(&self) -> usize { + $size_expr + } + + fn to_bytes(&self, buffer: &mut [u8], length_stack: &mut ::std::collections::VecDeque) -> Result<(), ::ipc::BinaryConvertError> { + $write_expr + } + + fn from_bytes(buffer: &[u8], length_stack: &mut ::std::collections::VecDeque) -> Result { + $read_expr + } + + fn len_params() -> usize { + 1 + } + }) + { + Some(item) => Ok(item), + None => { + cx.span_err( + item.span, + "syntax error expanding serialization implementation"); + Err(Error) + } + } +} + +#[allow(unreachable_code)] +fn binary_expr( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + item: &Item, + impl_generics: &ast::Generics, + ty: P, +) -> Result { + match item.node { + ast::ItemKind::Struct(ref variant_data, _) => { + binary_expr_item_struct( + cx, + builder, + impl_generics, + ty, + item.span, + variant_data, + ) + }, + ast::ItemKind::Enum(ref enum_def, _) => { + binary_expr_enum( + cx, + builder, + item.ident, + impl_generics, + ty, + item.span, + enum_def, + ) + }, + _ => { + cx.span_bug(item.span, + "expected ItemStruct or ItemEnum in #[derive(Binary)]"); + Err(Error) as Result + }, + } +} + +struct BinaryExpressions { + pub size: P, + pub write: P, + pub read: P, +} + +fn replace_qualified(s: &str) -> String { + if let Some(pos) = s.find("<") { + let mut source = s.to_owned(); + source.insert(pos, ':'); + source.insert(pos, ':'); + source + } + else { s.to_owned() } +} + +fn binary_expr_struct( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + ty: P, + fields: &[ast::StructField], + value_ident: Option, + instance_ident: Option, +) -> Result { + + let size_exprs: Vec> = fields.iter().enumerate().map(|(index, field)| { + let raw_ident = ::syntax::print::pprust::ty_to_string(&codegen::strip_ptr(&field.ty)); + let index_ident = builder.id(format!("__field{}", index)); + let field_id = match field.ident { + Some(ident) => builder.id(ident), + None => builder.id(format!("{}", index)), + }; + + match raw_ident.as_ref() { + "u8" => { + quote_expr!(cx, 1) + }, + "[u8]" => { + value_ident.and_then(|x| { + Some(quote_expr!(cx, $x. $field_id .len())) + }) + .unwrap_or_else(|| { + quote_expr!(cx, $index_ident .len()) + } + ) + } + _ => { + let field_type_ident = builder.id( + &::syntax::print::pprust::ty_to_string(&codegen::strip_ptr(&field.ty))); + + let field_type_ident_qualified = builder.id( + replace_qualified(&::syntax::print::pprust::ty_to_string(&codegen::strip_ptr(&field.ty)))); + + value_ident.and_then(|x| + { + Some(quote_expr!(cx, + match $field_type_ident_qualified::len_params() { + 0 => ::std::mem::size_of::<$field_type_ident>(), + _ => $x. $field_id .size(), + })) + }) + .unwrap_or_else(|| { + quote_expr!(cx, match $field_type_ident_qualified::len_params() { + 0 => ::std::mem::size_of::<$field_type_ident>(), + _ => $index_ident .size(), + }) + }) + } + } + }).collect(); + + let first_size_expr = size_exprs[0].clone(); + let mut total_size_expr = quote_expr!(cx, 0usize + $first_size_expr); + for index in 1..size_exprs.len() { + let next_expr = size_exprs[index].clone(); + total_size_expr = quote_expr!(cx, $total_size_expr + $next_expr); + } + + let mut write_stmts = Vec::::new(); + write_stmts.push(quote_stmt!(cx, let mut offset = 0usize;).expect("stmt1")); + + let mut map_stmts = Vec::::new(); + let field_amount = builder.id(&format!("{}",fields.len())); + map_stmts.push(quote_stmt!(cx, let mut map = vec![0usize; $field_amount];).expect("stmt2")); + map_stmts.push(quote_stmt!(cx, let mut total = 0usize;).expect("stmt3")); + + let mut post_write_stmts = Vec::::new(); + + for (index, field) in fields.iter().enumerate() { + let field_type_ident = builder.id( + &::syntax::print::pprust::ty_to_string(&codegen::strip_ptr(&field.ty))); + + let field_type_ident_qualified = builder.id( + replace_qualified(&::syntax::print::pprust::ty_to_string(&codegen::strip_ptr(&field.ty)))); + + let field_id = match field.ident { + Some(ident) => builder.id(ident), + None => builder.id(format!("{}", index)), + }; + let member_expr = match value_ident { + Some(x) => { + quote_expr!(cx, $x . $field_id) + }, + None => { + let index_ident = builder.id(format!("__field{}", index)); + quote_expr!(cx, $index_ident) + }, + }; + + let raw_ident = ::syntax::print::pprust::ty_to_string(&codegen::strip_ptr(&field.ty)); + let range_ident = builder.id(format!("r{}", index)); + + let error_message = "Error serializing member: ".to_owned() + &::syntax::print::pprust::expr_to_string(&member_expr); + let _error_message_literal = builder.expr().lit().str::<&str>(&error_message); + + match raw_ident.as_ref() { + "u8" => { + write_stmts.push(quote_stmt!(cx, let next_line = offset + 1;).expect("stmt4")); + write_stmts.push(quote_stmt!(cx, buffer[offset] = $member_expr; ).expect("stm5")); + }, + "[u8]" => { + write_stmts.push(quote_stmt!(cx, let size = $member_expr .len();).unwrap()); + write_stmts.push(quote_stmt!(cx, let next_line = offset + size;).unwrap()); + write_stmts.push(quote_stmt!(cx, length_stack.push_back(size);).unwrap()); + write_stmts.push(quote_stmt!(cx, let $range_ident = offset..next_line; ).unwrap()); + post_write_stmts.push(quote_stmt!(cx, buffer[$range_ident].clone_from_slice($member_expr); ).unwrap()); + } + _ => { + write_stmts.push(quote_stmt!(cx, let next_line = offset + match $field_type_ident_qualified::len_params() { + 0 => ::std::mem::size_of::<$field_type_ident>(), + _ => { let size = $member_expr .size(); length_stack.push_back(size); size }, + }).unwrap()); + write_stmts.push(quote_stmt!(cx, let $range_ident = offset..next_line; ).unwrap()); + post_write_stmts.push(quote_stmt!(cx, + if $range_ident.end - $range_ident.start > 0 { + if let Err(e) = $member_expr .to_bytes(&mut buffer[$range_ident], length_stack) { + return Err(e) + }; + } + ).unwrap()); + } + } + + write_stmts.push(quote_stmt!(cx, offset = next_line; ).unwrap()); + + let field_index = builder.id(&format!("{}", index)); + map_stmts.push(quote_stmt!(cx, map[$field_index] = total;).unwrap()); + + match raw_ident.as_ref() { + "u8" => { + map_stmts.push(quote_stmt!(cx, total += 1;).unwrap()); + }, + "[u8]" => { + map_stmts.push(quote_stmt!(cx, let size = length_stack.pop_front().unwrap();).unwrap()); + map_stmts.push(quote_stmt!(cx, total += size;).unwrap()); + }, + _ => { + map_stmts.push(quote_stmt!(cx, let size = match $field_type_ident_qualified::len_params() { + 0 => ::std::mem::size_of::<$field_type_ident>(), + _ => length_stack.pop_front().unwrap(), + }).unwrap()); + map_stmts.push(quote_stmt!(cx, total += size;).unwrap()); + } + } + }; + + let read_expr = match fields.iter().any(|f| codegen::has_ptr(&f.ty)) { + true => { + // cannot create structs with pointers + quote_expr!(cx, Err(::ipc::binary::BinaryConvertError::not_supported())) + }, + false => { + if value_ident.is_some() { + let instance_create = named_fields_sequence(cx, &ty, fields); + quote_expr!(cx, { $map_stmts; $instance_create; Ok(result) }) + } + else { + let map_variant = P(fields_sequence(cx, &ty, fields, &instance_ident.unwrap_or(builder.id("Self")))); + quote_expr!(cx, { $map_stmts; Ok($map_variant) }) + } + }, + }; + + Ok(BinaryExpressions { + size: total_size_expr, + write: quote_expr!(cx, { $write_stmts; $post_write_stmts; Ok(()) } ), + read: read_expr, + }) +} + +#[allow(unreachable_code)] +fn binary_expr_item_struct( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + _impl_generics: &ast::Generics, + ty: P, + span: Span, + variant_data: &ast::VariantData, +) -> Result { + match *variant_data { + ast::VariantData::Tuple(ref fields, _) => { + binary_expr_struct( + cx, + &builder, + ty, + fields, + Some(builder.id("self")), + None, + ) + }, + ast::VariantData::Struct(ref fields, _) => { + binary_expr_struct( + cx, + &builder, + ty, + fields, + Some(builder.id("self")), + None, + ) + }, + _ => { + cx.span_bug(span, + &format!("#[derive(Binary)] Unsupported struct content, expected tuple/struct, found: {:?}", + variant_data)); + Err(Error) as Result + }, + } +} + +fn binary_expr_enum( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + type_ident: Ident, + impl_generics: &ast::Generics, + ty: P, + span: Span, + enum_def: &ast::EnumDef, +) -> Result { + let arms: Vec<_> = try!(enum_def.variants.iter() + .enumerate() + .map(|(variant_index, variant)| { + binary_expr_variant( + cx, + builder, + type_ident, + impl_generics, + ty.clone(), + span, + variant, + variant_index, + ) + }) + .collect()); + + let (size_arms, write_arms, mut read_arms) = ( + arms.iter().map(|x| x.size.clone()).collect::>(), + arms.iter().map(|x| x.write.clone()).collect::>(), + arms.iter().map(|x| x.read.clone()).collect::>()); + + read_arms.push(quote_arm!(cx, _ => { Err(::ipc::BinaryConvertError::variant(buffer[0])) } )); + + Ok(BinaryExpressions { + size: quote_expr!(cx, 1usize + match *self { $size_arms }), + write: quote_expr!(cx, match *self { $write_arms }; ), + read: quote_expr!(cx, match buffer[0] { $read_arms }), + }) +} + +struct BinaryArm { + size: ast::Arm, + write: ast::Arm, + read: ast::Arm, +} + +fn fields_sequence( + ext_cx: &ExtCtxt, + _ty: &P, + fields: &[ast::StructField], + variant_ident: &ast::Ident, +) -> ast::Expr { + use syntax::parse::token; + use syntax::tokenstream::TokenTree::Token; + + let named_members = fields.iter().any(|f| f.ident.is_some()); + + ::quasi::parse_expr_panic(&mut ::syntax::parse::new_parser_from_tts( + ext_cx.parse_sess(), + { + let _sp = ext_cx.call_site(); + let mut tt = ::std::vec::Vec::new(); + tt.push(Token(_sp, token::Ident(variant_ident.clone()))); + if named_members { + tt.push(Token(_sp, token::OpenDelim(token::Brace))); + } + else { + tt.push(Token(_sp, token::OpenDelim(token::Paren))); + } + + for (idx, field) in fields.iter().enumerate() { + if field.ident.is_some() { + tt.push(Token(_sp, token::Ident(field.ident.clone().unwrap()))); + tt.push(Token(_sp, token::Colon)); + } + + // special case for u8, it just takes byte form sequence + if ::syntax::print::pprust::ty_to_string(&field.ty) == "u8" { + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("buffer")))); + + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("map")))); + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of(&format!("{}", idx))))); + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + + tt.push(Token(_sp, token::Comma)); + continue; + } + + // special case for [u8], it just takes a byte sequence + if ::syntax::print::pprust::ty_to_string(&field.ty) == "[u8]" { + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("buffer")))); + + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("map")))); + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of(&format!("{}", idx))))); + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + tt.push(Token(_sp, token::DotDot)); + + if idx+1 != fields.len() { + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("map")))); + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of(&format!("{}", idx+1))))); + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + } + + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + + tt.push(Token(_sp, token::Comma)); + continue; + } + + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("try!")))); + tt.push(Token(_sp, token::OpenDelim(token::Paren))); + tt.push( + Token( + _sp, + token::Ident(ext_cx.ident_of(&replace_qualified(&::syntax::print::pprust::ty_to_string(&field.ty)))) + )); + tt.push(Token(_sp, token::ModSep)); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("from_bytes")))); + tt.push(Token(_sp, token::OpenDelim(token::Paren))); + + tt.push(Token(_sp, token::BinOp(token::And))); + + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("buffer")))); + + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("map")))); + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of(&format!("{}", idx))))); + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + tt.push(Token(_sp, token::DotDot)); + + if idx+1 != fields.len() { + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("map")))); + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of(&format!("{}", idx+1))))); + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + } + + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + + tt.push(Token(_sp, token::Comma)); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("length_stack")))); + tt.push(Token(_sp, token::CloseDelim(token::Paren))); + + // name member if it has resulted in the error + tt.push(Token(_sp, token::Dot)); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("map_err")))); + + tt.push(Token(_sp, token::OpenDelim(token::Paren))); + tt.push(Token(_sp, token::BinOp(token::Or))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("e")))); + tt.push(Token(_sp, token::BinOp(token::Or))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("e")))); + tt.push(Token(_sp, token::Dot)); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("named")))); + tt.push(Token(_sp, token::OpenDelim(token::Paren))); + tt.push(Token(_sp, token::Literal(token::Lit::Str_( + field.ident.unwrap_or(ext_cx.ident_of(&format!("f{}", idx))).name), + None)) + ); + tt.push(Token(_sp, token::CloseDelim(token::Paren))); + tt.push(Token(_sp, token::CloseDelim(token::Paren))); + + tt.push(Token(_sp, token::CloseDelim(token::Paren))); + + tt.push(Token(_sp, token::Comma)); + } + if named_members { + tt.push(Token(_sp, token::CloseDelim(token::Brace))); + } + else { + tt.push(Token(_sp, token::CloseDelim(token::Paren))); + } + tt + }) + ).unwrap() +} + +fn named_fields_sequence( + ext_cx: &ExtCtxt, + ty: &P, + fields: &[ast::StructField], +) -> ast::Stmt { + use syntax::parse::token; + use syntax::tokenstream::TokenTree::Token; + + ::quasi::parse_stmt_panic(&mut ::syntax::parse::new_parser_from_tts( + ext_cx.parse_sess(), + { + let _sp = ext_cx.call_site(); + let mut tt = ::std::vec::Vec::new(); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("let")))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("result")))); + tt.push(Token(_sp, token::Eq)); + + tt.push(Token( + _sp, + token::Ident( + ext_cx.ident_of(&::syntax::print::pprust::ty_to_string(ty)) + ))); + + tt.push(Token(_sp, token::OpenDelim(token::Brace))); + + for (idx, field) in fields.iter().enumerate() { + tt.push(Token(_sp, match field.ident { + Some(ident) => token::Ident(ident), + None => token::Ident(ext_cx.ident_of(&format!("{}", idx))), + })); + tt.push(Token(_sp, token::Colon)); + + // special case for u8, it just takes byte form sequence + if ::syntax::print::pprust::ty_to_string(&field.ty) == "u8" { + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("buffer")))); + + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("map")))); + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of(&format!("{}", idx))))); + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + + tt.push(Token(_sp, token::Comma)); + continue; + } + + // special case for [u8], it just takes a byte sequence + if ::syntax::print::pprust::ty_to_string(&field.ty) == "[u8]" { + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("buffer")))); + + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("map")))); + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of(&format!("{}", idx))))); + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + tt.push(Token(_sp, token::DotDot)); + + if idx+1 != fields.len() { + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("map")))); + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of(&format!("{}", idx+1))))); + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + } + + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + + tt.push(Token(_sp, token::Comma)); + continue; + } + + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("try!")))); + tt.push(Token(_sp, token::OpenDelim(token::Paren))); + tt.push(Token( + _sp, + token::Ident( + ext_cx.ident_of(&replace_qualified(&::syntax::print::pprust::ty_to_string(&field.ty))) + ))); + tt.push(Token(_sp, token::ModSep)); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("from_bytes")))); + tt.push(Token(_sp, token::OpenDelim(token::Paren))); + + tt.push(Token(_sp, token::BinOp(token::And))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("buffer")))); + + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("map")))); + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of(&format!("{}", idx))))); + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + tt.push(Token(_sp, token::DotDot)); + if idx + 1 != fields.len() { + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("map")))); + tt.push(Token(_sp, token::OpenDelim(token::Bracket))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of(&format!("{}", idx+1))))); + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + } + + tt.push(Token(_sp, token::CloseDelim(token::Bracket))); + + tt.push(Token(_sp, token::Comma)); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("length_stack")))); + tt.push(Token(_sp, token::CloseDelim(token::Paren))); + + // name member if it has resulted in the error + tt.push(Token(_sp, token::Dot)); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("map_err")))); + tt.push(Token(_sp, token::OpenDelim(token::Paren))); + tt.push(Token(_sp, token::BinOp(token::Or))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("e")))); + tt.push(Token(_sp, token::BinOp(token::Or))); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("e")))); + tt.push(Token(_sp, token::Dot)); + tt.push(Token(_sp, token::Ident(ext_cx.ident_of("named")))); + tt.push(Token(_sp, token::OpenDelim(token::Paren))); + tt.push(Token(_sp, token::Literal(token::Lit::Str_( + field.ident.unwrap_or(ext_cx.ident_of(&format!("f{}", idx))).name), + None)) + ); + tt.push(Token(_sp, token::CloseDelim(token::Paren))); + tt.push(Token(_sp, token::CloseDelim(token::Paren))); + + tt.push(Token(_sp, token::CloseDelim(token::Paren))); + tt.push(Token(_sp, token::Comma)); + } + + tt.push(Token(_sp, token::CloseDelim(token::Brace))); + tt + }) + ).unwrap() +} + +fn binary_expr_variant( + cx: &ExtCtxt, + builder: &aster::AstBuilder, + type_ident: Ident, + _generics: &ast::Generics, + ty: P, + _span: Span, + variant: &ast::Variant, + variant_index: usize, +) -> Result { + let variant_ident = variant.node.name; + let variant_index_ident = builder.id(format!("{}", variant_index)); + + match variant.node.data { + ast::VariantData::Unit(_) => { + let pat = builder.pat().path() + .id(type_ident).id(variant_ident) + .build(); + + let variant_val = builder.id(format!("{}::{}", type_ident, variant_ident)); + + Ok(BinaryArm { + size: quote_arm!(cx, $pat => { 0usize } ), + write: quote_arm!(cx, $pat => { buffer[0] = $variant_index_ident; Ok(()) } ), + read: quote_arm!(cx, $variant_index_ident => { Ok($variant_val) } ), + }) + }, + ast::VariantData::Tuple(ref fields, _) => { + let field_names: Vec = (0 .. fields.len()) + .map(|i| builder.id(format!("__field{}", i))) + .collect(); + + let pat = builder.pat().enum_() + .id(type_ident).id(variant_ident).build() + .with_pats( + field_names.iter() + .map(|field| builder.pat().ref_id(field)) + ) + .build(); + + let binary_expr = try!(binary_expr_struct( + cx, + &builder, + ty, + fields, + None, + Some(builder.id(format!("{}::{}", type_ident, variant_ident))), + )); + + let (size_expr, write_expr, read_expr) = (binary_expr.size, vec![binary_expr.write], binary_expr.read); + Ok(BinaryArm { + size: quote_arm!(cx, $pat => { $size_expr } ), + write: quote_arm!(cx, + $pat => { + buffer[0] = $variant_index_ident; + let buffer = &mut buffer[1..]; + $write_expr + }), + read: quote_arm!(cx, + $variant_index_ident => { + let buffer = &buffer[1..]; + $read_expr + } + ), + }) + }, + ast::VariantData::Struct(ref fields, _) => { + let field_names: Vec<_> = (0 .. fields.len()) + .map(|i| builder.id(format!("__field{}", i))) + .collect(); + + let pat = builder.pat().struct_() + .id(type_ident).id(variant_ident).build() + .with_pats( + field_names.iter() + .zip(fields.iter()) + .map(|(id, field)|(field.ident.unwrap(), builder.pat().ref_id(id)))) + .build(); + + let binary_expr = try!(binary_expr_struct( + cx, + &builder, + ty, + fields, + None, + Some(builder.id(format!("{}::{}", type_ident, variant_ident))), + )); + + let (size_expr, write_expr, read_expr) = (binary_expr.size, vec![binary_expr.write], binary_expr.read); + + Ok(BinaryArm { + size: quote_arm!(cx, $pat => { $size_expr } ), + write: quote_arm!(cx, + $pat => { + buffer[0] = $variant_index_ident; + let buffer = &mut buffer[1..]; + $write_expr + }), + read: quote_arm!(cx, + $variant_index_ident => { + let buffer = &buffer[1..]; + $read_expr + } + ), + }) + }, + } +} diff --git a/ipc/hypervisor/Cargo.toml b/ipc/hypervisor/Cargo.toml new file mode 100644 index 000000000..1db60c904 --- /dev/null +++ b/ipc/hypervisor/Cargo.toml @@ -0,0 +1,19 @@ +[package] +name = "ethcore-ipc-hypervisor" +version = "1.2.0" +authors = ["Parity Technologies "] +license = "GPL-3.0" +build = "build.rs" + +[features] + +[dependencies] +ethcore-ipc = { path = "../rpc" } +nanomsg = { git = "https://github.com/paritytech/nanomsg.rs.git", branch = "parity-1.7" } +ethcore-ipc-nano = { path = "../nano" } +semver = "0.6" +log = "0.3" +time = "0.1" + +[build-dependencies] +ethcore-ipc-codegen = { path = "../codegen" } diff --git a/ipc/hypervisor/build.rs b/ipc/hypervisor/build.rs new file mode 100644 index 000000000..097aba046 --- /dev/null +++ b/ipc/hypervisor/build.rs @@ -0,0 +1,21 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +extern crate ethcore_ipc_codegen; + +fn main() { + ethcore_ipc_codegen::derive_ipc("src/service.rs.in").unwrap(); +} diff --git a/ipc/hypervisor/src/lib.rs b/ipc/hypervisor/src/lib.rs new file mode 100644 index 000000000..b522122b5 --- /dev/null +++ b/ipc/hypervisor/src/lib.rs @@ -0,0 +1,273 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Parity interprocess hypervisor module + +#![cfg_attr(feature="dev", allow(used_underscore_binding))] + +extern crate ethcore_ipc as ipc; +extern crate ethcore_ipc_nano as nanoipc; +extern crate semver; +#[macro_use] extern crate log; +extern crate time; + +pub mod service; + +/// Default value for hypervisor ipc listener +pub const HYPERVISOR_IPC_URL: &'static str = "parity-internal-hyper-status.ipc"; + +use std::sync::{Arc,RwLock}; +use service::{HypervisorService, IpcModuleId}; +use std::process::{Command,Child}; +use std::collections::HashMap; + +pub use service::{HypervisorServiceClient, ControlService, CLIENT_MODULE_ID, SYNC_MODULE_ID}; + +pub type BinaryId = &'static str; + +pub struct Hypervisor { + ipc_addr: String, + service: Arc, + ipc_worker: RwLock>, + processes: RwLock>, + modules: HashMap, + pub io_path: String, +} + +/// Boot arguments for binary +pub struct BootArgs { + cli: Option>, + stdin: Option>, +} + +impl BootArgs { + /// New empty boot arguments + pub fn new() -> BootArgs { + BootArgs { + cli: None, + stdin: None, + } + } + + /// Set command-line arguments for boot + pub fn cli(mut self, cli: Vec) -> BootArgs { + self.cli = Some(cli); + self + } + + /// Set std-in stream for boot + pub fn stdin(mut self, stdin: Vec) -> BootArgs { + self.stdin = Some(stdin); + self + } +} + +impl Hypervisor { + /// initializes the Hypervisor service with the open ipc socket for incoming clients + pub fn new() -> Hypervisor { + Hypervisor::with_url(HYPERVISOR_IPC_URL) + } + + pub fn module(mut self, module_id: IpcModuleId, args: BootArgs) -> Hypervisor { + self.modules.insert(module_id, args); + self.service.add_module(module_id); + self + } + + pub fn local_module(self, module_id: IpcModuleId) -> Hypervisor { + self.service.add_module(module_id); + self + } + + pub fn io_path(mut self, directory: &str) -> Hypervisor { + self.io_path = directory.to_owned(); + self + } + + /// Starts with the specified address for the ipc listener and + /// the specified list of modules in form of created service + pub fn with_url(addr: &str) -> Hypervisor { + let service = HypervisorService::new(); + let worker = nanoipc::Worker::new(&service); + Hypervisor{ + ipc_addr: addr.to_owned(), + service: service, + ipc_worker: RwLock::new(worker), + processes: RwLock::new(HashMap::new()), + modules: HashMap::new(), + io_path: "/tmp".to_owned(), + } + } + + /// Since one binary can host multiple modules + /// we match binaries + fn match_module(&self, module_id: &IpcModuleId) -> Option<&BootArgs> { + self.modules.get(module_id) + } + + /// Creates IPC listener and starts all binaries + pub fn start(&self) { + let mut worker = self.ipc_worker.write().unwrap(); + worker.add_reqrep(&self.ipc_addr).unwrap_or_else(|e| panic!("Hypervisor ipc worker can not start - critical! ({:?})", e)); + + for module_id in self.service.module_ids() { + self.start_module(module_id); + } + } + + /// Start binary for the specified module + /// Does nothing when it is already started on module is inside the + /// main binary + fn start_module(&self, module_id: IpcModuleId) { + use std::io::Write; + + self.match_module(&module_id).map(|boot_args| { + let mut processes = self.processes.write().unwrap(); + { + if processes.get(&module_id).is_some() { + // already started for another module + return; + } + } + + let mut command = Command::new(&std::env::current_exe().unwrap()); + command.stderr(std::process::Stdio::inherit()); + + if let Some(ref cli_args) = boot_args.cli { + for arg in cli_args { command.arg(arg); } + } + + command.stdin(std::process::Stdio::piped()); + + trace!(target: "hypervisor", "Spawn executable: {:?}", command); + + let mut child = command.spawn().unwrap_or_else( + |e| panic!("Hypervisor cannot execute command ({:?}): {}", command, e)); + + if let Some(ref std_in) = boot_args.stdin { + trace!(target: "hypervisor", "Pushing std-in payload..."); + child.stdin.as_mut() + .expect("std-in should be piped above") + .write(std_in) + .unwrap_or_else(|e| panic!(format!("Error trying to pipe stdin for {:?}: {:?}", &command, e))); + drop(child.stdin.take()); + } + + processes.insert(module_id, child); + }); + } + + /// Reports if all modules are checked in + pub fn modules_ready(&self) -> bool { + self.service.unchecked_count() == 0 + } + + pub fn modules_shutdown(&self) -> bool { + self.service.running_count() == 0 + } + + /// Waits for every required module to check in + pub fn wait_for_startup(&self) { + let mut worker = self.ipc_worker.write().unwrap(); + while !self.modules_ready() { + worker.poll() + } + } + + /// Waits for every required module to check in + pub fn wait_for_shutdown(&self) -> bool { + use time::{PreciseTime, Duration}; + + let mut worker = self.ipc_worker.write().unwrap(); + let start = PreciseTime::now(); + while !self.modules_shutdown() { + worker.poll(); + if start.to(PreciseTime::now()) > Duration::seconds(30) { + warn!("Some modules failed to shutdown gracefully, they will be terminated."); + break; + } + } + self.modules_shutdown() + } + + /// Shutdown the ipc and all managed child processes + pub fn shutdown(&self) { + let mut childs = self.processes.write().unwrap(); + for (ref module, _) in childs.iter() { + trace!(target: "hypervisor", "Stopping process module: {}", module); + self.service.send_shutdown(**module); + } + trace!(target: "hypervisor", "Waiting for shutdown..."); + if self.wait_for_shutdown() { + trace!(target: "hypervisor", "All modules reported shutdown"); + return; + } + + for (ref module, ref mut process) in childs.iter_mut() { + if self.service.is_running(**module) { + process.kill().unwrap(); + trace!("Terminated {}", module); + } + } + } +} + +impl Drop for Hypervisor { + fn drop(&mut self) { + self.shutdown(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::sync::atomic::{AtomicBool,Ordering}; + use std::sync::Arc; + use nanoipc; + + #[test] + fn can_init() { + let url = "ipc:///tmp/test-parity-hypervisor-10.ipc"; + let test_module_id = 8080u64; + + let hypervisor = Hypervisor::with_url(url).local_module(test_module_id); + assert_eq!(false, hypervisor.modules_ready()); + } + + #[test] + fn can_wait_for_startup() { + let url = "ipc:///tmp/test-parity-hypervisor-20.ipc"; + let test_module_id = 8080u64; + + let hypervisor_ready = Arc::new(AtomicBool::new(false)); + let hypervisor_ready_local = hypervisor_ready.clone(); + + ::std::thread::spawn(move || { + while !hypervisor_ready.load(Ordering::Relaxed) { } + + let client = nanoipc::fast_client::>(url).unwrap(); + client.handshake().unwrap(); + client.module_ready(test_module_id, url.to_owned()); + }); + + let hypervisor = Hypervisor::with_url(url).local_module(test_module_id); + hypervisor.start(); + hypervisor_ready_local.store(true, Ordering::Relaxed); + hypervisor.wait_for_startup(); + + assert_eq!(true, hypervisor.modules_ready()); + } +} diff --git a/ipc/hypervisor/src/service.rs b/ipc/hypervisor/src/service.rs new file mode 100644 index 000000000..59040251e --- /dev/null +++ b/ipc/hypervisor/src/service.rs @@ -0,0 +1,20 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Parity interprocess hypervisor IPC service +#![allow(dead_code, unused_assignments, unused_variables)] // codegen issues + +include!(concat!(env!("OUT_DIR"), "/service.rs.in")); diff --git a/ipc/hypervisor/src/service.rs.in b/ipc/hypervisor/src/service.rs.in new file mode 100644 index 000000000..6d6f38268 --- /dev/null +++ b/ipc/hypervisor/src/service.rs.in @@ -0,0 +1,125 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::sync::{RwLock,Arc}; +use ipc::IpcConfig; +use std::collections::HashMap; +use nanoipc; + +pub type IpcModuleId = u64; + +/// Blockhain database module id +pub const CLIENT_MODULE_ID: IpcModuleId = 2000; + +/// Sync module id +pub const SYNC_MODULE_ID: IpcModuleId = 2100; + +/// IPC service that handles module management +pub struct HypervisorService { + modules: RwLock>, +} + +#[derive(Default)] +pub struct ModuleState { + started: bool, + control_url: String, + shutdown: bool, +} + +#[ipc] +pub trait ControlService { + fn shutdown(&self) -> bool; +} + +#[ipc] +impl HypervisorService { + // return type for making method synchronous + fn module_ready(&self, module_id: u64, control_url: String) -> bool { + let mut modules = self.modules.write().unwrap(); + modules.get_mut(&module_id).map(|mut module| { + module.started = true; + module.control_url = control_url; + }); + trace!(target: "hypervisor", "Module ready: {}", module_id); + true + } + + // return type for making method synchronous + fn module_shutdown(&self, module_id: u64) -> bool { + let mut modules = self.modules.write().unwrap(); + modules.get_mut(&module_id).map(|mut module| { + module.shutdown = true; + }); + trace!(target: "hypervisor", "Module shutdown: {}", module_id); + true + } +} + +impl HypervisorService { + /// New service with the default list of modules + pub fn new() -> Arc { + HypervisorService::with_modules(vec![]) + } + + /// New service with list of modules that will report for being ready + pub fn with_modules(module_ids: Vec) -> Arc { + let mut modules = HashMap::new(); + for module_id in module_ids { + modules.insert(module_id, ModuleState::default()); + } + Arc::new(HypervisorService { + modules: RwLock::new(modules), + }) + } + + /// Add the module to the check-list + pub fn add_module(&self, module_id: IpcModuleId) { + self.modules.write().unwrap().insert(module_id, ModuleState::default()); + } + + /// Number of modules still being waited for check-in + pub fn unchecked_count(&self) -> usize { + self.modules.read().unwrap().iter().filter(|&(_, module)| !module.started).count() + } + + /// List of all modules within this service + pub fn module_ids(&self) -> Vec { + self.modules.read().unwrap().iter().map(|(module_id, _)| module_id).cloned().collect() + } + + /// Number of modules started and running + pub fn running_count(&self) -> usize { + self.modules.read().unwrap().iter().filter(|&(_, module)| module.started && !module.shutdown).count() + } + + pub fn is_running(&self, id: IpcModuleId) -> bool { + self.modules.read().unwrap().get(&id).map(|module| module.started && !module.shutdown).unwrap_or(false) + } + + pub fn send_shutdown(&self, module_id: IpcModuleId) { + let modules = self.modules.read().unwrap(); + modules.get(&module_id).map(|module| { + trace!(target: "hypervisor", "Sending shutdown to {}({})", module_id, &module.control_url); + let client = nanoipc::fast_client::>(&module.control_url).unwrap(); + client.shutdown(); + trace!(target: "hypervisor", "Sent shutdown to {}", module_id); + }); + } +} + +impl ::ipc::IpcConfig for HypervisorService {} + +impl ::ipc::IpcConfig for ControlService {} diff --git a/ipc/nano/Cargo.toml b/ipc/nano/Cargo.toml new file mode 100644 index 000000000..a714e1d00 --- /dev/null +++ b/ipc/nano/Cargo.toml @@ -0,0 +1,13 @@ +[package] +name = "ethcore-ipc-nano" +version = "1.8.0" +authors = ["Parity Technologies "] +license = "GPL-3.0" + +[features] + +[dependencies] +ethcore-ipc = { path = "../rpc" } +nanomsg = { git = "https://github.com/paritytech/nanomsg.rs.git", branch = "parity-1.7" } +log = "0.3" +lazy_static = "0.2" diff --git a/ipc/nano/src/lib.rs b/ipc/nano/src/lib.rs new file mode 100644 index 000000000..9be3d2b1d --- /dev/null +++ b/ipc/nano/src/lib.rs @@ -0,0 +1,355 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! IPC over nanomsg transport + +extern crate ethcore_ipc as ipc; +extern crate nanomsg; +#[macro_use] extern crate log; +#[macro_use] extern crate lazy_static; + +pub use ipc::{WithSocket, IpcInterface, IpcConfig}; +pub use nanomsg::Socket as NanoSocket; + +use std::sync::*; +use nanomsg::{Socket, Protocol, Error, Endpoint, PollRequest, PollFd, PollInOut}; +use std::ops::Deref; + +const POLL_TIMEOUT: isize = 200; +const DEFAULT_CONNECTION_TIMEOUT: isize = 30000; +const DEBUG_CONNECTION_TIMEOUT: isize = 5000; + +/// Generic worker to handle service (binded) sockets +pub struct Worker where S: IpcInterface { + service: Arc, + sockets: Vec<(Socket, Endpoint)>, + polls: Vec, + buf: Vec, +} + +/// struct for guarding `_endpoint` (so that it wont drop) +/// derefs to client `S` +pub struct GuardedSocket where S: WithSocket { + client: Arc, + _endpoint: Endpoint, +} + +impl GuardedSocket where S: WithSocket { + pub fn service(&self) -> Arc { + self.client.clone() + } +} + +impl Deref for GuardedSocket where S: WithSocket { + type Target = Arc; + + fn deref(&self) -> &Arc { + &self.client + } +} + +/// Spawns client <`S`> over specified address +/// creates socket and connects endpoint to it +/// for duplex (paired) connections with the service +pub fn init_duplex_client(socket_addr: &str) -> Result, SocketError> where S: WithSocket { + let mut socket = Socket::new(Protocol::Pair).map_err(|e| { + warn!(target: "ipc", "Failed to create ipc socket: {:?}", e); + SocketError::DuplexLink + })?; + + socket.set_receive_timeout(DEFAULT_CONNECTION_TIMEOUT).unwrap(); + + let endpoint = socket.connect(socket_addr).map_err(|e| { + warn!(target: "ipc", "Failed to bind socket to address '{}': {:?}", socket_addr, e); + SocketError::DuplexLink + })?; + + Ok(GuardedSocket { + client: Arc::new(S::init(socket)), + _endpoint: endpoint, + }) +} + +/// Spawns client <`S`> over specified address +/// creates socket and connects endpoint to it +/// for request-reply connections to the service +pub fn client(socket_addr: &str, receive_timeout: Option) -> Result, SocketError> where S: WithSocket { + let mut socket = Socket::new(Protocol::Req).map_err(|e| { + warn!(target: "ipc", "Failed to create ipc socket: {:?}", e); + SocketError::RequestLink + })?; + + if let Some(timeout) = receive_timeout { + socket.set_receive_timeout(timeout).unwrap(); + } + + let endpoint = socket.connect(socket_addr).map_err(|e| { + warn!(target: "ipc", "Failed to bind socket to address '{}': {:?}", socket_addr, e); + SocketError::RequestLink + })?; + + trace!(target: "ipc", "Created client for {}", socket_addr); + Ok(GuardedSocket { + client: Arc::new(S::init(socket)), + _endpoint: endpoint, + }) +} + +lazy_static! { + /// Set PARITY_IPC_DEBUG=1 for fail-fast connectivity problems diagnostic + pub static ref DEBUG_FLAG: bool = { + use std::env; + + if let Ok(debug) = env::var("PARITY_IPC_DEBUG") { + debug == "1" || debug.to_uppercase() == "TRUE" + } + else { false } + }; +} + +/// Client with no default timeout on operations +pub fn generic_client(socket_addr: &str) -> Result, SocketError> where S: WithSocket { + if *DEBUG_FLAG { + client(socket_addr, Some(DEBUG_CONNECTION_TIMEOUT)) + } else { + client(socket_addr, None) + } +} + +/// Client over interface that is supposed to give quick almost non-blocking responses +pub fn fast_client(socket_addr: &str) -> Result, SocketError> where S: WithSocket { + if *DEBUG_FLAG { + client(socket_addr, Some(DEBUG_CONNECTION_TIMEOUT)) + } else { + client(socket_addr, Some(DEFAULT_CONNECTION_TIMEOUT)) + } +} + +/// Error occurred while establising socket or endpoint +#[derive(Debug)] +pub enum SocketError { + /// Error establising duplex (paired) socket and/or endpoint + DuplexLink, + /// Error establising duplex (paired) socket and/or endpoint + RequestLink, +} + +impl Worker where S: IpcInterface { + /// New worker over specified `service` + pub fn new(service: &Arc) -> Worker { + Worker:: { + service: service.clone(), + sockets: Vec::new(), + polls: Vec::new(), + buf: Vec::new(), + } + } + + /// Polls all sockets, reads and dispatches method invocations + pub fn poll(&mut self) { + use std::io::Write; + + let mut request = PollRequest::new(&mut self.polls[..]); + let _result_guard = Socket::poll(&mut request, POLL_TIMEOUT); + + for (fd_index, fd) in request.get_fds().iter().enumerate() { + if fd.can_read() { + let (ref mut socket, _) = self.sockets[fd_index]; + unsafe { self.buf.set_len(0); } + match socket.nb_read_to_end(&mut self.buf) { + Ok(method_sign_len) => { + if method_sign_len >= 2 { + + // method_num + let method_num = self.buf[0] as u16 * 256 + self.buf[1] as u16; + // payload + let payload = &self.buf[2..]; + + // dispatching for ipc interface + let result = self.service.dispatch_buf(method_num, payload); + + if let Err(e) = socket.write(&result) { + warn!(target: "ipc", "Failed to write response: {:?}", e); + } + } + else { + warn!(target: "ipc", "Failed to read method signature from socket: unexpected message length({})", method_sign_len); + } + }, + Err(Error::TryAgain) => { + }, + Err(x) => { + warn!(target: "ipc", "Error polling connections {:?}", x); + panic!(); + } + } + } + } + } + + /// Stores nanomsg poll request for reuse + fn rebuild_poll_request(&mut self) { + self.polls = self.sockets.iter() + .map(|&(ref socket, _)| socket.new_pollfd(PollInOut::In)) + .collect::>(); + } + + /// Add exclusive socket for paired client + /// Only one connection over this address is allowed + pub fn add_duplex(&mut self, addr: &str) -> Result<(), SocketError> { + let mut socket = Socket::new(Protocol::Pair).map_err(|e| { + warn!(target: "ipc", "Failed to create ipc socket: {:?}", e); + SocketError::DuplexLink + })?; + + let endpoint = socket.bind(addr).map_err(|e| { + warn!(target: "ipc", "Failed to bind socket to address '{}': {:?}", addr, e); + SocketError::DuplexLink + })?; + + self.sockets.push((socket, endpoint)); + + self.rebuild_poll_request(); + + trace!(target: "ipc", "Started duplex worker at {}", addr); + + Ok(()) + } + + /// Add generic socket for request-reply style communications + /// with multiple clients + pub fn add_reqrep(&mut self, addr: &str) -> Result<(), SocketError> { + let mut socket = Socket::new(Protocol::Rep).map_err(|e| { + warn!(target: "ipc", "Failed to create ipc socket: {:?}", e); + SocketError::DuplexLink + })?; + + + let endpoint = socket.bind(addr).map_err(|e| { + warn!(target: "ipc", "Failed to bind socket to address '{}': {:?}", addr, e); + SocketError::DuplexLink + })?; + + self.sockets.push((socket, endpoint)); + + self.rebuild_poll_request(); + + trace!(target: "ipc", "Started request-reply worker at {}", addr); + Ok(()) + } +} + +#[cfg(test)] +mod service_tests { + + use super::Worker; + use ipc::*; + use std::io::{Read, Write}; + use std::sync::{Arc, RwLock}; + use nanomsg::{Socket, Protocol, Endpoint}; + + struct TestInvoke { + method_num: u16, + params: Vec, + } + + struct DummyService { + methods_stack: RwLock>, + } + + impl DummyService { + fn new() -> DummyService { + DummyService { methods_stack: RwLock::new(Vec::new()) } + } + } + + impl IpcInterface for DummyService { + fn dispatch(&self, _r: &mut R) -> Vec where R: Read { + vec![] + } + fn dispatch_buf(&self, method_num: u16, buf: &[u8]) -> Vec { + self.methods_stack.write().unwrap().push( + TestInvoke { + method_num: method_num, + params: buf.to_vec(), + }); + vec![] + } + } + + impl IpcConfig for DummyService {} + + fn dummy_write(addr: &str, buf: &[u8]) -> (Socket, Endpoint) { + let mut socket = Socket::new(Protocol::Pair).unwrap(); + let endpoint = socket.connect(addr).unwrap(); + socket.write(buf).unwrap(); + (socket, endpoint) + } + + #[test] + fn can_create_worker() { + let worker = Worker::::new(&Arc::new(DummyService::new())); + assert_eq!(0, worker.sockets.len()); + } + + #[test] + fn can_add_duplex_socket_to_worker() { + let mut worker = Worker::::new(&Arc::new(DummyService::new())); + worker.add_duplex("ipc:///tmp/parity-test10.ipc").unwrap(); + assert_eq!(1, worker.sockets.len()); + } + + #[test] + fn worker_can_poll_empty() { + let service = Arc::new(DummyService::new()); + let mut worker = Worker::::new(&service); + worker.add_duplex("ipc:///tmp/parity-test20.ipc").unwrap(); + worker.poll(); + assert_eq!(0, service.methods_stack.read().unwrap().len()); + } + + #[test] + fn worker_can_poll() { + let url = "ipc:///tmp/parity-test30.ipc"; + + let mut worker = Worker::::new(&Arc::new(DummyService::new())); + worker.add_duplex(url).unwrap(); + + let (_socket, _endpoint) = dummy_write(url, &vec![0, 0, 7, 7, 6, 6]); + worker.poll(); + + assert_eq!(1, worker.service.methods_stack.read().unwrap().len()); + assert_eq!(0, worker.service.methods_stack.read().unwrap()[0].method_num); + assert_eq!([7, 7, 6, 6], worker.service.methods_stack.read().unwrap()[0].params[..]); + } + + #[test] + fn worker_can_poll_long() { + let url = "ipc:///tmp/parity-test40.ipc"; + + let mut worker = Worker::::new(&Arc::new(DummyService::new())); + worker.add_duplex(url).unwrap(); + + let message = [0u8; 1024*1024]; + + let (_socket, _endpoint) = dummy_write(url, &message); + worker.poll(); + + assert_eq!(1, worker.service.methods_stack.read().unwrap().len()); + assert_eq!(0, worker.service.methods_stack.read().unwrap()[0].method_num); + assert_eq!(vec![0u8; 1024*1024-2], worker.service.methods_stack.read().unwrap()[0].params); + } +} diff --git a/ipc/rpc/Cargo.toml b/ipc/rpc/Cargo.toml new file mode 100644 index 000000000..12d73a118 --- /dev/null +++ b/ipc/rpc/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "ethcore-ipc" +version = "1.8.0" +authors = ["Parity Technologies "] +license = "GPL-3.0" + +[features] + +[dependencies] +ethcore-devtools = { path = "../../devtools" } +nanomsg = { git = "https://github.com/paritytech/nanomsg.rs.git", branch = "parity-1.7" } +ethcore-bigint = { path = "../../util/bigint"} +ethcore-util = { path = "../../util" } +semver = "0.6" diff --git a/ipc/rpc/src/binary.rs b/ipc/rpc/src/binary.rs new file mode 100644 index 000000000..6466acdb1 --- /dev/null +++ b/ipc/rpc/src/binary.rs @@ -0,0 +1,1196 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! Binary representation of types + +use bigint::prelude::{U256, U512}; +use bigint::hash::{H256, H512, H2048}; +use util::{Address}; +use std::mem; +use std::collections::{VecDeque, BTreeMap}; +use std::ops::Range; +use super::Handshake; + +#[derive(Debug)] +pub enum BinaryConvertErrorKind { + SizeMismatch { + expected: usize, + found: usize, + }, + TargetPayloadEmpty, + UnexpectedVariant(u8), + MissingLengthValue, + InconsistentBoundaries, + NotSupported, +} + +#[derive(Debug)] +pub struct BinaryConvertError { + member_tree: Vec<&'static str>, + kind: BinaryConvertErrorKind, +} + +impl BinaryConvertError { + pub fn size(expected: usize, found: usize) -> BinaryConvertError { + BinaryConvertError { + member_tree: Vec::new(), + kind: BinaryConvertErrorKind::SizeMismatch { + expected: expected, + found: found, + } + } + } + + pub fn empty() -> BinaryConvertError { + BinaryConvertError { member_tree: Vec::new(), kind: BinaryConvertErrorKind::TargetPayloadEmpty } + } + + pub fn variant(val: u8) -> BinaryConvertError { + BinaryConvertError { member_tree: Vec::new(), kind: BinaryConvertErrorKind::UnexpectedVariant(val) } + } + + pub fn length() -> BinaryConvertError { + BinaryConvertError { member_tree: Vec::new(), kind: BinaryConvertErrorKind::MissingLengthValue } + } + + pub fn boundaries() -> BinaryConvertError { + BinaryConvertError { member_tree: Vec::new(), kind: BinaryConvertErrorKind::InconsistentBoundaries } + } + + pub fn not_supported() -> BinaryConvertError { + BinaryConvertError { member_tree: Vec::new(), kind: BinaryConvertErrorKind::NotSupported } + } + + pub fn named(mut self, name: &'static str) -> BinaryConvertError { + self.member_tree.push(name); + self + } +} + +#[derive(Debug)] +pub enum BinaryError { + Serialization(BinaryConvertError), + Io(::std::io::Error), +} + +impl From<::std::io::Error> for BinaryError { + fn from(err: ::std::io::Error) -> Self { BinaryError::Io(err) } +} + +impl From for BinaryError { + fn from(err: BinaryConvertError) -> Self { BinaryError::Serialization(err) } +} + +pub trait BinaryConvertable : Sized { + fn size(&self) -> usize { + mem::size_of::() + } + + fn to_bytes(&self, buffer: &mut [u8], length_stack: &mut VecDeque) -> Result<(), BinaryConvertError>; + + fn from_bytes(buffer: &[u8], length_stack: &mut VecDeque) -> Result; + + fn from_empty_bytes() -> Result { + Err(BinaryConvertError::size(mem::size_of::(), 0)) + } + + fn len_params() -> usize { + 0 + } +} + +impl BinaryConvertable for Option where T: BinaryConvertable { + fn size(&self) -> usize { + match * self { None => 0, Some(ref val) => val.size() } + } + + fn to_bytes(&self, buffer: &mut [u8], length_stack: &mut VecDeque) -> Result<(), BinaryConvertError> { + match *self { None => Err(BinaryConvertError::empty()), Some(ref val) => val.to_bytes(buffer, length_stack) } + } + + fn from_bytes(buffer: &[u8], length_stack: &mut VecDeque) -> Result { + if buffer.len() == 0 { return Self::from_empty_bytes(); } + Ok(Some(T::from_bytes(buffer, length_stack)?)) + } + + fn from_empty_bytes() -> Result { + Ok(None) + } + + fn len_params() -> usize { + 1 + } +} + +impl BinaryConvertable for Result<(), E> { + fn size(&self) -> usize { + match *self { + Ok(_) => 0, + Err(ref e) => e.size(), + } + } + + fn to_bytes(&self, buffer: &mut [u8], length_stack: &mut VecDeque) -> Result<(), BinaryConvertError> { + match *self { + Ok(_) => Err(BinaryConvertError::empty()), + Err(ref e) => Ok(e.to_bytes(buffer, length_stack)?), + } + } + + fn from_bytes(buffer: &[u8], length_stack: &mut VecDeque) -> Result { + Ok(Err(E::from_bytes(&buffer, length_stack)?)) + } + + fn from_empty_bytes() -> Result { + Ok(Ok(())) + } + + fn len_params() -> usize { + 1 + } +} + + +impl BinaryConvertable for Result { + fn size(&self) -> usize { + match *self { + Ok(ref r) => r.size(), + Err(_) => 0, + } + } + + fn to_bytes(&self, buffer: &mut [u8], length_stack: &mut VecDeque) -> Result<(), BinaryConvertError> { + match *self { + Ok(ref r) => Ok(r.to_bytes(buffer, length_stack)?), + Err(_) => Err(BinaryConvertError::empty()), + } + } + + fn from_bytes(buffer: &[u8], length_stack: &mut VecDeque) -> Result { + Ok(Ok(R::from_bytes(&buffer, length_stack)?)) + } + + fn from_empty_bytes() -> Result { + Ok(Err(())) + } + + fn len_params() -> usize { + 1 + } +} + +impl BinaryConvertable for Result { + fn size(&self) -> usize { + 1usize + match *self { + Ok(ref r) => r.size(), + Err(ref e) => e.size(), + } + } + + fn to_bytes(&self, buffer: &mut [u8], length_stack: &mut VecDeque) -> Result<(), BinaryConvertError> { + match *self { + Ok(ref r) => { + buffer[0] = 0; + if r.size() > 0 { + Ok(r.to_bytes(&mut buffer[1..], length_stack)?) + } + else { Ok(()) } + }, + Err(ref e) => { + buffer[0] = 1; + if e.size() > 0 { + Ok(e.to_bytes(&mut buffer[1..], length_stack)?) + } + else { Ok(()) } + }, + } + } + + fn from_bytes(buffer: &[u8], length_stack: &mut VecDeque) -> Result { + match buffer[0] { + 0 => { + match buffer.len() { + 1 => Ok(Ok(R::from_empty_bytes()?)), + _ => Ok(Ok(R::from_bytes(&buffer[1..], length_stack)?)), + } + } + 1 => Ok(Err(E::from_bytes(&buffer[1..], length_stack)?)), + _ => Err(BinaryConvertError::variant(buffer[0])) + } + } + + fn len_params() -> usize { + 1 + } +} + +impl BinaryConvertable for BTreeMap where K : BinaryConvertable + Ord, V: BinaryConvertable { + fn size(&self) -> usize { + 0usize + match K::len_params() { + 0 => mem::size_of::() * self.len(), + _ => self.iter().fold(0usize, |acc, (k, _)| acc + k.size()) + } + match V::len_params() { + 0 => mem::size_of::() * self.len(), + _ => self.iter().fold(0usize, |acc, (_, v)| acc + v.size()) + } + } + + fn to_bytes(&self, buffer: &mut [u8], length_stack: &mut VecDeque) -> Result<(), BinaryConvertError> { + let mut offset = 0usize; + for (key, val) in self.iter() { + let key_size = match K::len_params() { + 0 => mem::size_of::(), + _ => { let size = key.size(); length_stack.push_back(size); size } + }; + let val_size = match K::len_params() { + 0 => mem::size_of::(), + _ => { let size = val.size(); length_stack.push_back(size); size } + }; + + if key_size > 0 { + let item_end = offset + key_size; + key.to_bytes(&mut buffer[offset..item_end], length_stack)?; + offset = item_end; + } + + if val_size > 0 { + let item_end = offset + key_size; + val.to_bytes(&mut buffer[offset..item_end], length_stack)?; + offset = item_end; + } + } + Ok(()) + } + + fn from_bytes(buffer: &[u8], length_stack: &mut VecDeque) -> Result { + let mut index = 0; + let mut result = Self::new(); + + if buffer.len() == 0 { return Ok(result); } + + loop { + let key_size = match K::len_params() { + 0 => mem::size_of::(), + _ => length_stack.pop_front().ok_or(BinaryConvertError::length())?, + }; + let key = if key_size == 0 { + K::from_empty_bytes()? + } else { + if index + key_size > buffer.len() { + return Err(BinaryConvertError::boundaries()) + } + K::from_bytes(&buffer[index..index+key_size], length_stack)? + }; + index = index + key_size; + + let val_size = match V::len_params() { + 0 => mem::size_of::(), + _ => length_stack.pop_front().ok_or(BinaryConvertError::length())?, + }; + let val = if val_size == 0 { + V::from_empty_bytes()? + } else { + if index + val_size > buffer.len() { + return Err(BinaryConvertError::boundaries()) + } + V::from_bytes(&buffer[index..index+val_size], length_stack)? + }; + result.insert(key, val); + index = index + val_size; + + if index == buffer.len() { break; } + if index > buffer.len() { + return Err(BinaryConvertError::boundaries()) + } + } + + Ok(result) + } + + fn from_empty_bytes() -> Result { + Ok(Self::new()) + } + + fn len_params() -> usize { + 1 + } +} + +impl BinaryConvertable for VecDeque where T: BinaryConvertable { + fn size(&self) -> usize { + match T::len_params() { + 0 => mem::size_of::() * self.len(), + _ => self.iter().fold(0usize, |acc, t| acc + t.size()), + } + } + + fn to_bytes(&self, buffer: &mut [u8], length_stack: &mut VecDeque) -> Result<(), BinaryConvertError> { + let mut offset = 0usize; + for item in self.iter() { + let next_size = match T::len_params() { + 0 => mem::size_of::(), + _ => { let size = item.size(); length_stack.push_back(size); size }, + }; + if next_size > 0 { + let item_end = offset + next_size; + item.to_bytes(&mut buffer[offset..item_end], length_stack)?; + offset = item_end; + } + } + Ok(()) + } + + fn from_bytes(buffer: &[u8], length_stack: &mut VecDeque) -> Result { + let mut index = 0; + let mut result = Self::with_capacity( + match T::len_params() { + 0 => buffer.len() / mem::size_of::(), + _ => 128, + }); + + if buffer.len() == 0 { return Ok(result); } + + loop { + let next_size = match T::len_params() { + 0 => mem::size_of::(), + _ => length_stack.pop_front().ok_or(BinaryConvertError::length())?, + }; + let item = if next_size == 0 { + T::from_empty_bytes()? + } + else { + if index + next_size > buffer.len() { + return Err(BinaryConvertError::boundaries()) + } + T::from_bytes(&buffer[index..index+next_size], length_stack)? + }; + result.push_back(item); + + index = index + next_size; + if index == buffer.len() { break; } + if index > buffer.len() { + return Err(BinaryConvertError::boundaries()) + } + } + + Ok(result) + } + + fn from_empty_bytes() -> Result { + Ok(Self::new()) + } + + fn len_params() -> usize { + 1 + } +} + +impl BinaryConvertable for Vec where T: BinaryConvertable { + fn size(&self) -> usize { + match T::len_params() { + 0 => mem::size_of::() * self.len(), + _ => self.iter().fold(0usize, |acc, t| acc + t.size()), + } + } + + fn to_bytes(&self, buffer: &mut [u8], length_stack: &mut VecDeque) -> Result<(), BinaryConvertError> { + let mut offset = 0usize; + for item in self.iter() { + let next_size = match T::len_params() { + 0 => mem::size_of::(), + _ => { let size = item.size(); length_stack.push_back(size); size }, + }; + if next_size > 0 { + let item_end = offset + next_size; + item.to_bytes(&mut buffer[offset..item_end], length_stack)?; + offset = item_end; + } + } + Ok(()) + } + + fn from_bytes(buffer: &[u8], length_stack: &mut VecDeque) -> Result { + let mut index = 0; + let mut result = Self::with_capacity( + match T::len_params() { + 0 => buffer.len() / mem::size_of::(), + _ => 128, + }); + + if buffer.len() == 0 { return Ok(result); } + + loop { + let next_size = match T::len_params() { + 0 => mem::size_of::(), + _ => length_stack.pop_front().ok_or(BinaryConvertError::length())?, + }; + let item = if next_size == 0 { + T::from_empty_bytes()? + } + else { + if index + next_size > buffer.len() { + return Err(BinaryConvertError::boundaries()) + } + T::from_bytes(&buffer[index..index+next_size], length_stack)? + }; + result.push(item); + + index = index + next_size; + if index == buffer.len() { break; } + if index > buffer.len() { + return Err(BinaryConvertError::boundaries()) + } + } + + Ok(result) + } + + fn from_empty_bytes() -> Result { + Ok(Self::new()) + } + + fn len_params() -> usize { + 1 + } +} + +impl BinaryConvertable for String { + fn size(&self) -> usize { + self.as_bytes().len() + } + + fn from_empty_bytes() -> Result { + Ok(String::new()) + } + + fn to_bytes(&self, buffer: &mut [u8], _length_stack: &mut VecDeque) -> Result<(), BinaryConvertError> { + buffer[..].clone_from_slice(self.as_bytes()); + Ok(()) + } + + fn from_bytes(buffer: &[u8], _length_stack: &mut VecDeque) -> Result { + Ok(::std::str::from_utf8(buffer).unwrap().to_owned()) + } + + fn len_params() -> usize { + 1 + } +} + +impl BinaryConvertable for Range where T: BinaryConvertable { + fn size(&self) -> usize { + mem::size_of::() * 2 + } + + fn from_empty_bytes() -> Result { + Err(BinaryConvertError::empty()) + } + + fn to_bytes(&self, buffer: &mut[u8], length_stack: &mut VecDeque) -> Result<(), BinaryConvertError> { + self.start.to_bytes(&mut buffer[..mem::size_of::()], length_stack)?; + self.end.to_bytes(&mut buffer[mem::size_of::() + 1..], length_stack)?; + Ok(()) + } + + fn from_bytes(buffer: &[u8], length_stack: &mut VecDeque) -> Result { + Ok(T::from_bytes(&buffer[..mem::size_of::()], length_stack)?..T::from_bytes(&buffer[mem::size_of::()+1..], length_stack)?) + } + + fn len_params() -> usize { + assert_eq!(0, T::len_params()); + 0 + } +} + +impl BinaryConvertable for ::std::cell::RefCell where T: BinaryConvertable { + fn size(&self) -> usize { + self.borrow().size() + } + + fn from_empty_bytes() -> Result { + Ok(::std::cell::RefCell::new(T::from_empty_bytes()?)) + } + + fn from_bytes(buffer: &[u8], length_stack: &mut VecDeque) -> Result { + Ok(::std::cell::RefCell::new(T::from_bytes(buffer, length_stack)?)) + } + + fn to_bytes(&self, buffer: &mut [u8], length_stack: &mut VecDeque) -> Result<(), BinaryConvertError> { + self.borrow().to_bytes(buffer, length_stack)?; + Ok(()) + } + + fn len_params() -> usize { + T::len_params() + } +} + +impl BinaryConvertable for ::std::cell::Cell where T: BinaryConvertable + Copy { + fn size(&self) -> usize { + self.get().size() + } + + fn from_empty_bytes() -> Result { + Ok(::std::cell::Cell::new(T::from_empty_bytes()?)) + } + + fn from_bytes(buffer: &[u8], length_stack: &mut VecDeque) -> Result { + Ok(::std::cell::Cell::new(T::from_bytes(buffer, length_stack)?)) + } + + fn to_bytes(&self, buffer: &mut [u8], length_stack: &mut VecDeque) -> Result<(), BinaryConvertError> { + self.get().to_bytes(buffer, length_stack)?; + Ok(()) + } + + fn len_params() -> usize { + T::len_params() + } +} + +impl BinaryConvertable for Vec { + fn size(&self) -> usize { + self.len() + } + + fn from_empty_bytes() -> Result { + Ok(Vec::new()) + } + + fn to_bytes(&self, buffer: &mut [u8], _length_stack: &mut VecDeque) -> Result<(), BinaryConvertError> { + buffer[..].clone_from_slice(&self[..]); + Ok(()) + } + + fn from_bytes(buffer: &[u8], _length_stack: &mut VecDeque) -> Result { + let mut res = Self::with_capacity(buffer.len()); + unsafe { res.set_len(buffer.len()) } + res[..].clone_from_slice(&buffer[..]); + Ok(res) + } + + fn len_params() -> usize { + 1 + } +} + +pub fn deserialize_from(r: &mut R) -> Result + where R: ::std::io::Read, + T: BinaryConvertable +{ + let mut fake_stack = VecDeque::new(); + + match T::len_params() { + 0 => { + let fixed_size = mem::size_of::(); + let mut payload_buffer = Vec::with_capacity(fixed_size); + unsafe { payload_buffer.set_len(fixed_size); } + let bytes_read = r.read(&mut payload_buffer)?; + if bytes_read != mem::size_of::() { + return Err(BinaryError::Serialization(BinaryConvertError::size(fixed_size, bytes_read))) + } + Ok(T::from_bytes(&payload_buffer[..], &mut fake_stack)?) + }, + _ => { + let mut payload = Vec::new(); + r.read_to_end(&mut payload)?; + + let stack_len = u64::from_bytes(&payload[0..8], &mut fake_stack)? as usize; + let mut length_stack = VecDeque::::with_capacity(stack_len); + + if stack_len > 0 { + for idx in 0..stack_len { + let stack_item = u64::from_bytes(&payload[8 + idx*8..8 + (idx+1)*8], &mut fake_stack)?; + length_stack.push_back(stack_item as usize); + } + } + + let size = u64::from_bytes(&payload[8+stack_len*8..16+stack_len*8], &mut fake_stack)? as usize; + match size { + 0 => { + Ok(T::from_empty_bytes()?) + }, + _ => { + Ok(T::from_bytes(&payload[16+stack_len*8..], &mut length_stack)?) + } + } + }, + } +} + +pub fn deserialize(buffer: &[u8]) -> Result { + use std::io::Cursor; + let mut buff = Cursor::new(buffer); + deserialize_from::(&mut buff) +} + +pub fn serialize_into(t: &T, w: &mut W) -> Result<(), BinaryError> + where W: ::std::io::Write, + T: BinaryConvertable +{ + let mut fake_stack = VecDeque::new(); + + match T::len_params() { + 0 => { + let fixed_size = mem::size_of::(); + let mut buffer = Vec::with_capacity(fixed_size); + unsafe { buffer.set_len(fixed_size); } + t.to_bytes(&mut buffer[..], &mut fake_stack)?; + w.write(&buffer[..])?; + Ok(()) + }, + _ => { + let mut length_stack = VecDeque::::new(); + let mut size_buffer = [0u8; 8]; + + let size = t.size(); + if size == 0 { + w.write(&size_buffer)?; + w.write(&size_buffer)?; + return Ok(()); + } + + let mut buffer = Vec::with_capacity(size); + unsafe { buffer.set_len(size); } + t.to_bytes(&mut buffer[..], &mut length_stack)?; + + let stack_len = length_stack.len(); + (stack_len as u64).to_bytes(&mut size_buffer[..], &mut fake_stack)?; + w.write(&size_buffer[..])?; + if stack_len > 0 { + let mut header_buffer = Vec::with_capacity(stack_len * 8); + unsafe { header_buffer.set_len(stack_len * 8); }; + (stack_len as u64).to_bytes(&mut header_buffer[0..8], &mut fake_stack)?; + let mut idx = 0; + loop { + match length_stack.pop_front() { + Some(val) => (val as u64).to_bytes(&mut header_buffer[idx * 8..(idx+1) * 8], &mut fake_stack)?, + None => { break; } + } + idx = idx + 1; + } + w.write(&header_buffer[..])?; + } + + (size as u64).to_bytes(&mut size_buffer[..], &mut fake_stack)?; + w.write(&size_buffer[..])?; + + w.write(&buffer[..])?; + + Ok(()) + }, + } +} + +pub fn serialize(t: &T) -> Result, BinaryError> { + use std::io::Cursor; + let mut buff = Cursor::new(Vec::new()); + serialize_into(t, &mut buff)?; + let into_inner = buff.into_inner(); + Ok(into_inner) +} + +#[macro_export] +macro_rules! binary_fixed_size { + ($target_ty: ty) => { + impl BinaryConvertable for $target_ty where $target_ty: Copy { + fn from_bytes(bytes: &[u8], _length_stack: &mut ::std::collections::VecDeque) -> Result { + let size = ::std::mem::size_of::<$target_ty>(); + match bytes.len().cmp(&size) { + ::std::cmp::Ordering::Equal => (), + _ => return Err(BinaryConvertError::size(size, bytes.len())), + }; + let res: Self = unsafe { + let mut temp = ::std::mem::zeroed(); + let temp_ptr = &mut temp as *mut _ as *mut u8; + ::std::ptr::copy_nonoverlapping(bytes.as_ptr(), temp_ptr, size); + + temp + }; + + Ok(res) + } + + fn to_bytes(&self, buffer: &mut [u8], _length_stack: &mut ::std::collections::VecDeque) -> Result<(), BinaryConvertError> { + let sz = ::std::mem::size_of::<$target_ty>(); + let ip: *const $target_ty = self; + let ptr: *const u8 = ip as *const _; + unsafe { + ::std::ptr::copy(ptr, buffer.as_mut_ptr(), sz); + } + Ok(()) + } + } + } +} + +/// Fixed-sized version of Handshake struct +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct BinHandshake { + api_version: BinVersion, + protocol_version: BinVersion, +} + +/// Shorten version of semver Version without `pre` and `build` information +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub struct BinVersion { + pub major: u64, + pub minor: u64, + pub patch: u64, +} + +impl From for BinHandshake { + fn from(other: Handshake) -> Self { + BinHandshake { + api_version: BinVersion::from(other.api_version), + protocol_version: BinVersion::from(other.protocol_version), + } + } +} + +impl BinHandshake { + pub fn to_semver(self) -> Handshake { + Handshake { + api_version: self.api_version.to_semver(), + protocol_version: self.protocol_version.to_semver(), + } + } +} + +impl BinVersion { + pub fn to_semver(self) -> ::semver::Version { + ::semver::Version { + major: self.major, + minor: self.minor, + patch: self.patch, + pre: vec![], + build: vec![], + } + } +} + +impl From<::semver::Version> for BinVersion { + fn from(other: ::semver::Version) -> Self { + BinVersion { + major: other.major, + minor: other.minor, + patch: other.patch, + } + } +} + +binary_fixed_size!(u16); +binary_fixed_size!(u64); +binary_fixed_size!(u32); +binary_fixed_size!(usize); +binary_fixed_size!(i32); +binary_fixed_size!(bool); +binary_fixed_size!(U256); +binary_fixed_size!(U512); +binary_fixed_size!(H256); +binary_fixed_size!(H512); +binary_fixed_size!(H2048); +binary_fixed_size!(Address); +binary_fixed_size!(BinHandshake); +binary_fixed_size!(BinVersion); + +impl BinaryConvertable for ::semver::Version { + fn from_bytes(bytes: &[u8], length_stack: &mut ::std::collections::VecDeque) -> Result { + BinVersion::from_bytes(bytes, length_stack).map(BinVersion::to_semver) + } + + fn to_bytes(&self, buffer: &mut [u8], length_stack: &mut ::std::collections::VecDeque) -> Result<(), BinaryConvertError> { + BinVersion::from(self.clone()).to_bytes(buffer, length_stack) + } +} + +#[test] +fn vec_serialize() { + let mut v = Vec::new(); + v.push(5u64); + v.push(10u64); + let mut length_stack = VecDeque::new(); + let mut data = Vec::with_capacity(v.size()); + unsafe { data.set_len(v.size()); } + let result = v.to_bytes(&mut data[..], &mut length_stack); + + assert!(result.is_ok()); + assert_eq!(5, data[0]); + assert_eq!(0, data[1]); + assert_eq!(10, data[8]); + assert_eq!(0, data[12]); +} + +#[test] +fn calculates_size() { + let mut v = Vec::new(); + v.push(5u64); + v.push(10u64); + + assert_eq!(16, v.size()); +} + +#[test] +fn vec_deserialize() { + let data = [ + 10u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 5u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + ]; + + let mut length_stack = VecDeque::new(); + let vec = Vec::::from_bytes(&data[..], &mut length_stack).unwrap(); + + assert_eq!(vec![10u64, 5u64], vec); +} + +#[test] +fn vec_deserialize_chained() { + let mut v = Vec::new(); + v.push(Some(5u64)); + v.push(Some(10u64)); + v.push(None); + v.push(Some(12u64)); + + let mut length_stack = VecDeque::new(); + let mut data = Vec::with_capacity(v.size()); + unsafe { data.set_len(v.size()); } + let result = v.to_bytes(&mut data[..], &mut length_stack); + + assert!(result.is_ok()); + assert_eq!(4, length_stack.len()); +} + +#[test] +fn vec_serialize_deserialize() { + let mut v = Vec::new(); + v.push(Some(5u64)); + v.push(None); + v.push(Some(10u64)); + v.push(None); + v.push(Some(12u64)); + + + let mut data = Vec::with_capacity(v.size()); + unsafe { data.set_len(v.size()); } + let mut length_stack = VecDeque::new(); + + v.to_bytes(&mut data[..], &mut length_stack).unwrap(); + let de_v = Vec::>::from_bytes(&data[..], &mut length_stack).unwrap(); + + assert_eq!(v, de_v); +} + +#[test] +fn serialize_into_ok() { + use std::io::Cursor; + let mut buff = Cursor::new(vec![0; 128]); + + let mut v = Vec::new(); + v.push(Some(5u64)); + v.push(None); + v.push(Some(10u64)); + v.push(None); + v.push(Some(12u64)); + + serialize_into(&v, &mut buff).unwrap(); + assert_eq!(5, buff.get_ref()[0]); + assert_eq!(8, buff.get_ref()[8]); + assert_eq!(0, buff.get_ref()[16]); + assert_eq!(8, buff.get_ref()[24]); +} + +#[test] +fn deserialize_from_ok() { + use std::io::Cursor; + let mut buff = Cursor::new(vec![ + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 16u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 10u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 5u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + ]); + + let vec = deserialize_from::, _>(&mut buff).unwrap(); + + assert_eq!(vec![10u64, 5u64], vec); +} + +#[test] +fn serialize_into_deserialize_from() { + use std::io::{Cursor, SeekFrom, Seek}; + + let mut buff = Cursor::new(Vec::new()); + let mut v = Vec::new(); + v.push(Some(5u64)); + v.push(None); + v.push(Some(10u64)); + v.push(None); + v.push(Some(12u64)); + + serialize_into(&v, &mut buff).unwrap(); + buff.seek(SeekFrom::Start(0)).unwrap(); + let de_v = deserialize_from::>, _>(&mut buff).unwrap(); + assert_eq!(v, de_v); +} + +#[test] +fn serialize_vec_str() { + // empty + let source = Vec::::new(); + let serialized = serialize(&source).unwrap(); + let deserialized = deserialize::>(&serialized).unwrap(); + + assert_eq!(source, deserialized); + + // with few values + let mut source = Vec::::new(); + source.push("val1".to_owned()); + source.push("val2".to_owned()); + let serialized = serialize(&source).unwrap(); + let deserialized = deserialize::>(&serialized).unwrap(); + + assert_eq!(source, deserialized); +} + +#[test] +fn serialize_opt_str() { + // none + let source: Option = None; + let serialized = serialize(&source).unwrap(); + let deserialized = deserialize::>(&serialized).unwrap(); + + assert_eq!(source, deserialized); + + // value + let source: Option = Some("i have value".to_owned()); + let serialized = serialize(&source).unwrap(); + let deserialized = deserialize::>(&serialized).unwrap(); + + assert_eq!(source, deserialized); +} + +#[test] +fn serialize_opt_vec() { + use std::io::Cursor; + + let mut buff = Cursor::new(Vec::new()); + let optional_vec: Option> = None; + serialize_into(&optional_vec, &mut buff).unwrap(); + + assert_eq!(&vec![0u8; 16], buff.get_ref()); +} + +#[test] +fn serialize_opt_vec_payload() { + let optional_vec: Option> = None; + let payload = serialize(&optional_vec).unwrap(); + + assert_eq!(vec![0u8;16], payload); +} + +#[test] +fn deserialize_opt_vec() { + use std::io::Cursor; + let mut buff = Cursor::new(vec![0u8; 16]); + + let vec = deserialize_from::>, _>(&mut buff).unwrap(); + + assert!(vec.is_none()); +} + +#[test] +fn deserialize_simple_err() { + use std::io::Cursor; + let mut buff = Cursor::new(vec![0u8; 16]); + + let result = deserialize_from::, _>(&mut buff).unwrap(); + + assert!(result.is_ok()); +} + +#[test] +fn serialize_opt_vec_in_out() { + use std::io::{Cursor, SeekFrom, Seek}; + + let mut buff = Cursor::new(Vec::new()); + let optional_vec: Option> = None; + serialize_into(&optional_vec, &mut buff).unwrap(); + + buff.seek(SeekFrom::Start(0)).unwrap(); + let vec = deserialize_from::>, _>(&mut buff).unwrap(); + + assert!(vec.is_none()); +} + +#[test] +fn serialize_err_opt_vec_in_out() { + use std::io::{Cursor, SeekFrom, Seek}; + + let mut buff = Cursor::new(Vec::new()); + let optional_vec: Result>, u32> = Ok(None); + serialize_into(&optional_vec, &mut buff).unwrap(); + + buff.seek(SeekFrom::Start(0)).unwrap(); + let vec = deserialize_from::>, u32>, _>(&mut buff).unwrap(); + + assert!(vec.is_ok()); +} + +#[test] +fn serialize_btree() { + use std::io::{Cursor, SeekFrom, Seek}; + + let mut buff = Cursor::new(Vec::new()); + let mut btree = BTreeMap::new(); + btree.insert(1u64, 5u64); + serialize_into(&btree, &mut buff).unwrap(); + + buff.seek(SeekFrom::Start(0)).unwrap(); + let res = deserialize_from::, _>(&mut buff).unwrap(); + + assert_eq!(res[&1u64], 5u64); +} + +#[test] +fn serialize_refcell() { + use std::cell::RefCell; + + let source = RefCell::new(vec![5u32, 12u32, 19u32]); + let serialized = serialize(&source).unwrap(); + let deserialized = deserialize::>>(&serialized).unwrap(); + + assert_eq!(source, deserialized); +} + +#[test] +fn serialize_cell() { + use std::cell::Cell; + use std::str::FromStr; + + let source = Cell::new(U256::from_str("01231231231239999").unwrap()); + let serialized = serialize(&source).unwrap(); + let deserialized = deserialize::>(&serialized).unwrap(); + + assert_eq!(source, deserialized); +} + +#[test] +fn serialize_handshake() { + use std::io::{Cursor, SeekFrom, Seek}; + + let mut buff = Cursor::new(Vec::new()); + + let handshake = Handshake { + api_version: ::semver::Version::parse("1.2.0").unwrap(), + protocol_version: ::semver::Version::parse("1.2.0").unwrap(), + }; + + serialize_into(&BinHandshake::from(handshake.clone()), &mut buff).unwrap(); + + buff.seek(SeekFrom::Start(0)).unwrap(); + let res = deserialize_from::(&mut buff).unwrap().to_semver(); + + assert_eq!(res, handshake); +} + +#[test] +fn serialize_invalid_size() { + // value + let deserialized = deserialize::(&[]); + match deserialized { + Err(BinaryError::Serialization( + BinaryConvertError { + kind: BinaryConvertErrorKind::SizeMismatch { expected: 8, found: 0 }, + member_tree: _ + })) => {}, + other => panic!("Not a size mismatched error but: {:?}", other), + } +} + +#[test] +fn serialize_boundaries() { + // value + let deserialized = deserialize::>( + &[ + // payload header + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 2u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + // + 0u8, 0u8, 0u8, 5u8, + 0u8, 0u8, 0u8, 4u8, + 1u8, 1u8, /* not 4 bytes */ + ] + ); + match deserialized { + Err(BinaryError::Serialization( + BinaryConvertError { + kind: BinaryConvertErrorKind::InconsistentBoundaries, + member_tree: _ + })) => {}, + other => panic!("Not an inconsistent boundaries error but: {:?}", other), + } +} + +#[test] +fn serialize_empty_try() { + // value + let mut stack = VecDeque::new(); + let mut data = vec![0u8; 16]; + let sample: Option> = None; + let serialized = sample.to_bytes(&mut data, &mut stack); + match serialized { + Err(BinaryConvertError { + kind: BinaryConvertErrorKind::TargetPayloadEmpty, + member_tree: _ + }) => {}, + other => panic!("Not an error about empty payload to be produced but: {:?}", other), + } +} + +#[test] +fn serialize_not_enough_lengths() { + // value + let deserialized = deserialize::>>( + &[ + // payload header + 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + 2u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, 0u8, + // does not matter because no length param for the first option + 0u8, + ] + ); + match deserialized { + Err(BinaryError::Serialization( + BinaryConvertError { + kind: BinaryConvertErrorKind::MissingLengthValue, + member_tree: _ + })) => {}, + other => panic!("Not an missing length param error but: {:?}", other), + } +} + +#[test] +fn vec_of_vecs() { + let sample = vec![vec![5u8, 10u8], vec![], vec![9u8, 11u8]]; + let serialized = serialize(&sample).unwrap(); + let deserialized = deserialize::>>(&serialized).unwrap(); + assert_eq!(sample, deserialized); + + // empty + let sample: Vec> = vec![]; + let serialized = serialize(&sample).unwrap(); + let deserialized = deserialize::>>(&serialized).unwrap(); + assert_eq!(sample, deserialized); +} diff --git a/ipc/rpc/src/interface.rs b/ipc/rpc/src/interface.rs new file mode 100644 index 000000000..c3e82fef4 --- /dev/null +++ b/ipc/rpc/src/interface.rs @@ -0,0 +1,106 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! IPC RPC interface + +use std::io::{Read, Write}; +use std::marker::Sync; +use semver::Version; + +#[derive(Debug, PartialEq, Eq, Clone)] +/// Handshake for client and server to negotiate api/protocol version +pub struct Handshake { + pub protocol_version: Version, + pub api_version: Version, +} + +/// Allows to configure custom version and custom handshake response for +/// ipc host +pub trait IpcConfig { + /// Current service api version + /// Should be increased if any of the methods changes signature + fn api_version() -> Version { + Version::parse("1.0.0").unwrap() + } + + /// Current ipc protocol version + /// Should be increased only if signature of system methods changes + fn protocol_version() -> Version { + Version::parse("1.0.0").unwrap() + } + + /// Default handshake requires exact versions match + fn handshake(handshake: &Handshake) -> bool { + handshake.protocol_version == Self::protocol_version() && + handshake.api_version == Self::api_version() + } +} + +/// Error in dispatching or invoking methods via IPC +#[derive(Debug)] +pub enum Error { + UnkownSystemCall, + ClientUnsupported, + RemoteServiceUnsupported, + HandshakeFailed, +} + +/// Allows implementor to be attached to generic worker and dispatch rpc requests +/// over IPC +pub trait IpcInterface : IpcConfig { + /// reads the message from io, dispatches the call and returns serialized result + fn dispatch(&self, r: &mut R) -> Vec where R: Read; + + /// deserializes the payload from buffer, dispatches invoke and returns serialized result + /// (for non-blocking io) + fn dispatch_buf(&self, method_num: u16, buf: &[u8]) -> Vec; +} + +/// serializes method invocation (method_num and parameters) to the stream specified by `w` +pub fn invoke(method_num: u16, params: &Option>, w: &mut W) where W: Write { + // creating buffer to contain all message + let buf_len = match *params { None => 2, Some(ref val) => val.len() + 2 }; + let mut buf = vec![0u8; buf_len]; + + // writing method_num as u16 + buf[1] = (method_num & 255) as u8; + buf[0] = (method_num >> 8) as u8; + + // serializing parameters only if provided with any + if params.is_some() { + buf[2..buf_len].clone_from_slice(params.as_ref().unwrap()); + } + + if w.write(&buf).unwrap() != buf_len + { + // if write was inconsistent + panic!("failed to write to socket"); + } +} + +/// IpcSocket, read/write generalization +pub trait IpcSocket: Read + Write + Sync + Send { +} + +/// Basically something that needs only socket to be spawned +pub trait WithSocket { + fn init(socket: S) -> Self; +} + + +impl IpcSocket for ::devtools::TestSocket {} + +impl IpcSocket for ::nanomsg::Socket {} diff --git a/ipc/rpc/src/lib.rs b/ipc/rpc/src/lib.rs new file mode 100644 index 000000000..c6aff23b5 --- /dev/null +++ b/ipc/rpc/src/lib.rs @@ -0,0 +1,28 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +//! IPC RPC interface + +extern crate ethcore_devtools as devtools; +extern crate semver; +extern crate nanomsg; +extern crate ethcore_util as util; +extern crate ethcore_bigint as bigint; + +pub mod interface; +pub mod binary; +pub use interface::{IpcInterface, IpcSocket, invoke, IpcConfig, Handshake, Error, WithSocket}; +pub use binary::{BinaryConvertable, BinaryConvertError, BinVersion, BinHandshake}; diff --git a/ipc/tests/Cargo.toml b/ipc/tests/Cargo.toml new file mode 100644 index 000000000..89a4f98c5 --- /dev/null +++ b/ipc/tests/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "ethcore-ipc-tests" +version = "0.1.0" +authors = ["Parity Technologies "] +build = "build.rs" + +[lib] +path = "run.rs" + +[dependencies] +ethcore-ipc = { path = "../rpc" } +ethcore-devtools = { path = "../../devtools" } +semver = "0.6" +nanomsg = { git = "https://github.com/paritytech/nanomsg.rs.git", branch = "parity-1.7" } +ethcore-ipc-nano = { path = "../nano" } +ethcore-util = { path = "../../util" } +log = "0.3" + +[build-dependencies] +ethcore-ipc-codegen = { path = "../codegen" } diff --git a/ipc/tests/binary.rs b/ipc/tests/binary.rs new file mode 100644 index 000000000..6eb1da852 --- /dev/null +++ b/ipc/tests/binary.rs @@ -0,0 +1,19 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +#![allow(dead_code, unused_assignments, unused_variables)] // codegen issues + +include!(concat!(env!("OUT_DIR"), "/binary.rs.in")); diff --git a/ipc/tests/binary.rs.in b/ipc/tests/binary.rs.in new file mode 100644 index 000000000..dfc020c45 --- /dev/null +++ b/ipc/tests/binary.rs.in @@ -0,0 +1,169 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + + +use util::Bytes; + +#[binary] +pub enum Root { + Top, + Middle(u32, u64), +} + +#[derive(PartialEq, Debug)] +#[binary] +pub struct DoubleRoot { + pub x1: u32, + pub x2: u64, + pub x3: u32, +} + +#[derive(PartialEq, Debug)] +#[binary] +pub struct ReferenceStruct<'a> { + pub ref_data: &'a u64, +} + +#[derive(PartialEq, Debug)] +#[binary] +pub enum EnumWithStruct { + Left, + Right { how_much: u64 }, +} + +#[binary] +pub struct TwoVec { + v1: Vec, + v2: Vec, +} + +#[binary] +struct ChunkSet { + items: Vec, +} + +#[test] +fn opt_two_vec() { + let example: Option = None; + + let serialized = ::ipc::binary::serialize(&example).unwrap(); + assert_eq!(serialized, vec![0u8; 16]); +} + +#[test] +fn enum_with_struct() { + let example = EnumWithStruct::Right { how_much: 15 }; + let serialized = ::ipc::binary::serialize(&example).unwrap(); + let deserialized = ::ipc::binary::deserialize::(&serialized).unwrap(); + assert_eq!(example, deserialized); +} + +#[test] +fn chunks() { + let sample: Vec = vec! [ + 15, 0, 0, 0, 0, 0, 0, 0, 81, 6, 0, 0, 0, 0, 0, 0, + 110, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, + 173, 0, 0, 0, 0, 0, 0, 0, 103, 0, 0, 0, 0, 0, 0, 0, + 112, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, + 107, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, + 114, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, + 114, 0, 0, 0, 0, 0, 0, 0, 112, 0, 0, 0, 0, 0, 0, 0, + 81, 6, 0, 0, 0, 0, 0, 0, + + 248, 108, 58, 133, 4, 168, 23, 200, 0, 130, 82, 8, 148, 182, 54, + 177, 224, 198, 163, 123, 250, 122, 157, 158, 75, 138, 30, 7, 83, 91, 141, 56, 46, 136, 2, + 197, 12, 243, 220, 69, 192, 0, 128, 28, 160, 32, 232, 123, 221, 90, 116, 93, 94, 136, 78, + 235, 200, 167, 154, 3, 175, 74, 53, 133, 32, 239, 199, 169, 46, 95, 111, 114, 204, 19, 138, + 15, 167, 160, 103, 72, 60, 241, 165, 248, 130, 213, 45, 166, 249, 102, 83, 87, 98, 153, + 68, 58, 13, 83, 193, 182, 217, 182, 9, 241, 217, 28, 162, 152, 114, 136, 248, 110, 130, 6, + 96, 133, 4, 168, 23, 200, 0, 131, 1, 95, 144, 148, 100, 131, 212, 219, 190, 174, 5, 47, + 105, 201, 11, 11, 210, 108, 207, 242, 164, 74, 218, 19, 135, 6, 10, 36, 24, 30, 64, 0, + 128, 27, 160, 206, 145, 163, 186, 24, 122, 126, 115, 80, 203, 152, 219, 160, 243, 1, 139, + 109, 199, 115, 50, 159, 197, 95, 184, 174, 53, 150, 3, 200, 82, 138, 22, 160, 119, 226, + 202, 208, 136, 165, 174, 240, 216, 222, 27, 214, 12, 213, 250, 68, 214, 144, 120, 53, 158, + 46, 124, 105, 87, 220, 213, 192, 28, 81, 118, 6, 248, 110, 130, 6, 95, 133, 4, 168, 23, + 200, 0, 131, 1, 95, 144, 148, 100, 131, 212, 219, 190, 174, 5, 47, 105, 201, 11, 11, 210, + 108, 207, 242, 164, 74, 218, 19, 135, 6, 10, 36, 24, 30, 64, 0, 128, 27, 160, 19, 172, 66, + 208, 28, 189, 213, 239, 125, 170, 127, 147, 190, 97, 171, 194, 229, 241, 178, 176, 111, + 3, 201, 217, 9, 179, 23, 159, 159, 64, 55, 225, 160, 7, 123, 227, 76, 149, 80, 48, 130, + 122, 23, 165, 175, 24, 89, 228, 128, 25, 106, 160, 195, 82, 204, 206, 150, 83, 70, 127, + 34, 221, 169, 80, 43, 248, 110, 130, 6, 102, 133, 4, 168, 23, 200, 0, 131, 1, 95, 144, 148, + 100, 131, 212, 219, 190, 174, 5, 47, 105, 201, 11, 11, 210, 108, 207, 242, 164, 74, 218, + 19, 135, 6, 10, 36, 24, 30, 64, 0, 128, 27, 160, 29, 6, 237, 5, 67, 42, 51, 65, 172, 133, + 9, 222, 160, 39, 202, 88, 230, 123, 232, 135, 234, 5, 244, 215, 99, 129, 242, 59, 63, 36, + 26, 253, 160, 104, 178, 37, 227, 142, 255, 186, 41, 91, 108, 206, 13, 108, 24, 73, 229, + 96, 224, 142, 230, 93, 214, 27, 60, 119, 149, 119, 56, 62, 5, 204, 179, 248, 171, 129, 136, + 133, 4, 168, 23, 200, 0, 131, 2, 77, 248, 148, 137, 32, 90, 58, 59, 42, 105, 222, 109, 191, + 127, 1, 237, 19, 178, 16, 139, 44, 67, 231, 128, 184, 68, 169, 5, 156, 187, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 105, 4, 134, 47, 167, 212, 79, 177, 44, 91, 97, 85, 184, 182, 222, 59, 231, 242, + 110, 141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 28, 160, 98, 5, 133, 180, 19, 27, 159, 186, 76, 27, 159, 143, 186, 97, 124, 253, 123, 40, + 87, 35, 184, 115, 99, 176, 68, 85, 191, 210, 218, 132, 220, 52, 160, 48, 160, 79, 26, 47, 127, 253, + 55, 252, 196, 196, 129, 87, 131, 132, 84, 74, 166, 33, 85, 134, 25, 34, 244, 14, 1, 16, 1, 205, 34, + 30, 3, 248, 101, 3, 133, 13, 43, 184, 47, 225, 131, 1, 95, 144, 148, 202, 110, 19, 32, 65, 111, 158, + 204, 235, 91, 252, 213, 35, 215, 54, 91, 165, 67, 183, 171, 1, 128, 28, 160, 182, 194, 27, 223, 136, + 182, 189, 146, 57, 61, 173, 62, 58, 241, 42, 80, 125, 174, 84, 191, 82, 124, 228, 62, 216, 233, 116, + 117, 227, 207, 138, 56, 160, 31, 210, 242, 212, 31, 156, 129, 155, 166, 64, 102, 140, 134, 35, 176, + 137, 201, 206, 213, 199, 238, 132, 185, 145, 220, 217, 151, 80, 243, 93, 71, 211, 248, 110, 130, + 6, 101, 133, 4, 168, 23, 200, 0, 131, 1, 95, 144, 148, 100, 131, 212, 219, 190, 174, 5, 47, 105, + 201, 11, 11, 210, 108, 207, 242, 164, 74, 218, 19, 135, 6, 10, 36, 24, 30, 64, 0, 128, 27, 160, + 86, 37, 61, 45, 13, 251, 9, 19, 188, 242, 233, 83, 77, 137, 28, 185, 141, 105, 217, 54, 182, 156, + 119, 223, 213, 112, 240, 20, 119, 167, 4, 7, 160, 95, 53, 122, 159, 6, 209, 70, 155, 122, 153, 165, + 192, 249, 223, 219, 83, 159, 40, 242, 39, 44, 132, 182, 208, 232, 77, 64, 178, 241, 233, 230, 253, + 248, 110, 130, 6, 99, 133, 4, 168, 23, 200, 0, 131, 1, 95, 144, 148, 100, 131, 212, 219, 190, 174, + 5, 47, 105, 201, 11, 11, 210, 108, 207, 242, 164, 74, 218, 19, 135, 6, 10, 36, 24, 30, 64, 0, 128, + 27, 160, 114, 33, 104, 64, 195, 12, 156, 235, 56, 59, 210, 102, 183, 210, 216, 137, 223, 207, 134, + 63, 65, 36, 204, 121, 38, 175, 214, 106, 184, 197, 26, 173, 160, 39, 94, 238, 34, 106, 190, 22, + 225, 95, 211, 192, 249, 95, 231, 1, 111, 8, 204, 133, 35, 84, 242, 134, 75, 61, 50, 26, 150, 46, + 209, 129, 155, 248, 105, 106, 133, 5, 103, 130, 1, 225, 131, 2, 130, 119, 148, 191, 78, 215, 178, + 127, 29, 102, 101, 70, 227, 13, 116, 213, 13, 23, 61, 32, 188, 167, 84, 128, 132, 60, 207, 214, + 11, 28, 160, 3, 83, 228, 182, 32, 30, 183, 26, 157, 247, 32, 142, 60, 192, 100, 175, 106, 216, + 144, 16, 100, 165, 95, 91, 135, 138, 14, 41, 82, 251, 207, 159, 160, 74, 160, 161, 187, 63, 216, + 18, 23, 64, 172, 216, 238, 192, 134, 191, 204, 206, 236, 197, 134, 116, 130, 15, 85, 113, 173, + 130, 39, 50, 160, 49, 222, 248, 110, 130, 6, 98, 133, 4, 168, 23, 200, 0, 131, 1, 95, 144, 148, + 100, 131, 212, 219, 190, 174, 5, 47, 105, 201, 11, 11, 210, 108, 207, 242, 164, 74, 218, 19, 135, + 6, 10, 36, 24, 30, 64, 0, 128, 28, 160, 138, 12, 20, 188, 112, 66, 91, 30, 216, 44, 24, 124, 242, + 200, 111, 179, 32, 26, 37, 221, 239, 110, 1, 84, 48, 89, 86, 61, 169, 129, 90, 21, 160, 44, 172, + 112, 11, 130, 45, 247, 188, 207, 91, 247, 195, 58, 188, 110, 127, 59, 227, 41, 151, 244, 41, 120, + 68, 185, 238, 41, 236, 195, 141, 38, 16, 248, 112, 131, 5, 238, 44, 133, 4, 168, 23, 200, 0, 131, + 1, 95, 144, 148, 5, 113, 9, 145, 204, 89, 103, 32, 126, 46, 182, 84, 47, 76, 28, 159, 77, 184, + 154, 59, 136, 1, 100, 240, 147, 154, 69, 101, 18, 128, 27, 160, 130, 0, 124, 82, 177, 112, 241, + 14, 47, 186, 67, 117, 176, 187, 147, 94, 4, 177, 218, 198, 55, 59, 245, 9, 142, 95, 88, 220, 63, + 98, 175, 49, 160, 17, 204, 228, 24, 242, 38, 166, 219, 17, 56, 103, 244, 33, 125, 223, 45, 43, + 252, 215, 163, 40, 1, 187, 152, 34, 229, 82, 180, 213, 148, 129, 32, 248, 110, 130, 6, 100, 133, + 4, 168, 23, 200, 0, 131, 1, 95, 144, 148, 100, 131, 212, 219, 190, 174, 5, 47, 105, 201, 11, 11, + 210, 108, 207, 242, 164, 74, 218, 19, 135, 6, 10, 36, 24, 30, 64, 0, 128, 27, 160, 149, 149, 154, + 6, 198, 127, 14, 11, 164, 0, 244, 4, 74, 83, 9, 108, 164, 66, 186, 26, 109, 69, 98, 41, 149, 33, + 238, 137, 23, 175, 124, 226, 160, 39, 249, 210, 237, 52, 83, 110, 229, 138, 84, 199, 64, 19, 209, + 156, 195, 9, 50, 184, 64, 78, 67, 158, 167, 121, 220, 80, 137, 104, 240, 50, 60, 248, 112, 131, 5, + 238, 45, 133, 4, 168, 23, 200, 0, 131, 1, 95, 144, 148, 247, 0, 201, 156, 113, 12, 158, 3, 208, 61, + 221, 91, 236, 235, 235, 195, 40, 46, 100, 73, 136, 13, 230, 68, 67, 114, 161, 197, 100, 128, 27, + 160, 123, 206, 0, 221, 2, 87, 197, 156, 109, 157, 133, 31, 26, 145, 223, 150, 235, 160, 54, 144, + 210, 146, 31, 173, 221, 128, 233, 148, 73, 82, 191, 220, 160, 57, 62, 114, 94, 77, 8, 116, 150, + 51, 112, 241, 70, 149, 157, 209, 193, 213, 109, 248, 102, 177, 27, 132, 226, 77, 141, 128, 122, + 185, 238, 188, 114, 248, 110, 130, 6, 97, 133, 4, 168, 23, 200, 0, 131, 1, 95, 144, 148, 100, + 131, 212, 219, 190, 174, 5, 47, 105, 201, 11, 11, 210, 108, 207, 242, 164, 74, 218, 19, 135, 6, + 10, 36, 24, 30, 64, 0, 128, 28, 160, 53, 222, 41, 101, 73, 44, 103, 26, 39, 165, 120, 194, 128, + 67, 109, 151, 96, 42, 193, 47, 255, 23, 27, 247, 8, 125, 200, 53, 129, 69, 103, 64, 160, 49, 12, + 64, 143, 74, 149, 161, 245, 68, 83, 89, 101, 212, 254, 81, 16, 170, 176, 33, 87, 6, 112, 34, 153, + 6, 192, 98, 126, 188, 17, 199, 155]; + + let chunks = ::ipc::binary::deserialize::(&sample).unwrap(); + let total_length = chunks.items.iter().fold(0usize, |total, item| total + item.len()); + + assert_eq!(1617, total_length); +} diff --git a/ipc/tests/build.rs b/ipc/tests/build.rs new file mode 100644 index 000000000..7f68b16a8 --- /dev/null +++ b/ipc/tests/build.rs @@ -0,0 +1,24 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +extern crate ethcore_ipc_codegen as codegen; + +pub fn main() { + codegen::derive_ipc("nested.rs.in").unwrap(); + codegen::derive_ipc("service.rs.in").unwrap(); + codegen::derive_ipc("with_attrs.rs.in").unwrap(); + codegen::derive_binary("binary.rs.in").unwrap(); +} diff --git a/ipc/tests/examples.rs b/ipc/tests/examples.rs new file mode 100644 index 000000000..8cd2d2ea5 --- /dev/null +++ b/ipc/tests/examples.rs @@ -0,0 +1,173 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +#[cfg(test)] +mod tests { + + use super::super::service::*; + use super::super::binary::*; + use super::super::nested::{DBClient, DBWriter}; + use ipc::*; + use devtools::*; + use semver::Version; + use std::sync::Arc; + + #[test] + fn call_service() { + // method_num = 0, f = 10 (method Service::commit) + let mut socket = TestSocket::new_ready(vec![ + 0, 16, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, + 10, 0, 0, 0]); + + let service = Arc::new(Service::new()); + assert_eq!(0, *service.commits.read().unwrap()); + + service.dispatch(&mut socket); + + assert_eq!(10, *service.commits.read().unwrap()); + } + + #[test] + fn call_service_client() { + let mut socket = TestSocket::new(); + socket.read_buffer = vec![10, 0, 0, 0]; + let service_client = ServiceClient::init(socket); + + let result = service_client.commit(5); + + assert_eq!( + vec![0, 16, + 0, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0], + service_client.socket().write().unwrap().write_buffer.clone()); + assert_eq!(10, result); + } + + #[test] + fn call_service_client_optional() { + let mut socket = TestSocket::new(); + socket.read_buffer = vec![10, 0, 0, 0]; + let service_client = ServiceClient::init(socket); + + let result = service_client.rollback(Some(5), 10); + + assert_eq!(vec![ + 0, 17, + 1, 0, 0, 0, 0, 0, 0, 0, + 4, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, + 5, 0, 0, 0, 10, 0, 0, 0], service_client.socket().write().unwrap().write_buffer.clone()); + assert_eq!(10, result); + } + + #[test] + fn query_default_version() { + let ver = Service::protocol_version(); + assert_eq!(ver, Version::parse("1.0.0").unwrap()); + let ver = Service::api_version(); + assert_eq!(ver, Version::parse("1.0.0").unwrap()); + } + + #[test] + fn call_service_client_handshake() { + let mut socket = TestSocket::new(); + socket.read_buffer = vec![1]; + let service_client = ServiceClient::init(socket); + + let result = service_client.handshake(); + + assert!(result.is_ok()); + } + + #[test] + fn can_use_custom_params() { + let mut socket = TestSocket::new(); + socket.read_buffer = vec![1]; + let service_client = ServiceClient::init(socket); + + let result = service_client.push_custom(CustomData { a: 3, b: 11}); + + assert_eq!(vec![ + // message num.. + 0, 18, + // variable size length-s + 1, 0, 0, 0, 0, 0, 0, 0, + 16, 0, 0, 0, 0, 0, 0, 0, + // total length + 16, 0, 0, 0, 0, 0, 0, 0, + // items + 3, 0, 0, 0, 0, 0, 0, 0, + 11, 0, 0, 0, 0, 0, 0, 0], + service_client.socket().write().unwrap().write_buffer.clone()); + assert_eq!(true, result); + } + + #[test] + fn can_invoke_generic_service() { + let mut socket = TestSocket::new(); + socket.read_buffer = vec![0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; + let db_client = DBClient::::init(socket); + let result = db_client.write(vec![1u8; 1]); + assert_eq!(vec![0, 16, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1], + db_client.socket().write().unwrap().write_buffer.clone()); + assert!(result.is_ok()); + } + + #[test] + fn can_handshake_generic_service() { + let mut socket = TestSocket::new(); + socket.read_buffer = vec![1]; + let db_client = DBClient::::init(socket); + + let result = db_client.handshake(); + + assert!(result.is_ok()); + } + + #[test] + fn can_serialize_dummy_structs() { + let mut socket = TestSocket::new(); + + let struct_ = DoubleRoot { x1: 0, x2: 100, x3: 100000}; + let res = ::ipc::binary::serialize_into(&struct_, &mut socket); + + assert!(res.is_ok()); + + let mut read_socket = TestSocket::new_ready(socket.write_buffer.clone()); + let new_struct: DoubleRoot = ::ipc::binary::deserialize_from(&mut read_socket).unwrap(); + + assert_eq!(struct_, new_struct); + } + + #[test] + fn can_call_void_method() { + let mut socket = TestSocket::new(); + socket.read_buffer = vec![1]; + let service_client = ServiceClient::init(socket); + + service_client.void(99); + + assert_eq!(vec![ + 0, 19, + 0, 0, 0, 0, 0, 0, 0, 0, + 8, 0, 0, 0, 0, 0, 0, 0, + 99, 0, 0, 0, 0, 0, 0, 0], + service_client.socket().write().unwrap().write_buffer.clone()); + } +} diff --git a/ipc/tests/nested.rs b/ipc/tests/nested.rs new file mode 100644 index 000000000..ab3f9fc1b --- /dev/null +++ b/ipc/tests/nested.rs @@ -0,0 +1,18 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +#![allow(dead_code, unused_assignments, unused_variables)] // codegen issues +include!(concat!(env!("OUT_DIR"), "/nested.rs.in")); diff --git a/ipc/tests/nested.rs.in b/ipc/tests/nested.rs.in new file mode 100644 index 000000000..e68bec0d7 --- /dev/null +++ b/ipc/tests/nested.rs.in @@ -0,0 +1,56 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::sync::RwLock; +use ipc::IpcConfig; + +pub struct DB { + pub writes: RwLock, + pub reads: RwLock, + pub holdings: L, +} + +pub trait DBWriter { + fn write(&self, data: Vec) -> Result<(), DBError>; + fn write_slice(&self, data: &[u8]) -> Result<(), DBError>; +} + +impl IpcConfig for DBWriter {} + +#[binary] +pub enum DBError { Write, Read } + +#[ipc] +impl DBWriter for DB { + fn write(&self, data: Vec) -> Result<(), DBError> { + let mut writes = self.writes.write().unwrap(); + *writes = *writes + data.len() as u64; + Ok(()) + } + + fn write_slice(&self, data: &[u8]) -> Result<(), DBError> { + let mut writes = self.writes.write().unwrap(); + *writes = *writes + data.len() as u64; + Ok(()) + } +} + +#[ipc] +trait DBNotify { + fn notify(&self, a: u64, b: u64) -> bool; +} + +impl IpcConfig for DBNotify { } diff --git a/ipc/tests/over_nano.rs b/ipc/tests/over_nano.rs new file mode 100644 index 000000000..6f45dd245 --- /dev/null +++ b/ipc/tests/over_nano.rs @@ -0,0 +1,77 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +#[cfg(test)] +mod tests { + + use super::super::service::*; + use super::super::with_attrs::PrettyNamedClient; + use nanoipc; + use std::sync::Arc; + use std::io::Write; + use std::sync::atomic::{Ordering, AtomicBool}; + + fn dummy_write(addr: &str, buf: &[u8]) -> (::nanomsg::Socket, ::nanomsg::Endpoint) { + let mut socket = ::nanomsg::Socket::new(::nanomsg::Protocol::Pair).unwrap(); + let endpoint = socket.connect(addr).unwrap(); + socket.write(buf).unwrap(); + (socket, endpoint) + } + + + fn init_worker(addr: &str) -> nanoipc::Worker { + let mut worker = nanoipc::Worker::::new(&Arc::new(Service::new())); + worker.add_duplex(addr).unwrap(); + worker + } + + #[test] + fn can_create_client() { + let client = nanoipc::init_duplex_client::>("ipc:///tmp/parity-nano-test10.ipc"); + assert!(client.is_ok()); + } + + #[test] + fn can_create_renamed_client() { + let client = nanoipc::init_duplex_client::>("ipc:///tmp/parity-nano-test10.ipc"); + assert!(client.is_ok()); + } + + #[test] + fn can_call_handshake() { + let url = "ipc:///tmp/parity-test-nano-20.ipc"; + let worker_should_exit = Arc::new(AtomicBool::new(false)); + let worker_is_ready = Arc::new(AtomicBool::new(false)); + let c_worker_should_exit = worker_should_exit.clone(); + let c_worker_is_ready = worker_is_ready.clone(); + + ::std::thread::spawn(move || { + let mut worker = init_worker(url); + while !c_worker_should_exit.load(Ordering::Relaxed) { + worker.poll(); + c_worker_is_ready.store(true, Ordering::Relaxed); + } + }); + + while !worker_is_ready.load(Ordering::Relaxed) { } + let client = nanoipc::init_duplex_client::>(url).unwrap(); + + let hs = client.handshake(); + + worker_should_exit.store(true, Ordering::Relaxed); + assert!(hs.is_ok()); + } +} diff --git a/ipc/tests/run.rs b/ipc/tests/run.rs new file mode 100644 index 000000000..607e20636 --- /dev/null +++ b/ipc/tests/run.rs @@ -0,0 +1,32 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +#![allow(dead_code)] + +extern crate ethcore_ipc as ipc; +extern crate ethcore_devtools as devtools; +extern crate semver; +extern crate nanomsg; +extern crate ethcore_ipc_nano as nanoipc; +extern crate ethcore_util as util; +#[macro_use] extern crate log; + +pub mod service; +mod examples; +mod over_nano; +mod nested; +mod binary; +mod with_attrs; diff --git a/ipc/tests/service.rs b/ipc/tests/service.rs new file mode 100644 index 000000000..56b9915db --- /dev/null +++ b/ipc/tests/service.rs @@ -0,0 +1,18 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +#![allow(dead_code, unused_assignments, unused_variables)] // codegen issues +include!(concat!(env!("OUT_DIR"), "/service.rs.in")); diff --git a/ipc/tests/service.rs.in b/ipc/tests/service.rs.in new file mode 100644 index 000000000..68d40efc4 --- /dev/null +++ b/ipc/tests/service.rs.in @@ -0,0 +1,69 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use std::sync::RwLock; +use ipc::IpcConfig; + +pub struct Service { + pub commits: RwLock, + pub rollbacks: RwLock, +} + +#[binary] +pub struct CustomData { + pub a: u64, + pub b: u64, +} + +#[ipc] +impl Service { + fn commit(&self, f: u32) -> u32 { + let mut lock = self.commits.write().unwrap(); + *lock = *lock + f as usize; + f + } + + pub fn rollback(&self, a: Option, b: u32) -> i32 { + let a_0 = a.unwrap_or_else(|| 0); + let mut lock = self.rollbacks.write().unwrap(); + *lock = *lock + a_0 as usize - b as usize; + (a_0 - b) as i32 + } + + pub fn push_custom(&self, data: CustomData) -> bool { + let mut clock = self.commits.write().unwrap(); + let mut rlock = self.commits.write().unwrap(); + + *clock = data.a as usize; + *rlock = data.b as usize; + + true + } + + pub fn void(&self, a: u64) { + } +} + +impl Service { + pub fn new() -> Service { + Service { + commits: RwLock::new(0usize), + rollbacks: RwLock::new(0usize), + } + } +} + +impl ::ipc::IpcConfig for Service {} diff --git a/ipc/tests/with_attrs.rs b/ipc/tests/with_attrs.rs new file mode 100644 index 000000000..89f3575f7 --- /dev/null +++ b/ipc/tests/with_attrs.rs @@ -0,0 +1,18 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +#![allow(dead_code, unused_assignments, unused_variables)] // codegen issues +include!(concat!(env!("OUT_DIR"), "/with_attrs.rs.in")); diff --git a/ipc/tests/with_attrs.rs.in b/ipc/tests/with_attrs.rs.in new file mode 100644 index 000000000..f18dedf9a --- /dev/null +++ b/ipc/tests/with_attrs.rs.in @@ -0,0 +1,28 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +use ipc::IpcConfig; + +pub struct BadlyNamedService; + +#[ipc(client_ident="PrettyNamedClient")] +impl BadlyNamedService { + fn is_zero(&self, x: u64) -> bool { + x == 0 + } +} + +impl IpcConfig for BadlyNamedService {} diff --git a/js/assets/fonts/Roboto/LICENSE.txt b/js/assets/fonts/Roboto/LICENSE.txt new file mode 100755 index 000000000..75b52484e --- /dev/null +++ b/js/assets/fonts/Roboto/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/js/assets/fonts/Roboto/font.css b/js/assets/fonts/Roboto/font.css new file mode 100644 index 000000000..75226e621 --- /dev/null +++ b/js/assets/fonts/Roboto/font.css @@ -0,0 +1,56 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/0eC6fl06luXEYWpBSJvXCIX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/Fl4y0QdOxyyTHEGMXX8kcYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/-L14Jk06m6pUHB-5mXQQnYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/I3S1wsgSg9YCurV6PUkTOYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/NYDWBdD4gIq26G5XYbHsFIX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2) format('woff2'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 300; + src: local('Roboto Light'), local('Roboto-Light'), url(./v15/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} diff --git a/js/assets/fonts/Roboto/ttf/Roboto-Black.ttf b/js/assets/fonts/Roboto/ttf/Roboto-Black.ttf new file mode 100755 index 0000000000000000000000000000000000000000..fbde625d403cc1fe3be06e15ae90c448c013eee5 GIT binary patch literal 163488 zcma%k2S60Z_y5f7?j4<@izpr-U_n7?cCmK_v7v~l*u~y8YOL5|FR{cLjs0A)_paEm ziyB42m|~1ZO;OnUe`fdYfPC})egBvbZ+EuLoA=(ldGltL5K0Jf!!MB-n#H$E9KLbH zP{N!Hgd{mNOYGRNOSSObg!L&yi0`y^iQ&~Zt=V^o5V{IarS?wmIV>)u`3OQv4<^L@ za_=#tj5_D4bqNVSjO$(d4(pdb{d4b~gj9*bGspY&965~G5f8jy#C4~BgU9#X_3B*) zAvK>6db39VwDfTUlDan{#A_-TdfmTI&$PdO-0=sVMg1hEKMEYXJDkIL2b`DhpFV2b ztmoI7wF}>b|@g^{9CuG zoMu06JMB}Q!h80z-ALSP&+k=#@SJ|I;shRceyXEXw3pR4SuS!SzThSJy^wg5c0{sV zcj491>qLihK|CPLz!f5`mcS7$r%~Y+>C3CJRz*lIaWKb|fGH>p;O}nMu3a-?B*a{( zBMKpX^{W|9>3V)mtRG}2rsRU|{CIMPH4BSXXqKq}5hk@nJhGK38zv&1Q+ zyyTDaPGpE)z_o9HS-3x1rOl-ppp3*xj<_#@43Jtt4j+h@|lb#OtJ=G@3LKe<23uM8-;9Bt`g0y6c*gj^J@7o^2qekuUhUSdnZLs*o?l zwxokVNF-2^?T5Ys$PD2p(w;3Qb6HK&3FQlg9b`0~Z6oa>!*!G->AuGE9;AhS7BPsm zNwoAONf3W0qonF&mhLR6D=r{$;#bfk+9OUPJ*2xNfHen?kH{D?gZQ!)q_nh~49E4Z z`Ye*Hk0z~{A4!o`kS6R8^L=R#X)f*|)upp!fOwN6v1IcW)YDM3Cq0E6$g&c6UypW2 zl0j?}>|rMH6&{me!br$vEm=)S0enhfThMku0U@97fW8$R$#3F3(uXY}bHy=au=If# zqzuwR3L;dTMiQirWH4w8T`$sH`jZ4neIV1Rq>lI)c2gGCKZQh#vq^WzCx-J5-UhRy zWT2RA{v-~Bt#re^Q%I^Pzz$ZCYGMfS5tB)8T{#k}3m`Rh3nBlzWR&>X{91R-{1J8d zpl>#@OC#m&Qo+w>@H3Be63wu|x5UM+3vra}Nj;QxmA1ehU5TjMPa5gMNGE9}nW;ZU z`q}j${dBd7pYCsxE*6lXk~eYHUxKWcL1ybo8`#!pA&GR6f=Ow8ED08az~dy?+zRM) zGI7wA2j%A+)u5NBXydOq9z)`Fdr24lWYj%?1nF+$zL|h0siGT?_s<}e#Tn)kI1kgk z#(VPd%vAFQ{vLfU>7%=g^O@#f^yNrTog3*b&4G-U5>bDcjMFV9DSC-?lkSnO_Wj8$ zJ0srbW6l?iM1np#LWb3)aH8Wfx12}mU*MfPNt*55cS$R;F^L!dAOoP=FM-L>`95Gf zA)o31%Xs}_A^Q3k=u_j!5aA4T)(krCgfn|Jy82(pP~CFU5ZA)R)}#h} zRawasJ}87F2yUbuWK8TT!u~9j9f7}bfX_`NRy3d2dfFc|(dj#L-7!*_p#o%bM9b&+H$>rYncGtpP(!o~-a z*1{~}3SST-B%+Pi$w1u-Qc>?jrrBk|kG>+o`eeu$J{Hj)B+OpvCMP0)LF_{Z5|XA)^Q0eyU=c{OC* zNA>ky@cDj_xeqDLx{?tXYueGHBv9%~oM86`yxU2CRD;xML0leop`@c-G)V^k zjhIitvyg?Fl_R!TaoDT-gBV|}1=@0*q09&XByGs!6;dm%88#7=#JokU2NNrZR`e*7ZZ2mbV9iMPHF z^pS&ee&1>wpCYAo-w}7Q9c(unWn+QIkj*OekMlUbjCVaE3HpP$_W}GtXOt}hW|Lsu zVbIB>0>&B#eLcJ*5BInOk4YI_0(fc$S-&^`u6vLA@E#yR*Ovr{cW^BM^>My=TMVSR zT^ybphIf4pdrKfS#FfA*6;*KD6LwUCkGtSGN|hsI$q4DfLd*+9J;t2QuwyQdRU}9p zLSg1 z=cJbA7aZay^EnjD{V0fk5h_+$0xYNwvHz7KzEfkYfo2))*bKQ{1U&?L9`pd@>5F*5j>}c|6Z%LpNya!+ z9nat@ftP% z$YV?%=lxHr+7SF(arz49&^y=1|1VWzSj3TP49oRqiDh{_$z$5$l*e^C#Bpj|$78sm z<|!(;|AXK9uYm91ey%uJpgDv4LeOErXznX5{h9aaB5?m&9NhmFuZ#Q5;uvZ^QM?}O zG55D603VEc7Xe#Z{?ign_perPxmZ!W4aJVt zafG*tgO4v3sQu=ta$YAWXW0$qthCx(K^mw`lg67{vZLnis?WfjM(rQalXV`$ZT3Ir zFMQ4dz4Ez=>NmKKdHjl)6}H}$sj({Qt;XTpRuSv-`2}?Eh`KU(tg7~T9<%aTmG?;= zC&N}P{%9rdGkhH4_49bt#vktE_w!g)oRdeV)gh+{akw zOxpa$k^2K4v#RqTK4*eoQs+%PX2m^LTmC1t+O|61r( z8}c~}V13T^Zpe(wg3C^&R$pR`g{>5^J&(V++*RNEPl`E#8n^$Awjy5VcEEKD8;Iib z2gusN%HO}x&tiRZr++E`cmMuh{Jyol|DBr8iQUW{|J!xd&iHsV5PQgxc3}0R#VBI6C=NANgT3vEemTH&_1Uqwcj6-cP z4!)LpD9Jnr!~3+FgWreIVxLOin3MAGJA?^lsV!Rb6ItKLF~rI4%Hv4V+G=N z#PB?xSH~wF<8$9`nGdLA7>?EPhR2Z@11#g)XzQ55V`AI8agX|b#LVhD`J8}{dpxe@ z@8)9~e?R6LYHZD~^D@+-#=tz*#{1Mb-O}f*eFt${4@_?;dP2UvBT}M_F+q~_Iw}aF z#6$rn)*tQIPKO^!(&+?AC#fgAK!+nq5Cu`x9>8zLBxc8-74T2e^8+T}DLl$_qF&@> zq9h1{4z-{%on9~5;i67`NRJx@on&vvbRc-QgquZ%8<84OfB0+ls8uKF^+ST8xR+PKIYF_c z)9U7xpf*${@@B{UHgGxMFtM=X6Qiuttv&8 z6rRSL`47J!a?#;YJKkDw&wn5bdwvVriZq;g_@{?YAaC+wY7e9Ohah|O{6_&KRTICp$q8}x{;dbTWV&0ES4p)iM1U0F5#SvV7!VRrH6SIB1?mD_1Kk5l2l@wA4s0Hn8rUZ|>ka$k+-FfSn+wfm zv{Y-W5pCUww(cRP$t99aUXi!NObyhXhR_PM8tp(+X@5&wH_*Lk>nB#q($qE2^ z%Q}{}&Olqg5|#>^g?++NAxpT0wh}Q!j1ZfO@nUarm^eYq5O0bP#TViqP@G&MYc_DnBDbh#w_QX+(Z2 zd{B75@N(h)!fl0H3pW<7Eu4clW|^<>I|}V_yrZD7;1hDm$gmb5mt3$F*np=$0Pk?z zf{>ScUJiL#?q%Ej{V!X;On%<&d1peNcX*!oJmGnZywT4amo_xugv2HAxb!RE82TLW>$aL0| z^&N=D0c;=}L}roMYz!OA#;OB+4za`R2s_G-vE$?`WPMMtlk5~b&Cam1>>OD{7PIs0 z0=oz=aG6~pOUP36j~w;{9^ol_##*qJEP)MXf3m;W-|Q2+&mOQx>@n|sLVL1TNEA8< z9f^tT6Ox7QLJEa{XOYR9% z(ObVH_l0TXfiPW|K^`LWpFAOCVF~#FAFzyk6qb`egcX7;tfW*}MVaumuv%Cntfc}KsU)lu z_6y%o9o17iFyks|8kyfIWX&9{{b{A75+egtN2(Z7B8=`_o3WF??2<*j`K&`-pvM6XCjW z4IccakPXjvn>MA*#13Ld;g#?sZBAPVKM6mJgT%qKrSOZGF1!|gr32_dc=#c7ir9?K zBv_fp_JcV78~q1?x9x|INvs&0am>NTEh7N`MELz1G_b~?8-ZOwZvcA@I9LVBE6=G(-d8{ykI!_fM+ti@-fwaa>IUnGaeWh(-Bc&>9-Z z0??X39Lf)XHUJuem#;t@0r2JQ1ZYcu%XJZGYajvT=RqM;nuv1FPY0j}%CkUI0mzR* zrrf8}J~(~?+85}DW4xF42cT<~3pzyuSq8dL16dBr-wTixpc{aVI9>_L+hD@+*Pw4T z2s=PAE^#pMM?Y)8${fKe5?|dT40>Rt0AGOXzBJ$mVC-OAHUL=znxuiO1wF1o*a>!Uwpg7?m+d=I$5b%twxe9{!3qcyVt;07F zzADLW9V?3(Aa7x|1_BufuqRv5HQh&>uV#5jq1)0mv1;mcU05VI`0ZtkOVa zP{>hO4M2Ya+Rs7ugQEQc+A2Vo!Z#X7CMephqBrOU4FvWhKtC$dKsRe32SK+0-vWIA zE*F3t0_Aey=m&fUKsNC8gzHk^{K7_reZUcv9|g5yD2|V5Am>1#BLQ|Q33( zSuhOrG;k5`xd3{}f{~z?0q7E=1`)D=8^9>w7H}Ko{2aEz!TpB_!om3yp<51&HAp9G z;C_Wq;W;q=U^1+M;9XeZC88b5CxXHTL`S^n4ycm`VJfJz2HtMbMFU1GBEn8MxX;2W zp9+j(M0C@@eVFJDc;NlhK|M8azb1NV;PxbX1Euhu98g~k+`h!p8ZZhHtRSl(Pe986 zfq3U^&>)~Zo`tQ8!5X-&i6KBZ%AbKoXuzmRkj*1v6v}@Bjn;rMl!!4v4V3>1T2lkY zRP3Ds>Z1HDXgv+wj*$&lK|X-S0S&;kv4VnaWgMWd(u{xlF_ZhLf24O#F ziU!_?#2!FT+^+-eWdVP#H!u|C+%ARz!}0!1&=J6Blykj}0mh>IAm}&^yl;r(HDKo$ zLFS8yvv5DxX9h3_$DyF`6XHAob&K#7D!?~(A`ua?rxiiDthrn{@5=zll2!%fvg5Mp z1aMiP-MlYiHHu(22N9bCYXP*IMu75mt_OHqHvk(^ULAB3uo-9xYyq~TJPH*3UF81n zIOr|_J`cM*2zEFT>}pW^v}nTdK41VK16;0c0WPBhcuy@*E|)_9*DaR?c*IHv5sz8W z6_nR;0_EJMP6DTZF2HHvEb8L)9B>}@GyuH-TmC(r@- z3-}x5uRuQmpK(9eMFCKV@}EEzzzht+P9dU!kLMEAAp8Q#00W+F1?r{&J0FPT4tU@_ zuL<$Tv;KHSfKL4D0g#`t3v?=a&0tl-5Uwu zh|%=ZGm)gZbNTxcy95Q8 zrp}$~Hy16io}VsxewdPf7Q_`VfCQQxrc>kbDv+Q6KVA?N5EK9olNwhs*@v}C?9v1* z27pC}FjM6wRZNayrZ5nvuzjI4!#Fpw%aJ&QH@y$rk&F&qj$i}wkHeDuOhI7Qm~q$u zxmn71E1knkaT$k=q-&RbVWhF&5fUc+*cjzbl})5Fk*N!-Ob*eo;4+>r#IEuo)-bvf zdNqy&Tba0cY;vt2UM7u6Z530NAL)Y1_xM=i2k`9wd-rIvu|O4-l3dB zFNg0Oo;fygob9;TF~`Z@sgctXr)=kn&SRYKyF|EbcDdo|;u`0=$Ti2{U}$9MXP9Ex zVz_F^a}(UAy1j6Zc3xp**?@iwMJ|lfDlyWXr zuhfE4_kDeR+xsr_-Rb*l>4?&UN@w|1_FL%pcbU><4ww0*?BcR!e@FkS{@?q*FITnP zh;kQ<)r<+q-ewzr4Ja3o5U?y@L%`91y8&+k69Nwh{t?t8Xn*-K<(~()3SJWYE+iqu z6ml)pE3`-Gy3qF(+Eut$aYV&Um8438D?O}Sqw>Paufu%9CWY+{dl>dZ756IDs|>2L zrpotKJ*qaT+NbKws$W$-UG;sqXL!}{!QrFA*M#4R=n^q2BEOnPwfJgRtA|!!8mWuS zh&&q=8zo1(Mt6?B9Q{X3%b0_)cCkHU57lt4(Z0s=nnKO)HILP*Qfp$Z-)ncOeZEee zI>+j|)$LYSuIEs1e7#ro1M3g2zdx>2T)Vgxad#W|HyG34al_DtOB=a28q_GKar4GQ z8)r4C+hkXhS52dvPHK9gnQOCp%?34l*StdW!Ogcff77B-i)}4_Z<*NgeyfO9+gjVV zp3wS_Hc4$(wE57sW80(cYPUNU?;hVX{$WD1grn_)+wV>cPdwS7eTP#WgF6oDxW7}` zPSZQr@BF#T_%5H4S|u$@x{~y=YpJePyEg9T)h(mjugOi4<>cqx9lQ7GzAwcwB_-uR z4~HJzdhAQ}OdXh7*mFkD+r7Md_3tJ3`m=Z6-Y?SP($=MY?338%NZ(R@hxeV@cXi*N z`*rO1egB01CkKQKm^F{N@08v@eL?!Z z^qc8FrGFekheQq;IpqG3PeXM>y@!SkeLl2sSm|L^hBX*AYq-(RH7;k|`|-}>$B*AQ{?Yh%6GA5JpYUGxnvrdR%KeowCB@2XXeZjXHA@SYj%~{<7eN>aLVYOF)ia##^*Ucb9&CXIHz!K z-MO>pem}3@ynXYs=KId?K7Ygff(4ToTwU<;t8NRO7LHh$v&gup-=bZM-Yssm*tGc5 zlEfvZC6AXzEZw=xW7+&=2baBGp1geF@|+b;D_X5MwzAa9FIGNY6~F5I*LA;M{PpeC z!K){(ez#`en(x;9zP9e#X=_id6V^3ew`kqVb??5Z^UdD%71mE#e|AI54LdhFZydbw z?Z$#l9X4&+^xNjB&6~H_ZAsgb^X;asb+_Ky)@0k3ZGV2(@w@BW%WR*vJ%2~L9a%d= zcCOsHXXm4xFLu@1)o<6)-Ojs*?VhoF#qJ%ukMF*-`_&$oJtOzL+*@mJ|GmTZj@vtR z@4UTB_rAuz52hZbtbJAX4d0iu@2$*aU%9eePfn1#%LC-8@=AG+d`5mK|F&PZ-*XTl{r6iRpyq=qnWodUuFJ%z;Gbs zK-~lJ2YMbDd*G`BTMisJaOuGJ2R`!Ie02KJuaBCJUOIZ` z=+DRKF^^-x$6}AQJ=W*gq+?5ueRFL4vD3${9ea4}x8u6w?#KO)M;~u}yvy;lr{OR$JCv+#=Pn16qeWLY=UMD7;SaM?fiPI;pop^ZSx0BMzGAAQX zwmg}7a`4GB5+uG8mEKRW&HjQ&jNGu6&CKhyQh;4{?>obP>p z!udt#w_WhKQ0YS4h0Yh!FHF9$?81%iCaWymU%RUs=XD=w>BR`0AqStGM1W=+qU zm$fu&P1feDomu;{j%A(8x|;Pg>)lnmtL3i7Ty1@|@6{n!$6TF!b=K9du5P@#|7zCN z=U4x_=6Ege+VX4bu9>bKzIOWB?Q1_>dw1>c>-4()b>sC4*CVdixE^=C`StkgU9P8I z?|*&R^;y@yy1wH2PuJgF|NDmHjldg~ZdAX~E}XopF23?cKM}-@bSI$J?LoxZkOCr|zA0cLv>=eP`*N^>?=2*?;HM zovU{q+<9|Xx?A>c)ZNy1d*7XScgfuychB5?a`%sWF86}()xFo@-r#%F@2$Bf-@AVA z)xG!k%=f+TSGiyRe*FFZ_ov)nd4JFSi}%03|M7v-gU|;J9&~vy^ufdjvmY#du>Qfp z2iG6Gd{FSv^I_$OjUIM=IO5@)hg%+=e0cBS>l`7+Hzy*eSx!pMsGO-e^K(|^Y{@y6 zb35m!N92*uqbiRYKkD{q#G{Ny%N}ibwCmB~M>ik+@aV6{_K#;gUiRIKBva5&oj~i)JqpU-Wn}=*8F<(_bunvGK+J7pGoaeevK$ z-izN}e9qJ7dE^D>)yZp~*C8)8Z*bnYycu~b^0wve&pVZOHSa-QUfyqcpY!$k9{J_+ zE9b}NH_C69-#NcWe!u*o`D62^Aun7=ZAeg3xmz4?dov+|$hzj-OWbbjgevck)V zm(5J{?*J^nE4={OT#>}0-`;E=)X1h@qVZWPP%LI75K0)z^Mb=dhB<&AQb zI^{D#Q79`cluVztNczGr*x1i*Y+PXqOUYoE3^LNs{Dyw7a_B^A%Q|Nl)NIljOf>sn z7;-~MLS)gwk=H32Om?VK2$z|IzzbNoNuO;JcyUBE4EdsIG>FO5+WS&e!87v6~(sW<`c@FV5OYPp;-fWM*~L}Y1)6Ige$3fzDb zgY`sJ1sbKQqBO3Q<}EDi#P}P^hRZ~6Ypa-TDr+$5)ZdQTCdY8uuIQp8ugrws?%5_g zgUM69%RAdd45m_Qi9gywgM=WDpy)^ykwT;g;1!@E2xmboZDXTLjh+^SegC=1#l{<( zTx#-4`5g9ADQt8pZe!R+x?1T=S0AEwhv)_+mE(}|*CC}ZOQ3d`8k0nGh?szHp{kIf za^lCfrmbT-Bw3 zb_&);2je7|YZ(URkZp1Zm)(j~Cm3X(qO)Lw$v@lVA8raZ$YDjr{sy_a?F<$f6%$$A z+Y9Xr3Ji(%;f;%q)|!oe@Xt%JvFatg6iR)%nwG8DvuD}T{W-NF2h@nHR*OE~w{*E_ z&+?`FAI4SfX-8{SkEq28Kdobz)`_cTZ~b;b^VwTAf2E6RFsn{fqXsn!Zf0!Rw76*o z%B1jS$^D`m)Qu`^Cyrb`gLf$&MJvgI4NbdcTb#na$9iK zm4YqEUZr&0BuW|NayI44foh>#NxcQmL9S-I2E{|QT6;b9dXJds0E6BqAXEpbl;`%~ zQ9YLGVF})Xr%!B5j3yx(Tf0&I;cp*aZ=D-U{W6{^8I3#a9r92q=(qfjF7e7I`1EaH>=N|7^l=@J9SNo z8!^awcMtUm=WvsV+dZP(-D7=pOz<+e`{+X$3mrG@<@~t$U(>G_#LfL_GGp-{=oVVO z*4BPXE9Fs`az|;}Z)*)K)vx^#Z?1qhkFdPiuH>7kCu9217*QNJi%m0K}e`(uBVZ(Ul29__a^R(YWGc*(gg&8i8R@Om!9sA*b+ zK1Eg2*}f(cUdm(-Y9C$-jSh~Lgh(OSNAl1MLMTmDjy9n6eeaj1F%6W1k9QwByjwWl z^~7{s_(+0m!35H_ABV_7wPjf7xF3{e*W%sc1;S`w5qOXe|6m0QQpJ z+Y#7Qpe~e-QpUwMo;K!F&d4`-(<=Ioy<>mC>fHzwD^nXs8awP=;Wm~;-%*LTVzl`q z{fRb1y?&akB*;qQwohzT<2gQpp+`r>(D3+y1LG4044}<0aHTFuCDfdUue{EyqooJl zp}86BP##guCx}Mg{*AtS`-QFwALlxnUyH5rb)OUD)>Ib!%J8lQ|6{O>N%mmC-r6ly zZ^gSML~F1$1h>mRwllD2AVGn|&CLLXy9H}L#Z7grv0`iG&v);YKd3#;rw+>A_DP-F z3GI_QwWlmm$x%+zhBTNuU@J+SauQa$Zq1@4%KXhMm#%|sw!(EZM!R(Ip{nmxWn*Qn zC_cdo0Gc3%%Yuz38GEKts0JdETX3Y%SlOdwvMJ@nsGgKB22xTR9Wenu$(JO_hSGj& z-{L_~iDB4QNvUG5CaO~s3_Kn(84R*r(KSb6K%wlVUgNc6r;Ek^21LcE4%m}#;tdcJ z3he0J-R;}9NmcgDdb9MkId1lfu{h)D2#H5{M zSA!d8%++9$EVfx9Vo<#b?P@^sZb955gwp5$ zcn7_3XW24kZ{c-M){G_;Zl^jgR#PcZuF~im!VaNe4m};nttB2BXbH~Bl7X_Te>v2r znIwe``KHA7+JF8CWpoq>q)Yw4=DH*N^Z3ydrU3taQjjD zq&)L7D&`;O=S>)XVN!fb!B4Fr<3zM%0Bp&J1d(2Hsq(>`jZ#H1scQ1p7O4itTZ93q z$dSoW>B8X#{s#9aDfO<i^;?R2}g~NF~%lEG~j#2!Nc$Hify$S{6{)QuGxIK8xZmz6neq z9aMkGJA(ibt6Dmo8oThwrhH^|kw%5^U>4R816gVZQ6XaZfaLxY zl=rWHRo;vn(tRLhkH4o(x!QeIN{=?Jl6N$2*1TzxCe6gk12IAkXvkdp?a*v`*?b@cj>b){y6QI zuNM6@jh#?7{p1x#lSd4RNQrNj+KWZ@qE5N<-_BpG{JHzfcgi;>F)+K)!#(EDpS5c6 zh}qa@JO(4}&sgIQA?}n=J#i;g@W;5zM@&~tSqbiGj3^)%_knwfA_DTKft?bh3^0ON!6Em6(3h&)o$+k?} zF=8mSb+4ppm{rs#eTXR{96e3dkR74cmrL-Wu2YoiVbqClhqZQys}LZ z2HCHupdyCCqBFSYy0$Ykh%q?gP|X|1kjUyjK7tONFxDNb-6BJNBmgHqaM#B2%){Ni zyis(gI^IoVJwhM{-4lnmm)lPc>h*2vqDIdCRCjXe!1|GH!#j@DxhYqayQh=~yB!T! zUaQgJc0fln;R0vJ`c1>zm9F4#95$YXD4&(AW({Tx&z|v# zMl`Necwk=6cG{K>KBuh7S2igNLQ8M0Q0*37P0LeHdf>NP$~a}-w3!{+(#v*x3FB+m z(pY#-J-)bTrP+2-v~EoaaWV4HNS(29ORyK!JcNC?+|HhMFJ{KFgL;MAFETIcKS9{8 zl&ur(@!-oyeoZ_>PlV?7^p-^7vLr2KReZa13(I{-^ z%12s0x)~g8_JGmb-*y&JEz&K(SQPe1f}1*Mg@#6I6UU$-%#r%i;QoC^OiBjlt8$$fIjJf}Su|dk_&g~A;A87mdx!n2koZDpro zF-3{2kS)qFIH^&NlR@^dF^Bw=T-tUfmld7R8VFyf6N39jgx)(tqjuBn z%JmadC#>AGX^mvstDL#m=(2KdKNU9?q(8V@|IU5Lj&spX<-#&1mB=R8gytx!0WWf5 z?Hr;0Q;sF9m5Z-<$XGm-=O%2OIU)%ASoo05FYpq6EgZorumQ@q%I}g1>b`E_r4D$p zCvpEr50dSfsz7v_Vs0NC6ir!+*C`5xS;|J?M&V)>!x|SJS8Lmc+SYwH~m)q+(!5<+>v zW)w@t~w%{e(fF9Nf=~$iaVkr zWojvCs{*BPWpm+YWh3puB-)*&7H*JCg(q1<&ciJH$_Ebu`l0%A>(p62u~w_SkHV$W z6x@vG$|Ei^;Lw195JrZMr#-GdVbz1pV-~l47?v8%m$zgeqnS)ozI^r78|5#W+9aVx zJIPewJMYoBw@=c#ruVYSDH3%#k=8O%v*B7@C0w;S;#n&$kw3O&$g$@ae9Ahjlh&&O ziiM-50j&EXE}#kc{6bbd>1!pG`G2EKg`g%Mp;rng72LIOB1V7{3AxQ8Rs6HoVis<- zX?mUYE~tmE^IUk((R8m{f+H7_^e=)dp#-bC)e3C`J0Fo$SII{t@Se;prigY0SR)FlT7=l~Hl!Vzui#T~B%Z)+6vT9QVp|Bdp! zGGEEvD6XTy$BxjzjZ|5)c((GFEB$Kz%te$Py{8=Bx0BYp(f&SdCYzLFw{b$896a#Q&u_lLfNhV=NEzERvI)5N?*_srC_Z}+|vuw{>t=E@() zJfFu{6$DwjX|r87gUQ#znH$1HH>>&DOv|mfgT%UtY_v&Ml_j<`1tS3br$CF1u?=R8 z`6WlW6c%O7qMm=T8ho_!QQc7CIsXWlgoTCiq-m~E|)9n~Jf&BV)Ah^DEj5iQ!G zUI9q{#PHM(n|BfduZs`E%1@k5Ba{rK!PB%peS1G;tWc3mKipn*xnAJ`SHW$-@j>W2 zaqx`CA@d5PzwBPI5;)fEwuC?T2YddUJ?78Xd*qsob~j;Vr&uNdt3K{FQ;=OtaUW~K zf=5VEVGs*JAsCMeDIdzG$Cw!xTj}u@eY8|nd26al=$@{;>8!k5K-tE1f6rAmrFTzB zA4jY9e68eu-lsfYOjE~abnZi^x9OBzdEWc+NBRxBIWwtOVqA@GJ!@qAcIwfT?-z|8 z+KT&sL?ADr89io)YM(DLcG*;cg^A+BeX*Rh_!5cvjY^_;M%?(hhqw{nQc;4xKq~Ul z$c@yIB}-nO`<)V_N{RWmEn)0jT#*=IcnBB@Z^Ne^(Qab?TtzWq26#iDJ#`P$hr!)6 z+w|)s>iJeUT~PD4akGU($R+dnfR;(Afi*@uo9;@4cqN>m&DCK(t?5FG``Kn1NHY{~ zWvWt|&ZP6j@}J_-Ftic-qjfnrbRwy;RBSXWQAY{i`meD~kCe%7pA-<;4SY z5P?rckV_NqZ==b|Rb|<^Q_6BBi+103nO0)ugvFoYg?a^NA&{Z?rh~5l6UhhsIg&(8 zvn3cSVZ|jzCOu4AukoS|MmnkzEVDx{vb~Ov1Ta;wr169?cflLFSQ$V!DT6+KR0h+H z%0RkExJL5}s}=^*Ulk90nR?rz6$fx+N2>h`M{2!RA7=R;pFiXN81W+Oh1Em>IUJt*cBOEj#InGK)VG?Ml3n3eQ7@#x zdSUm)4>V1@NNe$tr3yTa8@@*=4No>t)47_;<5?swL#rVb2^6Ny^-?T}%|tbg=^*l@ zNvxOgl%I=j{vaD%xNFZmZn$Q^1U$t+yT{o(8Oj*K40Q}*_sqeDNhrrkzg*7FI{8M3 zq~%t4k~5Mgj<9TB-stV)=I!GZj2ucdN{|dZ?e5Zj+t>H0_*efg$0>WMBmL&Bz`_cj z)K7HpWvUktH~PqYQ)bQOW7eI|GARMe+qpf73Ecfn)tYE|Pqe%hBiF?i*lPLq%6;RqU=fRG$O3>=&?ov^Mtp4F@30x6y^<5o+^KfYiD*= z+IJdN6WWh5zZU+2_R5e}vUgd3v_Mm#x&&cmyqH6>%2yWjJOd_sxblw5mmj=sy%+Pn z>M@}Ke5H}+4zzTgx@kgPD`yp&wWYL<`O0hM?fCq)cm7h&w{J4tTi^C=nyr2o+ z4U4EcY^^g3rj%9~!ODLkqcUiP0wp(vu1zff-*v%vbx79>@*SiJR%Ok~r#04>eF((&6$#U(7}EYlQ4%Gi(#jG1*v`-3>fd!$ZsBEsz2Uwrg;~6E81y zrH3aHg+P5kbW8{v__uOx;_FTM)UL3X`-Gkwx~{JOYUi>tn7efHq!r(k*{aM_UKUR8 z)_>T+&i#ax^Q9A#U@1;e#4DW_BJ<@PQ@OCIt!s0}i>9=E zr49RwJmBHrD5KGB(E=YIh~CR9(ksYq`?__HE;R2%%SC;C=Z+BnbEhNMy#BJEk@#}~ z;sHitl}=(!NZSv&`AKs5&TExRDmJqb15SX#GJQYOU?FIvcg8Sl8mPyuv*XAGI8dF;Brd++=_oBKAOa zVo$#t{N4V8$g4N)(7!T#WP)%p`HG-A2EtJk$SRT+i8cD z0Ai7S33jYzkE-D;`A)NY`{O^c7WHYKoV+NRukxDbE3N2V z)aiu&)j}4)G+Kil2(Feo)oQFFP?ZlAW9{1N!_bxZMmA53dA1b^I9WHoLK+&)Rputx z__#tJo$Ju5R`7gZD=VKjp3ZhN+s_lb+nA!HCp0nzyZ^A?P>n{o11izwts#)AilT&y zot98h33#w1RMZfUx%J>e4^-$fWhOA0F72UQ)6s(LDzuK$sBk)uA%@}CS!m)vq8B(m zi%3;T;uhQuE_Kt;Q_7ODvREu*T%!Ay=piL!sfMn66z8q8uG^_6eh6LtxUZ#pbv7oc zgfB|D7KyzSk6?UYW`L0=R8&hVZgO;;8@-x?Cl~Ay ziP4;930GvZf}&X}_b5fHoK}xQ+`K&b4w=wk?nJP!ijPT?U$1{pODV73zEXa4r12@q znc~syE-Z9YVFvbU6*?6v52)9#8P;k1O~YBD<@5R!r{NXlffU zt^G!wBU(>XKVtQhsz}vw)rrTZ7+2My2oX%Nc0ho|+kyNM`W7Erx&9Hs@Fws8#zSnC zcV>Ai4868P&u=b2RrY>2u0q(DjS}-JQ0}BFdg)QxIBfJ$Bx>xWbm~g+fhZ)4mXuQ^ zTZ#-S78mdcjJKqO)>Y=MEm8ZVwI#OfpQPhWkR3Ggzaj+q_W(EU)Qd$3xfiykm7?X9 zJw2D7&O?MSDy-6|bxy1TWwd<8s81pE(-2xwQNHg&cXi^?H+mv_j}|zQc#GH6I9I!v zmDv)U+u~^l!#>`p9{N2=inA|A!}0fR+EKB)Y^SqK*g`e;t@bqb>(KR8Al*8S9aqIv zz@L*#D@+t?&0FsT9)b`9J^>HGWRDya5()`uJd{wqt!Fboz9=ux!Gs|52>v!0B5y3h z7p;XMS(oYLT*jGoKbY)1*m;t(&^@!Zb1P@8pjC3Ng<{#;UXAwWcw?gBhfNAa(SR{K zGtt=Fh`H<4YW81{mQH_MLWr;InG@Z-%b6A*l)rDydo+R8W~r^3G@%idqiS@U)?xXXv)@ds z9ag1AdEX8>%Z{e)>d~r64M@ic|1X#Cq-GdnddM#77^6u?oy=P`RARuI`S{s zA1e!L_Q!f+b0!1}qt^5WpKZGAq`j5(%6H0onnoA1?Vm5=y%cj>A|1fdzvh0dFD)_f zs$SN5#af-}B~&S?%~w~jWJx0qDuG%&um+9XkAU1yq$s7+MrI{%f2NXWri}*e`h^~6 zlRsZ%(+VexwF*Zve6UWD@gbr=xGS0Yu~uH9Z`-;v_gB`jNG9qoGg+sR|10z3wT`AJ zd9<>!VaGP*8>9mAX)nP*D;2&gyob$@r&(o&e4x2NX(fh%BLit9BY$MGkP=p0V$!Ed zg$GQ;Rhys|vk0Dh(yLJtdRQ#heVA(|9iTMxNO{w+MOd>|?tV%Jwyiv5y*|5Dz3us~ zVsvx-WfDrTP$uMni;~$Pt6Z!$SuB6^|D7FrO@A#IKy#I7VJtd&!ErW$VoxvMpS+3< z*VVc(nlzdWX}LD2}`WB6_iEPm^; zFW%dSVIRzLR%j6&n&A&F3A+c6dg5VgAIVij$?IN2SU2_h-^goAk>1LtyfGw{FjKzK<|f&pUkO zYTlK5%7)&YhZH(g+$}VQ&#NyREI!W#`*gh3?Rwa2USg{bcVYPI07HGTf#1b|{V))p zy5Bg2JLgb!BR%)Y(c-a*{g+k{#EVey<70n zeWEg-zQeer%_)k$-XTvk4_u;0tHuM_V7aK+Y{L2hk4FG3mVdm%4i@YR|#XV)zHYT2M(^S&w=KltRZp(h8YpBOsqMEam9 zlV>cNv-ZNZjY}6T9yxm1;+5;O&a7Rqm`xmWWz?uEW5!+?G2#mELk4If7row_Op}Sa z-c~Gbuqvd)W>4EZfKdL?7=i@#+c7(QsF95{YNjh%QJE8nd^(WF!;;-8=G8Rh1RvPq3Ju-28$0HxL)R6)$;)^DgF;_tiyppj9gP#Du z3w{MJh0FMq0dGjbIJ66EdR0g*GGEr$u4Cyk(H8BNg^Md|m5$oW_z)CRR_#YI@Gv&R zm6>}Cmy)AiUC+Z5)5X@u-yH@eZXn*wH0 zo^O%mw!^o{+P?b2|80*2Be#rT)5nKfkGN~iT;=6o$_M2IZQp0)nUTusgURa_(7+F$ zXlZ3{zvLci!)W8Y+#i1Zt4w za=DtdxVZ4Op?x<0ZPip&XsW7JQ_(ny<{=b|uFCIbuvS(Ma|7AFYBVpf56>j_2744Z z+pDP#gM*E0bYUOcnOs`i^c#(AzOB$y6|1$jGj&ukVt~`W%nIV^1M9A|=wMHGF|vAj zcLOUQ#J5pm%MmtCsyl(P&MqeJRZgEc_08tpYm>Vq_o020le!kVE~oC_ZlP`~Rw!>a zuUCFsJK-2@MW@nM$4)ATPMuK>9cLX@ZMv5^e9ygam!~Gq9zJpO?1Wx3zg1rB-bMXs zYg%^a7A1E_7VUcJlCm}Hn)2<%%T(R-Jd^Dg>>*1(%&i8=F6!J0W2dRC#oDdiUlv2W zxRmhiiG!#fVGRWPw_RMULc$k}ynK?$4Ig8mQ~U9*Etj!f$LhyEBW~uiLCD9t_7S74 zeOL!yFE>vgZSg|~`(<4m^lc`Mnf~4GzM~qn*u6Jn_S(|Qh6)}02Da|R&iGYqKXJg2 z@sU#^BV77_xoDpWNz(U)wE`=Egw)#~`sc~{KnqekG{xY;FvO^`91T(Rn$@T=y+M`;8RDy_ zh<Y;~(EcRt5Ky`0oX#5Q(_$C$AZkiVN>{}8ZG`t zOUq6pJA{nnR86L#R>Pevz2RTN66)0MR;|v3Jqy?G?DlK{pwAmt`m1+~Zr8Bd#I3U@ zx1BbM{HiL_GU>SU2r{ta)P%Hjyt#Hzf?oP6h4(4Jj)e#8`Utc_FQWwPxvIH(HyDp$sF+GQ7)kw|x zVfVuI`xdQ#bHlR-E;guJug0VOl<}RD(&FQWO`9^}$=X$xj+nJ*T*b^fiQR}#dm}eJ zM?|%en?^whWuY~bUQ1KMER>O{mPH9Dj+G^{A^bZ36~l=|9AYlwgEQc7Mgbub>LK%7 zqsu=7z`9{CLLquw&|o(@aS;t8yA#whD=c7s5HUf8NHQlyc!aWs6ys#Txb>Nt%?kLt z&R$P-Ysz0ngka$#L;6U+6u+O{CWUu_GRH1EL+t{!2jqM;RVqsnNNtrOe4(G7STbo? zCQ^ln>7yVDNTo_yu(hA(YCj=zSMS3gdEj*bBJjK$n_Ds93IH z60qi|0xdu_sN5Z8peP2#E4%Z`m}XK2wdb`|XBaW7$g_rJBDm*6;jk;>02PaqvQa}q zNye)zM59BRcK8{@6B)T|LYdX?``kU7v`j41sKT@3=N@jKp5RiCjax_J@ zz(feyKtaaMLjN#)3MmrVU_GNa6Dq`=ot7mfocFP*9=vZ%r57iY6qz8Ya#hGKs!`3- zh${R<5LFE>FJfJQ`~qH}_j@2y#CRm+SCYL7o_uS;>l2Q#oVVZHxasKr!cHCfu)>ZV z3YCFd-aWpv)#i6kYI7&K*jOjG>`-CWbz6u>jw___%wjZz27kDWc7 zyB!(q)zTlOwfH`jr8t7nDP5J&qtFqdtym{Wt=f1^FTCa`BsZSxxCa~$z4l{i3tn?j zMj^2N8XegsUegWPo{ErR^!{hWYgD-pj=;@caa5-+ZrbN0!G=o$Wl+K-Ia>1>@*PwL z5vrrBxc8V+x6|%KG?ao(<6^`>O69!G;#ITMvZz8 zXxXe=hmX#ke5=dK?j7=av|0cr9=LoUb^#yE-N5OC4#8wuZ5O(;B0LxUQi%t8Bu`|mnk+~G50A`Me((@J-6cqq#B~u7d=pBLqkuxT{8A`T&XWLm+{4E^%aejjI#b}H34$|TZQ+B^IdtNsrE zo`27#VH!xCL;P!2?GXQ*pFG5>^3&uM6qIgtwsGEo9!!E?&_bi7t;AU;A02zT;dG&= zhA&>&suj)O!FWv-u_2V_0nd_}o353ZAZ4EAjs>hGgOO{Vn-=Y5blKd_HUJhM-Zs17 z1lC_vo-Jxv07R^YFmATw&kxwpEP}!|9re|Re0`aD z1NbF1H&36GLRNwVuhL0)SUeC$Un=|HvpvOg(dMA^Gro^?d4Kq%iNkQ(oQ*4b z`ir{~zYeVYJwA3szy5@RosZc5U#>VuRYy;?T(#=>bZvb?EaX>Iaq1KL}l7GRdtq=L$T)MICmjxYPyi97vkcU^Y(r?zXV zHt06JVaGaK^80ma)TWuz_CL3Z_CB(qDvQ%Y|8Vt%?E~$q8Xrf|#+oKJ2idGF3tgQlqE!e*5OM)#5qcwyDDBPhq7*xT%pqt_ z8VXcX$tPpr_GCO&Iel|U-ifgv{J`YWrOlhQYKPoi$bUYbF#Y(cJN{W=lZQAv@~(xV8ZlB0%1MaRSoE*$`0fo1;&~Jn7V%|pfEa*88OeWav~Z7YXCtPv-*~T z!e%ZH%unfR3APZ0Q3z3$E<$l&D{ros;VNVcf}nXyKjwVq?{%wg%(;1b#?ac2s2vuL zUO4)fSGKq3qx+4@n>nb@5N8GM=Z`;hfL~fSl!3C^K6O;r75aN?Xd#NVW?W~(2Lvnfu6wt3rivz5+4viIGXr? zRu_)1?nhvteyiU50q}tFRjW-PctA1#@(~{F-r~PB62&LQ3QOwB3wp3x8Ah!&N-grY)x8RnqT70Cw&6RoeD6x_EIDntHI+zpxo zwlR84h)gaea)qlYU~GuGf{XCa*=oWBt%7XWFs+8HWRv9d7c1W%Dn3i)WJ;w&Uw{3z z|LAL^@2B9)=kQ+a6=gcDb&(%H_k2#O1W(56CPK3v#*ZO-oxP3UY)Mf)+ga@v@~oeBN~6;T4>wLf+d3}auY(%7WBTreCUbOk9S~``Fy25pTg#Gm;Y_7 z2*vNpV4-XKXg9!CdL+0;xHcLF79eNP9;(y~OAzg0fth|6vQ5ZbP)HIWE?~&YkUfzb z;}%qRXTuMZ9LJASso27WtiQY>Tg~P*`R~$N#mvyw!)+Exhy0Fu& z8I@`F)4#2$$mbSIz(S~#TVM%d0qn+t1^ngNvsq_(W7UII{a$Hi<%5-_Px0B0^R~{1 zK#wTgD%bsfscv)FI8{FzaZonDRIHSOKvH-h8nPKth($Ud z`u_c%?ZawiPw@XiwTMy(%Bb6Y@k1mFF1u4+Trwe0MFt-n5&O!>!o>r58!Ec|Xyg*t z+s2Ig13^gLht|=QDl11)fKb{NC>Y{JF&2d>P+`b7iscH>q=7{~rU67^=`Ze?@cpPi$!e8p6#j#Y9 zvLmT3whoeJf&ZKVfGEPXvF_<5<6nI05dUHGCYJQtlo#ctR5?sl#Km2Q_8nHZV8h1f z)hu!^tG$m!Jr_--#3<$8kq{yu3f;Mjf4*xMJboSHLkn} zxxz$BHvUFYS+fd@GFerOzZt6Tep?Bg46*?P2VAy>flDJ`bKSNxe%bup;<-g<@A;QT zP3k?Pf4fdCFHJqOY|;5E{0fk9M-DoV><*J3pYKJrPR0wx3#U$(_}!~}3x`!o{5-q) z%$Y3uMkRiZc`5-WS9~I##v34u>W~fq^&H};qso>VBSAb}SQre0?U>F0ftbmWMOQTd zm?Qh0`#gV0xmwwCmE}i1j=5WAZt)Y)P%Y5Wt_iBJV-V-=qdEi@(-#|H(FbxR0x}|` z=oDFa3y{dpcra5dc9Z6@Jd+?YCZq_xs&-r;%es3IW2c8S#gbW z<%!q3YiH7htcF&|fPLzUhUBP(Gf5WlR0RDI?bdc>lN^Sk2p3Hgs5wZC5kaC0U)~VQ z#O=w(Bdpw3OdIP(3^*&o9eZC*ZQkZUO|7W@Ty~>-PS&TV+oG;^#R7geoISH-{&IM| zr}^tXqx^HkAkU12d|Ri@pG%^;Ruq9sjymupRb?Hlp#gSH5%CJct=;&YtcmF`srFT3Q?>m{efXyqg;!W58QT3vH}u4)_NQ<=rEIou+#%; z9$R-x`RuJv{!#gO)md-&b0y!o{a^i~0+KL!&KAl>ZtJ(I9>afoTd_Vkj(L6s-U|sKfPQz*f!{i&pRxWh|(@+?vY9g9po% zT(pAs=EV*hjobVJaP?<}{TQgt7X;RqELJJ(4a<=SEDTL$v$JR3>E1fLPOXVb{o*%1 zCDpu>hEYk5ywabQ5JVMYkP#iKy0wZa_?x=Gvwe`^Z-!`CY=UiBjR!R^rSaQW&fb&8MNRCZDU9dld--XlBme&Q z3Z)KyQey6_d;5$K8lq$yDFtA5mG9(zupEOljK3NVKnC1`IAr9@Av+NVHWN8osfg+V zp-EvPx{(lfC%O@akQMTtv9g$ClyYSw61b1w*}R#Tu>5zFE1?S)M#A;Nr{pT%%bURM zLDcC9ac}V{jQSBD3`d>=?}Q0##MDAh>;+%ekb7u7)FzZ6C+}v8Vb90?x-6u@w-fi4C zPs5~1ETbdTfxnTm{aI8h={Oru-02b_VGlh}kRg0OEGPT55Suz|CygHR5oz3S$& z=R4##Ovp%YUHI6%k1|?jHICXjC{E%}1dTC|nWu9Un(&LkqS}o-l7v-nKePHIB?1SZ7GVERr|nlq8yLZt~Ab~x4yN(SeOc&t0d z9~Jxb0(a4=P7f<3(_IhcJv*YXUfVK_9a8aE%1@<}5tFA=%%$55w>b_U1|g&$*!|2! z*M*K#!4nlDYl_r_pTl$bi6IKgZ~V#XDLK#k~VkI~EJU*;+KjaWP%gUKegB@~& zoP<$5O5p(tlxY{)sfWf&ZfdZ~%gwrWo!zx7-KgJ`tI~K^9@YuW7*$pin<0-!yET%x zsAz7^YQ6QLE06EQGlwcgO1SF}{6tZ_>JAi%X_sAlHN{fKUNn}I zrmss1VwDcA=5u7|Klt+vas>b?SNjGzspm~yjwk6X9itJwXbx}P2}Gjl zIq5cr5ki3#WOitvWsp0kH1{t+`=v9~ngMTt`+%I3vlu^8&-{k~^cMMqU|a?(l+OGZ zii@}nD+L|XDDi}MM+6Z0Zse3CR2dzS8r+MK>J&;%IojPT3Ux>*?k7jmjc5%!BoBVD z42hG1o@f!NmFNaSfPumBwOrt%ZOI(N`jCQz^@lrgj0!#ks0$s@fHy!rM@J0erp9Q} zZ$Nq-9D~u?&`MC5k6S`U_z1O}v3_##5{*Y1k(@R&IM7qZ0CeTb!}tk|a6YTImid<^ zDD9cNnwrZPMsT3HjL`#y;Upc-G(mZ~lZag!I2L*!kno_k_=}!%07Qm#EEYvp>G6#|ZD&pMHPRdEP0FvoshW%9`F1jBqd?{gd&p zK)zKHK1ce^ABjj<$z#+$LGHy%<(@RQUhuaw8*6t{UhyAXXgIg@7sEt_c6v~gEN3>~ z>i?5(RXz$ZJaYibt#rq`hd`%_cehc+2ojq?M$$F5%|O+N1E5wAux}8)lKb=bq&mg7 z*$cd{!u%J2dpOH$^V@4MFFqGd={QF9$qsyR(R>Q3zD{*aP|IjBAWQ^^L%`5P6bodx zeoR8u)1~u7i^Qo%mse%W2zWQ-kQNw$1Tr0L0!f=rDaG&OB7DiT>{tRHx)e7;zyOp| zCp~oi2KLyCGE+29%81O#k+1DxuBA))y*+&U%lz)LXISvdtk8dG=IF6g<=T@Te|(ZN zG-ySsW5?#do(bB%J!tWrEjt)n8MNJBVf?%xDZcE=r=EH?)PK3`LORVSd7Gb+Sbx`-2rq8;Y}>+K=S}!sej=Vf#+Jum0DCBVi|6p4YsgfE zHVAxj2gvnwtlKSWx3zVPcGUX1MNCw`q-k*V#MA?zt0K+SAxZ!ZgErKr*z}=OQ)&@% z(X{R;eUd>;G_5!?E8Wu13OGHNI}6d{^UazM?Ac>r^H%=5|9N~CTgA%mevy@3BMq(J z<$I2qwAGpGWTzeYU;9%Wk>%?wY7i^?T)}=8vwjV~v8UTxJNmWaHz4mD!snTZ_-PEx zs;O#166i$ThkTxZ+!YS1?p)a%AYBNHa}hxY+BvR<+0jHT6D2AZqs2E0H&}Qw>i!PO zh>!>imEvbor08;x3sxl95)3URQqC*ujL&NGVVC~9-u>~y`)hi6`Hn7K`_`z@`z0Wk zGRDe(#Jsc%Vi3LRS)Jum{huyd(1d-_hP2vzK2Ui9S|%D1#`&s4%OvWmMeNFUgnD#X z-<6uK)!?LO9z37^TRJ3R$MpW`B=ORrb!Mb5qo31^(2(lVf->+2&Hfm)dt1k7fVSZf zQ_o}UmjGEvouR=K*~?lpBmA72otq;~yUHBH`b?dB`PAAeXghw5rFCiEy0Fy~Jw^>5 z+^S%<^F-0%;V;&y`pVo-FSO(}o$Kcnjpseu^%~yapIBvZ`!R#Bpa_q&3-7OZ;Ww8- z-Gak{^MKkOHy#{V}AMS#GJO#tK26nyD^JrHFMZ zDoYbnGgF~f!&4Jep+z^RB7R-Th#IJ_N+MwyQ7M(~YAk~GCb8mEsm%+HNZV*KHL$n! z(>4kPvXBH!VfzZ(_38o$;Ehwi@UxE$={bZ&UpvWMe1DJp76tn^?R}MX%4*i2%7!;y zeYWq6q)JbVB6wBeN6Zk3>d5RBGKpt1xJ zE5;VAacLH#O)c?y6C^jT2qGdGIT;xuPoJBc94WugCqLY$`G~B!Pt<4YNA0d%LsD87 z9(rZ;rdN4})2H&feP(ZL-8C^Xy~V&5T|Ucus#dS~X652)z4q*LOgi>GlW66=kvpcm z5!Ix^#uY0!j4u7WZ1PSo_Ym^V4Bg2hbO)BTb*Z3Yp4b?=)LNGcwx;Z)w|4F3FVE8Q zLJKyW{G@oV(tcyB5{|1PJ4SRi#^}&Fu?oXH@d{|w zR3t*msoT-~_h6PcpSl5CnwMaOmijkfldUyhw$T<&in$ZO2{~aQkKD>&`*;h!SIoBH zds)}cy?SE57B%JR=?)P4Xf7?#YdI?DNVy(Lm`93>TT53@vD|3D!5n{;y(sA z7$HOU7Sk$?_wR(fuO*6%ckYnxAtrdQ^jGCkMEGMJ1!}0pst_Nc%NPC3#D^PK(QJaH zhH7D0h;6gU5f)L$%e=APEH_q>K~2^mUBHv9>Zw+2O=NmbDoZN-wP592sM(v+AZ>87 z;BKy%gC)+iPK-NGv0eT(O5Fur<(s0z`ba)WsfkmrhPe-6qIS&Ti-idT+qE(TMP+Cq zRW@t|HK=-Jy5bnAV9B0Vj1|8`G9t`;W@->&>#$f7eTem-K}`}yKuO-%zzqV*8P(_! zX|VB#HNCPrGB@wlqlnUfGwODyiZ97)9(}2Hl|H@$6C1IrAMtNT&g-SDj1QSUh2Of+ zX>fzMkcT&Q`n)+^rN+tin)X>dmPHS0edx6_-b6avhNXWxGjX;tu#Un56`8atTUDYS zv$xTo&wyaN7r*8EUsJBjt$2#yjvYIt zppw_+R=<-j8h{&5eI=;RMGw`h^_2iRLhk`%V@JUrx*1@EdV?J#t5r+q1@MZQX&_z^ znX7<4cTh@On?4mO4f~PF7f!4x1V$vjUhT2#LRj}Mo0JY{?fF;OU;ONoe!u+P9hOjX zxyALoXE*T=LDd?3kxbnel28>L8<4K?8n@UME2vCpSFFZtQBO9eX%*AjVh!O>jNuK4 z*1C|a=$Pt|YJBl0Khe5bkDk4M8(p!sYsI7cYgd=L{Pd~9qLdC-KknFn(f%nBx%Cf^TA^Rh4Of74+tRT%o{F{4IuhK>V>SOhAh^;M8vIvLG=ae0)iq0mIXhUK|x(4H0ZRo5Gw?K zvJ%d>R<2dKQEcbo2j1j|<-g^6Jfl(V(0k>M9%A2UT4*q+7AL6IPz{f!5~>G?MnO7# zS-Oj1v9j^u)cYVOJ6%qWjf#l?>JJ_dSq|%)|R5PF7z5C^l5@hC3-`flBu&}<| zzk^@ppMC$iw3BW|22XKbLf)f1GKziGNX>YKPeOAN0{muk0|X*QUr-$6R-91n`0O#yRRykQR>)mhku>KYfAqq zzh>^7l_@yuhp@NHpl~_FKzzUi{zEDW1c<&F+s+K@pBZu%Mmz=95y144vj*>25FI0- zu!De~iH*qz#*LE)vKk8kTE5Bm^FR4z2{@ZCmHH(gCGA}O6$?5APxB5xp2BOeuTwCs zjIqDC)8AOmA^vOzJVZCFIoZ+f0qh`p`RWU<0P0r&^(|6U4RVNKS4cNhpmnNo6#{`< zSW{rpNURi>NMAX1yde`A9#^guGu55ncrF_`w^8$;Y3!lrFa7xKsJc5wUcB@?08@AF zZGMqOVAjW4eskBRQs%q@Kl%(m_tD^C=z&_9RlEXT8jrj69W-1bri(nHIxCA}R;L-w zu=&eI94jSWz-3c1tzG|FkqU>86d+RV;pQ2nh#7&9ZWyU$1m_uA9}wfC?ou~jveT)2 z9V~{rHUevB6L%@!4dVZ~zUr_!;Zr|L`eRyQNg8T>d$Jd&-4H zUl$FX^!T6_HCeJgiN0LHhNjwBTmC+4{;a~tL2LghYEKPr5;P3T@q&IF`o?k+Xk)IRWG*0c) zblwX!Wr=;tq&Vb9TKaqPZ1$0~qn(V*(9AjLI`$`c=L~o!8uTBl25a<3@+moBKiX2d zI1?-U$WHy7RW zQSF&b_Z^&vqY+i@t~1jzuU>rOKu*qqahI-UKIOW|2PxG`4pvoKG~IyC90jeLwUGNR z-oU@+7akct{1IZW4U5nDOIEI2zhui!7P;rx! zu}cw6B5?&-WoZwgZ70U>w58sa82gmIU!kp~aaz&=F5 zm@_D7Ex)~wrf95Y-b0w8(XboXWo;0 zck^4XZTo|?OC_YD>)?#y5Z@oKmeu0>hymzGH(|=?do;8z$!VckgPTh zsTWH#ctA4EDIu^csS3G*5Yt())LI>3PHandNiH|0E+NhC(Q6(uoVjoAWI@j^=YPNG zzr^1t7yj5M`}@@%*)J?k{^QkQv!)J30Ynux?Z+k0T$s*qie5kea+(r+p}ONsI^K{c>n58}FOR3^HXlE%>c+Uq4=f*oym5aR|K#)#OwL@_i`4|y<) z=pAq`TXIMM}LcLgM1D3IMKqpRx?v0Jmh(dg85QBXpm0|r3 z?P9?zmh*eN{FnWAsDZyc;??1^W(=1*N&|V#=|A!xK?eLk3J|xRI1U z+JW82I0|k3sBBSe!x*$~RCof0L|2t)k$eEOz~aQ>0_v^+HJQb*4y>GfRQ>MtBZRBQYP<5iyAoDJZ8`4--g6%Js8b1%qR1$mchdRAkrr$K@0FdNz!2kewVnAW>CF z>CCc4sz;O`lClJAAcV^Bf8rBLn6hN&29c8GUpM_AQmtZ*r-$PV*?>}B3Y zddU9){gcZ}&-vez8i;?7mRzLWHAWQVCFCe70}GvDnMhze0wc-_5?ewI8CuV#3}jL> zuzoYDifIxVBw!F~wT_DlM5@KOOv~J;WJDX2N!N>#EHvK9k+UA@(``84_Vm3qOkv3r zhEJS^!uFC|{5TshzR#e^BZeILV7F4CMc0D7Cyzez-H9PPYE|7cX@jA$rRGeI}UfpL?8^S~X2b0lZ878LI$XyL~P+e_+qeK#1KEe8HX+ee@IGW_I zE*S+bA4#7I-Q~>1r$%7j2Ow>DrNtoEKhKt$)#F&Csmw$O;6L{GAV~$QCUWLNQd#v5 zt>mAIhSsFOR&ZfWQPeBVg3h-|EgSb5@e79}ilJ>$ffxky;g6+?(i~K{BBsCn78}Q7 zJH9u!WsWPPey4)CNdNC_f?SVDPZdwwzf6%>gp%8_mckIX%r8CRdcyfjAdA_G#tBo) zT5EbzwdE!$F=@ylk(e|e-Jh700*OhK_&p#oskmNe<=3y{7Z3555A%!b*RzU;S!e%( z_0KHXAV0ru(ZUVRy7C%+?cmG&)^qIj*V#%I>U)jFu4k{8TzK{cNt!F|U%zRO1?K=VIEybBt)DB>A=wVRJS_`msLa}Fupm` zS&eTSJ_}7GK181LiKPisFmegQ=;A|zO0ToyJb%(i<_eXb#%j=)%iUS*9VbZF#xL-sKf(wD9?CK}5HUM5pN)gIE*~e( zj6&kiEIVKWly|9;r?`>WhkQggCx{CSlS0DGPtE?(W-JA17Ddp%>_A_%Wu2yMqu8Qt zSd3+zk;WQN+SYjA+KhEEM>ryNr-X+#S}kkw&};_0F`HU4E~Xk3rH!c$$}D$K4)O$% zdlrb~oLy!-eHa&xl3HoE&j1V9e zR)o!dV%7|WZ;xepEci9%UBh4F7xwYnYlGM?e{4E}X(U@G&Hs~m_wu*C>Bv>SXvVd5 zu;8Yk4rw6vMb!k;)e2hd4{;+s-(<5lZQc5Gwig_u+rnzNusx?jI+Z(^6`miCeOih@ z5L)=33l6B@2>tpePL+yq2(FpZ_F0 zl=<(ms+;c{=!IwrQnyMo+#5pi4OGjB%mra@bo7JmzKBatrXC4MBlQ-k&E`Wp1`{Jh z(Kr&(2o{^s1Hf=2fkb7Ijq{dtO6@5h54)W9`(wBk%g?3 zGil_t@(o zD@F|mwglhegD5m;4cg+;m<3SaKPm(lWBgE{6BPxo8Ri|#1^hq9lY%N8guJusN^4Ht zo&M|QoBX15^RF>2Sa|yv*G!t_T`=yABd;nl=httBt-Us#)n#ExY#iH_8<$yU+U#x> zVwcUF!b?gW5ydx?ieXDkz-e?w>`I%DIz`h&Hh6-51gcllff$CG=*^_@r{Ug2uQX1Z ziHZrBULe#k3bpXye(y2-9Q z39RV+uOo)cT5{#vPu^>iGvdp|jcPY+f)=~auWUOhDRxHxbsHFa<52Y)y_KRWmFrd| zyA8eH<*wMB9jB=Wat#mTfjCXMEANiM!6kA|$;WsL@IgF(-5H4=!v*JhG|t6zmk{tl zz<3d+um1je5X|bCxPfE?m|K(vL&PGmjjwQG5bHz4)yx*dszG;I;dyB)T?YTAx}_-v ztzEK9Zo7@Y?0=2#Wb6`4+K1j9O2L*FVANvooR{V9K-s<$?XNd-Burrdd>R89q zs%**A3Ohnys?h5C16#D)AkshFFg>iNMnsCfIp}-Q_kZPw;bLNXmhi)15W@;qKAOq* zPkV!pWqJGn+ws{zRxspqwuA34!97_M-{F-ykm8%rz$l&yh?pzLzM=NbH*zt0(`8b;|%Sdn7%Dx9_kNl=Vf|g zZn2qQ@ePY5VK2T&r!Y(7Wpo}9wc_YnJ<-1iS*s=VsU#a-z^8_y&$%Pe^NF}XC?5Uu zYy`G_xM9(_wDGhk9O;X~5!FoX0G=AaE(g>P*noPFRv$`vr-6G>J${0*K0KF>Jy1R# zqMdgctSwF4MR3unezk25n#v~Rqc#aD_ds!Z}gR{mtW_{-n@@Hr^8iH(=u$I~IKg2q;sTV2usVwFR zm>;DtLg-lifiB?1(+s0R%ezm7U@LcUW$ae* z&cqvQbq2w88l*clyH2$W|U2EKH1b@f41kTX${`sfUi_;E&f zvvMOdQYcE~j`YGt_~y-~O;|zw{I|aO_Kk-h;`^KAz5XpLcs4$^>Kf^bwr#3bUr<&m z&tz6Bo_)%*xWR}E%2ijCD-~_8_v0q^*RZ3Nvk?S0wyq}FHI>+64>mCMatOh{{YukY<7AHTHpCh2Z|-Vjnd7*!0Wwh=@(T=u5Wx<)*ETRhlWC`)I6Fm|0h7Uzxco zAf$w)McqF}+q!?)#I4SIB)?5@tH!ysKBI9^D*16;;z*Ii33n*ga29;%rfD|MP$Ofh z$O20aSXY6GM}eukNOotXvs(-KiQ#;>cv02+hCuF@P$qiB#wNmS$$Q@&%>73{H}T_Ys*jv26EO&9f{TI_&Uz31v}9bI}FJSnF}YJ{whu zg?@IG#fC6`_0}o=Tf%U%o0w0Z__X`I^Ze(Z8{Xrmt`+e4TjLniVtjZ{dh>Av`bk8_G)r}Uyu#$1dZHP_?J9y$ALKIiZ1;*5yg?XDU zC4~ECALG7r14ja&v$&w?hShm+*oxmrHfcTETyyP!9iPd322dh*+W-af7CO(+bh{MC z0yS1-wH>}hO(@z9%>+onTos2#<>|)~aRQn2C7iyb#EI^0F#8>*jV~!Q%z$!XmOBpr z(1MslLKInUAYv*~s53Q&O#TNpsG-IaNcl-?eiPI3s83C3-P#khnRy7E7yPDd`Htr1 zJsfCO^KuWGo~LX%wskAnOVx4HZh}t}5Os*P#J_AHKQqx_+;%liOyZo1;gRLk^5)6N zTAw>0{>K!I*T&Bw~alH)Goz~tqfJCrp5vuVq_Dq?0%S{534xpJh z5sL;A0qO)e1gl-owD3ZDs#5*6bEs^+b-`cyIqdw`Mmj5zoiF#@)4hHB?l4~8l~3;V zea`MP`u%VJ-8!dk3+xav2G={-VHDy+z#eEF3=p^W1ZI+m=#Z{hgc+(o(06#BmI048Vf=fx48gvkf)gS@{%Jw!3IMR6}NFV$>I4%lHx( zK@139wO>P_YOyI(ZDGTNL_isxz;Njo&jcgr_igiEw&|2BR=}`P_FuD3s8seJTOoQ5 z_vCAZXI++ZoDZ^RZT6Ke`NWAmz_S;i{ecb7@!+MnwYqULSAc6kixS~PD)JI@+bM#GRf=!! z;j{nTa&^{>pZ?(AAZ7LTekbeu=0ODsf`>L-p0;5F3;$XEq@>B6ALXy{^^*K0t-WXI z&#u+jMn$aMWtkRfyUjM6P^?{Ne8C@jR9EK@)fG)0OssNOyT2|0mkcbOV)ImGsO7sO zU907ivnR)m`{H{Pud>e0g`L{5&MiB(YzAew=_0?gbSVq|NgCu|dG3jsEgTFHWq5Z>Rve>}VU)`0R?<1EmQ>`d+3EB=)0aH!YSw~P@e~^s7BY8h_Fpi_Le+#Y;xN$J**)Kv*rZ`rhAwAWyYZOSqK2vNwr$0!< zUlMf+7#XCncw)e*fGop04eJtymKP|9Cn^|fMhyxR$Wk;4GQ-=1`Zv#7jSUy!#PEQD zAdEOs20)EmwGOX=S=hQw_v&NiSnw$tdtI=oLm3vze|NWU7tpt7_?_6t$gGoQe)}hl z!0!9lu}6o{T9B$ zBf~A7X?CPmC%%gMytc4s?2K?Dd3)mx5Mih@59j=*M_1(bAR zVMS`Z_5@4xCG(4nlau2*VoHqjAQ8;^=6oAQdiBT#fp4 zV5mHmGP2xMCF~8A@%?!n`Tj1g@PmBlIR8!Q!rIrzuX_PhBXW-ewj)ETg9sV!rp+})n_Ndb%);xK%$3RW2pb8*~;t3!| zqJ;-={B~m47y_Iiy^wTA+}jTPw$hv5IBeky)^g;RN5^*N&{pF6{O&P46}*MQee)x$)roA zVo)zye5O+iE|I-XCUZ~LyRk{N-sFFy(?!sE=H)-%%^f@{vCF>Kq_=!+294%?;j?e| zGrP4Zo<&X;CcSm&uiicHesH;0r>wAdDjt7v)t2tfKV#wY3cZ&bZj6(6lV3t#HKNX1 z)uB;`QWMoIbkUhYXf8b)VIz`p=4z#I%^a!(N3=^NcxuVUaf1OX1!z^?d_j0M(5hO5 zMwf%(l@luyt*TX~XA1ghw8~B<474^|FBMJFY@|x1JZX+etHgaJFclqt@4dwR7wU|E zyz}xGrCsYA4H^6WCbfOD<|d`2n*-5C?YSksHu*2D-6!?vRc~+A_h!#}x=HORM;?}5 z(FvtZv+Dr#O(b+)0(uUHYE|E8pa$m>U*iH2#^!qIa?^q>Q7eQBbx?s93Uyh9`_x#%Od~JE@zKQg#@2OM%ogaKaHa!9h&P3;N z*oY6?rW1=Ovo7j|si8kG%vS&`iQ^D?4l*t`j=-A>L`9ZYCIt*}jmAx7%DmC&!!@Z& zrHm%Q{1l(VGuT+RxL%g@!SPoZzuvT3@!QZqu&!aT)<>?q++)j|R*I{a(X8x8uuu=OAyZiU$64x8Uj)j| z8rSk;ShN3Wvf8?pPH}c{r2_w-?&z$#MCS`^7p}f$*VsUYI_Hwj6-GXRwJ-_V4ac5p zkO}HUFe_AeYIeFq&W>=1Nwf|RH73IETyji=H#? z4;%Q-HrJka`VW;3pWq)I@l1Rw4O0Nq8eyE;l(Z2;D)QO<8|BqANhA8T<8OE6`#Sd+ znEc&A+Ed-q*_ev(3OF|vRSmM%mkIh;k4D?VFgkgWAoaP#r3He9(gx;6kUBM`ICXbI zZ4z}~!e~CRBZ62-+PvKiMkAcW?oiN(-POJQ<*Jjv{QkwN&wf#)g2$9mtHvs$S4kOH zSVqjqQE~k2&*9hj*_g-1cv<2({&$UU($8iO8lHJN{aoEA=pIsJr@-w2@+JqNNxJBP00yZG=|=R-A`pzT_8pcX^Kb8-nK9#=Kl!&Z%lP~4 z;k^)Idf55$JMWBlcVD-$UX@|9FBP!LJhPen(g2KRLi<%-?K;2l%rh+XGW+^x7R7Jf zB z&Tme1ht&e@gRjl3bl0z{&Bgf_xPO>KN`Q>*`v5ly)n>b-gRF4{}B`@n*>* z`L?2)ix^_-p)4A1)T6`4JT~-KzL|Be#BzUUwR|k>IbK}y^vD;s@z0)rkwJfV;_Ha`0_SC(K4?` z&n{hVB8S;Ki6vZ)K*Nq}A9d}$X#bjpGFF5_CuNzlF|?h>=#Zc*YJ7szohGMx(sG^R zUzUu=QV*8givQ=;{TKN8mMraKey%l3ePi!WEUg{?fxWYL=59>tUb<)I9yVgn>^Yvg=uBNQOW9W1)#(T3DiX#4d|czI;B#U!a+5Q>G5$ISn3Tc}IFqKc8>1PaMoXqU zy`@j0yH6x_I0fzm-XHqJ!iGSDUWf4>lxGSx9^oD9#E=d^Z77P-v+FdL_@WyNM^($& zxMOICN#C}1#hguv7!h5+>iqH@!tp8o1I~(kmuo!mxgnx>(Fr^iUES;~jAQp7ILhi5 zIM1%#JrWa5{V(CUTlD8r&)OpF2hYvO&B%)J7k6&J-f~uKK63Y3N6@{7zzu%m+>dvS zM@@b7MpW72SEvYjk9&Ff@tXGWTwA?JFS*W;G? znzEAzJX}8nU!;nmtUcdZJRuYjw%+pd5^LI=e_wK2;%~QL>D3}vHG5y~ANgF~iH2c_ zTntpUg#j$Pg-3==9n`V`ePJ(0tZV*Z$(nvJ<^nbO(pDeUDWGn5!EYt<1Cm`^w5ZI5URlu!UhCH z)6@m1^0EhdBeWfe&XUPqT=A&LG<{qdHsj4v+Ro}fs9&#<&kX=Vwn3SJn?5{;xn)mQ zu0F9=%ESS^BcvF9Yt6XM<7z(&VEcDNoOI_bac?kx zM)Zo-ygr*}tSb}pg3Yidq)=*1AUmz}h@?K$(ppxa>aOzY!T6i}Q{;(d(8i6O`C{tgH)zCN_in(Ohp;iSVNK1XUH)FPGqZPc=_xr+m z+qEX#d6_P*0aOY8g=xXViGu5Mf448D&-`MO4`n zNv;Pb5tuO*T38Gg785H`f5q$^gatu2xf|~uj&3V;ouBO3G^zupGlrnEXR(~Ky43OW zQqJ>FHhZ$|6+Q%u!MaeZ=UgvnIaqaBX!-9pwz!#k)LW1CsL>9Y7KpN8mq}md5)F+J z=7*6PPN4v*%8*l`)3rEv7I33k9_JJMX(wC98~>8Aw+&j54rsGC>H-4TcXrTRbo z;75B(|NBhleo3sErqA6Gv<%F86Jk&2DH}4tmXa`5u33y>*14)G3l>cvVKE@8K@;|Z zCEH5jfo6G>8~k^SAm}im#>!TNNpH0>Ya~L(3@k3pFRpDvvmxQ89E6lxG0SJdWEsfLhOZc5aLVX_?y zr{3`zd3D1}(AuU5b)hT%VsNaHFC}P&Nk=3SEu9+0<;SI>M3nfCeI_~O&;8FLvF0xp zEma2T(CZkdMq2t{38P5Yzj_K*5K!DN zeaQj}0KuxVSkc8FZV;fs!KNsshBju919?7cF(rF|Sf!Oav$t6UEBIGy_%7$$Me938 z2l(Fn7Z)H=xO4iPWt#jUmMbz7I_-_j1o5nyIgb(98)VKc;4ow=O@9(({imR%l`0w4 zSq;`$7qvfD1)-^oQJd>yC4Ghne&*zLB6U*NOh^T3}Fp}SA>T!ED%YB z93w!KB}Qjcmp}9+jKT1*ER2HHqD2UNyITEtbms@B_`ah{`R0N_AMA>XIyUyhX-m&f zUe~UNf6KDr4|Ql*TMEkSxR2$$ed$H!S<5f)U3yVH!`@@52RHD=&-2Ub5`O1+7`yrD zf|>6e+AweIY_hjnm;T_aC@?rR9rIKrvli_UXyViWl?2E}KUSOk*9oIJbRdstKNld6 z$%-J4CAn$uBgB2t9Uyy6k;GQ`sEql~lSSL>!Pewkle zKk4-RQDgcw`*8jCub1X`;*J(WYgbCG&62VzFS@gK?1Jx~;(wHTXZRya!p5!Mt6t~# zPCft5+z|H2*lziAwsaWS9lol=%eT7j;FgA?x1$`8&Y^aHQ!u*?nWM{Ok{6~a;ZvwY z2};h|wg-I{Xm-19c7d}+9S7^cKax-IF9IDf4i>*oS_9FL!Imxh1hj0r_NV1NqVv%GvOU9;lg(Sv(Qr!;Ge+v==#DNiR8h@xF2U#dm1WN_&I7kO* z$qdx|us7Pa-!tH0YCY4t-Jak0Jqgj~7Q+TdAP@Va6J0r|QAe0^`AW>+-?DeeCg=;x zr5b4EakNvNmR_N@u#qi-tlxPxG)iR2LEwlYiwTZ=1%Lx+8v>gOJ;f13N5UZz3stJ| zmz(b4<6W?w8}Dff7=MePjoWIoerzOPH8}on{#P&)vpE)lZnZ$SC}g9oT}*`2^+3_1 z`;w~DA@KT6Sfv&@LhwUNUoT8Mh+M?_%^rrNO+ATkMH7>0?P1Vejw$__H(_sy4krFd z@NN&3UUO21e~SAKQDd~YF90I?tZ-W%${v_=xMxEDo+T zjjTikK^7!hR3$HstQ3upay>4W4CzJ?6nPsz%%5BL;`c-4?JQw0i(<7)_UzmF$-&z7 z|2{T-g~a}v=w%&Pt>_BZ4zH{I5+oesEBL{^J28Cla>Z(jZ~NTD>5H(teaNPsg+z;o z2f0wKpm~s}`e#diCSJo|h!s&$-zTLaEX3?+wl7CL05o2HLF%C4XTM5w(P)-DjUH%Je?-nr9p(oQCg$DE1`FZPu-qd+vOE)3DCcQ(Toa=94GyR z;gf>&qGqgoH0D3k#GPozFvH&@a@wS!EyyBthaRWUy=PSty(Xr@yeLPOoy96CRR!Qaa*MlC>;$uG$i03 z8|&3?g-xye%X*{84;AZG^J$)xEO{_9>c3ulE^=Yn+S*|{v(Dcf@7X#GMK)wU!_!0M zaq;2L#3*RCk!q32R%uas-I%c3PYu#0?4k{W-tW&wbFpkvI-w3xl0X_0lr-cgt<)m1 z?gxGZ#_DE}>d1j)jDj~bA)x(hU_}u!&tiGFTBZ5zQoLV zyY9T=j@p=AoI`W;CYgy7sel@x5D}HLxG=gl&=se!ER2<_f%a?_w2G1nnPg{B;fV1J zG&5G?joK*9-tZF7i*f>pAxqo2Z0Se;9{ESc_w9Loamfp7{+Q4D5AIkvcJ{Ox3L36n z;OndW{MPIf!$%yQ^KiF*t)F@7eXPDEpP&$Su{^p#mKBvVMms9u9)gi9rV#pWl5j;k z8{ue|&s5`##i`Endf}D{#kQ^(_#5kj(T_p8=3g&gWc+f)+voq+F;FhYhjSl>^ zl=D29`T(Rmes1po3g%4d_|i^{{@$SUFKBFaGfL>yPV{9gzF^L#sMq1G<-9aVWznw;&|gcjKtu&Ss-3!vw**&{<@785-b`V2( zKjt!xmFgEi+Ps6bcJ7fgy$;QJ@!mY;$RSpVmo(e>;!L30To2JNvGnC zaq0Vx)%Gn@XL{e4)5m;-s7*f>!Yc4jSXDPG7gNyHiCy=MuO>-L{@lp7c-X*>QcLFP zQ#jwrJo2fJejAkiN2i2p(u$c!&J6l^_^x|%gV^BaJ%^HYQ?2xZvodaI8Y-8d8z4ZCUb&joq)t6qY0BEvD94nmZ=L)&q&}KDz5U2UUgBbLC$F!5TVc^drJ3W_ z?VLaJp_9KU6K1yRqTH7IJjPt|&h=~C)Ywfss}J<-5u9KOx&S8xs$j}#KBw&v4VGo8 z|Mx@G9EJ)J2Rz1HPmi2jhp;Eu0yQB;yCz`2u|anR`X45XO+G5InA499=f{K5J6UFx zf1dp$!*@2m*Y0}NoxG%h^DC()Qx5hX&6I1Oo*$mJ`{^FvK5?U6rzZv!);uxfYnk>l z47y<%PAUoeaRw%F1aJkmkg*;=P(wuh7?Rc2coq@}W>Y0KK3Hqq9C4t6u^%LmY2D&% zlC@q_*cw%5VKOZy(75Dx_B5=j@c)GDr~!6FN=q zH#p|_3g@?t>t?rM(!1L>^=iE1+sAKUAB}+qTaI%{hK5cOUc>|9Mz*-32qID32*!k& z{h(Bi323BXkXhxY#wHNXko29k!zt`LYGMOnqFpM$wB&F2skrdbpZW@^)pj}g+dgdz zWM>}hMb~N0l@+Idkd=+Ryq}+X#_Y9S{PPxxt(x)Le{h>1Jw6r)%|?ieEy4NRzb{+7 z)YuByhQ=mgWLV?|_GQWqu`fd|VqbJ%*jK77xl#i?d9W>ASZG2L`;xBhjfi~n&~Rs^ zJgVNU*R)=fe2FeqbX{3`^7Ml9*O*+Je^lzYM{RpH?Pfpu+vas*v&X&qVavl)H(Z|j z$wxS=F{M}B=uQbV&t%nee_f+41#OM)b=bVn26{3`RSXkK4UQBxO9de5$j+@m)1oSn zom;^J%<#di3i$#$Y`lPU_I=wU$w9_C{pZZ8Ri%9=68pVK?9aNk>g2hy{=1^a0Npc- zzpUR@$UVsUU4PG4KL7G9GT6z6r#qDgtw$XtDq><RH_$K1ENsgu}IyZv)+P$+0L)~5hJkVk{k%e!%;uK0mlvSXS>Hw@xMwIP{T#9rQ zCgjeYtomE$7dBqFb>XgE3x|%95%lVj0l$`i8nc;Ic$vBPvkIGg@#gQY;r`XfrD1)R zy}P4F_wR~nwe_&tDu^~DIGU>-ORc{x*=XcKOv<8TRmCw zB(?-|-^T=s%wFTem6?1Jt6jBSXFC5L6{<*J`jx!DSJ}us{MVA}4LgA051k$M!7wm< z5JP)O=4e`aMfnwc?xl5FVvD*{A#SUY7@>6d#l!dVaR*mKXP<(^G;n_?sM^yUZdL-_Gmu+_{giUuRAJZq_>^l0NE7= z?~c$s0y~E287dyB7y-N>pkAJ=7!3LbTv(KWu<2vIy4;t4v8!G8HeHyqi9HkpTwB+E zQ)>>Ww5SXGueI!!bW6G;xqwU~f9(FpE2TU|mD@NTW@~Oa+I`lPp3_6hbDqZUTCz2z z0BsH%CVuPim&gkM?ay%JV@~H^%thaUs-Vn_^DJC5oY80{iXC!Q#-#IPH7J7CF)sshrRbU`3A>97o;*$@RAEh>s)?7kK(2-tw^$^AWNc4l?~zxUqn&x>ZW zvza|}%F`Tf_!z7s0 z8gp17=74BB)H(o0!cl`Tz$n`LtSr_Hsz{%YV#u7uxp(8olnQ8miXx{{JbKXz;spP_4b?C(&kzJ+ z{{)3k4H5z~H>MHF>aATi2A`LXJ{XvcVX?6+GUrO+Rz>+ zaTwpJdiIl|`+I~mU4On1d5q`#JyK{A#$*KbF)Vf_=b;6dGOUk#1-5U?MoPP;R|$o` zB^*)ax);IXpWb)s!MyxGHRj+pbzP(aAj z<$o%lv$n8#ga-ipIz~4# zDESE#Ax;@gwH$b8;wN!`hz7Xztt&+7H$>h9E7Gee1GdmyAZmBLuYN=#+4vU!{2w>P-Gy^jT_W&%-%NN-tF5sqh2F?I)V+Fy?4-{-HY4I z*)wq9o(0O(IeYgmXghn)o`q#`dFr^lvPS7`dk@KK(V}4oD%!L3UXtdVyawX9A5@z4Yug9!FHv>ie?C1hT zBfR0Hf_Tscj5R@~aS^zHBTj(*%-i@TDa@1b$Qow1efQ8qy;9JPW%@jR)pM8aANFWF z&zDLf&1AT+>rwae4O+5KcVfS+b3-N4Qe#BRuT)r6WD_PSV8|4f$k_@iAc^t-sUoKj zuaSt=N- zjau=eM<*vzMO#XfKx})z-@zQ7y!+vhMj*;tHYn>>s(-%!)m?sU;TRiJ%4~nL%Ms&R zAlRy6XwR&gdk62Cec^}i&u)5g_8zbc1u~9g9|?*b2YXwRbXbegt%%4{k4JYit5cd^ z6pPR{j3YD5@Z!`Bd$wka5;l1ol^B3r0izRSBiRZJK;E6*x`K}l)Du*|CgQtgK}ng| zL%ha_&nr_vt-Gpt4>E!G)o7d0xY>mt&?WM5Q=uXJP}(_= zH2$Ic0&2vvzPxvvU3|yfCzF+*i}n_I%4J4BcnccWgqNamst=E8qyYg%EZ>}~*38Wog zv+C8_vM$=)yrxf%7}}?$lF!3(>)LNrLHpR)Z7=f>oBQoUD1>s0e>|>d{ty`yV08H} z0ZXtysTBJLKJu7~KuyS(DY!T-_KkQ$O{tDlrd6yf60{K+m_(ryD4j~L)x~QauZ34| zV*|YWV9hUx$AC2fc&4kcg5CiPMFSFG$Jd3~W1+}cO}8ncc8)*fK{yYz;80}05Eq9P z9rz2FjG`(71ePWc;!glSw8}-E6V`ysWV{h8Nu%T$EJmxLPXZUUO0?SIfasaM5NyvvyjLuQd|I&>0YJ1{p^bP*&D!yiW^DTV!D*o4x zF(n7vu-?snYR_uUn-#g=GjvAG9{Hzgah~9~M0Eh7=8qJOF7kAgkJ1m`(kJW@&(6`K zNAsKO)~#6si0%ihM{yNs098<9Nz(mnMo}6;kPV;}RutpHZ^td)vR?&JM56eZ_3VKn zE*J%-!@`AcA&l4#l@SFbroxYaUyOj0I<%0}Q%zF#t=yl-52$^!`5?Gw--MjEpyeQy zb=}90o>CjSza3|8Rq9${Zx7g5V4ZKV|(`b0gu#rb~Z{ZoeJ2wbLZ{| z#6yG+pINK(`_uV}$Se}(hV4f=^!KrCL32svT4Ffh%`4X`_uTG}Bh2;LkozyeLNmYG&E1No{k zKK29c6l&pVhhS{dn&XASetb|0xDraCKweq}+(HTo5DU9g70r=|NrI&l9Y8gYWDzw# z9pYmQb`1bw(sLqS;CH|sqGu6l*s&Ctw9zpP4NN=$|MsbKge#vyhdP`{5l+B~TcPw*E!>JNv111Th%6_ zXsQxD5FsYW&2VJpWZ@?)(Us$J&<|P)=VYntx1$Eb@uKzk$NKKTzxm6Ue7ogG{N$lX z`RSTp)EtQ)7O=DK7j;MChsPgmer6x2H^2QzInBA=zDY^ zvE)jbl^(8yds7UOl;YHCo41j8*1){NSqqh$0$0r}K|T39`yS0Q+DDN@mK%$fPwZH{ zaQBYIOLu%)uli%@HB;-c^uw#xxDT#bb>x%gy5?A~vF!N|DOYOkNo%()Z#)0RwNsKa z=RMS*RfA+tqXj#*J=bQzj_u2Ax_;O!(<5{+Ku$n8N+ z;y>}L1zmeS{`nib&j0rEkWrVPtr6G4_4DTygI*3{{k~)JnHN)+^U}xDCJ$wQKeanK zDRV2q1F~lvdu^{nBXNR4RhPDE@w%KH?{u?LH(pio8s@FtD$K72E(l04E<~7{aZ%0d z7Z(VffQtkI7%UF72^%9rk3fEf#oe&rNb3rmEY7^r5>pZYF+7=2Pc!NI*-5n+#mB-{4@92Z|5o=Y4V0M`}vA>Q{~Fz z`;Obh*sA4B*|PZ7iih}#(NmS0Q~A%V>R4zy!^{7){b^f|7^0))pULy^dpf0*!v1kk zK@c0@R{)z}sMz^>_3@o1<$t0h-BH|oL<*Nzi|-ute&-|WJ4V8S_)a%`XEL}!8aph- zz^+2i0je;1&MVe;j36ZOoxb=^C);-1dq_%`mx=F?dy&5Lob?@RZa5S2b_}rxf)XdA zzDuOu^9-g4suAIBYhY-u$afV%qOc;#!tX-d!iV#KgjmrQ#3>U@X9%FDK{VnW zzT8F)AK@-`RsA}q5g*By7QW5j-op}aSNws+@G^d<>RpyI9Zjd1w2j|Xf5!efAk&e7 zo6tcRb%-_~ic7FbpY|7o(S)%GeEAujM*2VnY0q!k-njFS{WTh|0mefyI7EYGNtAI< z=MWKXHO-&2PjklT3<^0IaE z2lA=4umhjQ6X(k2p>7Dtk^Tlv}a@nqLOUXa~$MKx(QfUXO@3 z!q$KhF=sq8 z1B+v@v)NLi=E!LXib7O1K}h=PfE?N#KherGcz~FM!Ddl{!f=`+id-vNg!o15+KM}a z9ZXBH1TEz8Bf>kA_E8UUOhe!fDxy;cNdlFRY9I-7E%eB&)HJ}E9d(hY+JVDWRffSM zpz_?C8&~|+rN^~pzws~TUf;;79qjhoir)Y_3#JZURFIDybNoGC_RRB#+tiG%(`Mtwr)O;5*rrZ&#+E#I zVaqr0j`C%D6zE$sP4>wF6{4hH%o>~xzD@+V6nujtZNgwp5wzg6Sex)|yVwUGo$1j& zw050oYU!ni2gcOPo*Vnl<*@SLCF-%4&be*}B3lwQU!)(@+9>53g*@RA5~_E*g>XbN zJ3LEJwICS+IxCt=2MI;KOe>SMz+?EXozf#a}+Ms#^S~e_rWpKmR%j*oDTkz!U?!D#@ z8a!2e)N*b;Wle*IEVggV%sUMl#`KM4Z5r+!F4xLUoq1Irm>O#p@cxVhA51L*C#@?)N_ zD6X^sq0`!v^zt-b1eGqtH@;Gj;~UldzH!a_4I6!fUY^E_h(xUf+(zMV*wiXW4YdHF zCF2l5!*oo$--b?n(=HK$YXRaHEfgdO(OwY|sQgtEt=EhAM~LA2Yww<2h(k&9)R3>R zxqLdG$!62K#z`9c-bR%l!pl9n!{pO zyuwywg90tasaHQ5%p(g4#CH4XEtML4%{s5luiJO(;~jdujTr|+f9i$GD5+8h?5jiS zAVcWDe4W_6UHCi-JZ_FwL9fGFfwUcc@#Ka4m}V zvL-KNL8$G38*7I8#4&Fhvg7l6G&%F(hy38CP3-oMJK1=Cz!vCu{vk{c^KJ9Shpszf z_c2RH2h1`J^ys)2sdwmtd{M)@`(if6r2XP~{VG9-!r;d4*MuZr)41?EiX{9ciDZ0Q zb#+`+rwjjcL5ip#hCYE$WJ9lP3M+J0iKt?QGEOD1Oc^I8C~>sd4Ji5d9UqAf_%rnPpJ(0aFjrqlZ#ZhoX>8R2zR#9NkyF^99w*Pc{;4pxoBzQo`QmWJ*@|7O zF74AIeWHH-c1wsK|9$I(-t)lS^6SQujNMAUf4BT|Rj^N0{Psz=g2Q~5_TYWWqGVwm41t(ja=KR$13rSQaj_jLm3-i$=y@I^d#%abbiG z3XExuzqBS8$b!+=A_jFKFIcwAO3uSo4IL5TgVij%Un8g1#QGM>G&Q$&t%=j!uEgD* zwudA$q&rlV5%8oZK14-}#$qB7BnsjJBC+c#`c6^qfv`1@m(Or)B|s6)%1~eJ*|v3u z*tl4JaA8)vo~PUY!Ee96`07;hh<0q<`iZg~J^p&TTf4fyT>R0aY4w}YX7j`L#f#O| z9Uska(`3LCh3#fHsa>aGa_pm@u6}9Y{(_FJ8`i0n*|68_N7tNo4(L38+q&&3*`r-Mhryv&7x8MC)LE`-u{F-x7EK z5_el1wbR`h(|2lJtY^VHG|9S}>~zm9aZh!+pDl4ubGjFlxMw=u3rpOyobDwh?%7WF zQi2v?azlhZK|wU-Cy4NTyd-%6$r~rfGDOlGC7}`ku`tvbf$=f}?qCL!a*_+x^#C>0 zUI!uN5vaHX3y%1KPG-K35Qa^(ATV4H_?_bOUdec7;NYj_nL`IXEw_55|F}mRWR~#d z9a=Q+(4l4X_R34Whjr~as?X3G*|*P(J!7l>cHuvxSk@WaFD$#TtoO_z{m-!|PcP>3 z^hV|3K!}%Y)}vkg$^rM#pke}>at#<(`!}>k%ZX>y&&SNig)p_^;b}AhiBKe%$xK^WveR`$8_uhLQRaI71d)Ko1 zW%ZRyHySsNNt@r{>2-@|Wn?zbENI%Icc)%^Jtz^kStUufmAq7b*>(a_`7wxt>x~E% zLF>sF-~^OWEJUmFKjoJZA`$_wXbR$O1iA_@Nvv0(5Vl2-M=jYQycfyo#p%hp$?~{k z!O4}AYbPVlBg%^NkfV}G{tiwS&U-Q@ntvnhHo?3iAg8L^c8XBS%<)n@g`zx&;AQLY z;OE*~`1H=TtM@!pShR5Q)=PaJ&!}Frenf|M9ooscKNUTkRKH=Z zMoRS~O6c;Y%cf4+w0&K(l3#e^>NOi>`H!$Nsc4ub3)`Lf>0X-Yi|(Qec@>I9xad!1rHL_VD`z#a>(QJ^1kLrLRs&x z`I<#emZxpn^c?$vH$D|jP*elE_69H{8CeQdeL5P6{W2zE2vi!27A3Y>`mrzBbym)x z&7ESGm^}6va>iI~T*J7m+09A9E2SH$orjaW@`V8Jp7PeB5X&-I_21FN+_kH z!_+|KoV>uT1xxfdDmIaYYybiSYXNqLBT+u-S;DF|sNcO-gRl23*zjWa=en>Ct30*4 zM|NsjYtq))Q#;NWPPI&yV~$moaNsm7k|bLA;k4<_S8ZYoRfPVTa{!6P^ON9lP05g} ze(7e@BV4mR$3dH zZj`zd8gEBU3Ze31`hvw={0dGIake6ey?MzrJ1b&W3l1RHAEpIu4IXFMJ0Tvh-{k6L zRoW`-2hTgoH7b#|wXZ7AW9lZ@_5Q~5hvE4FQhoiwVsniL3$9>Xm}n?5FNUEe7bJg_ zwXa*kM!;r$kWXO4-qJgfVzRkkst~Pw-o(@dRm%j4P^z_PDUk5zh0SluzYO#sNlT3~ctBnQkFtq7ljb|mQ9pGL(fG&!4m4#)K zm4!^jsM%PP3ou<>nxcjK*cJQ^(#Q?eFW9W`l)-X04MtsGiA6pZ>PwV^|q^>9>!b35k^ynXJ@)pfr;!@Bhu)$C#RP*(HorrjoV9kliFvwN~TH>*)6 zyHe)S%|#~*4o`ccT@Gkj7wlmH_OK!>@_jW)&)_%0Da2vjx1R*A2K(2Xs$lp|U%Rpv zBnkdXWv@(22v+5dv4j-oKsbnCO-V^|^=J7(8MO?g{^LD-HFqCgiOScr`Al``@g1|a zW%C9h^1QjCUU_zTlDY~f6A2%F8_lWv@ST>GQkXN0=^AM7M%hz8uf0~)cTSi~v?Ij< zCn!WF@`9@2(ZVkhri)HF>Z&mVUc1O|HrwV|sw^tsS;U~L@`DqHeqLBOc!Df9*z{}1 z<@-t$l=a@7vyTO=SjKPfvTxYMi>t2Pzk4Ogf3(NB*yA9~{1Gikq*wzu;9=Ln)(HU?#n7u+hn#D{cY0$>C3U7VUSDFqh9YN1MS7-otHRdV?PbVC4t1sFNCt=N%T1~bQvDX~p7fBal|L~&DK*r2u zk+Hdub&+56JOPUHg#02=89dc?TwutPel;NdXq+H6#!SquqB)9bk)TW$hNQ1Cfgvac zCU{Yx_=Vkr6byzN0c8RR5+*xu-D0Qt{%ZW^tNiCAxLcQcV&xz1jxUxA%RX1Cc~%x< zUSfvICcLwOW{Jl<5O00J2v5Ru;AGv-?vxcH(+0fU7)hOjcfrU&@RcG2doY&gx6#Jl zisxE6o`Q>@owk>mIEb_phbQjp8m)?*&PIvQDQqDh&z6h|;g{8=JcC{E-1bZrw7vXy zWf^7?3QxMtr$(sXuA5vd*cYWKNS4$@goG1H$W2+-KVSXy2iC2A)6Ck~!tmFxUwo@$ zn|u^VW71H(oWye!sfxaLekW;wktlnX$WBr*B;2g;xe5{mobIoG&yV-`Nh8J}*3l57 z)r*Wwhu;Bd$W&Bi4!zW)mlgD4xgGR}iw(pksx!HpPZS%tnB}t*yd5?UeaA4Thk(zc z)y;^F8>m%DNCc?sQ}g3o#(^QNLO8b(VoH3<+(0d~s$Qtrx2pj$s4AurQ!A)KUbhs4 znZo&%rjt!?<5Z*32gSXNeuQ7!a+iM^#OD9A@#TMq}c=Ny(3p%)V3Ro zE-N^|lqDA~Kia-%ZQ~uQ;+KEz-Cbo5cDI7m{C|Sz3bNoch-CL6k)TL^-g*J)5ML9O z**uXSRC;>uurIy)R(8R7+S}qRJ3rto4Q$qeRH1tX-TO4_q!1hABSjOI0gJ_dc={-w zEytHFS0;H%*?a7hj|k;>*#R$qct||o1v-q3Mx2}*wdjJpbl6X7G@%LAPA#yf*fc9i zo!l{qL==63REI(ZODIPxtqa@wBCEK5HUDR8-^XW+Rtl%7OP}MO%{4ah@>NV(=$Sfm zWAh#JsLKQKhJJvhN>XPnNcaQ)Cs+#AVaX4W$iQkbUPKd;poBdE)KEbw18Pt-t(xK> zR83P0?7Z|xUe3RrdvnXLEItgiq(}BI4q;D>J*%>Hr@v?QSWKduRao-VyIp(pn~(2b zjf`nU@P($>zYxeURV7V});Sr1Z)K5&VCZEJ+(*ld?b2-k1Z~YnnmCKG72T~ELVW$s3>e( zI3GVxr;m@wds?C#3CTu^-rhY8G0nmVnAC+`zRhe0`V9NwkJq%;`P0r9J<_68yY1@I zotsZLkDlLW&vujy`Y1}~7qkXZdJ|cv=OI!LWXdd?dj7n+^zL}3 zv7u3sfT_u91GeAp5OWgoM&$VhL?HRtk(A|R>h4yG{Hxv3e#zM7Q&<2nqpx~eX>K0? zDjQ04mP(Q<6mL%fz0E6x+T-o%_FTJ)=y4#P*~Ia2bnmr5H^`;1X~hwu1_Y7x(6w9}9KFJJKBrNG!{+C8ar#VvaQPZ97@a zXUkVyRhr!R-EDjK>Vyg4oxjpqH&d@GL;U7}$Sq{5>)RA!Y*U`Sz>ayS3X!o`96${0 z(Xlv!7)=(R(L4e~42%ekJ{B4nADA8}=0USa!DN&SWyq&1mY1^F9ej!V`tR!X2@|dk zWD(enRoIPs_LJBR7g>f8|D|GdpQq69`o!?YMmvQ)5@|=dwme&b%}&SYb|63sUKsM~ zG_R0bF|T4l#lnheAD>n&T7ZMBW?EzbwKc#d>64326WEeN&JPIn%8<{OEcuef6}=oe z{-F%V`VFlbGcntO;r6=KqNnueoZdVjQ=d0>?{&;OMk@Z_%^QNH;H8+p9#pe?Iqjl6ws}}?U|t{vo6icQza9z%?1>OtKxIgLNP0+aNM1-mNMXpV5c~z0ssk<= zO)bEt=uPViu{$xO&FbsV5mFBf;?%mc0qAL#cMGC-A8eCZcV2QzVav?q)d{I$7cR8w z`B0mLmQOV6Opx4Hea*zPg8x@M1Cr@ZxPM17IMqS{459ZTSsF4pEF^pC>!XKkZUe`T z0LPfLNM5WA6cK(g8dFJ})C2u|@>|L9t_<{~%2(yZr-&acRtGAo{VTi+#+j}av5nva za{94D@+tX}3@dAaTqxs!LS+zZ#2<|-roW)#X{a2JU(G{uktBm-S(3v*u{s275%2hUp^Gu!)!6r^2V2YB;n-dIu%*r+U4fhb6~N)u@1ydm zLl|a}eUohw|AK6=ySQw!b!qVqaVv_Kr<*t6!M^_ORHxR`{2M_kg@QwBOrzGR(E?LR zU4*TJTslra?Z?-$R6f9av2&e2Cxpv{UoY-e0-jT3s$}`GJ2o zbWqI+qb9SUFZ*_7!#wFQT@Ra`0cK*}sae4DrVl5+~%i0koM_Ca4v>4rj6617N@~%ZF2juW0W!11mhzqkk zRIF~6h=mkv#-3_{k|3+s*sur-p~jfLP*aTyWB0{cOf}W6>kmi{vKmMrD4F;p0jm(*Vf!Yfbu2mq zu!4K~S|BLU>T2;MtP?}+(mk^=qD#bV48VBsZ1loZ;C?>Z40hIFa{6q9nVQ{fP6}Yd z&k&7xk_|>Y;z8ckE|nc%OL>$BK1ZsBAlcHeH-S<&IJBq`nGUUfCoDugV~hNb+lYqK zB(FJI{}mv46?!olu`_gpFbl6h8;uHbIBzG9_N>IdER-jEGCWl<6WW&%h{U;fCgS17 zj)-X)d-X3fv5Tw>oBk`nYr_#RrW+QRCbZ&;u-&g@>-j|X5^rOVDO-b0kv(THlUC(F zV^7Y)Zrs_g-s}Uj#x!TJ;OX$Q`rs%a+`>_eI@4;_Q(x8|H66==aemB1c6=Xib2@#&OyU^QCRobjTT4b9%fPh<>fRegxFQ0M<`5y;0) zw58?os|ViYuN}oYYQKtLfrc^sK*%%0mhWY!w>?+?Gr7r;UZXVD>fFO0vW_Qs`Sno~ z{=AU;?ydTt-}KU+SU_YDV#56XPok(H|tx>v7q z%Wt0J?pI%8?cZ*Aj&*zK6@K&`$9w$l$4QsaN&EwS#)@qLX6zC+@Bp2H2k3chM6~@< zR!!R@VkxXfyKYD#@%}R=8@S!S$+xiEdbzM|{A?;t7xIBd%bJcuhv>JrG= zzVQ`?QPDVX6m}*O1HHkg@qn;^*}_tw2Ek5SEYFNroc);eIYw;(>e3E2>=<~Vbx*8L z=LGM)Z*VL5Sd*iLEm#Q^))sOe$!Ew+-0w`m&~ZFF;dwD^Y`E@MEKrn%A);`bir`Q?G03i^D}PU$8t&@0~0<|MNYbrDd;I z{PgpfS5{fhrRR=>ef@RVrCsD-Vp2Pt&tRNSWof*|d}@3PI5p14wBuIRQ>!b31zMSx zh`6!Zz>$6kAzKof7GkV|OSH(!6lsJKs#q}q-Lg4h#ff$Y+22sN76EE$siYX`3y+RY zRMzl)fkWhVWi#sHlzRj1e&(@R)6(^F(s7i)@iqYUki=!yo#v{OD1`_6wu6S z=nD}b>I;Jik}=|5%4r;$K{+)gjH>iZC;d)q1>2L)>Im4Z#=nB9nj}PDx$S@UhA9d^ z#agf>|ASAAfnzQFpWI@;UjBxZonW5N1NTtKzXl`IP@o*Q>$@n-c&rEG; z6tdna9YZ6qcU`fSBgKh1z`^@!YOsJ}sJzHM#%l%N{8VEXO`>j@$TdeGJ(HwdpZ+|4 z(I>jUBMopv2}jDvvhS5jy*w|-1AEasre0?10pY19f8aXI$sy&U$OHvS=oD2*miNxV zZ{;uyKG4CUu0!leUw%++;{{c~ev?Z?pBtaO9t3-|In+{{~MFL!4C=WD;5( zA3!(&y@uxI=leFHH`FO=Ooft7QmYUk+NQzG2*V(hO`js*uufMp83iS`!TS(LrX{Ly zuG&CClA)w0BRrT<<3?l-rlIhJQp^HTiv0`z2e|Uz{A1_?;jD}2k~(R0sS@zn@Ud!4 z==F;q-3=c;JoL_$i#MDTJg*L(5yak$I&&t9=L9{4-KF)>8AhW5MUYPvnIC@;DILaE z`_Uc2Jc(aQfx;C8Z=p}&1{kEkC@7%_{F|!h$k3*cXCWzgMY=PfYw3V)GO|thtvmeS z9ez_`-B^!)DB9}`op%UD8m{oa_`5OuPZkt|`f(xXH~;b0wNdh9%sdNlu@H162{YIG z#_P~0GDeKa8Wl1G^i>0MrxNrO@$Hjn2P+^NmCS3a80Mvu6X{{&BbXUNQDWm|5r##2XJ;_)oF_U4&QW-sPH)tJAj zHvfYKJpAFzsKufTo$4~EpiY3 z1fWM8pAe~#N{MxbT3`ia@Cye4BET(&b&!PsB@@IdaXtuEIHdf;_e~l8GYk6X?$*(x zyY>Y4Ky(f-D~kQ(?2)%_&Fay?#YMcO;isyMdLThQ^2Gyvp7(e(f^N@@HF?beLr;0oR-JWC1_x$)vP{_dZ z$Ll$2w`raj5TVS|eq&Wp#^H$*T?Y*4t}HB<(9Po3G{$TJ6+3U+%)aB>zT)e@mDBjA zJzG4Kk9C5oJF*1Dt0b+|n4XJ>b%sAkHt<`tK@9vrlp?CZ8AOB2;yG*;qr&AVFA7&3 z;<$+wA@kkemkJri@`sbaZ5aS`zOFA@NR~KQbNL9Tn2n}!V!>Z|e&jRB9wA>AE0FjRvvep1#K(_=z zMMR+i3)d#WVfU8}T1?;RzQ|Vk5h5O14SbA{4U!<=FZgW`avl`H|3$%JQak-vuAfHZ z2Z^TSVJTaXVReR2)PVj24}KnU=>&wOY(vZP{p?Y7DFx?|_DdYUA7CR0dBf;_6d`IY zfC~nDVZ-mqCfMTyEh2@!(}E|$KLvv1<3R@+TSS@8*_9Cm;7-Dn7^TA`xs>lcub%py zh4Nqj@!W;>FtK>=8_L4j@;iL>`!vUACoAPN%S!yHjb>R9@m{^Oa6R4&wXDcuOyz^I zU;o0yO!<*mG&G$Gv@|m2!x@AUx&TbyBSk*Bz(IZAltkq2xa4X5+R99Mej7jN>4U>V zL4r|#Bj&5$Yb9($*<{aQ){!5DbK}_={3J>D;iz-B7ISq;tI$`~f<3<&R=+?nKh7*b zlvtVx1jdB{qMEY;`HQE!o#;$9$GOT$_~&eeUp|LInoWdGfZ)`Eeh2<1GSA5di!y+) zz@nlG$c-?6s*m^Phx%;igIPSnU*~M@g$`w#*&NPU0zTW$`_PX(7&N5|J48R8uRSZV z*2aiw2m!}V2Ct~>6Pxe1R^c0=ML}A}N$E*o2IUCm z)I#ZlyrcqrP`oAS5PhCtW&~=X2}wk2;4HC{XaQs*vOUoonlH@cA`&($5#{6s&}AW~ zW%r8u?fHSSkH7!x$sYZN@w-2l^4qMNoZoiCi>uZySJFq-O5AW{=h~i2Ya}fxC^~j( zXYGbFrz%t@neb&6PPYQZbNTdJ7f5NyD1L#!eg|sm<=$>v6-2(0mj(*ePN@SFJ;)~! zr6X-YUhJ8O5G#sEr)Lkuvx7m^^!Ni^KJo*7KOx%h+5c}wdI1-56jEea*GaqC41SF@ zMSBIn0aQVPfKNOdF(>d)brI$ihB(ZBjaPo4`I%Uuj}-#IVf9MFh6phA;f(4ce(;w- z;)L}biFqxP0>XqY<-`8$6+7?N*m=UiXn2@5U{+3O7+}IC{r58?_!+bWxdo5{g~(aq zKNsu;s^TT3DFC7D9O(R0-eSG^h)1=jT4&i}(z73qN1wBSd=GdW^XO1(Unq7UPqTS`f2AYvXW;W%*E1hw4@S37vd+FTBQ<#AS*D zLbz1CuEH?o5Jal+@|U`N^&5$kM}<-#1V|>4_{cw{Y(`KXyA3l?!}jB|M&mZ$%?t<=MY03Hk^*KS-k>-ypdf(M zmjF^<=p(2v0oUoHO97<5(C60!%JI2xNh(;eEE@%219^9-r5Tn;u?VijZ0gh+9ql9s zR~nn5p6%5qg#W@K;)?o>;D;hv{52H)3S#_QUj7sR+|JhR=r@+B@Av9<{(Jt}?ML{p zyyVAIwD;w|+vkJ#k_~RA=G1L);PQt3!f&-g*1Z>+1qPUY$%>*I)^v*7D$c0bsv^*68!bsHb`TyV(*>%|GZr%RZlMa;5y!DX;T6v-^gtA6$zSR|l`D11O~4i2bx6AzMKKHKEOqh#1f&7HJ5sT9`;q0wnmH zkj4UugXD^=50G5R48$SrKg3CbtDn^i z5G8~-Dmjk-GUV^h@`G=_sSNY{be6rzo3S@f$w4r7-4@a)XkQ>^5i1?g0=%_ly@kpA zXul9H4FK^oy&Kkcv5|fXp()Hn2NK>)N9k68PIN1(-KwB3P4S%QRrKBhBRC<1B?Fl5 zW7dN-jwI30XtIP;k!w-+Pe`YUR21wUan&|y_b>crxwQR(BC9-_uO&YCAfc7^1H3?m zY5~dMX;U)r7FP2!aQF!a29Ag=FjpN?f#PqcgH1vV4_OsLVt7a^{L+*V5C=;k)1&}l z+VxvCPEjl|Ni0za;!5>nxA@IlFPSozJcw^G7NbjDIzP2ZSV1JRsr1Yjom==pzo@}z z9H-y(1z8Y+P8fNxr&F|IaR#bM(7aJpxpuEtOe-WM6lp?aCqsOgF>0S z0`J-OM*HgQW;4-Qvl$=xQmuWBgtGp{l`Fci$hKd&K*A%P0`kmkr|`C-G((d@$%y)Z zHTbb(15v~g7$6D57-6mms4dP2Xa$n3DIm;#D3W96?Q@apRrL2x8^q9O8v4xyJAf~F3G?$(v2=o1&EUX1-Vqy;fogAQqOoUo@t z@Iawi5vS({%#w^d~;uk;ysAz{I+r^i4lFf&wB83GF- z6?`IP@i!^26gajIryC02P@q@d@~sMJ?2{jk8QO{1Gy`Id!l8kpTqq0;B<%PeWQgb< zOSqJ1pp$RH>HFXCo3GrPamr5$oU*b`EAylFjbgsN;Sna+r)h=pBi8?2B=k*`puknc zOv7CMFEXO-7-YmZ%ToD%v|+pmQNX)w@OQoIWmBAbsj!4En7h_?xFp}JoP zHR!DD4YyL_Mtn9=Scq4;hng~p06JhNUXgy_zVE+;K;NY4zJZw2^6*bT4!wMi4dU*{ zx`&kWvM`ACIvrAx?EuZsU%wE~H;&j~yy8>^!y(e6>dmtek>HzQ0plm?Dyn3W_uA6B zu&!epBX!G8=}mp7qcGk z!p5X;`cDa1UOJV3#c#j)VZB>1HI!GM8W!FU1&WE<{H|`p>Rj+v{cC^nd-waE{^ZsI zAxT78SBQnS{H?$uS_$<-NRSk7e{%G)k09w4#6=Eg^;vJ_dH%;%w6H5xl*-}jmmXQw zDf7mW!YRQ#bFz9E#r^&nxXrVeB{0XEqXyGT%34hw8a_b8YcxhB-cUeH47v)3`gleD z1!8<>3QL+meV4A8y3(}>%Mv8JL@XATW+jARF?w%u5e;h@e;|h|KQMmlx$XSUFJB@a zp{v~O(Zze7`+`Hixx)XBIX-{S8?W!K*Ko=rx#V3qMSc9;y2o&urs};b;G;#IdAu6_ z0zadk$po;+7JzB45aI&U5upH~!L^EfBpI$&^eX~IG32qt2&{MuvTpeT-u=m-C@hRd z@=)n=5~I}nb3r{Nhm+W@h>=~pjELmDQXh~I${Kz=q|o!|sDbYTr;XT>6qclcmk3Ho znv)-;PJz>nYM^Uz@uCKgmTUr)=1xWc1}kYE5+9!)pBtYSUl3myZy&2&k4I)tXgpXm zeIWNab}9bL`0Me=>pp}JDR3^qin@TC7f5I?Id&=T%ed=txaoQvzJ4eUQ5+%hV70k% zd2t1Cg>m+=#q4Pi9r=l*Ixl9GfQKBRx^hlsGP1Ik*Clbbv zHc5#HhjEEmndN~=5%agPtuNSry8Q7k{9sOY!yFsy$M?z%!2!b~E2AW(TA}*!pt{E| z{BhycPR;uFJsz8IyiznTqZ29rU3o{{3d(j)mo$Vm^*(g3hNI9fRm057=_Qn23g{)b z8g_0uy-UE0yBZAl*5&|XEDN0GrbHmHD=@8Ulz^ZW;Aphv^iobQxpan?=$%9_33#D% zf)$*~}lXIT=lmhuxr#!t_rF^Zq=$*uK^%H)+NQL;1%L6UJW}%59q#74~QngW| zKyb4}+?EJ5fZnK!bHrPbPvz6Gi&9Oj0woYZt@=V*f~Y5>rFhHAq#&Zmtn7}IDZQ|} z-UrU^TiE@e=aAgR^UNuh{rYSCz0-%D=$7A87M0z%_-0(+TE)(?%+p|HZN3W%|SWjE0JGaN7|Ns2u~v_+uPjfNix{`55_=-nTHRX{2| z*j;t#%^&m#ccq9r0sn!2a>C~<9IYQdWexbniygXm?{IO_q)A^l{#uT^yno+Cr7?@^ zlH05UcxXRxo&rRYhe8h?2!aqtumJxN<%7bjP9#pO)-QOP&epUM61}qp3)66*_(jvU z=sNPOeEP5ez$0bkWC(v|c1DBnuoNfYT2z8p3w}BO;?PK5%DVJjQ*w`sK#?Ygz9S*15vTYBUHC6fDbHDR1pT4pA17z3pGjh*% zyF=LTkF<7w&(g~)7L_f!_D+6Z-h_Wiath5dN9=JW%7oCp%*cdLvB!3Ok3~$6F=0Q^ z(D21-Hia}ZEl~euxru3mExw5AR;1>TsF+AoVxEp*fku9vdR3d05S{a?%}X>M~Z}6R`04uIzZ14Px%Rhngd*izlH6PomzBF46Lk z`%PSs1Y;FKZ85rdil`a_8>H=8ZbhwPm?+N_X%~5`{#9SGtVEN28q0!^f{Gl~(sH87 z;gCfOOreCG9DRMiojcSw41qHcU$m!E+C2Qo>{$M#D8O7q&tS4rm^clAuGQ>y=Ka0(Z&u^kzqkFtFS9Nq2lN{`x?jO) zIc*D?k6tPdF1ovz)n!t^f(`4p%zt46VJkYS7I^c6Mr*P9>`)WjsO}-;EMs;;5i%|W z5*VjpNMMLDBbiGJ62IIa%2v<}iCex4LB1*$KpIhEw2ru>J`2pvRtrYGJ9}*b%$H3A z`)xXRogW(T_}KIYV|wq%cXKD6`^ZMZ3ao`7t0E}R2rXKt zJg{*YndtuxSpq+dwU}pMvr{O77O4OFcLJp22U(rN?ggLU-`PGSnx*ms{a2p>&%pZRzmE9i2(*Iugd?)s1M*%I(04)u$1{a`ZiWZ=s2Vw-GywDs4Oli}`;%bKXp;@=bb{ z()UcIy@Ugq!1;KrDh9IE9MpVECL91ypdJ*21OI+955##;E`i?v1@$dyo+w&^FY0^q z((XrnWT^?vcVvEb*2Mhc=_z?FI?bKYZ}scnvM#&F)~zvNQ?Ly4G)p!yKQ?^UqLGM& zASZ9x->$$odU)8YB%+YiEw@(!Nd;M?Ep`SCp3aYw(rDqy9e0S^vwtb*OCN z>CHn!!{fu#!*j#)!VAI+!yO`PT?CE;1hiOd;b5ATtt$|rc(Q-`WVJ_llZ5SNmT-2K z((*hnK7XnE3*F`vv}(MhW~FM2`n0aSp=L~y%{_YFywPa=+ki!M8rGtIa%zVW&Fd$V zJ*6jqf$fpLgv=Ul<=2w5$|$2Bh>YSc@SN}$c#LRv3Hh%9}mfSIn$80pM}&LMa+L>|ojO^o@nWOWm}QbAFCy z70S1(iI5Oukqx5DO=gD{!@1`xad^WTY{9~tfy{kKNfsw`!vY>-qP-RyBB}yjCgYCG>`NNDW{L{+9@5gENrJ$MU7>yG*2C9)_S>#MjF)wlkiydW5}{#7osa z>JmU;MQM;`6IN?1$mB|X7CA#)_7fo8vTxWF$-vNbsk#B3krp6GI)>9KipD~i4m?gm z!eP)2V7GX0)hfgwor;vZv#y@!(MQ<^JIv=SsYH26DSL`tqV*5wThx5aG7hq0jMw)G zY$bwb1V8xdd=5s4D(VCH2IT?GwHPzbRMZkhWG@&Z<>?TE)XxY)t=+MriPG8gR^@h! zF8{E&{J?Lg2hZ9xciGvb?lEkx5`YQ*QvL34&)=Fi?U#NFW-~dt5>cTRT>Y~Moj@V?t z2?hkX^udM9LwY!@305Es;v|H4fNtb*CWI21@fD+OkPb-f(G{DhaI~$bDrx}Rs0i!C zquA|<3!ksQ#k_p? z=0EuMWXFgs|;46FVIo6;xap>h3nao-tx*h>g2iqY~OZg{@gp;x89!54~;G8Q>Ya7 zFBr|_+!OrI=a#XMvnN zmalt3Hq3Jy#6Qq8LHSHA^MWk=T|2;YOVI|!EaL#y=lr7(+! z=A?p3yTC_u(no~@NMuQ)u1WQq4DQqAx$K7DQF zE!HWt9V%L39+f7mfXitL3aCy^}k-Lu^ zllj3mj}EQH4`~|faz%al&jpt+dAiHndvs}8_K*7Vsd@7V%ONnU{}B+^NryKfd>L47 z5LvXK6=Ennpw=YG@(T~Bove>OF&bbzG&_Ahc%}a`l#(L8^|Q}-H}y2{SR{YwsUv@Q ziiILx{RY2*d6buy{~{l=wFTTy*TMx=)Tbj@yRnsiZD349M*f8a$QGFrK3z{RFBH#k zn0rbok-=6&6R2O%QXo0PZmL+lU(j{}jSTQ3tVAxLHv$33GeI^~_JgKfx>UPGgKE77 z?A@ij^wOe5wzmA%wY8@6O5Y@>I9 zfDhW^;8Gzu+;{gxq}gR7GMe%~LjL8RP15lPj2P;7cSG~}JEV75eeZ~oe)l-ddxlG| zW5i(bRA;HkO*2=r#Jp=88-hNV`dyKw*glfFyes%tzY7rzpRyiI0flSLtJ{KXXYo0D zb3>PSiXrh8pN|II^%DDouIFNZ-mq39?1HpE-nHL%_e8e*0e4r_*LC0Bo1|F}xZCM> zH|>Hxli|_=eHUPA4J(C+C)Ni;2m4OUw~jvF@(I?M0!?VXHt(1~E%{BKyC+J`t-FOe zgzmO`&tWC*{=(<(P36c5G+@OXJHUJQI^2B@mgQ7QpULp@#`=5_4^yEOHU%LCV}EUR z9d!PXMX|p-q;K`}hn5uKon>p}*5!)lqF%l@gL3P+LJ*-@#{bLR6WRF(+@0_*cW;tj z`LB1=Z1tJ!kS^%6MGMn3zY%HO`aQ#?v--MmPg1G7y1wpVu(0Xp)X2N0udU~rw9VLo zd+(lzCV}S8n^L|PU!;5Q-Xv|d?l#Ac^3GSko93&}WVp0TpD!p?G_{rRZ`|s>_u8(S_YRMv9!x@*F~_Z0Dq4erD(JK5;l0}-ZIj-R zX54pw-BNdb{j~M_59;?5)sYUDU&J_>yt?v_+8Lj>^->+|7d{vES3AS!?e+b8lo>NO zO|MnGGxxuj_Ae3q(z}1=-3E5}-))yRh24K|qVLGI&&*j2uS6Z=$bD9=R5W4(J%wD% zF4}&l(xJ#@UcUa?iNSd*KgMHJbnK9Bn zR?qK5h*Nl_86Asl2XMDerN-Fr8uyww@1;^+xxtcCiX`;fGVV6zB!jc-_%53x7XiJ! zaAA%tC=av_4==D$2kt0H=o7VA-CqRZS@K#Fgf2zXHcbnLi%5`N(rxK4f>P2&u=6lQ zW*EKIp-jQ95F?51EHS62qBmyp)pn@v_p!|pdy0klY!_;G|T8CR~pf|Rnw|z zsqOoWes)|}9{(s`C`VObjW*fbck7yeiclk3AgTijX&EYpa4-alU(~ZM0=5&=4urZsWY0X-+d0xX z-HED{uQ<;mFS2=sU}t4#ZD&&_92+Ul!wJTYKvS{G`H(`8Zd#||AWtRNvPc3z14Wbp zMWrH2^+naadv=Jzud+nrEcvyFpgy~v|Cp)&41Hz_?Daux^Y4mWJIC6#;kn(y`@0`f z(sCxAT;eWnv}V$#Gw->1;+niLa|36w>eNTAZvu|pKXx^X%J_^8JdgZuBew+1>$Bd96tzc; zd6=^{__#jnVBD?GdMhwG+PK@CwIL(uv(7Qc-V80_{#pCbM$DSHCyi~FHrKv?)&`G* zY^r|mpplVlg5BF({+BhfDcAT=eA^B?lTs;e4t#tY?4#e|#Dtb0=#DO%kCDb(bmu-T zLGWN3Ndr1}A7eA+5|dw7@t%OLe-Pc#M=p|zt@)WFd$lRA+(3LoAGxT_{oLJv8+~Lt zFMZ^#Y^-%&=Ew#W*X4!~@5l~mD^uV{^}?h%YjIwXK1Kuodx56KNiS$&UY`Wvy|8c@ zv`n0`LCgFofUM3iX8TJ`Ws zBhs?Jy?hP@pL)rK+w*g^INe^*`nR7>@Vwsr`zc;P0-6+gFpz zXqIrbs@D(SYv>qu?M$UEk6RiwVVn+ko27LRfaowU{OfQhn-IOZ#{Cd&;Br^c%_u=P zYYAN5B%QWK7A|}Oy=3pmIfw>mB(R$Tj^&CM?uP-pYIBb_lAgk29t`#iF{VJ;JMdlpn|4Yi#Sy5yzBAm49!n`d&??{0u$cXO2bXgRNDY zV>`SnI*PlW_nB=``C|{zRlIjgvAlqNXLDmFm^XO|gw7X$Pd~8ziBBKVKfO-aLdMVU z90VWw8W9(4!G}2y!~Qf69h;|u?&>3>rq35=c$j8Vne z*40moJ!Y-a)TIjvO+4o{@bz}(S*z6`O-bRGKGJ^_9GJRWtH z;Lds8&xec8i67Myb3r{Tj6PAyvgTrX7rgqOG)A1y9PCTJ_wE!n$2d))OHw6VuP!NJ zE^0k77mQ7qz$S`kKI!qWHv|p9DD=7XkTn?@?ll7vX-s%x@_6^Qn~u2?fh6l=aK*47hyktS>o_^$YTsIg|ufatP5gU!-4 zYX+t~U`QJJ3`oYJ89>H@g-3tBf#oxZ64=W1JLoy(z0_~8Qj+Cz1=a!vG50Z$K7H$O)#FO=FJ{>!h(A(oX3-_SJj8Ns}v=BFxORcf&I;~E3XK6&hf5tn>Dg& zgEaUnI?XGkVwK<@Vow6BRf^~eTBTvDyLaqO(#rqqv7y7)Z1C6Syt?{|?F{x0 zvldw7_%MSFo=b_&cw(IaD)$#^P!VYs8Aewu8n7(E!LyxZ0mp94F^DZeK^ zPv#AL?}u+=kwkv!U|t>8IP-q#Dd~vL6@a<_5m15gaT=SY71sWml)&IQ!8p4a_GdxS zyib+u+J<6u-L6bBlWteuAsy1WJnYJbKBe1{NMF%yLtZ- z8J;LFMfg9=y$5(y)z-gx(YcMX(`A6HpWtY@i4zD1r^KAZp|a>b0U`Ma3Sy z(ym=ZA$kQYBp^l508&D^10*5L1PGIX5Ib}Jzr9YGNx8?S`*S=Z(sCF`@??yg$=Nlq}-_DK(5WS6BsfRVTs z1DIT^k?gX}tUpf&X=K<%#HQNu-VMydh97NIcgA9}hM|F7YW!d)M;uMrSGn4_KD7Dv zYywOdB#NF%jx)~aY_#~<`uvYx756@A&8HPtG4ec-6&uG8OKX|Z3K@C&Bd=C0r)cHh z2iMwQ%i1DsyT&Wc^1^DR zH3q()@AzqeVgIdsK-=pjkDArjH#-ZaqH1`+pVXXMGVG3elP6S zs4cjz5et6o;TZa5G4APSh<`uHZI3z6IM;7aU~7FV#ArD5s`S8mT!7za-jbTty7=sye$5G z{%MOm%H|%!4gq&$_#-het@gGp>c_?fSm7V4C(zP-5(j zt-aZvhQZ1Pw>5VMt@)=>hgEB-eyDB@b0sZA@4Tn};FiZ**rI-O%CR+_5*_th3&~%t zsfD+2tx6+*Fq-F53;!0W?w1|3NaR%4?)wDQ%j)q-pCqkBUs5P5HE$I@xHV7f*jl%r z-p`LJNPW_Nx5U^U(tb)LS3W!iRtu$;?_6#=Lz2&wk+OcKKNEQi9-VB;ejSw6rAWvQ5wnx30e5&-{8b?2xTeI{8}itwwspZ(p#0>O2HadHw@>E-m({T|WP z%~h@*QDgR?ATItVHpJKTbTv~=P1YQg7OB@K{Nu~$_fIw@j(&H_uDDDunk>$WMnyYg zf|oy~<_FN_8|m?JaE>r7$ceN>hvgWj)Yq)H{L_iS4*G?aObm8NH-9&N7?|{B?m5qU zd1YI9Yo$J^G4N=f7`lj;SROiFUSX*%43d4l&=(6M{nF?p6(qW%8|9D3tCxnmLj&&q zN!gQJ+eOW@jQ*T4?)efyX+Hw&)_jatntuAW!)x~D%^Z3T`>c>ItNT03J|Q*=PsSgq zxHd}5for3(+Xiy*C-zaxfm?Rw4Z)Lxvc8Al+EU#nT~@d0m}HxR(&8cD3k*(NYiXG| ziWA}vn|bkN<$pBul3a-YKb%`(LHZHrR{Zz)zMGVu8xuoQ-su|%&I5xu{Ds&1dcDt1 zp}$M9>HQC5XhsGu!D-{|#x&QyAnSEZkDdy{vZHmnn% zcT9pYu;jKao=7Os8M6#X)I5R^5ZB^cwMGq`d#kSL0PGzd9n`sB{yG3b&b!h3Du&yD2R+nw9ci}fX=;e z=t_@s4+<8#*VcZ`1Ie~Xlvb;lKl;#Zc~J16wBYfEj|Y9fwk2*Y)79h2S^|ys_22DX zHFw?KHG4o{SAxE}x)zSN8&1c{S_EWt7sM$Cy%@=}Vs~oT;Gw&Je^SQ|UwbEw&TkK~Y|Che~?17v#k=hq|wO^6MJcAz%4uTo&cl38}i4KuIHr347#k2JRL}m8G_QuNR=)>F{CBNE&r}smz0|T{-eD zbrDm0jx!?e;>DEuz4SyMe;re+9}n2Z(94HjLH}~7$v;+gJmp+>8Pi3l)!qK3`SYPB z*9;zfjky=z=vc~Hk;*THLeo@nQYyu>(#`O6)jc0iN^8#%sXQv6eZVJA8r-ttiMnOS zwi8dZT5RMLw5F-lH(#DU!RVfRdLW~|rEp7YtL&E6v%`V+BVjI$tM3WBrM2|y(nxNf z0N0?b7b|sFzlC%h<#^GcInGg9gA&Y=+IgXVin;t7wPwvZv=P76NnokcUJjj2{wZGm zdgqXvZ(bktNAr=#?kZ zMgAzK%1RII08ecz)72-5U!1*+|HTg$(bDme7GZsa5lifjbw|R7sErkP>~5lU@LbPC z7Rr75;GWeie9wvnzCVla=gK`Pw|rVBxre6Q>)4E*-wo+GTkm^46B^=G=H7jX_j_`G zntv}db^5J-`g@syViqE#XQ15Q+htO|o7}hK`8xg|((!*!t=02Up0k&e`ypkX!r_0w1q`JR7J9M5R&!% zr4gK*ae|c2_eyU}mJZej`*v=uQ)NCF>ge%0q~?6J*T+LFk;cQ1AB+a;Hlc%*bv?pQ z8Yo{Xg0ifeWt%L=TX`$=Cqm^fWpCeeLRFbVWDY2#=Mdq_<6!%+d{0U4P0AlF_bm6| zz7F@T<$k2Tcb)>@uVpocE1Ps{=@V2QF z?i>K0YuE_qztT~?Uc;_0ntiIs7?jm-Z#F~5Ho1o%X}ps}&W)>PDcu#}qT~IgysSQx z`-|lMN+h{`$VBt7WAvFb?+J86+M;#CZ%a*kq0cxPAaz}iMzOnIuiIsf^wIi^uaviL z1&d#`oXdDn&#EOy;eUC?SBJKGx36m8ZH0H=)v0}>rsfG3Txu9+IxEW)@%u{OTK`L8 z>5%@9HBG;i6TWgwjT4Me<~zSXx#zpfN4(#C)Y}hft0gP*#fps*3e>P_?uyg@yhlXO z3tN}VoXuX5feCt^*|*h!z4AwIGXE`f8ZJ-7ddj+}kY2l_?I^w3U+(m9rm%B+1FNY* z>QbqNsI2{t;1G9lFm6oZAS1|>{=%E((tM`Xn$PD1_{zMAF6)n2o79+_>t}qG)F<)L zv_APe18UCA^)s|bl^UVab^E1j);+=0b7PFS@DhD}u36&*<3O^;nzMc0Ok#anc81Vl ztTBli>4m5)la4DjSO_VwmX74Z04}vprG9W zP5rs~ldZ+ZQE)4ydr|bZg|*VWhIy|L5eR*MvlFu$GFRQ6H>zrXG0p5QvT-dd)Rw31 z1EYTkM$@%tsp&=k=|_jowaSd=blt}7QkU2qv6*;d+Gd(hC;2DQ49!3P*R010Jt}fU zj6h1ioTPT(qj=+S_I5lZ*3HIYMT&R3jBGdjb?OR&6m3q_7 zlZ^+Q@#LSG$g(Q!OURFT`A0c_Bfo#5dFsw!%75ZKKz_GG^VGe2t*Mng#(%VQ6w9hSV>`3w^7~%Lal^V|y z-0qQQQICGs|CwD(UaRjBPtdLThC$Ytbof& zS6}oBBUfMk&+U!q@9bfXVlgtTq%laX)zm#Gnp?;?+ z^f=4eXMZR(N0PyBth&dot4^o6>^<%3mO2wZqf+WZt_3TpiCvs0hUcE@mJwSbtE^mG z;;zZ`dZoi`iP(pjcDK(fa9I2iHpJ_PR9(yP=^h+Bt#(~EM7rjUTzGG-a+E#vd2uwSuDfSfacaJ17m)~j0 zPyWtM3`kp!{c5kyq+Ggr3d0R8Uv;3s0(yk@YNVTQ;<1shW%n5IdM=dvc8LL@$@2TK z_j_XJl&ej>_sZ}0yZKhG&d1xBT+Q3~IE~;KSLR6P++qcf(P~nPJEQs z-stH2qQSV_*JO83>*JJ0rF3a~lJkpSI@r~EyyxvfskFbRPx9+F)~j!gT0V_~)%>gi z(`UqJ9BKQ;&_J*Dkg>k?2ETMrH~a5hd&RmWeQHUv_6=%Lvi1P;V2znGjM^Kd)V`s` z;kBO-p4(Ay@p{Q60qz^sSIOD~-0OxpvwK@ zlxYxpC8)jd$hdd%YS%I#J|sLvR^{{+xFxdSb1P_r?@Nk=h*t}5k#kN}(7(}g;{PV# zf)}mxsKo51D?P?0_6wZh^DLDI?s_A)?+@J)v}05MG{1CEH#~5At;1?x_h+@YOr=t? z_H{?Dy;}+oGP?P=n3_;$e_hWV*bN=` z7XJzl`eS>$*poiwb2>2jL`5Wjs^q)=n6@XbKlYIwOWKoQ{Nm4!N^B)G*{ua!KC&Ni ze)Xj-7-jft-fQ}L@31Ca&IzKI^k=i&8f~veRw^BPNRR#K1N?o&)RK0t*bTuDtMqJA zvjYrSQ|9TOu5m+1j|pfguX9=7YNOAY07Lp{S4!lht*cXN-=Lm2LhXS^&`2hEgO%AV}zREi*!lkdaN^b3ie}=m| zO7q5(uLiXj9szf1@8D{uNRmIYRoW^&Z1fQML!x}12lV%&_9ADp+7;?+tJJ`d-ym)N zZvrm(``Z~Am=~sN8SLoxQr3*5353aUOQtgZxrQ@E41XhwHF={cWU>%K^b94 zf9%#?cm&+3-P0?P0g-%a7s=;*DJ{iX7JNwy+TgF_5DAg~m}h9oKhw3=$cg`(fD8US z&xP>dhx9(Q<8_gT3GD0bqbr<3{HbOERyBctk36jvHmFS9HW=d%b;c-52;z~x{LKk_J>Kk z9@Oo})ZDuJ1$FB)=mO0NDB{~)7i;2^LJ{O-K(rbj+Uoi(gzuqo(u0Au=6l*HKHt;& z>lI154v~izI$uU`dL~~Y>XKh5`F|u%vQH5?VazP`%y8cIMsT%7PWpJ9Pw}{dxJ|8U z5qK>p)FN_ne^Psb7`!JZ;(^zeSfN{Y;Bm=JfxBPBJ-12gjII${w32hGC?Wk0bK=@s z&JOAEeH%3;w_e+0^(-t$)VF30bEA|~pEcF=gqL)>{xW9q2=we%r$(H1k){7NZ6pVL zHcdU?GuM{G=W{dNGw9i#)wKRx&OPF+_vD*C^pVT0gQ;KlIHlDl*Eq>Zkf5bWc!L2NB_Zl7nt3k_<8CD=Rs9ZwB}O2(kt(JBJC1y zrS1SVPc{ch`Ih82l=4+>d9$|U+thQb)DIrIek)({>rnn`DL>LHFOdf|8GKqw`64&p zzDvqqMm|^e^vfjw_{3Z3bEG_RRgF)GkPLb>j~M?u+EX*mcJs}DNGyL&;&@y3 z{ThAUeB(#wY3M&3U%Z1vY6g;TI$`ctF(1{4+1v+nYs+jd3lKOw(OtU`Omk=v7yFG= zf1XwU7>=sqWg7Z*xM)M}3@zcwgKKlm`g(DLUh2!PLtg68NM6OE4+alj3#*qoBwr(| z#kvWv;%3=`Y8xE1YstaLoW5&*5&hR3qxK7l#fi#8`(J+9xGoy~{I&-lxWn%A=)_IW zZb}@q`{aH8`Js7<>+ijG1Ve)AExY%B-?IOQ8f7>{qO~-khZni*2`pu*1^WN>g6@Cq zNz8ijMQih+C-<0B4`rKE^UUixBI@`C~>Z_D9`vN@y9|;wDScc;HzkRW5qjFbaShGsV)yYEzu)zP3EGlmE*2 zw=)siRWN0Y+PM@_UI{ zt5zA;&YSlnf!+@j*~XH@^=98g`Sy^!88h-Wnq3cF_eY$TybTv0z{WOKcc-*OpZcMj z6?A8*ER}DPEipy!GCNhrUNZlu*f((BjctbdCO-M`M`OtR`91&5%i$LqHzgi2K1mF* z=jT21Ox~fNjOP+f56#7bj7SU%HT2iTs18cbub_vhZ{Oi;_x*{0H-4P%%EYj=X8!sU zdKcE8=-*g>tMMBxP5y80;7P5;7D`{i6aMaO2LoMKBe8|jS5V8Hl27^cNm8EqaD0vW zY1<@!0`sRso%Bz5~Zg8@nC7VegzVksfOj&PI(h} z&{)l}APS$#zTA*2S{#?1^7cWsHn+Byug#;|v+Fa)MV^eV*6+&`Z_T|T@uYE|QO~Gr z+@E;jHq$udm`0u%KlGG&@1gpv#_?upc@xi&+{{LeF}pG)ryn2qi~6S8>Kuuq>aF9v z;*i4%tG)IxH#1FM0p9?Ojz2D4WL>}c(rDX=H&=JHCN1S1$Df+%xpyaa88?3Xjxjn> z`b6W#Y`2)zIM2HIP%m@EA2^M?h7XNpHK%HzM!RxejW)6eUpv*QgpwOUPHSv~I^r^M z3S^2Ew%ttL0@a}Y+*)gM>&d+)p24w?ZH*L66C;ejC2p&#N{lnc59yb9- zs&Qjoeh6c))bq^rh(1_18AyRYCar#+nO^(Hni$`b1S42~t*wrPrk*#XM`}UcK_t$f z`?->qYJbN+Z>S%=M^JaL>cv}`>&5QdQJM%f_Gz~L3U$|ve=~nl-;KsEq1_GS^ekf2 zy1d0KuwP!xwHBE6;khTd(Zo(*bG2Sk;>IeeU$1iX>JMR} z#>ig%QeM{|l=tFU8h>I!LZ3I1^#^eYB2MlsGP|;gmI-}`21$A3$FD!&EHNkjrZU?5 z2fVcf{~liX6O;8zd5u4Fr{3A#%r=^pQvWcwJiDTT`o&w-__IRCJG1>#@F|u0dwKQW zpR7NKP6R7-1pgDI{;LkhKZs8RD}WM=Ez%~)>i#u1>KBh;FUjJ@^y4g&$D``cv6oWf7PdirIcrXSV;ExbR$2d zJo%#~pZaCpzc&hFbl+L(A5Q(Qw&>A;#`6sqAKLX-t8=eMwjY*wAtN++J;7KFZJEVj zXSl!OPd_*1WHsui=fz%VI;5PeM*ctC=aS!9=m35xbh}o^t%VMZj&!~kx2Aqsh1*{5 zPtf^kg?{~^MrXvtEQoSksp%l)hq&dFbg;`L0@clH<26KyXd~xvH}fL% zvRXFnXLxkESLSne%%sNdv`qSO7EKXbT8P9;3%?S~1|=q^o_j?Lua*41V3u-j6O>~7 z2nCNzOin$wiF`08za8aeeD0pOME*L-uS@+YCoWO{?>b*B;3et(z`nO&ug^Z}qgzO1 z#Gl=e{Q_yfQf35YbnN6n^%4>dx9M*O%wRGMat7N3Ev7N zzbVxDmz2NS%V(5JtInbxy^lpsHIaJOOa8e~VT+W%#(OSmh@ERle>6F56WZ4mMN2nE z9Qs!0JNF~AE7J5%qP0?fPGU-88|CxJx6+PP>|8!m<1^>b+C&lgXs!Ka8t(x!R(kpK z6Pw+9qe{wu7vxjkY0R#(H`0!w{1UVKMg-j)0XUimk5zC&+nzby3}^va*A zpX;7@!QRA>#*_9V#rBzUzsA4Ud#CyS2f4>zwwucReE)mwI0@V(x< z8Zwsq_i6LxeyQBcPEMkJA-$8+d;Zz-{bIR4n&;^~h9P}U3HbiZ{jGApK<@Fo?QFSU zDEC0#N$>3C0jCHXY*GW65@Q5mJH z$%g)Qs%#xeR$iB<#RE#D%8s06z+Ur^KD7l()s&@bvV-^2J5kTBXHQei#pX6T;Y1nl za0s0qMI6uRSjTHz^^LeAdKA&}c!@=|?DYAkE%RCuwmQ2d$M~$#|6XWmjQ{+YmYrIf z<8x=|45uX_fh1^)M~lI_3Rk z`o&T0*@qKiKWF!DdL+d~zvry2yyeXL^}1o#-}=Gy#Hat5WehbhyWq|DUViO`si$3( znDa+rQqS+)1bOeCY4i>WR0X-1g1S-i2YDobXoK-S%_5 z)9fa()4KJ+7Fc~FelDaCx&)!=I+lLr=mU&cn}6Q5&Utk>`{=PcFLTMYgJ`oJ9}>Rf z^}orN{xNhRKu4qePuH}&6Q5QkCL}&Fh8WKpm;J=sVQ(}RBrfC(gigkfe+&V~PKl%S z**uIFF3-*M-af_BMva{etbDEosD=o)WLi3im`R*4i4dqHchBawvb=~)C?sSyJ9O{X zum^F(W^H@4Kkis7U2mf8!2a#LS-hrex$*dc8T*W58Zdkvcf;rPj1hM&vyIpPv7vpU zr4c>ZXub2KxkjxiyH^ewnK*FO$FIC|1Y4%sCNe`UY))7;85>Dt_%vCCEm|ZyowXKm zn#$0_cRKr{647s6R`i>)ql2=6cKdT=ozb@v(H}Gc+j=N*OSQFfZyQf}EAuB*TPycA zvw^ZUKXGfdwJ>jUB8@&nu@9@eQ`f@0&ATqO{)ulTedrXi2I5=!{!4IHi<~e-`?J)S zyam{>@muwoVP4u`+<1+bHi?%^^wRot2S49VNvAOz@VHk-k2&Xh>2%dsedncXsk%mn zm#(848;!kmU3%9OymUP^(zw)1XR6DMkGyn!ew*;p4ODIB3eHn^a(?T5YP`Bt-HeUD zTeV>iYiIn%(@0&ww|A01PL1L2BGzAyR;Q9Whn#U-hXlX+o7|02f1~7h+BrtuNXa4m z`Uc=`pp810-&{`(w~;@FS|`Z;cr{FZ^Ec|clPBosp9%&p4yS|18Iq^(yH%^PW3?Jn zpL8pDwBcE8c=C9zH}ZtrxsK=AZFtH}{7-G$snzbPe>0l$w?n5}ghqd(##^aLb#uyt$iS_GS-q zC*IkpKc`YpvaVCXVLWv01YJ|{_!~I`;of6JfcEVv)( z&tP6KL+|@W?hOjmW*zLugyhd3c)4mh`o8hw)Co6_A9I`PG4A@i?_l={8YMbKFHSmn zXR!Mxd1n$gN#0rbi5a7_|CX(~$p4=5|1A06@3t}H?@$*X{-62{!N`y{Xgqa}{?l=| zG**(!#~_X=c^O=5li!Z_K^ST~tvVj>xC47vPgEyyqWdY(>Qv~brLPO4{ch~X@4?xx zJvqa(Hmz{B+tAD94)O@u-EmS{pzQTI;>uywqYLnW`o`J2b zqYtyvdOPn8FXAkM5>8VoRl8J#vpdR+Q;g0=7o(@q+c?uW%Q)NUZ=7#DY)m$uF`hHe zH!mh5Vm@z9HD5AcF<&!t%s0)q%<1M#^PlEB=6mJ`=11no<|pPn z^E2~b=6rLZ`IY&NnP)CGmzvAX@61)^59Vrft+~$JU~V?InqhOhS!9-&rDnt|GxwO~ zX3UK9p3zFP${Jz~wJx`=u!dQ~tt+h&*45TXYm{}3b**)sb-gv(y3rbA-DKTt-D2Hp z-DmyXy5D-hdeC~vdf0lznq)m{J!U;_O}3t}p0u8_p0=K`p0%b}&sop&-t4cfMb>(2 zi?xF_SQqmi)?xOQyyg2=;kBu1pYf$KtZ`bBjCrBl9@BeF4~5gaoZh#`z#gm4c;@uY z={)unk@6o9gV_P zN&i3omkuxWnt4L@iCs?2KdJRezw|ocACem%7jG z{$=;2y7lg-=UMzV<6_h;#>D;jWzTq~XKVL!hC2O=YMKRw&^Y)8#s z_|RjO`_Xi#bPedez1M60^L&nU-=jb7H~L#md4Bzi4?UXe54_SJ4>Nu3aqk(bXFJU~ z{o(nWb-`s1J{#Hvy?IiemYmTO{D85N_(L5gR&_U{f~Jy=zBQ5HARxNteJ)mP|~HNrX^TIFWu^1Q?-Q2 z^|f9zp_5BTb;dJj-LvSLw%dAdr=C5iOI{;BHn#L6Z0jjl%sN=ivx#{2SLZXPx=3A2 zKR1xiv1$;X;~1M>jtw5h=LB{eUy1b{!HSfV)U|w0RnPG0#4eM!u)}k)ucu*O7f|b$ ze0r&``SezKDj$2igijx}l+Rgexhmk9Kk~T%8@vq*zk|9U|;bHB7v~u|_RcDc;VEQ(bk3(Tv@Uck1_}tMP_j)%iCpb!RmZYu$xi zTNfD@se6ra>`1-OxYM{x-EVwD4B#On&&X$`>=NPylZ<6V6&^JTIDhVOV=WPk$wskJ z%qrcTMyYyITX*#|_WdIDEH-|enquBz-laYz}Dj*!F*^&Di(( zY6~`gq1uX_|4RKETfb6;&F{_c)o!!EEKqyQHRc+%7fZiYm1FJ0Y9AJVyNY4;i&O=c zzeL5c{-tU^JwQYqpcg1pmGlIA)IoZKa#cl-uwVT|k5H+8Gpo!h^*cSoaPOYuUa`q zM{7DOgHN+&S+kgod)s>3=w`iZePDFAW?OTOURJJ^Yn*L;Va+%C(qnvWoJ+5TYHRAR?Kc{Tx&PCn;TErE$t4*({?Aj zlkqy^gf2#o-OcW1ykYmX`x|f416^p$q!+r_m}L*N2l76tOYK3%+xF%5aN}KjggwIe z&>m@zGCtx=t!s^s?a}sVV~#z>9%Fn$Waw7oQ~N{vLt`#JNKf8a@*}X(S!#3vdOJ(a ztw0#q?ku&QbC%iz`MwFV-WW;OE6kd*Be$_RMm2@f?adh1xM~V@n_4#kw*oU%dutZ( zHt;U@U#P~`BGuIH3!Dq|11N{yHgYo5YE?fGQw@RRoxbW+r!!jHnAwi)>HO^$D&|a($ZLJPSMrya2oiKpXQ_;C0{);2*#=U)J^2N|YG5<46$k@Glq~^DfxX+f9u;ChH_f~(_fx0Tb^Hn^HxEv`1#G_L7H3u^&&fO>%5yV(F}1T+DT0+22H z7y$XQj{}YeIshjECj%XUPQYnES7(pi9XK861)Kr&0nP@_amwuTfd0ThM6 z{`m}M4*NLU(B&QI@(!c9Q;I(CK%aMD^E1sc&NlRV2YS5&z20FmH)zJli#yw_;lNG6 zt-y264r>PcN@oFY1Miaeg;Q!Ra<RO(sCp zdD2={AIlI^y_}eNJ#Ygs8n_Xd2NVG%Kq(Lb%78si4C#y6U4U-<_F_DR`uGI(Swq#B z@o+=zOBwd14Es`seJR7Xl+iCY!k(02Ps*?%+J2N_KgzHfW!MaDC(5uBW!Q)^>_Zv$ zp$z*_W{gwy>4)nZcLLeKU8+8MUWT5Rq331jc^P_MhK`n@qh;u589G{qj+UXLW$0)b zI$DN~mZ76%=x7-_T8566p`&H!SQ)xghTdqMDYM>ZWy}Y_Y#^8W1;97J_do%#8rTZ# zMOM;*T0kA39*_kz02%>JfD?g}fsVjwwAEBqPN8wTlY_Ot0LfxSJTxkYM&){!GxRBk zKIPD-9Qu?)pK|C^4t>g@PdW4{hd$-dryTl}L!WYJQ4TH2p+z~gD2Ep1(4rh#ltYVh zXi*L=%ArL$v?zxb<v?h zr~T!$znu1$)BbYWUrzhWX@5EGXXOCU2xtPF2%HRb1WuzZ&FN`M=ow1jXmc!ciFq$@ zAMkhJeqb4}0$AykVD(C{b|qM~5-d>(R;UE6FG1@|(E1Xzz67l=LF-G<`Vus~L`$Oc zxN7J;ZrlNk2POjdkf-Im962vX&dZVWa^$=mIWI@f%aQYP<4BXy9pp-&hL)sAFvcwgCU8CE#R(lMPNbIN8Sn?SS^c z3BXCfDZr^fXW&EHbv7-J(DDc^kI?c6EsxOh2rZA$@`#%6ETQ%FX?=v&M`(S7)<*xj6Jf%`RrBXbl zQaq(nJf%`RrBXblQhJE>=A&F62c7_8+{c~uco(Jg66>uITyNrfv$KxgVm;nOsr5YR zcS(ODebahtG51SJF9+6;-VMY^$AJUDLEtCg7vMMG4Bx%$re=<4~jvVhhV(7FP(9Nnqw6rjK7qrc~)zvrXB=hM;xT3SF$ z3utKpEiIs>1+=t)Ru<680$N!>>k4RD0j(*Z6$M~l0QLo7T>#bvU|jz=qO)&*c) z0M-RyT>#bvU|j^Ce46660AI~~SOhq2RP>~vTSb{4Y|Y%!LsP+iXT3i7U^#~$Gn zV-t$8;bCleSiMQ!mt4OlZxOuAr|e?<b)MtYkOLD$0LPKmUWX zK^3qjdN1WGfH-gfs00oIKT-Z?uD=4m0fzwARMAI-4V!B-dYBeYG5tlD{vvF2C$AUR zeq1jCXajvmn7$)S-w~$o2-A0j={v&o9bt2#vlz=cnEkH zc*H3-Cjn3Mn`eRNfER!l0cb#96Q-{T)7OOQYr^z3VfvadeNC9YCTuR^Incyh0(=WB z;~6V}l|V7|?*w)MQD8T)7pQQG>7&BdIA<|_@ir^lDa5W8;}>tErzpfP-bViwwqE4> zm$-kK>nq&9N*Qpma=4!cOy~YRU=HbA@;~D`pZf)*zX9?{f6ui5SPg98`$Awdb#CQ8 z%(aLzB|s@q#&>(2F#Tbe{xD2`7^XiA(;tTE55x3_Vfw=`y;mW53y=ailAbbj6XbIMNkIy5dMs1rk(&1XUnG6-ZD85>$Z%g^{2*(o=!tgpr&I zq^1I?i6bd-BqfZb#F3CN5)!7D-fDdS%m#AFpHJQbuHOK8q`&7{0IUYK0!8GN0HwfQ z*2$y;wSYQ6Js=Bc05k%c04D+`108|WfUZsj9It@m6>z))j#t3(3OHT?$HQrda1?4rp=1ocTolShpN7A0RMa_HR!R*2uh3sQpYP_bN?;p|1aa}k6l*sJAeGr%-KUsu@1ETvvEvayxzKu zW9l-FsmnN~uCYMXGrj`8QJKaf{K$MTUION;xUP0|EF=#e96r`z{EvO!gMHqEecpq8 zCWfKvn3I72T7^~0CHg-aQ2x8fu9&7zXm{m zYb~&c)4T=&!zovnUmf6A2l&+iesO?b9N-rR_{9N!ae!YO;1>t@#Q}bCfD_h7u)aGk=SoMUNDNNANhVGu!Zlp z(NcOfPGi~trWH_UC3^Iuk>TtznmZf7JYpQ<>@>RIdv=wW<~j~9EjBLUyGxPYL0FLC z&W-5YO6>kB?EWh3{wnPLD(wC$@kbxQW1a+Tb=H|-U^}4w(hBmlZ>s%L*C#zFKIwS8 z=SgtmIsDG&Y4NMvzlOcW8@IHd`X1N!omJTARoLiNL^?J=u?W$Q^-wKhE#@~%D8Gj5 zTCO{&tBCw!u8ah%om?3WSi9)OcMC-;Z0)a}g9omC*7LY(zqLQtf%vVL3Y9DD%jk87 z0K>Q+j&0Wd>^P{N57qOb`ZTD%0;Caq$1%3k#0S?@-f#%K%I5Q2-{D9B5ju_E2 zxU<=fe9a}m zx4>3s8eE$O*QUX>*>G$&9GeZtW;2S2!?D@;X6xYC9ym4)j>YlC*5QY(!}nT;@1;i< zv*B1i9LtAe`S@V#@W0lZQ5rK00uhK;8Gk8?SezQ>?_E_6TvT9hhMY~zi6F(Grt8_R#=3bd2nnV z9Gecumcg+DaO?v(wg!%^fn#e#U-G&BNSTem7Rqd+UvYJ13EWyE`clC)4jcd~frCJm zvmB1Cfn#gn*cv#t29B+PV{72pGB`FJj^)F#HE?XY=#$H_HE?VV94mlhWpHZ-+*%H| z=E1FbaBCjing_S$!L1MA)*86A25zl^TWjFf8n`tbZcT?<)8W4T;NTiKxCZWhpe})Hi{Ml-oGOM>#aK6O*($JX73f(p99sm(7NJus;ZiX= zRSbuU;ZQLgDuzSFaA*e{DuzSFaHtp#6~m!oI8=<~+lSSw!0Iu7;VgnvJK$6?oLYol z?MAPP;Zm_!zbl<0xKM09f|of7SVS5e;6^drD25x0;Km}ju?TBd0p*LW@m!yC7D4r5 zs9ub9t3XeRp?WbEt^(^;0kw;vb}?410*j`pTMTuJv0@ciunMeK1v*iT#j3zsRbZ(q zplC4^Erz0tkpE&RR}AHfprqeEqfoFA3hL2pA+o+7$`wMn2$YL>vK~X$ z%b;QeDi$K^`=MkZlq`gjg;25(N)|%NwNSDUN)|%NLMT}XB@3ZsA+jEYf)OaV8VVLd z!3eTm1_cYDU?FlIMb7sj=Mm(5EixU2nuSoY5Gocz#X_i92o)nxF#;7M$aEB$jv~`h zWIF1}bQH=KBGWM_8}VdXj|2;m>HSc*5b72p(@`i}2xSYA<0x_*_2hWJC&&AtbRm>3 zM2=&~aSS<*A;)D&4{m5|?IgTR7QK()B)eE6|#FOLwSfMhkP#Ih(^yGLy+$e+_ zg>a(~ImTOOX1zXft}^0WWyHD4h;x;}r6Raggf-fs9^?Kc0H2FhN%e_)m9a9ZK3pnN z>qxIBy^-{0;_qS7u4O7x`uvXl-2dVf85Xf~{3~X^>l;nEHYcwo*Q0^fKpUV7c|E!E zT(Lxbxb{W9`y=a@Ap3)y?Z#k!kBhFx#P69uKst6yCljkHLrRK}h8@-?s>Y#a9G%mCS{!|=gp&KkM|+q1FUViSRr_Ds_u9et#GcWiO7XMY z-aAgq;@6``f&jFR_Lz6wqI1^OJq(pV}BJ;I@xWO6t8<-k75#DF+(05}Nz z1pEU02K)geR2K4>g*;{Hd2(6w&tLM<_Ikb8PEsoII2(6pLs-&L8WAUA7RVl67iRSF0 zWjhtKP-xFCv}YHs+^zQGOItt}Mn%1W!T8(5CGuVh#yi1yCm8Pp<5DozQFk42FGXv1 zfpsZZ?}qO?(VAUgu4jWw(U@Im%q}qAjmGRoV|Jr4yYP2+S^F5*_9dczF3=Ac=p+R0*9bp;IMvs)R<`s_ca}mC&Y=wpY^jO4?q@llIcqO4f}H z#@ibLTn>z6G?mYlSf9j#_HmE5g|AY9uTp`pQh~3c$F?zil?r^73Vf9cWV8Zbr2=22 z0`<3xP6V4>pfF@fRxacjNXIT(PP61{L@Q75D}ftfouOH&)@-R^iuHf%!qO zJqVV1-mwZStH7)Z%{kKiV->z=m07`ixW)so0@H!_fa>#)Rrr=w_>@)nlvVhYRrr%t z_>)z3f1cR|8poh<3>wFvZw&gzu&j-tZ4BDRpluA=#-Oc^zwLvzF|6%A=o^E+G4(sX z;UTULQ7s$jim%t5Yag!txLyQYNfc%x>kAeEJOld1pl=NN#-MKu`o^Gb4BEz^Z4BDR zplJ-6#;}6>plb}8#-M4;9!%tBC~yU7)-*uV7&MKsGAl%T>Il86uryUznkpIMk8)NJp<6+OZiU?zI1V@-=m4a~x;t@Cyqh0q!+qIm0<^uAW3&>|KAfLH_eC7i3nG4AO zkE=pXjsPn}kh=WTxG+7`CcHy!%k)SIY_MB#Y*m~sB~4}2#L5HgR2cgd$IisH z*N=UPV_)Lh^Jd-i1z45~0jv))8$(`WScw>N8beNF$Y%`s)D~0wqM1BpC-SK+HH2B1{ZV#r7g8HphyF=Ql$jKr`CF=QYH|6^E!7(9+)31aX!22W$~ zGzL#&SOINicVY!%P#_aa5Q8T%coKsrF?bS#Coy;ugC{YxJqF!l&^-ptwME_u#dbom zOy*%mpsk~{1_M>jBTynHG|zDUO|OQALhr851++efW~LjL(c@j|JZwIKR8Imbkgo9n z8bFVhPmhLV0(n3YPy&lwnD@p-qGuO6RATJTk>$LQnI)8E2#bZ=BhZ&XO{t=EMW(i;`h z8x_(U6gnm)@0x-OTeKB3tQ#fNNqZjyyZXE79na%6q{eJ<5Ywy_L3bU8u=fd zFKydI+cwd*O|)$jZQDfKHqo|Cv~3e@+eF(ovD@qdR>WNhTm%dNhC12kP>vezG*?$+ z<6kD71AGar0KNl$a&pj_9Bg|wI+KIWT{l7p_~peH%#Ne+6FgP!D|Cpp;M zY}v*KB&%Y;-3F-N`|Ba?qU|^F@GXqB}Y0P7b=0gYM*@J2~i14!V0PtUAD!mrdSD~43E1K^N4IjYx7qZ#+2~jfb~YP5%R$d_tT*^Rm+J!H8{m7O z09XxdrrcJpVXk|f9CR%QUCTk&a?rILbS(#6%R$$2(6t=wUpBpNHoa~(y>2$WZZ^Gc zHoa~(dYFSA=Aef;*uQLaF-MtxZ>DSmT{phO|M?1!_ZuPyI%gL-`^ni$&Th%sV=Sca zbj!rh#|6&kl-WqmeB*1r`NsLm$Vd9{iK*T5a!9!~$5btTk;mO;ezC&)MLy*Y@QVX@ zLkIANSX-yAX7*wMb$*GQeB~^lWQ@AMNh!IXl9jBz)jLuy#%f=QcY3vIK!07I{eD+7 zGMn#wuYO>it~;ArPVIa7%|3op4~$r;s>k${y%I|_DX~d?3q_XW+ii9lVg-g67c&lB zi%qIU`7GA6)@5D%Ue>Q>QezZ+qtqCs#@&?qo_R$rp}MSI``UoAC3>wZWw%gv3uU)Z zb_-=c2jhA?8Ec@fXFSmt|2TElT1QNiv(^p4=M(m|G*oCVc+F8U?7$z4nH4iRAtG}} z5lcPU*=BUayE%>f(}6x<)t7Y^7elklDLWjDTB+llPZgsVsIx=S4?v+^YJu}3YXcgn zmH10KezJ?%k1A#i4>@bGCzBYVkD<27jM8tS#%;s^4=`Gv$7p>O^!pGS^BtU83a7Tg zsRB5qDG(9hm9|(nrg7HS2rEn#W zC;g~ycgCp)oIBJc=REa<^Rar`nFTc#utMu0wS<#XmO1~RhWmJOuKJ$5A2=VjzZ zN-u=c3z4pc(BM-jSMJ=x6Jw0H=QD@982NHJTtr)38w2g({id+CYt~k)3Fb=*~=P z`;o}XFlc%;v!1sn_NxaH2hqRT@ZlQxFaVs#!-p*RP#Zp+10T}i!!6*R1@4*PUKc)$ zh7W1r{|$V&NR=lN@Szb;zXd*I!iQVnLnHW*4j($hhfMg;z&I)qg%2OYhbHjhO!$xq zreop5MYO*z*q+UCbo*(4zHxD)0zRAuAFhQDwc$e=*ms5&dXLN1%+Jn8S5~6WyXn2E zoP|7fH&4lhF6(&8chs!8tEpK^O+Qf657h8IHB_Y7kO-VBLr*r-yO*mbP_2|-?E;rl zG;JrER-&Ux!~tq!Q?z}_gvNS({l&=mFlRG5y+_v7-;SktfJoaUB=ZUIW4r*4Yt>hL zzla&gJbt|xjx&n_Wy_%Km*Bq}%4$ow70RwKCLje1!S747^BW)^e3t;LfYs>tTINe@ z@q``fb3B(X(A00KeKYsFuse7Y{JM%#`;?jf43>KvGczzS+kseFRA`>)?#gyvlk31oX?ys4)3XE4O?B+fT(3du>Z?Hv_?TQ zMfqxfP~k8B@b3TXKWtdaAGB6bS0QooN94}?bDnVaz_}WKP+e)@ud)9X?Tz^9Ke;wc z&G)fI;@rOmq#Eef^Vh)5^8ahx{`Y?xFQIDCD(-h9&)%OtOV<5!M*68l5q(tf=j1!g zlQ~_Sw-d}LJClPij+k&*ouavQ1de5qdnfR|{$XOA!-`MtF7&HGYOZwN=hNBw9BR}j zzdpS{eJ9WP#94~=DCZ%12Za^VzmM~N)421QPCNf{)?tI`tAP|rafq$y@BKgLM4iH_ z1%D3vj5NPJo@e@Bc>MKmm2;O)(zjLn6WZz%k)o0OuJpbSityoN( zHUrC%g9g}6!?#~hu4=Zp32>1uAg$|`lYh84J$_cmSO+~nMbN03f=-af3-(aP(wlrK?d7G8r&=yM2FqBZwFGImw;kJbK| zwNm)O3NPFHbM>c&RhAxrKI~KH8}$DhG<-LD;{JJ8JZR;7rFA25kN(2x<$dp6ghEj1 z$bUzs9scN_{yG2hzpAMh;BKmW@r*;1sKdv=cGV}ZAs>sm)f4HZPvH!dTI>rxi@g5q ztZ%_?{);%ROz-AzrSv}j*0PWPSmLiEm{%IfNk{Eu2Y(0l?tjMqe!XA+6qV1Xqgu}A zR5>A~6DOn;va^2+pDvt{vW?SL^nU#w?AI@5{%|Lso_KP*R4?9Ty%#T?6`AaV{)x|- z?A-sI9dd_MLY-w;hOPR_-u-iB@BVqRcfX&ZckN$bbT&Gxi)GjT0NJ%akX`%Z)g{J6 z)-PW!JMxFgj{M=WBmXMdk$*Ki^6ye3WiS3??8TqTPJO-S{!Q6)|Bmdre_!_8e;|AA zKa@T9AIYBk*|O*UW7%^*NA}!*B75#Xl|A=!WzYRQ*>k^0_T1;mp8I^+bH7;j+%J(m z_utB%`=zqyewpmKUoLy@SID0G?_|&YO4)P2iaqx~sqbZ<{RX|yUTxL;>=nC$t!%}< zU~9Z8x7cT|_UV20DyH|@tGM20uYS|}?A0Om+2pRHa`V(bueMi|_-%0k?cb2{Nr_0{@Ub46T2H9IbTK3l8C41|~ z%ij9G$=>?AWpDl8WpDlcvbX*L*<1gh?5%%T_SQcpd+Q&Uz4cGX-ufqHZ~arUxBh9_ zTh9p*nz> zIdv!(tUlvoigvXS?P@C8)kw6fm1tMGXjhh;K$MP#Z9`YJj-`u^rHhWW5*=$LI(Cfc zSWD5dMxtYF(6K|R4SJR!Vxcvyjc8gM(KHiHYo?lU?0<7cge{B~ss&niG9^zjPEki2 z9nrvJL<4Jy2G$Y{JjS?#eFTOv9z8Tf4-L^nTl6qZ^e|2Iur7KySecx9G(_2)d^Ajj zIQQskPM;fTUdKD+uQzX08Ju=Bh800Knd4ML^LF!gcFyaQG@78j6FDK_9`k

}`N zT5u}Tqty18`4}Z1XDx(*Ui^S=a@O9-!R`G z{igXQ>3?8TnqX7jp+)bSoY%maOz)A_XL_WIeMuMlk}mcoUF=JS*q2&jUuuhesV(-U zw%C{2*cW;^bCJoZ51izbM>^lkC%xEQOnQm=E$OA^QgB{oE`u`5&E=$-10?;O`5oz% zoC?xREL3x`P|d|cH5Ut2S1eRru~2ozLS=}B$`A{cAr>k_EL4VAs0^`CnOG=RL7D8X zfeWk;BE8?-uNs)Fl~+f}X(0{FgXTff`pl39=1*9(qp)a0l*zeLLsdwhEv3>qU22$0 zt*e#ASyLk^Gs+sJ8t5~pD0!WAovOvjQ#X(vZH?wvH(EC`8#Trn z!ybg2tedFeX6t6wyWC>kLYZ5!oAt$RHWjvO9p|B&^N z%Fw4*@svrd(P_;YR!A4;SUmkl7=fLE7 z>v?c^!FoY8w5DQlN!2PH%XXdAAnUYu0P3rS-anELk~LjyeW= zJ)Qg+ocfWetv3HT7lr@tTJO@9_pJB$_G9Z~o<7H#!)YL&ux`k-KD9pOS#zzq;Kr#b z)b@q-1@m|FnYq)J{cCXh#`;E|9KzWl^{qTBkNkWqpL!Ov+9=CfVl4raZ>?|1S<2cY z(^_UNqt4~5K{Bls)(XEx+AlZGsw`tQb(3jTT9u>^vdYP{s;nx~Ke5`$w0^dJCjASmo=odk>sQjhvHHoh ze&;mkhSndff-zm!9C~Ehyhx9<$?7Q6wrq$S#}ob`gVQN4eSP_8`=#?H?kX% zZfrLu-NbG}x~bh%rR(05|1Is792eUxg(>C#7&Ze_P3-P&$V`WX8d(rxTEq}$qU zNgrz;OZqtbIMVIxcBGHDk0;&UZcn;{-GOu`yA%I8_eN#tzM21h?Y_)rp2Li23;SHo zkg0Eo3=1|WVdkp_MGl!>eW)A(GNd(_NbISKs zo6_4hpr_OxYg4bM*L{2jXZfAXf8DRQlwLeTb?1|TXL&k(s_x5cNnc)D`tmx`m)DiP zyqWan^`tLvE`7O0AAS*j!vH?E^xtXHe}|<1PE%L#u{m98I6doCd@`jk&yv3UXz9zd zq%W_p9^;dtUgDF%s@|9R)$4pR6th>P-{g~-(#L0beY`&R%9fr!OM3b=wL*PI&MH2c za^h7j&K+DwJ?r^2;G~_6v`%~0%~O~u=2 zinmch`BGyS-a~&A2~P1dGQ_vY5Z|J<_!jlVx3KUn?xNS%UPYRC6(REh^I=YS(Y{4i zif>`1_!d@*Z()gVks-c?ExtvD_!hSK78&AO*y3Ach;Lz=FPbm%MD11B;!oJ(N!a2; z*y26doagu!t(ay`qs(-3I_Vka4AL{rnWSf#vq=Bb{3q$R&9_PGbHQ4Qe~>1gL7Mmk zY2p)Ph))m_pCChgf{^$G8R8R!I0IsMLo~A(Edbo@g6cP?J?A|w8zj)e1&?}SZgdjr5 z(C_N;R>;!htt@MTHGv#G>Izx+Soe_D9z#p<6`FXyg7yhA#2d&EZ=jZV1I@%6u*4g% ztrx8qsbBj9A@K>)#3!)DC&&_?;Ars)Z1D-wtT(JT=#{5g)A*J453GLgF_x5x*fz{DvmtH)M(5&_w)(ENhpwiyl242x15cB!MKn!uw@HAOb2DUl0mN1Hl9o5fQ4O zw5a$1MG+Ozdy@bnA|O(XiWU__Ek24Bu=Uf5Xni6TMAzOoj~h$B@0R}PpK?A{=FaRh zcg~!dGi%m9cgBTr3m3*MoU#g5KEcW)SUChMdtl`atc-z`E3ondzw!g0@&mu}1E2B( zzw!g0@&mu}1E2B(zw!g0@&mu}1E2B(zw!egr*H~5K}Uu%#HpN$a3}7Ba2lr}oX+V8 zcV^6`l}Y$GgEJ7$E_MBoB001E$Tto$QR`9~5LaS@o=1$=>N!J~K-!lQXK z!oo;AWh8ORNRoI0Pe9B>o(P=8lYo=)R(n&Pf_IXdD;H_PrCbWeBaFlkg#k`1^7&&; z_*%%rbS>m-bS>mH7)$XFD<_Nk7lqNZ4YY@D@X-~3GhBgno6F4&<`#3OdB8koo(QwH zP#jv~SHc~^S_VKlxX4^-rea0tdFEEIhn41W=mGV46O;+ru{G7?VBP0JFp=?C`+AnS z(JThbc+dpEDpHKE|E~ron=u1Njlu8S3r7x5Ho+17FG@E1MvW{?wr0$QqmnUim(n(e zR?-CQp)FWc78uhYtRy`aYi5>U#fbS(Bm&G%!SCNQ`5 z;BP&_#D;=(jl*i4rC7WCCUYA&(<7$JK-tu?HUh(G4ffXsEUqus{Tv16H3=(a&oMWf z+rg|>o3&U$G-T_?ok)TflmV{S53Fu9_}OHG6+F#CbB9@B9yRN*mUGCqG3wzgu*pm? z$UMA1Fa|76)&-wy7MZ2sYHQ4TS@pR%tGt-UDqgNQQE_TSSUhb8&nP}EoLF+zWS*@! zPw{5O-$jJeOQ-SDiGs@&S1PWK1Sge^FXrIsA&NYnH!5x`nLcY8S1Z1(xLfh9h_JM{ zgx@O>JfQdyGArZ5ieD-oRXh<1mcqy*MZaRSVv9&{hMb$In5@`AF)b1-pH@7>%TnyF z*hg_tL|C4Y>E)LT7Aan&cxi-~GXv-dpk72*NW5gtrwqP;s#0AjJVdho@sdj6K+f2v1BI zkwhaG?5)^GF;B6VVw58MW3V|xaj4??isA*gc#aEZC}t^UDt1xqt|Ova}_+SYgyUjjhx7scCQ+t>OQZM_NJz_t%U)X=xFYQ()QaLLo)RdLlIScto7&KE zIzd0uN&3kd2n^&LL^jX)TqEaqja`&G!=34xxM&ySVqH_$%r$o{Tuax=#kqKw;1XSH zm*mcJZQR)|*|l}&xOT3+JJ)q^=eZQu(WSahF3qL8&aR8gaG5R(+mCj0*)GTBy6&!r z>*;#A-Y(DeaeZAs*WV3r1KnUZ$PIBr-7t5)%XbBCxGQuc+(=jCF5pV8;{|ew*Lr_jo_G=JzRv-=P*1&3~pQ)ExKmAnxSp?pm=B+;IcA;Q#ln z`0{_YZ$*7?oN2b4PG6)Gt_ynNacMnuy$zjPThSY6Kd0<<;k~p$4~$3eJKY{P;y>zh z|4okz^|xKxTlPvn!P8}5c%RZ9rTvByYI@G`u)Y&l(|fjHhB5^6iDBUW`FLUv$82c? z<}5|3>y8G;zYue+i!s}|1hbQIm`Pj))_)7;CwH4q&0(mgN1&a4p~~r3&`iI9YWf{C z)9;~`ic)&qoPbt(()@(M+d?UY&(wO>2VZEW?Fu!sm(8>N>`=;wsyLaZ&{Z^*enTZt z7pGGx&7iBPjLK;y&4SW+EzPFuXbxQurSS%uNBDIMEr9=WA$*mKp&i}^o$yZRgUg@` zu7Do+Ahf?npz}RO0ji)XT1Ojc6K$rgw2ihy^Q(r|_Y!oySK!^-1Fznj(C^-cKKDL- zKnJ13{SB(yCs5cvqtBtFVGS!f3N30WG$^dY58Y`Q^rm~EGp%s~rCg1LAB=G_v*xm^6&9LSpAE9Mx-|Qs`+-xm#1VXo{8qUQ0P+nZ(2UAS)ThLpy2Dvk?=3k6X$& z4p_nWiVZy7|9ZWbs_kWJdxhF20V{bvu!<9bp?X|_P!M-N3QW3{NupQfGsBw;s|SE< zX?KG%zoF?5YRWtHW#)%8X8$QlG9D=bnjq)VAz%gcFDc2*z$)lsQj$>3KZ3s%{HVs% z)Dir_M7awYFyYw93i1-x{UcRyfFt|V{c2RWcI4e#P4#06-wq?7Ea zR002~oP9k|_Vuo7+A?S0IT31 ztQj_o$`v4KZ9$TLR{`Iulz#!R3O-lKTS|RDLg8)aHTldpsntrcqCE}D z{HCU_(v)}W%ghgJ%=@P(iS*6@NxcQ(E0L0911otUunKCblq7UF&|i_dMq_H*j^rC~ zk`iR;r44EXZwN@<^EGuaumZka$-6(Ww(Y=^j&tRXhwlIP@>#AOzLVO}vAWO?8VYNl zREC%Ul}kKH3#{NcU?txOtZHz7QV|p26kreW`rUNUX zGyl@EJ7NNy0}OI+U;_5 z$Mm2&!cUIzLf!?-gI0+hRKP7-fm;+}E;WL@HF#1yD-G6PykmaS`U0 zi*a-T!&rh@^u5p(GtFKc*{I{tyv?Go$tXqew7p#yD?3awf4~R$ARp5Eu?V~XzeTJc z$1s{;hcxJ&+CHp2Rr0M|!C0}k6*VEmg7MUieo%YmtQKk`t*KB$(pCz?tlETG$up=( zt>g|%NWSS&{H?nJdj~#Q)Jk|KPesAgI2DZP;(>0 zY}?>>Ngv`(vcHOdmy)S1okQ)YJ)KJ(V09+c+!WlmuBhD*3oL*FES#^l1frxnI*(E) z1#u2{vVhu!rA~q;wYUA)enOoogEFZH^$bge=Nqa;Yux=fj8_RzB%~Jolumir3HoX- z<8q$Kvl^bkvnahb6?QY_44l`pE|=EGr@nll@2LF-Nz?CWSSIRScLrLIy$YYO=MUOZ z=zd`DQe{*n`dK&_VY)rn;+G0`z1?gq*bTfjb$JjJqA0uBK5aMIr|d@iq}^bju)0tb^u`Ju|5*b)#&`pI4ib6EhM5| RlaLSiI;{f(T?y`Heg+E#ii`jN literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-BlackItalic.ttf b/js/assets/fonts/Roboto/ttf/Roboto-BlackItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..60f7782a2e4aba9bbc96d7634799eaa05512c927 GIT binary patch literal 165444 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-BoldItalic.ttf b/js/assets/fonts/Roboto/ttf/Roboto-BoldItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..3c9a7a37361b6ae0571b33f09b6b55367e188cfe GIT binary patch literal 163644 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-Italic.ttf b/js/assets/fonts/Roboto/ttf/Roboto-Italic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..ff6046d5bfa7cd4498ad4a549d2d9028f6c73372 GIT binary patch literal 161484 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
  • 2a-ytx-(Y1%*Q`;e(V?9Smc22g?_xG~I&%zq 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≀A#j z3En4hd#s$US74J{FZyyB`#_Q2U1F?42f@E6Md#-|I@mu*ya#KDzKk`-xN#cnlecPJ z=0XO3hS!&*a3=GH5a_@Tqu$JAU9XHCh^X(ElK+_Gl*}E7i0uxQ^mE{Q#!frn6OD&H z=O&-c+-ZmO2Sk2)B;UyF1Czcawdc*NnS11ret_ho?Oum09q;KcWqyy5Xo>d_-|%cB zt%9{Vup6A=;1B_6`-`qs21W~{s)I-^xrp>sN$Fc7ReC15+$rh9B)uoxsucVaQd|j3 z`oZM$o#0=QNjN9mx!$N(mN6X1 zRa312l1eO=p6-`|Kg$`H+=4ZsjkKx*2P;;U5(>~OJ+4odlHM2m_X6!nUzAF}Gx-zg z+J<~8_={8NcM1M0tnIrm&=LG^8@l-v>HL#X@);xP#VPzl^N*7MSITu4%A;3_1@%r7{2$=Dk6ahabt|sVk?ZgEwKExO{lDx0 zAo=~*tB9bE^_gHp4dnAb?usBQXWx)DM?1mRntUj0j$CWy&Cr!~a#H{Aq(1fN_dnN% zHJ{e?LXRbqpXTRHQU>TRWk|0k^sH(pTC7~XiqSNrR#X4suV0cm6?&nWH!oM@TJryE zd3i(rr_L@v>&TBT&+W2eGAZSms=oY_by!}X4D346BDIm+U1|F>>A6<^ukxO5XG)XC z*Sl^6^?GwkS6{m7NE5#KX~|qGVozoj+j|Aw4nKlEuS_b?-5PJzs`MXZr&-;tA()hY zjblNup}hO8TRRC&bvvfus&4Gya!NNsm235nqknQpn|nvMhr6+>>?hq8cGDZpYP5y= zC%t)WL9;I1be~)H7cc1GX36%lnXedQVTN9c!S2_ocQ(pf1$ z__%HIRAX`5nNPkl?CcM$**1)0z5Ap9l;wR?(+aF+dcRz^!zB)yw=z+@9q&RG`*|x9 z>jb7{(+}PIY8ccDQy}f!PZ}<42q8{ss7a-NIAa4GeU`)7+&daR%)8ji387dRpGB+nE={X^!=^PiwsVqngjw8V|+(Sz_1+)HHr@Omg=VPu}}L z6XWr>*Bz7`WPH)Z=(J_XN6s^w7w6raeBtabKD##WPi$qwWdFc4`(5;$-j^Bw*j=5>W4|?T4Xii2Tx^8KN!f_J(*%RasyDkFFDY=I=w7wxR*U4Nb!HE}Ydo5o zJ#=}U*+cKD&)k{T$q{wtL%d6j*qsk?QJwh^?-~dowG;nLT4eeax<%Ih8D}|I6iXR4 zmP+pyl{z=nfn2%iCee#~Q|DGjx}9+zVBY%^DV!kb1*!8aH9&orI&YvFGy3o5*+?D0 zOltSMF|G1Zsq-dk1bc(J=}pxo#>c7iW~#Airp}vl-jwl-JJ_N8J~c+&tZq~{5o_$s zI>w%Ona6T=7XRKs`mJgdSA%#H>~-uS+gY7T%B>tP^6$D!u12Z5z#KyxG)i3$=0)6n zEpRu`nbjXU^=9^Qy^ViHk?&Y?xd!~9a@Sq_cL&eVB{-TgxTQFrs}m$mUmsT|&mQ&i z%zWC-l%+GdcjoD1I9|^)Zj-0oLfReb27WW^cXXYry8m1U{%z3eCZW?^5{rN z)OEg_=jqZ9=D+KB*6l)z>%kezxqkW>&hI7ivRzdBAP#Ub7y~6 zjUA)zk?+yulg{gC$}k4X9s^}F%W)SegW=%m%mq82`2}Y%hr^|ECXX^XWFf_ToY9p1 z&prktgV~HVILN*MLPO>O&Q$imGY4Oy4!rKZF}JGjH;x%~i|TXhHFw`mbOQYm4I*;G zdHTx0yGmb~L|M{T78;g)UEW=Js+ausli!o&ci=6f#@w#X`QtD78&VuXEKP`W~hz}g6j;9yj zm-V~3aN-1YBBQG(!_^zv#cQ^jgVuhk=3-ywsrl-2W*&U6iq(4c13NgCs15AZxQY4J zKd~q07M`_@v9>Z*uC}u?WF<3lBdoSL%IHb#t{=NVo@ktGoMN0|oM}94Ofa4?o;S}l z&oT#@=bD4f^UU+jA?5|q<}>DV<_qRa=0x*V^L5^RJIVZ~ImMi6{>yyN{J@-MPB&+oADeT` zPtDKF`Q{hqSLQe7LUWP1)Ld?UYpycCGuN2w%wqEgbECQ044GTaQnTEwFvDil+-b(l zxS24k%^I`Ty2!fNy2QHF8fp!*F0+PPS6Cygk=B*gRo2zkHP&_3_0}ls2J1%aChKPF zKIf}yNleFyXz+-KDZ&-C4x z)vy27{#*NX?El>HJN4NK&-5AEa7@F!{Z8)JvCn&b?#=CWg6eZbqbvK)>l5l5Z#1>> zs>VO$zMlJf-(UKK`m}Abs$Z9;N9Df6@0oo1@P+r!!pXnSVc!3Ums;NSxvJ#g+pz1mOfIJ|S){#y?||B%w$UR{sY&+oHO z|91VQ+r-?d-SZCbb$H)!J`jvT*Jf8Brdznb#g{fh^E+UhU7(%)3c^s&#qC#Zg1H0Sh} z=WovprOQvLf9bn1ca{EEOGf|a`s~y92yE+7SjJzmWBB(;?9$!a;P<4?f?e^2Ya9*cW67Iz!%Ul|tn5-e_<-J=tHuTiz? zXMB}k)o)nx{fgaO3=^Mkw9&w5pl&m?&vm=e#%QPRVASPcHO4s7=%MbyQukEj^jM3! z#~5S`Qui9SvWoCN;|}9ab-(c?@r{QV4fsYqY%DdFsYi@&i8wrJtYQb9$BZJP3lq%l zW_R_3d4zeSdQw|=^)&WY7rLvIkgxo z{(@S9C4WgR#hSmRmT3#F)?&k_sbcK-bhRE^K2!aGJ^xt!h)tiPO0esnstwro&(ucj z`+T(t8~=scjGg~V{e-PwsY2#zbG6#Rn}CbdPIE2uI(A{{H>()dKBRVI@wcitR=-qL zVfo8d0_$I)s%ZhjY7ebIRMpTD>{NSc4PvU67NJ`0qeZAuznZmXt@@3YVVL@z7U5>Y zv~IO-HCkACR-Vz)8e@$y4zR{q?fLv|cfev|h9F zjULt%>uuv$>mBPIhLqm5-ev#b_pNEh@zxA$wvlTUSOvx@);w#zF@P51YvVLpjTOe} z)+%eYah_FVtuuyL8?24S#a74)8JAjHtqNnPwZqzJjI`o*YvU@rt=-mm%0AHUW;|^l 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 NB=zG+r1ji${|`g+Rr~+| literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-Regular.ttf b/js/assets/fonts/Roboto/ttf/Roboto-Regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..8c082c8de090865264d37594e396c4d6c0099fe4 GIT binary patch literal 162876 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-Thin.ttf b/js/assets/fonts/Roboto/ttf/Roboto-Thin.ttf new file mode 100755 index 0000000000000000000000000000000000000000..d69555029c3e184189c6cf9961c9cb21205bda96 GIT binary patch literal 163132 zcmcG%2V4|K8$Uj?yLU%ZkB*{vfPlt=3LN$pdy6d*J1X{uy+@4=iCtsw8Z~0{TonNk z5EZP54ZDaDQPb3@iOMa%@66sEkT-eX-{)V>eDB$v+ns&pnP;BonP+ARp@a};d`U## zrpp)I|2S-zMg-?OgmnGbru&yIIkHn7u|#F?r=WxH6e5Z?ur~dW?*!) zz_t?zsW6%lm-B2t9XMu4 z!>3~fB9z57!ujZN6DJjoAyMGxAp1Rf!jR~`T|%P?sr3ryqX?6YK*)kTAHM?`M5jAq~OyyasR^DTSHZX!!g7s1emV* zlT46u$wWvyMi@ZW3gbvcF@pF=b4WWnhxA2RV|s$D5zCU#aQ$rHBrq8m26O}Bfw@2@ zAPN{pN0VtlSE&+ypF-AvP7r64e!8(_nv_X=r5ohDCYY?$G$QAv<-l5;e@*slwvqFK z2YDq8A-y$jDEB4jwGZ&y4?qvHP|8v%?mHu$B$3j260Z4@B%)4#T~pE+)X3{UPx^!B z3Gy z7ccPRL|qNCla))uNN;{0?h$?@2gOfhv=BoAQMO;aPO59mlJ214>=@`NtcCp6k>j95 zvw-Zt@p9=avPk-x4A4A+%ukR8bUEtHBooD0lA!&D%oM*N`@|(=mDGvM(8i*?I_WEx zBU_{}(pI=bz5=??BJwq!87InQFug;LqEEY`e7?AvtQF^xxtfz?mF6k#uS;f$E6He` z7pW^%B!js8&OoNy$sTPc=?D6ww3xI*T|I#VnlZ$U@hdeVaZ&)WqaTQ~<^Zn8Z@R7| zTDO4og=`LK4w5axf}*{eII>3?M0#@hk0JZ%-lD-wmSRP+K`10KocCU24er?@v?mkj zZPG@pLwchx6;6(pKuYdlDEJS$e{M7l_BgxFPs^|eqT5%${w_7+|eZ6iW$ z9PffLzNQ*vp$loups7K&Xv>o^;%3r`HX}oTPP7II292U`NhE!b^E?tP4JFN`$)uYw zlWc}9O_T~qBFQ1GbZ^K+p)YJvUosN5qd9CrbFm+p1v@iX^MO>=E+UuEe`jZ^#gft?vkXKT>icE$JDu3BG1Fy+qbat6^iStAIRP zFrbbW7*B{Rxa_{N3xjQbO};@NMlpMW2qa$I1e@3o{$~jMRuSx`L?#G-7M&5UkPi55 z4P8lANPeWER26NTjDDR<4u~&-UvZuQo0~%p(97hKm`OTFeNny=w(dE8djxDieF2<~ zmu8Z^k~92OMN&&zgMK!UO3?pMsWQ$h!XH*5T_D^3z>gL)Dm?JB(=19P}Bp&X$BHE zX$kBXdmiM-+JgS5s#}M;VxV8Q;EM;~I1n+x01_pB3tPl|C@aG`^A*hJYU+`1G_k;1 z3+)d%-6A`Zy$mlnaGyE{O^M9l8d->c?L0 z2n*fCVoVn2{ZDGup_0@@0$IPa{`kM8I>fLnj%5AAV;R;@h-Fzk`FG0VIu^(Awy+p( zZqZ8)X1|y{{5QaUaQnz?qy?~#Za@mXT=XmO&}JK%eJlxP7fXWK#gflq_O~Rgwz$Nz z*fY6ZX13W1ZljA#c=lf4DtOTY@g;2bPG+~Q;QTTBZMET69+?fdg4yztU~;jdWE)Bx zb9>L)WU=?m=5w%qcvF<16^hOZGm0K*hLeh#>P6i&jY(}GtSF9;C(LR1xIlkd=P^uY z|2}_V_J&`NxeBuz{FueBh*_E5B39kT;!z%lv$4%$eRWO|j%S_Zzp-*$!(&x877;fw z9YuYwc%7E{6MH_3M{WGE>u^0ABb+acM{cLsxXi*avvVqcMs6qAShw05%bdx|3$p_( zW@Y08<8UjpOMKphn3Y{))#bla#tZwM&o?m-6)Uhg0_-*79>x=&Z!vi@J7wXO+Z-0V zv3MUbx+U%`Z&#o6whu%Mi1?eu%vL*QeFl>Ui_ck1&5pSoO4vW^7_!-rW`zImJ_GNPd=tSu}%VgwSkRP!5Sxeox*E(L(S--)b z4#s$_YU`Iq$V2>C^w#2sHcRnE0?Wam{sZuJjItP2r4~M|{?SjKT)z9VvEZ$|mt7Ses4rcK-;%pwP7xx7pV;CpvFukFe1wOTRkPv|4 zqtWOzf+$M(5=4#d!+y|6b{dUV%OGg98ao{FGYyK_<&wlM(r9p-AV>l$)rgX)k#v$I zp*GybD(B}K9exl+oCty_Nm`u_m7{8Y6T48r1MCE?h-a`{a1DEch_Ii1P(7Z_eq-Mn ziT{Vo*drN#Iy_0IwRh0rXVl9-c6K_Q250PA{4TM_N$Q2{8|8NR5wOECuGQMxX(VLYKggAo2Eq1@>VK ziM9_e1uK#kmoV1ZH|l0GW`sWoXJ|A|aVP$>9N}CefgklIoT$=d&$Cp{JB_Ih8Yr^6 ztZKt<1)qYT%Ab9+65EI0Vmo6svJdZ6_Fdv)TN$s8-6!avp=b@BiRW=G!S$BwM5qna z&h`%%ST9kpfMoGBegPMN`egPEp+Y0Mwig$wN9-q+M|J@dw)On)S8~~-P^*JHm@?x~ z&@wf_hoAB0LG2yhnY=@p1aJ|PDSry2sn(CNkIT_1_%L(AsO4jor-0$h%m+h7e8cW> zicFX`hDchL>v>7$V)bJrjs#MMd`)(cgXBk&N;1e*@{IgW6k3it(*PPoYt!y@03AlZ zrgP{Dx|;5!Ci;pN3Eo1u&`U@bGKCAmL*WmRVwBj6_YeqI&8=18G%S zhxVY6bhxFhJLqAw^`qcrX=?`BdIxQVakI2_0ouA;TqEulkBCX)Me!QiN~A!kw$xhc zA`ORh6&QD`egTPfOFh_<4~i{2MKrF)9f>4u`yaDCqbivZ+(>0E%V zElvTZ6}cB_izMYw1oHotOy=ch;WJLdPz>yy`$kh~sw-SfKU zwfkvuUh|*Eq!Op44(T9v ziYu7Bwy8hScpPJqPY49s0ujIy;0=bEw$$zXM8G=fe}07LxC8iq@)0@+9feLpXWtaVJ>D6t)xOOlNG`#Aw@_P(uC7Ox^RZ9B&&q8!Z{%WR^YsFfviS;_>OQ_cmRv=NXQl13GIch z!f4@7;V`)u@y-N<3FyVyhgl9`!EIfEY=RiUY+#ABtupF<+8}bL%{ocX`tR?Tn z@5p;`ohXazDHS(RLEI>A5;u!ms7NKM5x0s*#cfneb<|GkD;^V%QxED%y=ZwcUOWM7 znE-oRRT>B@*@sr6pV8{H2CXUells$IG+6pd>IoZjQfe!;gH^604Ui&fT^b^_mpaf; z8b*yYoYtfD#boi6)KTgrriiK12x+9$S^9!DpbcSNCCrcG%xDMIQcrirJ; zblRM@kcLUa>F2a1Y*v)iP3kTUk%rP%;uY~SEcjJ18e`996taZ3Jk+B>ZQX0^tJF9bdCzL z7IcLQ@*OCv7hrQZx&zpWUd5eox5XeA;K4JF)5zz-C z`k3P@Q1l-x6A^m?YXHaL zbVNJ?B%(YC)QWL9KBXe8Z-^aKt1O`GcA}1dLBSu!fO!m zB9H}40DJG z{Hy_Op@O^v{agjpajckfF#9XDQX#GbZ4G>Z`u_y&qC%8GyQ*MgL+Yl2vcB!Ef{hia zhYHI2`AZ-IJZuE*1@wV^VSV0L1sgL`KNZMs5vjilHio1Dz(8ED1s!AoyKgWs4&_WQ zqJiCzfA$AqC6gSnhG{Hr0FWe1W=}Pi*P;b&lq3{j)Op9C!}uyJX?aT z-~iv)Z9^o;o>l{8vSxB+ysrfyOIiz*$&Sh9D}c!Y?Pg<9+5~I{+5%euw42rjW$oM! zu(s|1cA~s4=q_M4&>q+W{DAUMP>gqp*}r7agTRkKN8k`}809ITCg2D#0+0bF*UkWw z(Q(w%0F=q)1i<>1$pSpmMxZAx=ncxAaSG*3r&ztIKm?Emq~lqPo&nC{n&zPAfDB+5 zkO{zEFyDxkZz927@P4}ldKu^jTmiCxA;4AOHtJ;c-BCfAKHgO!vTN_D5ZV3rfm~eA z?tcvA;aN;)p8)SregpJ9@F&m%_zU=e@&eG0z$aYK`l1jpqx=P^0u%wGu$zFWVE$Y~ zRfs=>3Vb^vu&A&mib0bEhfFNFBuULV|pohz8f0+6405OglE5Xaj=cL1+({2S;S z;13*s5Be4WpHeeIDtA)B`rbeQM?AL=D4uV?vsrv#z%vbQI7VL^+*Po#VekaN2t`{A zxY^)`EsFjRCfTfzAS*q=L={ouh)q zD2ClCuv>!|ptlSxW-;sqpu2P~Xq*bE4JhQofH;^KptB5g5ojWigyY4a$pF*CCD>G| zQNiZwzGyoGT?*=Es>&7hGg=oZi@UJqV?69YD2y?{z;vT%_chIpjrER23#{j9rOy*6`FlaLk_C`Js{}f?3#tO~ z_w{B4{=WXc;ILQAnkM@i9lA%f0*k(2(V>RP(5j}%v4+VP#Hq%SAR1$c?H-ZX4B^e- z1UnMbBO;L)#OKkyyiNXK))14Rhukb>td(VIn3}~T7)bAkBfg}icOsTtpSMK0Q*{%m zPGqVPs*@A+THL|`^@v^d6T;7F>qhY-an;nm4g6V|G$pcwu@XDd4DHc8xFU{-tSzHM z4XWT|lLMV7cX6PTe%(OTW$Bwez*M#hkgzTj&_bc z9alO2<e;36)t)^cz5-V^?qBiU&V|{#!9^_75UWgxm>wp<%r5NkxOlCm|;ls zb@yHBd%%zQ)$r@!x7zQle;NPs{vrOI{D=A9sM4}ZOn?;7GvG|%cR?;egM)IbwyJup zYF0I`YD22+toGMuUwxKeeQEWS8Z~RItEsIyzGiwY|5{yZrPTU8*dy2{xNC59upFFQ z+oyKV+G}ectbMljl{!+LusU7qjH`2^PHLSObt~6hSvM`jF{E+Gf)I0PMCh5Y7GbBt z{xFU+-VbjS9uxkqUX^-N>-|>0dHt>R%?tmS45p(aND!Osl7@BU+zn z{cD>RZA@(|x9!vR`?f!~3vV~QU0l0+?T5AB*}kAdP>1my&UdWVabm}uPG5A2>m1ZM zrt_ySMt^a=i%XZOU2b%(*Y$L_X5H3zd)<9l_s2bY^tkZlmtX$$)$E?mJs048i#icg zBl3Io?QQ6Nzt6xvd3{6se$)4M-`D*D`Zes=wZBjQ#r=O9@cDp~171YBM~;q6ALu=B z(!leBDh?VsC}FVI;Hgm_QG23Z4{1DP`H+W0D-Yc~%yroKVdsWd8a{b=!H9Mvc8@qR zB5kD8$gv|oj2buU@#ware;iYB%;GV>jqNe^$T-coUgP4TD@S+u*MHrk`$P|kj*eaw zy(>B;`eF3@@xu7B<6DehF#h=j#|fSjf+jSX=r*y=#4ZzuPMk6E?4)*+%#)W--ZW+D zly_67P4l0&bh`cYLDO%}m@wn!%waRLX4Rh6epb}1uV-zT?JzrJ_Jr9nvy;E>^!2Ja zPIG$988c_moYXm&=X{u3VQ%2uHFJNTx8xhQZ@!z~dw%bQ_6x@?ytt_Sq8W?UEY>X^ zy7+iZ-I!%D50=zeGJDB)OCH5`i`^Uh`r9Vo&iwY#Qp3_FOUExgw)Fn8YRiT!JF%QD z@4fu^3ZE67RxDeQw$gLu;FTL!-dyFos@tl)tKC-jTb;hfe@*u_SJsBE?Y!3XUF3IH z*414%Yu)Mf+Vx%5-`db@L*j;?HhOKGv+>Br!cDa{joD_IdAHweQ3JzWdMq(EW#;1EUY*#W}}Kjk|EL=E1Oou?OG%*#F0j zL#+<&JWLLcJbcaMYwBkD+H~v4XGfYG>2@UQ$h0G|M|K`LE>n51{OeKAqf3siI=b=b z&Z7s99y{iZfBwg|9``&x`}n!|koflTed8y_FO1(BZ;DTjKOdhP|N4a83B!r-6YWk! zo|twb_QcK;M^9Wl@!-VU1jmF*384uc6Z$7iPFS34jeu|#*Iu(3sUrPOy4k`UoCZ&9vvNh#!N=C}Vlou(V zQe9H3q#9G(ruI%9o%(g^%GAxNds9!PUP!%_`b(OaRxZsut!7%&v<_)K(?+MwN{dNb zo3=MCA?<8hc3MH&htrzVo~NswZg{%W>B!R)PcJ;Z{`BtChfkkAef{*))9=&Er2D4_ zr#DP*liodjWctkX#p!F(x2MOYpGv=wen0)!^rAD)XZ+8EooRcf&zZ4j=A9`x+w<($ zvkT8|IV+#NcsB3sALks-`JStHuHCsl=f<2{aBlOt)8`7#y~(i8@Xn~4(K4e?#@LJ* z8H+NuW*pAQ$at9XHdB*XF*7u?b!NZJahZ!UH)NVJGc)gIzB+GrzQXzH=Np|ra6b9` zjq@+h7hWiH!RJEoh1M66FJxWFzwqb9vKK2{taI`6i(g(GeR1l=Wf%8cG+jJ>@yf*~ z7k|4%E;(KDxm5d7i%VZ#8g^;orG=NaTsnFw^-|8ICzsw{CYN0RkE!O6M!RuME91;mX%nVy~>ba^yZ7aA zt}5Bu?6TR0?7G7?|!HpI-df%9Eq;Dq#NlsF5b9)B8>yxHgG;G3gv&c3hoj?OnH% zZePFs@{Vw)!kxNzI^7w5XXc&dcXr-6b|>@By*t0&C3n5=8t=Ba+xc$f-3fOW++BC~ z(A|u?kM6#|SN2}uy(ag*x;Osb(tF$PneHXuJAd!yy~p?7+?VcGydQeMc&K5%|e^+D4IUp*M}V8MgU599|a4=z5)dGO@H+lShRl^%vZ?C@~V!|4xK zKHT>(<>AGLIS-#a{OytEk>{goj~YBW_2|~4yhp!2`jD&1btwm5f9?)Kcc+@p^xJf8RXY@RM}RNjTWr+GzB9G`eT@qZHhq~Vh`Pu4zp_EU?W zw*R#6r=vfm{FL!i)=xPDk<8 zOP_6cw&$7YS@N^2XSvUQe)ea9SWvFOyCA3_q@Za*hk~93gA2wL%q&=3u%cjn!S;fE z1&0ex6r>hp7F;d3U65N)Q1JV6-E*JkVb9w<|KfSi=i{DFeZJ)Rrsun!A9yZ5PkMg& z`OW7KoX;j=`ZKKT=sI~%kN(vd5M`6qB+b% z#Hxt%M4~13Sc51>#>-B6XJ?oCCMUg#WV3HA|F-AfWwMEhw2CkZ!QMv%k0!nN3Bd`` zHt8iJrH4CZ%#In+sl<+xBM$Vf?4*{I;lw29kCdfvYuEAhb@mmVDb~c}|NY8Us!k} zS4ovW&huo420U$@G>C4-Klgb1VD($5aRADB2X6nDN2QB%G&nz z+M`|N2PikGu|vI%bWF#39TnxTNLop`*P)*Bf{uz**3eDLP`W8pa5B;zN+g5P{5BM2 zS%MR$vt)WvZSjS64yi>J$yI`DqcsHl@>V*al@8YSm%&LH>xn;3{GBYq2*61I6Ncyz zfZJtfPD~DZ*{!(IqF(kcJ`2#B{Icb00S-+30eZQH?I*N6G%&DAU|?9NF+429-NVD( zKQz$aPwVdH;UW15?rvJ0yMGvd4{`GdscRIEw%VhlZfKWtFg)SB@$|l3XPU34E~_Jh zuO14&`P}$0W$R@c(PwJZxDiXEcAwLpJn4{^e&Fh%*g+He^=}tBrOWnn4#_9&^3EMO ze~jtcgrc7{3pMAk>gP?Wk#N$GERi*h8Z$OEdXsB5`>x2pKjYsGpf~k`O$}6miI9Y7 zl~Ev00-3^yOhHW!!LqZhl_-0-7oZn*#N6&En$9dO6f~1`Q82hSc?NhXnln z0>eCc^TWba;n4r`nc9argj1U*P2RkD;v^Ie9yED! z)ZodAeN7>=rnF(+!5u$1f56Mj!lg*$-(M)=vlrq9rA{|j z9S|Y-R~st#S#FZXZ9DSq^r?NPAZbQP407z}xrOtTsaA(paN~x3bvT6GN000LF$T_; zt!t0Bz25zSG#({umCuA$+MdLP=w&BYH_Kh7a_sU@7ng8PEq3R*yScb{>H-B}?Z`9Z zT?ZW+E=I{iTqmWD658LPyJ*KY)tf8XO7xk~3}u9J`t$1TumJx(tG%M~8NGtqol(2a zg>?lnl?{f?g#g`9agfo)B`j1Bg2FvqTPCd%D5MxjPbHi|-()lDS!Xy{xsVg-PV5*4@|H-x-G1IYj78^OVZrN?n>2E~JDh z_Vmv%ic~fweTyjeS!^ddQeKwq>^b*#kPI9Uua`hXo)9z)wgTezzE0!eyYbU_fw%{BwjkMs^SPw`2sdBYv`I&rGH2XLXR5 zj*S(;=2~ml3AZ}bHL5qQV{xRY=d+^u!a44@E6CWQr`DqyENgH9*8OS7kcL8J!`a%J z@RPHPei5Hq>|krzp<*T61&eNShP`8bR?0PSv&TjA_Y=A>PK5CCzX2=wWn2;+sYrxC*?0C z2YXSY3~^O6ndj$;jZ~xoM2fn0D&Xn%OIM{&sf3;|a!Jjvc*l`|1R2S2x9Mj!)Y%DPicX z_(}1BzVR!Q9!yA{x#LFS?wtoHG_)J~q&2kK0ruo8xh%IQrm}h%4^>0$(L{S|d%20> z?X|Z=j#P&o7Zw`LO@tH8&3%QjJ?I&u zGLbIxku-&_;=x!pV&mZl*?X}*WQ=TA*?_uKUMP5>R$j{Dq%0dP5N!z+w4*$pwhNXu zcKoQUUUo0$(XM3tB)hn?Zj*hyneT()cV%&*MQfN#3kvaI!IA34bOkMi4D+alp>f^L zzPy=n@>#iXecBJl4qu8Jv84(2zr}}{6RI2ky8P>(Ij7>}yEo$R)oX+yMdm`2-a(Vx zi60pxd-zwuvrHa(D7D%uKBWGmRd5{C#n_ zW}T8aY`XIC_P5XG&w94zC|y7gn$PTW84ywxdt;`0Osxy3AXl*q&pRCoQ3mbPP<`6}G1Z!D(?oc9FcGSz2OSV_l6*Lt_ z)5X2o@_wO8f^xdHP@PtxwUx-VPpe)# zGwRU5{(FU+6PL|{C`Kvn8WQ`!7DUvWb~GetmcP)JqevlX+UvNBoVB z>Lif3=^>1D}w2CZSy4^!z|g(+eS2C;)t3E^?b1aKeExo>Xc9$h7s z;9e4W|1sO}-y1*~`!q}(Zgvn`7A6Z@Xs?FKqPoh$hO7nsiav_ITzd?pzl?qKtX5bY zZ;SSn@?n)RfGRWXsbC9(SbT@3W8WIP5&o=%%SFZog|ZtbXmAtBVjcaBMg#LvI<31c zD?z^%njdTHyJ_*t?**ffMH?jb{$@dEOP*q7^ospM$97t^_u%4P85#R09-T7mjIz@j zZwX|Y(ok#G%qL-_1(_u`_`D@!rh(p61+AzaYzk3BFRM%9;goIsm$MJytOv_Fd&Vyt z>-BB@Wb(*1h3Msq#Rb*%a+TsUw79A53~j_~FU%RRuW%#6E>BNU%S>sw3)br;L8o<* zU=1*3z!g;lR~MHmAqMQ`VXhg#2k_R}8EdYhVgHM`X3qq5d2}E3#s=j5`AV31 zz@&MbH`7nu&YLzsLww=&zlZhK!S8pM9UPsQj1ZSHH7`Avu%^zK6=%QjxhGQ>dx@oN zFdHZleajBKkc|VRS3;P1r(&i#d{;xkw}s%_uyDVyQ!&w_N+%@8y3iNcl_p|WH+Is1 zm$I<+mC4s~c{Q6nvcFBX5*}?YMx_tw zEQ=+gno_wk>l{GVJ8@g!q?cWbnJtz5k$ptgZA?EUXr>Sp7U}}qEqVF}2KxIEXG~tX z21x`0VEO!I5KTvU%~h~cGxl15!zBR_oy!w z+v-cC9+`eSBUDr&-Z2M?%?e}1DTQfx0phwj%BV3J&Dg}Fa@QH$*^@RhbznaEzl^Vc z98&OJrCb-Dj5#)Yw)ouaVH6h?nuM3aWpgNdCXb%?L(eWk&-_SV*@;J+>NEdE&$tpH zYyR(g=BKKnUvQ~_A>hAj9rJ?H#c<`9y}OhZLhQ#acd4_7(fgM(50p1^3cg$YFy$hf&8 zZ00|UB}7W}E1#+|iDKM4he$cb!v031xXXxMtfeuTBZU2ohgbLt1P>yqV#_)(TWFp3 z^Cwv!%c~5bfktQn?(L08ZWoTq!J%sSI)&OBrJ{a5#b#U<4;tuLh_jlaR5P^U;%MWu zl*@OFCr<3RBx+2B4mUpCyCk2=NwDbIMLflcbd(+Vio!qWnH@a6oi%7Im4~;jGGLE0 zq$F#tW?aWb6An`jTVC+OXnZB~?QEVZoNO&9x6OCKMf}gg0Q1DchnBt)UxEt_i<>N& zxPSE~CB_=kE=;3CiiDpFABA(lscq7_@is-uv_zXqNv>2EScf_94{LgdpKt|X0;bqW z%^Ii@droTCu@^$nP&AQ!y9+&qUSAl^d#aoFp$|W9*9`pFMHBgPho;xZec(qO)p?92BU=wY*;R#AdEVtJlszE(`wg~X_f8UmHQ|0PA_e$ zoKb$ibx3))k~X3EE2TF7?m%2gCs}f1b8QxrJ6X6cmF>6A7-dJ1r$}I_OW0)iKbI1Y z#1-PQxNGj8F&*<&j5IU%&)1KX;dIrx`}fZ&YnE9k=dg$wAV{a5odm65_Y^D2$$ zN&0uW-sV+hh3_wKK5&-Vib&}4Fz9kMGFo={tU8{jTC7s0+%`86EAu5TECET`a#@GU zthry{7+ z?WMUhjIUDDe$Ary#x9-pbosWzIYtzx{zd!sn>Tp)$fZ%+vEO9Y?pty5=I@xpxnV-iGwSi7D~Eg5fHB>f-e7|Sgs6dq}D4Nt8zO@~8WW&X`*{!QwQ zIA{^elTeZfIc`Dir@g(iY{dg5ge$ zf6&!$VCMr16f+fn5+4;-z4*&7m&Dt6wm(|NW)XI*WhFA}rABnAXWJYdwWNRoJehOB zTtR44sSOC=Ojnq-~|7fzW!7Ygt;8|Cx9 zot7RWC3>tBU!`Pe<;%i~`c&p7Lxh1;X<@!^G~aJ4^cKG=oNm4?RKq(&lwg@k8i}Xa zlMb?`gnukmu{8iGq3*JTKO&8hjiidkrkk?8hOOzTF#SMsU1w*6nnj5-!k z)yHbj4YWZd6=Z5z?Ge-}%yf$&N<_Dt zgpzGy^P}R`v)Xk;un>k2#EyC^`A?r}=l<2!sOtzW`rv)*d~l&9)onQ=rbpHhhSV#c zCQ{Z&e#FfM*Ia*WQh48xRu84s8*7G|CknUC)fkUOMHfY6Z_zTpQqim}EGZUOZTzKH zB(pjd%3^0Dvo_yJPv{!WFSyr0SgVL-sS$a9o*IiUCsr1NMX?_ftr$YrG(6J+w>U7L z+ZU1W_jsSj2Wu*8WIbO~flDsj<7Fnm|&Jv-{{(eYrVQqVuTeC+?*PWnca;an7_O%(t=lc(5i4_%T!~O7& z&u2z$Yc+59gx&MMJ1T68S+^ltSdegdyZMvc%-%OR+zQ|{GE+#7SMdi7JW`{D&xvywBUcbt}(CyyGd zJVf;Lg6fvWD*B1D(YcfiL`x2$Z@n?%%kouD)tmn#`z6MsEUL>HF8{zh%rQhB!umwO z{tV>ZJk->NfV~?og7=zKd!yZxeV2a!{ldY=I-@Ri{qZYT{kFtzO{IZ_Ro>IUthm)j zluyt7e^Sg$|7L*46I|Mr$Us^2;Xwo<3YHZ`YS$)HtF-^wacD*EF&tG=TGYiW4KNLC zeb&Phg7)WXB{+M!p#(Z4`1%Pm?xoB)*}!NFPn(f^uU`DVMJcuVDZlPb6sl5@`i~tW zEc-})>^lT2vy$$a@^0!x`iVL#AJK}QXhi}f?FCytLbmtwN8cm6X)13SMVxDE6Re|1 zu4K=%WR);tDmATyL`QKxhULSGQ%tgldL{Cu#p|yy11v7GtPQxk`?5_$YQ~cyyU7Mi zpipQ2{aMql&pQ6B@Yc996UJ<87&u)~wmona-t^n;w(R}7n(IC;Rg~-X8!pJ3+peSc zVX4N?@ny!I8UgKTf$rI;b;kIGL#G;l`lSAttWhLW@l-OZQq+#tibxO zRQ5&ISKxbhJk{SSlv<_2fG!!%TC@zlgQp6xorL$xKWNxVx$HRgD;z^3bl z>`M~srA|-27oM;4f{x_o&lac|$jTnV2mf6kdmf2QT3 zgy=E6`6eb|EV+_)vJ;=t5tGY5jG*ViA#9EEckt%y+o5{y^{hJG1;H(g(0o zPr|ZhANm1*{9@^brB|vTHPhtl)#oy?czpKIzRa!W4qySjvK1^jVJ;ye|Iwtxj!J47 z6Qz2^rY#uy>Yl>lt(DLWJk+*)@w?I3OsP| zsd@d@UgyyhdcDL73dS1@yvaRS*4q|bU@mwEqW>_g!kld!yjr)oP93p!aP(A9DauXUbh4NywMP;mjxwYLTmf72ASR94Bc)7&)ys2x$CZ-zh&>A)uvo$fe7CMt z;%A<))o7eUf9a%@6ZEa|hhG*e&9vmxr)e}(2{EsMKHx1y@;jdXZ_yH-p~@B_Wqn53 z-}}(6#7L?_rpm4Xft+7vf=i9;QXv7Kvswjf>qT~tHM_&xWZjd&tU-w=vaBbwfU+AW zh&gzgjwzZ>)imx8Jv?nX7#fHlv^r5X(q)_E@t=EyhlgLD74xHa?K_JO$5G>ojprt| z&`h;{hd7EC7!zLK^$G2#LwCRD8kJpp*=)_SUNOh?TgW zJ96@W6)Q0-?$`RudQC3_QitP~YtPSD&tJ zEnA>yqi0e(v}p#~bi&f6QI?e;*h1`wRlQy*YgNjJ@PTY?lWi)i75R=3N0pS0NJ<8O z#lFJdnFm$2h=lhNLXznz^^C>_sne_>NpQ-1TSzkO^v6Je=d1XVM*)Qq)M3TnHC0Dl3cY%cbXeY z4f4h>aAf0aG$NweczOVtBHIN9*(?c<9;^?nh=8FYvvfj5wzExkvSZuNFgb9l=v2e0 zkrO5d2o{PL3)y_FSd_AX-*rqfxEV0ds91X9Ktlr%9jQBqOKh^X?H*A#5s7US)5UEU zb{@VNp0IZL-X=?_)0WoP55(sh?Gm@GI!^7+wW+>%%G6E!mXBFIt6#hBpEv0-vHRRD z-+wb<4x3X47X2bL()34+G(av}B1YmfcWWz4SrKcF50g!GL7&Y!i+4(~FXxMxWw8MqSFSjbzLl(-V%|VmCI5lzLX)iB^&T3kytMk2X8Rf>g_wm zttWi{h4sXiU1mI4`wSZjxtdBUapVMD;|WH>S=NDC(o$&OW%cKDrLv%<(3?Iszc$~Zg^DCp7s|0dQaXrChAyPNOf0*x znLJ9#u$10#R#;?3ocZ*(IFgk0I`%q{C7Y*%3I_$TuqvD-_x{w;DUFnhUY(CM@Suij zUq)AJp>%E7!%e*Y$)V9H#}NC$(MR$3Y$)joN$mnh|CqzFO6vbb4r_-f6do5cvBdZq zhE2R3jz4OF{nknwVV$-yW_LAY$MS4$fbkOywZINQz8fFetm4Fx?8+C}pcia*ruPr4 z>x@ZFxToaouGe|sOCx-elR|n4T)H z>Vzq8^Ocj4jDzFK8}jqt@?PM;))~kmBU*)1{Ml$!-e^%mA{vR4umUjcvdUsp})Kpj>*iW=5MCXQCQM zjSpWjyY1KMQT2yJ3$J41>KzLHX6}j~8va;o@eCGMEmt-YGyVqA-)AG%_q$3BFRnpl z5n*99LuZ>0sP>xW7oGiG+3Q_wSNc)gD_%mvr##IZ>wJWgMMaL{HBBHg0;4P$0X`eU zwtCiWrG||g{GgjveXYZpUuF%WOJ!#q*ozUemm6PwK|ozH!(qwJ@YjfVf<}GMsAP_& z8PCyN-yEL$_;G6Z?n@=IH0w^;J$d3l{oYl1MSUIa-gUgVyF|8zk^#se2Vjn6AR}dO z9-FG3gu6KFQig3aQd#~I%Pho$UL~9c6C>7BbhccwNz9f#UHMj8SG`=JxEx70{{rYnWdE7%45m#Br3lgmg(L0=4+{5WYad8V^VCsw=MQ_s zB+#H0q{UrtzPZ)aRQ2e}O{c0R$335NrAunH(;Jq>SNpVT&Bv81KCW5yNqJnjYD@Qi zeY+hCiZ}iGUOpX^wyS5SGgZ&Zf4n@LR8^R{NqM_*BX!!ek=k$Gto+Hw9o(NZ9k!x8 z-g)z?!1mOtE#W@h+DBaDtS2@l!^Sh#d|hySu&$}@3!T^xeS@_2F_u6^eyVs=C0h+B zF>al*QDDN0f0(K0*#Jh&B75@MFmkcMoTYM*%;D>0VaQ&i%rhih3U8r!()~&!dRA#< zRGQFq;CrQfb9&ZG3*w$iMlsUp<25Cbs^T@iH6=v7w&-hTL571~$32T39<+4lll;QaF19Q4aEF$x4%d zY2_)gwYf?d=4#BkVWt*Tg}*HL52385j}UUH zv)!Kc%In*k7R-x&clGw~#(VJzIc>k+o_)NRV%M=QQfLGJGy+#a<`DRqqnByW$nAZDW=cp9yLSz&;PxQvu6INexrM~66Ov0 zGP*ajtqGd11ol3S9cF|Th)K`iT!l|8euW1)9rT3tEuH}DL4sw|=_!?JmZ{d$(_%zL zGPCGs{Jrh7&}H_%;&R!iUVSDyAHJ}G@0ylTS`!^r)2hy4I0<933NegrEN6Rz9cuD- z_8fwb5eK~kG`Xw;pK_Ldp~thhtICUfB!rdRhiIy)mji8=SUeI>z*@`^OIfmxa}IE0 zdrzydp#~(5dHIShp>uy*y=vO~!udyN@F5eeedv&K z_3)2M_K|ugX$Lx&b~qWY99O0&$K!?J8+P3`b@(yo`?d4uC2Vg0-3cm=PgYJPB-7?e zCu!59cqR4JMcO+vQ`vhlQ`vv@DvdzT?8Dy`eggSb!fx*6vR>V>j@2C>i`;lBhbg!w zh$VP=Zi??R{`;CvJX_3J;RJ*5kIOl(*5#azu6T1syc8Yg#vPosJ>15Fn zbQcpDHbo18^4c7`hdUN__y%`>10=TJMGBhVX8PQH8x9PP8Z+0pYu=>T3QAh*@7(q& zZ-vvwW{uiT7%*mLtKpL)`V5`Fa)ENTZ_jG|8y-Eh4SUvCk=0@)aR~{eGXfrB!FmR5 zS@aM#at2*0t`S~iPgH>I?L-Y$>$Gg9%VImMNfp0C17^A564w~bmBjLNDXkp_Ba1gf zf7TR1x@92WI{i!C1A_w!5qJc8Oy5Cs%f4I*K=E zWncBh0bi)Euih8xTemWQx4Uj|iEXlSpif93&HfAO%sYvCk+M1-C{!Q5-HhHzONzf1D>gcO1?b}VLH>BI39s+u&uV$ujm0Ngc zww_tKC*VA=i+7nYQ8P0P8oos=5TelsY$t4R375^pTrQghoW=jMlMg% z+bk~ha7*l<$e5VOL9yXOzvvh>q(kRn(#?S@Rty~UZS3Gq!-sU~Hf$uG+_tDle1QL_ z;Q!(6yW^v%*7x_!%x*{m>4l!2&;x|*BB)4*3kqUGX-bvetD*NQA{_+jNL>b`N|T}# zAs|HrQS3;uB0{n!zvn%(XJ>|T@BQ9CejjC%-DI<;zV&&ZHxww3rhXJ5&W)G24gC5; zI*ybIdPH?5Is0LOP12oV1SG&=3usEf&S<(%uob+Go7ZQ1+-zL_UbU{8=B6S}H#?PA zSX42*tjt%YI(NcDK~P(ID6leZmG2?s4#;}8)tfJMnK-C@ z+qW8sO4H`bbY(b3n(i2_2MKv(Y?=t1$-5ykF*H&~aWV^YMByxQs6po7LLB5^Zm${A zB&1ac#1islY35I3(!_j_rAahjES;7}Z>d(gUg;N0i)6U1rq4JEW_b|+o}_|PQdn4% zPJ_C)Yc(``UcbSUn>Ts6Nsp< zr{_Aietr#3@(85ahs(@7K@Nx{VtY7CV3`bqR!EN(gMy-R;4FaiYt}jRr1K{Ko9wvt zh)C{&uNy;I=-4<6-D1Z{XTcUu6D3D75-E*3;YI|)lBNZRU>m78JyLujJ1G#rNy%^} zi3n5V*Xn|~-mT&8EcJDMx8Kro)wCME?t71Z_=&PO@92rIJGSzD==>66?Et@=*fTD+>D6Vf2!oAlMl*btkGjCd7+MiP|3@-xc^~k!MOWppU-}S zEV0?>BtTV-g<*$19*sICt01#eL@O*#4e#?3@K-`;J;Le~OZmYGknUjxc3DzUHtP^xqC*Unrmga6}k~T|@ve;L26-9ys#OKH@z& zU^Xs9?=85CRSiN_IZD;!d*q=L@5#Y?euliEzrS6)=L;3_HoWJeqXItH|2avp8I#24 zU=@4tv1(;>kuHho^&5I|5xw>nH!(57Es!@*Tsn#sz@ASGoJ-=-D2Xz%C<;mBhslQ-V;7BrHcivO<{rh#7eTVFt9yiLPAzxn>QPOrNq;b1VCoulnfC zIaw7I<}ch*c64rBC#z|*m7V4+Uo~UR!DFk2o|sgoMa}xGo&P>44zRMie#R{gM?`Oy z?h+9_9Bx=C#$rp)Nr()2FT@iWZ`31=OM=jmX&%x2FnvK(bBL3RI1|-ySV}s~U?53r zQ}GeRmqOf0V1Pjk721y~exs96uH^dJ7ZK%~UV!G#ebqv~M#Yt;zU?KIz4zBE&u6d? z_$yRjG2iWbjjaV&G;_3vPWGzLKn~T{Lo9Mg8e1r!Cf)1=fD=wZFj;%JX#zXKMAXzP z{9QdrBiRUa8$*K!#CLIASbH{#FUnvYS*HxXh>gzRqxh&)HktLv;IqX8ADqS}@}Urg zz=VIOec`+anSUo{?okPb*7DB zdAH^$JI7rCl3e|&yRT`^hXFKspEaL(S>0U1lfUP^vVs3|g@3G(d?%f{HU&3bLy>c< z1Ye|%6Arjic&%_` z++bc=F-qYCka?y^;kc4<72=+ZYZ})&&ecXQWxTnT_~NaFH`l6F3ocA*U`t6FnCqsO zH+~a|zfAL25GFR+g1pfY-kJ~?z&~Zg3MiTom=C}MMf%%-MTw-D3qB=)UP(gKN`#d5 z*Sp86vC2QpT)XG14q_Xu8Ql=7pQX6407^)7RbU6gOHks8 zyqPGGbn=3vqIkdv!TYVtiIpoKSUKny)Q>=k)7ir^3H%$vN))BUQABuB&7e%P2qRJT zteQM@P?vp!N1qw=?eV@Ro{Smr>Wz|Drd*H7pL@KN#wwi}zvXb3or4yCtT{^#=No@$ zzSQ^jh;JtT#MrAZuKnY+v6bH%`f}CQllxZA|K8Je(03>Lf7*wIUZm66*zq@5YkG?a ze5|8|?h^S@(mx^~3~$Xrp&AqC3U_TwD2m9xC~*aNN>jBuBDRFfmtz7i3kM|$R8a=? zTBQ6&%gisX{^UouSin6QYNiBjJ{z*>Ix4FLTQQ#Zh_VvHExBE8{LbqYlXih$Cd!xw`pN$^+FwXHwuf008TTf>2@w!~IJVHrrp4@q?GR&2Y#^Epax}!-3R42h zPq+fDMX7sH+eq%cwsFxSs&Je-m1-RG%c#rq+iFi_=jBtmqo!rE!F)0s>}#11&GjLy z+#B!-RYaV`IBls|DZLF)7gB-vP56<}$qe5WhPHdC3Q?Y7n;$6?sNxf(>7)l0B9|ct z*#RpXpl&$gm>#joU|NXm!-$)**5lFH_4>#q*KDXn`hL}F@WSjbAKKiJ1}+4FKr#Fx z;9g;VTpaC=tyV6OM`DF3FapnvmK^Sv#q`9I!}>J6T1q_>f{lkDrT`KO^2D@Qrzp-1 z%JxKN-DU0gGAe1@xznS@_kNI6q7d!7Czfz~;=@_#W5?VVFS^wh&1*K#2N2+;nlFilPL5A`6OC4cynWY$ z-o8AqLe|J9f#4D?oH)rCo7gfTpC}7&hQ9PLk*U_B#TN|9ifqhgv~?^}`*z+0ca0*I zvw9E7Zvj{*Y^Zy8*Xh7D&Y$tBzvgkH^98KZIv@jf!_p`PCW|nE**1=&O)`q(C=XZw z07#=1XNm^MG(q)a@j)Rm%^L+{Ph$TlNGE}qB3Mjo`lYM#?ipJ)EAuAQu2yL2n*y%G znvVDMQU*UHR987c<>`5p4iuKW-05O4D2vIX7^oEt3L%aHy}I}UR>^Id)oWF!M2x8( zi&@kDdYtiwlExdLH*qp5o4;HQH_H!kG>%9B0Pn{~83xZos7Gn|wT2>HeJiulk8^kZ zkbl1G?w&vOE;Z`UcW+m!{Oi)mb~vOne90vM=1&Nnx^LC8kN-H??AZ}t-?Sop|IbH+Ex zCJ_8E?cCy30{)&?fzI>df}74vah{W4QJS>}kF1)NpQSrRaF-H36!ZrE&knAjMUDP!5Y`)nBexzRCdp0YAC?F#lwedofGe(r8IO8nLi~ z)x3!^A1jyuwkalRs|`sb7^dV33O8DwztT8=rR5W$$H`PFZL8qKghB#yCRKsdHL?X@ zn=an9IbS% zOj*)xurZ|vU=umwppec9H&}t;0hooqlu|SIg)WHcRAKb?B63O*XAy-;e9!~M3e8Z*c}W=3P>-_?|l=%b8Xw`qOooPB7j`EX@9YGJeq=q45a!2BeV)}|u@F19O% zVjdu}u_8raO+9{oe#1F1E%I?5g>xp8`OLT;Z9QH3w^kklcAlelnf&(DBGV33c_ic+ z8V?n{&W~K-nANj-w5aJe&Y>-WBesr2A56Y@kVO?1Nmax(EYS??ndvlRmjI>}`|?n! z@321ZX|wJ1zPZi`D|f7Q`6@hA_KOh`!^jG4HLAVd)PpV6Ucye0_aP3KBThb%hfC-) z5jCZgRy0oR1h{)lSSp+~@ghJDX1bD&7{T-(hJezXv=x1adF(*Yb}wnGXHN^xANv3z zbYjq(O|K6or_X;@6j0&v; zM}IxoU}->PytH4R*^HIIS`;zru8P3sFOpCMHI2=Rw8IyQSeTor#}%Q-2W9ij>MTUv zZ5o_WVY}ZA&(2Qr2oOG`ryKE3D(+@~3^_M!@af^Zeo)J?uDg2mS^IRU(aH#4_z70y zlJ?xxU#HiZ_s>+)JR>g-f2v`*nZ5zgG1sy0^R?fUna*3VscRC&E`poIAl8e*o+${YIQNht;P!_=UE<|*?Ac_r2$;i%PV?NIQ zvgVa1oWYlh+|LiC$iF|ktGFC};LU&uR=c1aaGt`hR}%q%a20?3p@EWpWD(gw8x_d~ z0#lqpm_~lW>}=)0ypf~kx%>6*KG1op&!kCxT6OC3Dt*dg=hH0Ixe;>!(~Q5y+6GY( z=7bSDSnP+R3=Blh`)MDsPhBytGR=W6eGyUSgA%GIy9=^xl?AH&UNs=E2i_z_U-0&*i`MAXR5jD)WHlI z@{z!FfZ`2&HK)KYZ$@4Rxu3p>IvFUU3YPjn<543o5c)cf@cgSfZc=2Xwxyq05xQN-Wk)M5- z&Z>&#rP^*<*=^x40C4ZjgefU)Cx!9pwZKS&aOUBkVkAIggIqa9ncJLy)0j2=v%bs0 zb3urh3t6z2Z(*MnyayjI)=>>GE+M5c&oF#qoS#l`n?sEN(xwMDk!f%0q~C(E;$?_>P_LHYX+<&SBaY6>6ePa2~U{c)$OpfPqb$gwhC+%Df+ z+6lhYRST!a4Vjur&T*m4ZM6zDD@4Y(LxdH>&~(5ICL(-j=GpNP054ON+G8-V#roED zcx_aVpqynL-_TBUC{(q2R?R9eHfhiz2x!WDkM=#E>bx!X((_;~y0KkiueOJ~5?q-s z+!V0_w3!;VP7_-vIO^0a-@3;9LUTo{?`x_d6~X_enr7c5{;Th9L0jBoU_%ftG~){j16#=!^lu0|IkWW4wkW~EW1{hY*#rB`KLNQ2EOgKYbd^> zyhdHoLckEIBA*X=DiZp&80u9lClp+sW}=!-54s|tA3_WXtt?1KIobdmj-72*zUDn+ z=**9aa}E7XGiKpO#X*Alv*M7TLxco9hzL&tVh2um8Io%~;AO~gK_I9DGtrE(VkneG zNzxMXzi_K<1%nCrJrqKbI-BBes#xhKQGzHkG?2OyFD>-tgMZr+hygU7!bLPymgGr7 zWrVW4w$k3-%q7W6V;$wyW6}uK0z`lsgQ0djt&;)A6)+b#Q&qK5p;-i2t{F; z7`ZhT4+e+Y48+o;vy+^5`}iS}CG~`Fi_(l~0qgi7s->;j!~YwyB}mv;utP_%nh#dH z*brf&^hG+(fdHgKP%dG}h^j%TDbu;LrV>|MiLdGGc7HA{BUTW1UA-rED+p5UbzKvY zE0UsEK|D&{Xc6XnXxGf+0D24~$Oi+$Qqq7;uqa=H^h2;RBM8w)ot!_ohw_2%l~+JX z0XV$!16XB&k24s#h$Suv$m+*(>`0H)j9k$YK-rj4J}5IBQE^NK7n~L*&nXx|u(HMQ z8R6hKa9NmkY+jTM+*tmm?o)%2hue)2}jLT7`|H7hScEqP>V>YQ z4SO9hH61Ym6%3NLLct=?j6wm_Lg0PT^k{KRX*bLqB>t?C4#p9wsu31NOQ9Yj0ymrr z^gp#6Nr^=6D-Di$d}NrS-0`xQ1@rigEuJm>*ZK2UwAZ7gPrbiv`TZ$*qbA;4vFzSt z?T<;n&zk%_a zakSBc1kaeUHAUeb6_uk-#*<`uA7y}5FJkbO!s5ZzDryV&C)-E?A~5W<)M$eHQ}P{k zKR8lJen!wlk(5({aJZCvtdlb6+{Du$xbF$XQm@t9v@thXrCVb+Z(x1+bI)yM7jjlG z*DU@~fuk2Mv;8@DJJ#aLjNPpCqQ(5%orAvTD?0-PNL(5>G^)8Qj4%_-g2)n#DXO9OS?uToq@6D)iVC<^hT8(`D zWJr~;UZeWI#e%QbW=>Xq(&)(VeW!omzU8x7yAO7uB0zB*^f)NucrolUc;>@U3Ip5=Ykmr%A6m!=fv3qvpTYt z&cmnI^xje-;l#Y%S6V&iJFV(D>B9RK=g;@n%~S@P}V zoX@9(g|_ug7>%0vkk1qP9vC0V^T4*t90O24`vdM(I?h#$1+!{Pnx#Toq+-5$Y@t+P zkHkWSnz1@v0j?ba4tL6|XVweHiixLMV+DF*95o~%e>A{vFN>XGl8{7{STPD4!2ua? zug9=2kL^C9YB$nFG3OFiBnTMajIUACJdf<{6R+Q!LB30Q~{CnCmiwrwuyAiyfl zRxA_4jgL1lI~l^6$N=PkT+*a$bucgcMw|Ec_UPH7-IHlqEuU(>{G)|C*+Czwchh|H z#(v$s<6D`fO21IM`P||O@ssLS^2C+Tey7hD1xmAQ%wPjBvXqA+76;YOctRIloJ4ux zZS~i(LRDxV5xk>4gR@7QgQIG??bv_-?}R`|km||$Hgo6OTQ{P%dFFzp2N6?MU+p{Y z__;i<_M)zTyvNsxa!jgY5pIeiI?Tjjbvx@JM!X4J-caUvl(A5eIFb4$V5NkM;*=b? z@kOZu(Tp@vuF0MD0Yk7ixLKkT2!#^?gpjG2+87#$&tW!d^Q*5nmguny7wS+DL!tvbMo%<*)=eXSP! z$70C7hRfPD<3viFh23nhl-(k6L3;>MZQeS3c-45p`7S;_BZFnYj8@ZA5P17*VSV;q za{bIw(ZNv}qie+TpMrUpnrzn_**z);M>%hQlsEsCxuDn-8nP4bd#rQ4MW57&RJ#MjgkklqKnU$ zPnq3u$)+k|PyW%?VaH=(;T5rP90)U3-Z6QT#O_F7AE6;k--3>^B~k^$&PckTMn=Sr z?Cb_)?xz48(e0wiZva}uLs|t*^%eFL94L8tKF~pt?L(4)I7z~Q+I>-XlqyXND(Sau z%214sQbHssWU;LtEb0j?(QP_NW;hqy0Im@vxl$5Qg9^}!N@tqLRH!03NNN7j_(w;lzowtSm^JDUXzcY)!@M?`IF^O?KvuoEV zn$1E#%U<&LB)?722B#wmGia(O7=3im6Gaj)iEArQi4+fnfwCM7gvu>a4F@BEEPg_H z%A5|7oFRx{QTLSeMt*Tk&J=%2XYhpyN>+Yl!D7?xz_4AvXlkuL-Y@%}ps=Yt`}TO| zJLM;`8S%wi{4cTkjgb|Afr(gBW1aas!qFPr5{iN2jF5t5)Q>*SG;kYD2W)L|!>d&_&AH zsO$(8{3di<5gL!Ys=PCP;QT+@dav@U{HT);VAFzGRlN8&*Eqi! zti@ye^MUhqV*J#FsFcMXwT<6q^+;+vAwUwLrV`2OF{LpQVnUVx(QAo@l!_+6FD9Zy z`n@({c}b+QR+?3$I9{TPQvqd!hjp6&!8SS0#qLVEfs@U*@q`czgwIkxkH>Q+8n`Qb|KAAWn@fOnU7 zc-Gh8_wQKFnAU?8B{wuq;lG@}@bzidT;W@GAKdy8D;0e2QsmTamrwF7S}8W-?isG{g51xq5L~c<(1tL_ZJs zcXX3r_Fz8o(eWPGwp!K`730$?)o)da-}3O^v)b0rOpCAVX*uwTPqN)dYYuSkDOonI zMF69Le^K?tneYz&Wf8c@c{mhdz3+QR5J7A{lHJf<*I) zt&_gD-9pfVV+7DoSOnBAxEM8yw!|6q zNuva2jFV?75#3or)?M2IkzOPaZAdX%isC{m8kBe0;lK7P-&g z{A=XN(L=X)`RcO`pMX?>c*%W>%4FUCZs4gdS?xD>K6;_GFUjC3m)&oYAxTt=_3`NF z>7%;e=tV^zk{oYQxVxskM6Q%c>Z>RJho(3PgF*hoqC(W+F^zGQalV{?(;TO+yN$m+ zjzT=&LDYAH*jNYXg$y=Ut+d!$?`KqK#&w&fU3pg}>}uTA^su@%<}Q?%4gAm`vpu z>wD#g!wzI=*`QmM_|`;07LYI0_ZVOrxN) z$LY-IWXj0PG|r<)`pENWi^9slt9{x`^oSH4GtmM~L}Y;|po+(UutYk+>X9PJWgb-6 zA7~ijug^&VMiJ){!6ko*&ON}JY1a3@;jKhRmoHe~gV!!^S8ghYeZ#biyLW!2Z1?>O z9bW4BYVTXQc&`RsR|yey)bBvX0ITqz_aSFy3tt8_vd#NIVq4@o(V5ON7ucH8{YZ)w zqLI|JDRq?e}sNMeevKIZeC8@rlGYiehvDpQ3vc=L+ZEcY#G=w2KSU65UewJakoZBbf&0z*3f6}7CFKBX z;qxg&*~*gBmbiDZ-*UYIb~tv=B8-$!k%B;ht!0T|oZB1e$KmYgL zEBqz3Exzx2^vjC}aCjH0r+04u9E}2em3%FCESP1VYerlOi2%D)3~ zK;qI?4lZ#@ma!s1gvFukfPwY~=?n;Z5R|q8Ez&^LWSl`XcJ@#~A^I~ZN|2U2#FIDL z-Sl5mpAU{zzRxeEZuE_h3ZK=}&3m#oSkZUuv$AaDes&6LT#t7KmN8@+&SEs`C#maJ zESPnegfd0N-on*1I?Q_BT?R`#uNuevf;%64}7_x$=A?CD&J3{JRDUg_o6e z;$IbC0_N5cxr26yX;9~nR7>X%+qnq@0 EnSqQ@3ijoAGbm}8LGfLSjjuaDyN>YXc+71DLscrAnCr40%Wqq6%J;(n=M@o1?#Dp#R1W8_UMK`a== zbq<5L4oSk2p(2ci5^IZcmgzzY-IzFDq`$l+i7JTpDb8TwNud;JN_r~H#;8&tmcFS|c=;=QEC%-IC% zPF2d1E#W`vibtsj7nPa>G=z|LJ4r)~cjv9}D~JiaJ8Or}gry+5e?)=})@j*m+X=J@ zGI<;!{)JiqO2~8=jiZO%MsYkjg^2G)YTevleR%gLCUhlE`~Bw1>8CD!$2#)a2lqUw zY``c!f&`r*X5LI!EcMy8QHVIWJaM+mC@+Q8(*~-@MQh+!lB6vEROWe4*01{sPoCcr!-kpIge$f}!%hCoO$QEe0$h@pM_gBk6<_nl=pVp}i} zhf;tNJm*Y&OPaf_rDj@UHf#e6tbigoGz37-DiVM{`Zvm(I+{GJywjAPQg{1~;d?`O zdwm`Kx*Nhn>TZ?n3@7zlqrPGB=mZ{R^tXx}a&@R%0HrJbcL*w`nOEozIH+v7AO^fewOgyL((T?|^eW`*&75<80zuO#sQP@CMLP#tr&m2HMi&|+EQQ}}~3XtlG zL@P4$run8vh7g|)ZVTO5QN)pyP1OK!QQXvfOZ5N5txnC@8++r-Sr+6Qp^V{q=W>6E zcgM1@?-%_#RvG*IqM!I3v?x7wiq&FKFSwh49pRZX$G-XPJ$`NH4OaJ%=>wFW@ zfvuQRJmOS?^^ykn7zD8s;+)pm=409jB&DbmzZNk5!V41yO=QKaczRGqTEH-HPHd@p ziSZJi2z=xS2hH-qetNF02FQ!=Lejn=tMvCnP_IB&y>7k~7_%M9vhu9WW18z>?!=P` z{zB0M?hQTGxFbMf6n@m)#RZoaB9H`(E-WH)C?vB`aXXnnnj=mN_nWKvOFmM* zIE-3!*Pff!i$RnW9+3syZYfo_KN{9_U|Ww856=cE=l3dN`zR#Ng1!q{dkmJmk`($(NBm`F_dU?#A#JJa<@0ydsfBUIZfA^hzNjawm z6dX$&c!Z#GR7b1cMg%on#0a|SiV-6KcoR`4JSO`0N$5ZsaF_dpFb7RE2T|^#mdK)B zC_)6MV0>6Y1n`{`1HLoWbopB&itxM(9R&?JmJ(={_#qo`MncJeW7>>}^h zMSK)%v2yLU4g6!R#@mx$n-E`kcIT-Jm0(^mr(frh?g9M$89Gi<%MtPxam zj1tg)=bfns7rPhnu!gLFKU0@&TIpWHHrD4)DXgIq;rmVeE2BhFv9u_dzU})0bL&}f zOP!A_VFtW21J`B9P_f!_ZbDg*96@Hvq6pGM2zZj?O(*XxU3h1vh}0ue((zL-)Pz}Y zsuxc&5Gba1Mp1CWIN{-8=PXry?t|si4tl;@w)1$ejz3)9)ni{z&!_V@Y}vSR-g5S& zn$~~RjP7GMES>(+xP)rwW~^yG^YuOpCJq?hhk1lOOy_nxc8)r?KIE0j*$GW7pV&6b z^vZ&0fAnDS#p;!*BRw8p2dak$@%oqf>A)SNV^vY`t=`1v{(r5EUwhQ!$z>a#Usy6&*_`n5?#5g?EQliEuROgf9= zNx*P*2v$qoX?!Upz5pocccICl%~Ec#o3%YWp&XBO|Eq=iGdAsPekG#L$6zond0s*t zF9rOkz^#=-v0V)*y6qN4aEKwt|6TWKS|^+w1>A5hk&VL>C!sCS77xEQ?9}$07Vc)l zx1Lf@Zyolc`{iNlP6c~5F7EYQ>=SbrZqd4JUNYD7(y*l)l+q|Y&aBJs@WORa=boI; zuRhH^?AX&R_(r+w1@3UQ%}e~R+t*p-3;FNYW5hqYf$!HMan#5^m)+~F{<&O;uR2A^#lO^*v83cm5gNxO`269-GW+<1+_huSeoDW63|a#1t|hfgnG+ss|>-D%BtRC6mKDHWgHJpbm+@$>3v6-zRo zalf3~#QY!OrOS`Eoe7(84qSE9aK%}~V%WX(ZxxS6spP&7G?}pySPg34A=clOi0{Zt zS03S||K}n6pS^VdV0yUk!^8>!qRZZg^eWw) zb<<0iEFEHr<;dk=|7S1#p|L$YE}Tp1RY_Q_QmC-DvYyyZe*is?;DsrV^%A0`W)83m zU@|p;TlS`)$P1hGN-(r3z6tpaM@Y20APz4GKYv&pGz(NppeXZpRsVMN$$$PizU5N& zT?@8dP<)4#CzW$r(dCmDAAz__xx+7=**I5c&ad2;7_2R&$|4jV5K2 zCtMt+@r7{E7h5`&Rs4%p^mi&7`|AQ83~-Y~dHLIwVa8K&mKNhIQD?w6&}>eGj$;g_ z=7;XC&9(}dmQfDT_&&;36d$A#gD2TtCPde7X~7>C?zq5>7|!@&Hy^-%e}+X4oV0%> z|9tuoHjS^IwTdh+(f8n!=+z^pZ&3Ni1E(np<(mq=BbFU#=rqSf-Qn+{m2CK2Vqo(4 z%Qjl#u8ObD9>VD%tzM#Eh6Vle5PIzckMnyrY@vTksv=}O|@J6dFmIL|AW6k zUya?mj@m|Qx7=TSMYdHR+_OF6p0&5#GjX-#q|G}YaIf`ZqG7G!n41Xz9sLh!>bCo) zM-?Nt2$m->2ajrJOQktzXj|^#hPGQjQv8wiAWzqYX9$>dDL_DS)fJHQ%6hbxnOGfR>Kv#{(H&YlH236W#U5ZbLkuve8R z1f)R&u~T(B>$u_Mu}#n%znQLp@)mn_$>t4nltJqH>C-l-cDI1Le1E?^r2ljkvxFTk zW=ZISF^@wZ$o;Z8+mA*cI22J0fl!hbN}e3C8DN5D{PMrX9)KIv5GXQC{4K1mz+}mu zKj)w15Zt{djfpCCeEXnK0~4eh2+2V=umo@<4nL;`Qc)x{Y&TFUeDM=OF-MkfW>LC) z^iU#7$ea=nTt1Ok!F99D5Z5h+;AuwHTj07Gs02bq3K|;QC6j$v#qDxB_ygTooeuZ$ zm{CXha@H0% zK`^Mex*{f;2yZgT(mP0exJ(Y%^8PlQj*J6~kqE1pmN>{k^c5EQi)bZ@U<1qNNAwv9 zDl&g1w9nO5`E>Kx9cgJhM{hiVVva5E%<=-dz4={yaeDLae0Fov(4mulIjx1}{k`?f zxow&&?{EDqeI@y{3tdTyVNRvNVj2G+R!^RHo3OH}Q8{?>(GaRJ5eo*w>*28{qWP>q zUgE2(7~8vM=*F}%oBOZYkCCrrF{_M6sJ_<@|1f;O&>`23pd7d5+GEGP%2N3iQmNoN z*;Fn?poO~o&$CF__=|o5`x_N5PA0USRaY1!uH*1Wi51O_$+{mx?^8F+2Tjsb`aLY9m^)=-jQ}r;> zv)-`6%L3Y3R-Pphe~?cy@RJN_yCg~kY*bmoCggw>vM7~v+9)pckSNjI4dmUHsU=#g z0`!u_L_8kYl{BFpv)xf}VKt-M7HU2%xV9|RCk;d8f()nuI4waz&&Gp@(bKS;VM461C%&e4Jh=TtLEX zjCaVbTbgR!_Yb2=qJxK-!Hg^hQ8HSVIe{t5va+579s5sZgTpG z7@0f@frv>UW+YcZ-b}rSD1)aCf93_ibp-`7=_O$Y5%5A(#OBcU`kQ>1?)8D3TSv29x#Z7S~J9~d|?Jm{kqA+qtr+!Erq4#Yi_+w}O+ zN+qg?3DgiUQ`<7bYK4KF&vCq)hft}t0 zpz~Bdkp5}a6&R)m*=&@4V$225_1m$+(a4xg)?-AaH_*F~0LIM|!;~v*BU!ZxZZlXZ zGk|jKC2UWRRRq;kEYz%EWHU>=ut2z?fQg}liJ!HI8i}PKtu1x~rVXNpVn0|m%Vp2e zR_yn0%syTZ=P1kCFRx0ddbQ*q<2SQD*9~q7DsKSRi|6(~vft z{Ug<-&{)!45>I5HOb0nTozyt&TwJXZRIAht!w#ccuNo*I>r)V0WpucaWZFWWy3o z9H~u|3WY7V%{H$<1$GIN(NZIi*OEv{(ENy?0Z1b<=Ll~^-5L>|!|a2^OjWhwXPBV6 zWNZ5%x2xrz6{<%)a-tf_4u^L0wPJOgaW19trcJkQ&zq`*`2JCXgQqUIeQV<;#(wwk z=R*r)rZ<6sUVgqJ^8k2bt~=qcIP&~{%1OQ*cN(h3kKRo+VR#0F?D1@%!1rvSAF zh8ZjFtKFCdwl++3FMxTF6mZkvV1n#Woa9IDHp=Tf;wC%AVz6ZO_#<}Rqt5mrg5>v&oB+g?T&-~ek`d9HtH+itNB0kRTe2^Tb&)4Ps7U$5wl4Ap zi*+%pop6K#jHk||$F2)3e5^|;VK$k$I9iu zwgnY9&bN7Sq`S5U4h#F8huaQ}Hf6z$KR$cGhb*{pWN>B{@CoW4L0ysiujZJK?s;xn z8$^bxK*m?Lcs=r@h3hz^;>{d(c_vh>GM4Q8eX^zh1H z*{V#L2X94C%T-LMm{}3jauq6zHh$G|z14_134l-pzl?mO0E^-RQEg+8fqy{XJs<{% zY5~Ge($J|Z&mHEgS<~`^mSi=Ko;%v%o2RW6}i zW;rZZ*^1&!SIPBOF_+5-1R#B@rC66M(IW~-uvn?)TE*;G!@p+92hR=YbD!s5NN(S* zf1QXICMv-_>z_U{Y&z@4mlzABR%zdxd6a1*U!0iY`E=r1EL5M!YDK3uKK#a0E#K-^ z-KA>AG9e-@Ii4Z}yFR$}4cQBBA}9nrO2mZ?6(mguJxZ{j8g@E@Rc3)V+z%_%6QF{` zfSkcuk?L)Lx& zAN#tql|%55zYEUWT!$beCgHik_vm{R1XDCiDN&lW%b1+QYL0xG_pQy#)U5uh zR&(^=Of_O>9KYV3-(*W2Ba62v9QK-fUhv?u8h#r7Zh^c~OBLh{J z&;Tw4R6i?zLL~+y8+=8}IYxleVi6^gvFj~MDv#>BX_`i>5;1oL?FOm99)^;b zHWjePVcxIwIXTvS{I5QrjdmZu!|tsAs-xb|z41zit^M6f)wzF84H__@Fu!mkb>5#- zT_Z;pX60{i6bMJ2OB(srn4rm%L;0<<31hB|3K{{aM3J1XL9swxJnd-c*sF&$YD{Vg z3>`HDPe%htak2}AVJnYzz!Zf01A842+9DAIZ~~oZNRXiJLgkU!XVRVt(Gy}sTo)^0 zNrl4zsQ_lc2(LTW>(2C6%Jo*t)GG!gnYU7ew`#5z?LN((o?dr^w@$9NPNuhEuD2mc zda|1ZJjZCP3bJ@Ndbh)TCVp88eu?sV#E^*15o8i{@UgN~;#yj9iuDJ?NBb2Ku@jre zY)?0WV<$Gx(sh=K@K}pk?eOiap^@W$X#P@1&zNr2+KundYc){ZPgZnp`X$%5>)h=L zZy{`!t28`!+kIiD@6h%O=eH^fcMRFq_QFo(sqGgoRoK(1V_fGk6}nfvRjEbyE?Mo0 z;$nlt{Dw2%dELJc8}zEiK2#;2*o(*7)_sr{{DFNCn}7}%kKO^(;m{LfL|iA0yi5PG zXXkpe|I201{x6q3NU#6^z8DBPV%eh~zwC1n&fC9c*oIUivbTTDlvQli)G4dn>WazY z+p+d_uOQZ4Ykchp|NGM)NA{zz9}D^PNB8k{{QicM$G!Rd?gxjDuVbzaCs~xa?Dyre zE5vE->gu`%AEAt6njU1>!tgdFUzoVj^3>acu_Aybef_(V zbMIBJ-lYrVo`~r})0Bq4gl^!5zl5=-_)nf#3wiQv;anTvd|)l0?@?+P6hgUCtAzrW z2r^I16UIJ3c@~4kn@*qSO?mVRSfjwqfIa{PGc*O`2o zwiprB;*NjmOmZR^_N%P~OopTMaHBjFm0%X<9)6x_r(ho`ZGn)dVSWXoq5xrMDW7@f z-x$Lt-CKUSAlw~){*$lxZ_N2cIlhejOWnfi<-YtGtG(&BYsb#=CHz7oevZ$=D2MT7 zA_HFxqYU)6H%2K|UT#oelwlzvk%UudNt$7lwlo<=sZgmu1fhj3B`Q8k>FGXtxA&dFSfHj&hmbb7E}7gxKCmRzV9tL$m`SIs2th!bG}4 zHNF%wz62Xz3L9UF7+<1{FVW%)R?-=ihG0*c$0`10sd%oGV@VnOtNop?@vqZa+6{iS z3`_a4Lmo>j&%a?SHq={(QpOqU>#b)i*Ed+t#_(s?*IkELasE~9693!z2Y5LnA85IS z55lcVf+qGAt--E&oGpfK?D0OmXSy@KpdtD&M8PgVT$BJk;9f37Y{J%XBeMQs79)%3 zXAJJLFeN3s>eC8u)pe|=<4YA^9ya8qCf&!kbH$E+Gqz)=avdsFsMx&%_+=*> zH(;0x3;tm7IT#j(6d&Xp^Tso&&MPyfjwp#S`PSigo5I`9Gp zNX);I(hW}n$IcZiIPb*IpqtGf8Bc6)vOV$t1^k-%2S~g7BKz+f&?l>Mr7U)JV4HRW z`({_FnAI5H4d|2II*T8d-}#!!-}5~?!2b?T?-0M29eAtu=ZkN?`C=tcc4dC!r7m4w zs!|Q#1;5ng%@?aw^HlQPli%_0jo)$4P%@qm&gXbs3pE2=-vATGrr}y-JDDdf-pPWT8EI;U z>WOCY(LpND2p#r%gBpeLpp-7cp5?3a1{C32*=y=zh1IUdzs&zr;Rouo^zxCjYadl# zkDOEI$dh4wBYQ(z9>!Ym_jzRDoc0ZC(gWKRv7p|k`77{Mk#Izj8x94I{{NP3!&Ue%vTcZv zrW#Nzl(Vm1oxfA&+KhUsw$O}Whz9MiC8{bCBp6JxD<7 zrQ+UH)zuJ6%^BW`Em|)PGV(G_XevewIZx{!nWZJTePM33jN3Vsq2S%i2HE5S{=s z4p<#?A#^2Hq=#{JX|w^oNGirONBpDJV$lQ|{5)=tJKY#8)#9vS8fX|p54{)h?namM z&l||~qd14R`tHlp^FAwGuGE1AAD#4F#0Z(=Fiyh<7L-U zlnZVfvGiE=U_^0fjj8g$JTG)bEh}DFl=#w3rK5}6YS25VZ+`9Op-TDNO1Fl-97S)a zeByfoQrp*5+2$+fOD8k{p_Qq=Ee!ePhsG%v^N|*_INRnph57uyjZ;~7)WhFmAK8mt zGvm^ompE^N#M*fh3E(bZw*~8a}kk=vlNRGAVD3%I^hzf?*Z|5;@w>lj^Tfuu+%?!fQcqJiQ!Pww@Ssfn)lb`xwJl(-H?X!vG5#n& zYrKE_BF-R}H;`1K@dvW5Ab!VgQ{aupZ;Dl51x;>cB5pDx54c5Hi4Tid8os)H$pb=m zF)g|pqO^TL${IzH6#xAN+43W>QL`Phbq#?Dj0P4_8NZz&A_9**y|&c3)Xch~3AR$G z3B>s=)H~3smM|h_mk|)hbjr;p&(z(nYT#$o7#rpk^q=r)egXnSlyrAE12cxSHJmrC%>?~{3|SLFDrV3CGji2@*79_rI#uxeRlJ& znlxc0cd@iHOyl=2!Actm){#yEsZN#CtE?8AXJm5;c=@c*#EG4h((z6 z&1939`%mjtCa^+8|7SKA_petn(TYb=#54%Yg_EHbBnRYX8G)ZN57yj_n)8EbPviZh2bZ}>mD89@^%plQ@m-Qe&pLL{R zZ`eel&4~zHa?H_Ea)V-9B#JB-B2?tug?A4i7FmAy4;O&#c$QCO3WiqSqUI1AgIfu%js8MqricY(sfLL2}ehiW_)_Lj-&b;4Qsx!Y3i@L{x z*OzYlgRist@!+p!Uf^hJTAf864SnzJ{$oSj>sjm~evtn<t; zL;ZR#sF^<0H(dF#&5BNouEd7MO#gds{m2RZx0gQ26wc2+QFGk2QH`6H*sM$~(ra(m zA9s*+!#&oBHM1CX{kB^zwglTFO&A@@Dq!RNJG+Guq(JCeQZ;S%3Sa4V zf2q`IsG|DW<^&q<3S1S8eLeqK-7hSb=L3Ci{OEaGSmBZ8i*8sfIWSp@S}qF(bi`1B z&WJOezaYOyg@p9A>wlK|LK)W`Goon*pE z31ffII1izZI4&9Tx9B>6ODH`Qn>@6IYy!S3*;qn+Q}vJ{SUhqN87)dymc=T8EVnwZ z(L#|}%YkU2iR*Fh1W%2yitb)RU=HHiKcyTBbQ4!22$MzQ-GCaW?O0bDZ|H;Ll>+f$ zz$N6j8LJWFRmna5pT|pO3-hRXXhnCQ!La^N2ZBQHKo3!+8?7W~K z@s#FxkQf6aSNG(fQ#+}=^v{3%dPt7^Om022EU4!@_0!p1Uv=9zYT21xD-NElj?SnB zvv7CO$4^N|P{H9yXIG~;a=6&$O#0ar+!LHiWG8RnXBq5j!JL8|`YHJH6h|#Y>-J&C zLJ)Iqu4@7xLmmmWD5WXew7IxVWB@sspooGWh47grn1&rS?PyF98a)Y>r|2@lh*l^f zE?%AF<}I(}-Mh$uK0NsKxjkwbWzzlTmv`;{Lh*$uAMNKy_k$ym#^v0KamAw!?lnEg zsDnd>SzZ`%M;^2?beC~qhMY2gMNr51?Ab^*3siGDP?zOq(dX#ukFK+w{+hHndxHW+I z!5%eQXkm^KS-AD?bd+Dl1u063%b;M-5Dedv{5oUU<-NmpJ>mIo`F2eyTdI2T@``qG z=jYj3$H$`0ma3N9J$cpc57$oJUseM{0$OVI?5ez<*O(trn0lk*@s6zh@h+gg{#Lv8 z=0J4aVr3>ym!v=Z)Dm4cs~d$6#A>-e6VV);EtoggM0f*Dq z&pH80-M_nxn4^sNWkSaj9b4`hwK#u`_+ay$0u*#CU7-2^ ze7E>@2y&Z^&hu;r(RqhPyN+PB~^|B?Hc7FGiw;w@Sp7+7B z`HTe1^558kO-(sCSat%4&(J~OhVw`4QxeTi*iwcRv4vG_br|vll7(cM9l)Iyv4U`z zX=#9=o{BV#*#-EIs7Z^^6^0l!Dn->dc(kPu`jtNI=5HYB>8TXYwBuVwj%W5_XkP-& z>)erc``fWqbL(EY^Px_&Itz_)1$$P~(M6Aboc&~Ta%5;$XbM?#VR32o5YbOfFCo4d zEE2ZhEM*vtoq{AJoq$VhI6O&_S_d|uH|hYPXc5%nV>8||Cs4PqaG-}1{CA2Y1 z|75T37%K$+&fToF4?!qjP2~v9<~>My+M|+`OR&twmI<_leT0D}Ep%BNp$GX}%c4KG zb?0CQn#P76Z7r~a*~u6T2*_}>Tiv$c?e~m;Yif3ln39Sz`19Ds ztoUXY>SZOD)PABKKgv1427H!sYUiwrZS>bB9q&QAFab9C$A}dqIO^%q!j3X-ip}{9 zR0Ntg14LW?5><5OqBV`Ml9DC(NlZXAii%U3E?l9M^ps@U;f*KncRxC6SJR@c z-`Q}wHqsUr5Yy_4YCD?mR&=KvZ=i3pkDJf z(p9WTBE^egYR>Fz-;0YEE9XC%^9x%xxAE1#{bQVh_|S2jR^nujvv9K8tY%r*tj8BJ zYMJA4zf4b3SBeT8CfrLix1$${7gf3$w(^_g1cP%XIwB1&ST*88XTk2_`HOt~3=#!tb<(#E z-TPVRodXsf+_H4h61BRra?Pq8r&kQ!*Y`3k?B?1ShDL25jCXN7K)qq2KALoN=zkYYo}Fg02on=g#8QXJJpE z3>F!mx{l`x;+e})_c;gt>NBAZB|=G5Dl5+@&Nh{+(8=ng&2;?biUM*XT2~}9oF6a; z3n<>G<2s%8GWdk2JOL=-ft%MTsjad^tv{at;PJ(S&ux7mi2I;^)+6{_}MJ{rF4b{ zPI$eiV>`YoG(Of}SqqG1 zx+4mxgdj&0TP;osUe}5RUe7RIr=P3wI5EsoUm4(-sq9BxK%DN-$ar%gXtRYv*M2tw z1#2^#G*JdL!QJi;3waQvWHEeBHAfvsbH|I0ox1YU%Xptx5g~s(0)>f3;QaB}NIbrP z^Y?tF_XS)rEU<9Td|o`dQysNN4=@^1HD`z zx=s<5D(16t5#H*k$BXdR!mmc?4a}dEiqM}8JcEc6Xi(%C3DN0aUSXSN`@x`i4OTc& zJR8)=B%GbLXZD{(XRvs+^P>K*j47Eo;gx}l7WIF5Qc|fgFZO@WS7hP90gD&@{GM8F zaQim~5A4)_Ap3b>#}57bck0+bFKuv#_5%mEe|^Y56_rmavQDGdw}0-r_Uk7#9KHVa z=FhiVH&M+QwQ<9QMk6<@o0xyJ`;;kt8uywwvERSCO`X=Oai8&%`YOM4n=-XmqaIVH z_RIStLF<=5JKMwYA-kk*z^*|y1`%ofNpD4Wf6(;=Rnv()pJSSQ@{qZs6mh`3&|Jn?Rpi+c8$ncE;dD z0R$H~Q9`hKut2?Nj$>(%IJLEv`N|gOMm30mkX4zFyDSb!z(g#9n?-*!N13X8=iCh~ z@WSJJdWd@~kCg}!gjhR|;t7CNg7pXqNE0DOdID!4F_LnQ*kZ~(t_?0bxiw48c3tl{ zqqxWEUHt5;{8J9~aP09Y4*T}-)P&T`R8*UqHN7NzQi(D^FIkk_NiQN?W^pgM zUvN!Owm^ls8C0Ju{@KvasOi8jC>QuVr`Axp!}6aVQaMX;p2>9`|1{|6+KtED>*u_? zDv0&tGhM73`+oMvE#2<0W!-0cj#dBjz)LJ`HvSP42K~!OLe*>1|0D0c!>cN~zTrK4pOOM8q|uWQlF%eb z$PT>-B1MV~6opt26$`z0qzfX5fJj2`s9_68QA7}>SP(@~Q4#E7S5T6(^ZwSF-A;_} zeLv6jet&&>aguW~XZFmRwbrb@GSdZ&xBkeZ_)j+%hK}UZZ~0=jnyHu8R+G1yOVmE1 zk15QX#C7Ig(9cP2oPJ3UeW#|-Km4lZqdi1^Y2l?ymvr$-NwnC5+x-N5x90)pR6u;K zks*DUfU4d9^`G#xZ{M)I87JJ6crjm)q(4HB_guxem_3*Y-&xGb;@Fc$dTkB~P0#T< zLTmHsB61vD*^Qb3sKUDpqnA2Lh2fG!?i@L;0WNks0A{aVavKltRZGs8CAw&FtR#Ma z{-u)kLOXcwy?qE})k2EZi&zW3_Js(c?aJ%LqON(?yzSVQO~?G;Cx^=}29E(kS=5&f zw_IP}_52eU8oZw&mjSu5q0$7mR|^quG;i68sHZt&0A6wSc+KWlBp2ZKtN4|&@(EgD znpGIa{xc5AR>~a{L!?@XuQp3Q-5Kjo^~*9O;b;q0*i+#GfRAFtMePnCF3>QUk<~$8 zd=A9L=U6;`2hYIoS^RrF{vA2%n4!^0BS$U(Z>~OR7W1Qr4#eeaue`30o$9O|7D}Y7x*S#P~}d`4)~^tuV=TKd-Q{jqMG^9>NY#f21c7T z<|iVhF%^yPR zm3y_ei^>uaK|HJ8ME~$BeIiOqKLSBqx`Yg+%fI|0BF*40>VqP3#R`&r;X3vgK+CKQ zJ~YgTkg@X-MEUaUSjMvnf=R`GW2^Ff#C9Bw$Ero<2-lux_~Y5Yj#!MiNEWc;D2dFj zq=Hs_=ubtmtIVPU)~k2!Sm)EV8HMI_U2M|Dq@o$*YfaN=2mg@uFWMSRGL!# zI@D|PE_HM0u2V+^ZkR5xphVz?$yOE^RXOun?u5-eHmkG=*vPKNX4UNSX5xR)aW->9 zye1(lGpBuIY*K1cPEtFxc=l2?Y(<{*VPtOty$}l{i-}OkM$`Nx=%onguy|lz6?~SG zgez1HBDjGtsEXM_h;yR{Juu>L^ZZ-*PZibwzH{=>N51-7h&S-ZH`Fdoe>ShwX_1O% z@xh$@SDH6K1?h~`mKmn`WBul@P|z~nE*jr1l&R84IchYN9cmkLxf8si$1Gm6taA=a zp|it#NVCOt5QXh3QE^deQB9(J{fh&jkDQ%KAT9tp1er9*F`6_$e2a$>hJ^`(j=ZK% z5K;!E5P~xnqpVwySAr`B^aqMe14BdtBD5~byQZe1aA$_`M<9v~J7$VW8I+$vx_`Q8 zmJI;vndw>SAhe|PG?As#B_iI~{^?aqXT-$JcxnLh<2F_){X$ENFMUUg8eo26j?>|3wsC)A~}2-(L-Vx{sun*6?Bu2UKe+Lk!`uG=_Cm zwQpXE;q$-*4mm$~5QKI2t_2^FqPmB50S*bwtAJ>@LI45TRu!>cxj|e98AyObvKh={ zU@2MfyyT~A1I%#)M+f&MZjAhPzxcj|8MyJ8H=;xP64jc@%7Hj#vy z7}@c`y!<@;1DD883MS!SJaq`tx|#1?)?dVb`gi#6f{4~4rkfv{YgF~muC2Om!#}aY zoY22j|84jeYCtW49>vbbf=p0K8=hbE*!INbg)upM=gj16ronHV3rb05n4l)8%k7FQ z@!3%boIqg&WGu$P28&=glt#esR4_r^{i~>sAjCQ56m_d7|EP?P%g>I2Lg+u z^T8|NADz>_a%^;JbWU`;=w8tU(SiP6tsTb%E`aldJHusd*cWkZix6dw6j#r4y2Plv z&7l_YeSZ1Z&&>P96R3H$=*TBBQHqkKbm;U6UmSh?jJo=R16zw>%l9e6;cuAJLqn!*V-0ufZ2yDv9vjki*o@i3Ka;wv3cKGA8sY(AF|LDHhDzKm z8OH_|!U?e?irFR`BUqUuUQiLj!;WNFq6-*e&fq^tnN9Nm01kz`JW5+aShi&az}cp!?(YEPNKQndspguzmuU|CX{Bho<-tE>V{cyH(>%8{rO*`J)y0qqT^XWV9 zJ#bRZxlMH2Q+?J{b0^OKAY{(z{)40kbF}3eOG_+HizEF7ufSfs+R}SnoOfOO@Y&LA zzhNcPe&e_t2?%xYojQagV6|X7$Q72D;$ha?k@B{`qa~p4x9S)^4TR%`MX^~qSBSU{_BVn4AGYPT7eT(LT1twLz6v^ zG}?`nb;9=U*ac|s?2RF)K!{9DqHGI1U;3$Z@f-DEN} zLjMw+cSe$vTc7NF2+tA(FytA?lz(``)2UrYzCavsdVH2I{>A-^{+Rv5Uo&Q2m;v2s z%!=2xn@=nouhtwfV0fVrPc9VNs>gnRqOG~-k?~rC@#YVr_AuyBBe>ssA>y7+m;Iv7 z!q15cwP6X0vswV!RGd5*yBtxItMQ$cWq$@*`*&jOhsyQp68etVV0{P9XZt(0Bb~pq z0N+XS@4(oPlsI)Ie}@c6^cv@Qi<(xSHA#1{F%l{{sV`8yJoVH9EZ!T{q`Z&gal-^j0&v5IfI9F4 zQITL0>Fcln46+}O0XK7brzJIs>>}zXHdFv+;rAhTpWC0{NYPAyUo(#MK3WhzhnK`CS;=9_nD_RPW<+XhUmIB_8Rj<>V%Uc z#myo%0mBDAYGY zdws!@XVsfS+cQ<|x6-C+7qwIAmwH1jS8LWt)ACBcz|+^M?`mJeGo-=d2c_F%GsBeN zQrg$0FKZpucS-KUxocao(kP`lYMGOYt&r`QRvMxNs*(E8WSvXSphUoWD1_ZHC` zj+E*5?i^M4_jSI`msc2{{q@zLonuz~)yXG1|5f<>In}?U3a-QRNxuCkyRN<@(y^$Ts@!6I5`&%j~Y+h`JRiN}Dh_ zlqK-6s6C1zb`Jp6gFSatldDs_5zcfmv$H&q^wUy`8g7z1bj(vTyXQqT>-gaK+pN9@ z{;O7Qh;J7A*i_=e_lhaLD%vNoCTA;SjcT%H7}td(WGW7_!xLN?vOG#dxe*cI)LzL7 z@&-gk=H8^n)j+9uc1ggL34O?wBOrWwvK;72&j#iv=(&1I3i0CR>5aO z2F<#$+tZzUOuauiXjac_R(I_+_5OJ0vw-uNcI{#{qgS1!*DOxGsgAnTd`Z4-FW-U= zo>Z1=r+q82>kdYQaM3pg;~TsA8<6^(Z@f{#H;8-DNp}Ka9t7?Ck(b}x z2yk9L?a}UB!$P7hIXSVo0fppfBZ7Zmv$-%iMEb;cxnjMEN*%Y01LkZoPK-xfPIjoi z`k}f!bbshR^=Vq;3T2~+@qGx)BCqpy@}w!1e2-u)lhjuQ<*;h_teK&(cNluIM~n%( z`0)mVSZ0B5g*KExq6hx%%+LP@Avdog-WSWj$u29)6IGOvn78)7c%3N}3NCTmefv^o z+knu;iL^fbhV)v9RbK;zWFsguOX-GNGN^P@E90k1pKBxWc`_=s%rYXl77@6(6EhqZ zVjEWRk8M!)hWI3H0=ETo=DhZ+wsCgJV` z`o*UMFy>1yiLJ{QO^9f9)2K;{L~ZlD+8&ixwfs42j26wRranDq1~PYX1b~^nGwPe1 z;L(ZsI<(gv<`8Ci(%wXvg3Nj}N!ch%;koc2PkMM5^kni@33tg-spOrYdUV?ZgC3kf zYu2%gr)Ew#r~7v{d~E6pTCtX2v~*LOEA`}w_;=z&>cP@w7*(XD3wE~#79xe62+J+@ zX40Swq}gv8;!Q*Q&A%TH>m0VBx<0;BpWZ;W`Nvs#Bxm3U3|p0L-wEu3xB#csfR9JHYzC1`qBDpfzAqmte!*BQJ7?fd^uk7je?#3D>=_VT^H52%uq{ zkzkR?<3Xnq>MVB+bdios^NS3XYph9D#P(4eHNryLc!&01*eYa`1IOLlc;aZF$nJBc zW!P4{mkO+EKoS@n+~f{2(l9iLO0u&-*{oq%#Ev>H<@`mkEd6=S$gBs)gJRSrGv>{^ z;7u3%jUBVh-|2|IbR;0;dD(zbsWJC;YV6JbHR{)FOu}J(Z&taH zCO<@}a!(=Z=5gLalO0jL$`t`y#uax)!AW8(al{D|YpW?K88Rsv(w>il^T|GwOQIiw zqdAz2SSPoqPK#$xWuhg6K)21y^&PrYFr<3VcumdUv*huOZRd+hD?6Xsy8ClIVsFu+ zU1ss|qGM~8-P2(4aM9?}rFD(kMP+yYFmUv!Z>>q@dj$D_Yg9_3+|}{kz`OvF*(x zZkoDs!}Q@(X5V?_x`wkyk6F?7-djd2G&i@*4<%lTygEiyQ_J!d+%A30;lb}v;ifX~ znR>8>wLxrGSEZNIN9l(;A9q7W7_2;^j8?`gla=YpEM=bZxOmx!TlfS4F^=?mdW8gr z*CzbhnqS-UD`14ryYXvpe(lSzxAW^={CW?+-p8*G^XpK49mB5^_;m`u&fwQM{5l_8 zw~fS@&N%(f5G9OBowSC=#Bq2TI}I;WTH+3m4`yiE69Ec*`XW5zhEQfV{yk8R?LA3Rx%Jz;ZgPa5qU z%RuqHCyO6AS&V%GOhBRzCyP7B8P~agFF08Y-~dVhTIaapJ5LthakBWj8W&eQ^JMYFxMDzRQe5%elf_fwiszp!o)%ZUfDo2#i%6&d zHYTSe#FK?FF-QoTVRbsT4UMRk8ekj-p2F@3K7cA()Z7eSG}N6;Lj6e~u1Lyln%68l zfwV~LpYZ&iKz~IB8?-p-kjKwV&+l5ZX#)pMRVUwn?^LzpOLq^yxoNYL=E80r+IQ=A zP5Z9ezB?Yc@z#g?-(O$<`?X=O`Rlzg%{Y!rx#{UKD4B`L8`*)8UJ7847#IXa+7u3wIJ#J2`-1(|!M3-xO_Pll| zy@+1ste*XExaoGiQRy+!>iDo>$IT;wR8ec>mMtUA3tLKeZ@KA4pVn<8|Mz!uIluN= z@A|dP_ev*UDNXu&vit$(m~uzxbnwH75s*Az zli@#PB9rDq2wjP!my%oGsFuijDK4!va$lkBkmg4sn#>}BbpxInd5nQTQVOCV$Wu)J zd{wnqN;{Nx^2OG!+wG1`Pd%|(J)yR2*rIv=+jEW|Ki=KvQ+>X`jipzYUah_JYs;2Z zvuAgky6mwjxy{-)D`?%}j_YsV8oJ&WRYX~A(_yU{;#&i~zYeNTSC*Dv$Qrf-z<9k>*?y0Z=P82)pSiC z@%GdyCq}BnPfk5@MQyO%EM54RP&RhnE_@5;lx^@o{mq2&=NA_&|9Xl@`T?sRXkM@F zf^DECZ2c3BN;38Z`eRl_QX5~U_6@_%4m%9dmNyUu$DsmnRJd*?gm|<0AC6g%?g@6` zh6O=~ppqlWDft#rA(;e3m7hmpZEAc9mD)gw1vR~nnl$i-SI6&f8PWLc%RQfO8$YjT z(>|@`fw2cJ=AYO!`_=lln%`|Zrq(MH*+U*aTJq5czhk&md=8P zpW9^Un9=WVDo$*c@bu&FkTk#BT#YUp1;FrXh~bh^iip>R8UcM?z>-UGY0wZZ>bkjF zyn++i`n@+BbO7K(o@C$Eg;!aDA|S`_VM^FcewHlJ8sV=@)Od;?;t ztrE{uUwC}%`1$%n0}F;UzqMmp;~sUAuWH-mwrkRIx@ROeYUeL37(He{?_2uz{HpDZ zRREsGk!^Y;wuouj1p9o__occ!@D27^Q@NM+`9I#GysOv?isA(nM+-X#aseDmG?E08 zop<<9@bDH(AZSNKM3Gj9VY8(;;Tt}D!*3a0+9$M&>J?QG zH6&_E)WWD$QO`%c5*68B$_bb)HZ?XUwq0zmSbu*KAEfb+>bg4zKvu#U?mNiTwFu2J zvV$3!xfS78o@(6u)`^>i+WM<*&FeL5bX8hr{oEeSvh_w+rS|fDxo_X+FSqHHUN5af zlZf{H>tv_jC3mh(2`s_R6O|$5cOHNlDFQMCB=2 zYb0==UN~}$2xmjqR`OvlCd6{^iudqW@8A2i+UI{@?s{JLgZ%>;_4?*_X*VIJ5zedZ zu!1Tfg zke};E_9)=}=9@SF)!Y1`-MX&6*8$)TZvv*>eXnaR-PIx1nK=@3FF+Hqj5%=V_YydH z_`g&<5%nMppRDbPPZ;4yqYU6r0W1ce!GZ}>H-q;dObrITD2$9^)Xz;J1QEb_(Xsbm zv_5rX*LCgu8$RE+PYiyuJT2byzo13x;1(~*5iGM}as=m$!qj0g$?_0p*Z!)4e zw!S!;ASpFr79VU`!uH0oV8K=*sCq`Ek84^-dV{KrX#Nmqj`%oo9H50zc2K(}R5Z7h zINeU1ZW(Hz=9?wS$%ygX>RV7ULd;hmZ{Gp87h=@3V^~oPY~-~O`A~~HS{CE3z*UA< z+ZW7EFMDOSK@EO>_H@IMP=H3KI~P`6RaNc3Gqq|Cei-j?15`(MME^hzI7aB2n~Ma# z<>_Zbwl>5aAmrUO(dLDiE!9gRIp4x+0qk+%teC|nvdDlmU z-eU8#Z^4Qu?|Ce_%9{I@ZBtu?O6E@<@|e(nyBMVVdVJY0kogMXE9q%yRz(OB*x2@9 z?~Bbd1mxIg7HnWZaHSn!x2NoYQA4AWs{lDmGL|PKSynk`F)lYP!KWsC^ZJ{m!%xmW z^j)H!_}Y#a&iX#vDelP@gI+i+s{g!Z*~O`ccCK9a=ds=ImI}CyIA+jS3Fi?F9ksJn zb(An9#=?*a&w-%maT)-^u5rwQDSOb->4X4EWz3X}t>X5letvY?#YN^RQFq4aacK7A zTQKwDlQWlmH&gZXDLFUl{TZ{53Lim_uw)~z>V895-D3%QjFmR@Y}wa{4zSdY+Drwg z&9sxEUw{=0qgUaFH);z~@xK`_36*8a3RzmUo}tC+>mi?7g0$2})Q+Lwb>D(~Gs9Zh z4y-H^=PEo^a4V!FBSI2SM9$8I5vwBpu^KmAgP#wpAV2-K&}>}`hH}(#YF_9BJvkXq zejFH;3XDoaSMg|1N8A53Mx{xlO9LBDL&%@o=84?ukkV{-n~h{t*N>%VsGq*nhCeU< z$oymUhjaE_Ow^N)ZruOXPlv|7*ANE#=cl#4MWkNbw&bhHFRYxk`10G^-bJ3n)uJo; zDsi&DhJ3QO{QJqW?b$wNoA|@@9V3E!{!PTyRMm5+T&0XWx}a;68g8hU{(#KmBwfu4 zee7F+;w_v@aRMkNum(-3>ty^8b}<7i|5%<9{t?(=7hwI}%YM=7;I~-Bi1{tAFnyO- zX@8f!??l%wk>G$`HJ?OuT{wi z-!&x%d~Hh(VMP)vo8h-ez}rjJe2_MX!{8l;l@1?Q{an~5$Ug{k?06wxGrjaYP_ee| z%Pn~eYdGm6-DNmvIukSk~XPDHz8 zcY=DQkdvHUNYs`m&zCvs%>4IE(~lpgg+K4Yp@SFBiy7y|rKf+IBC32@{Pa&#&98oo zc(3H|j|<-ml~4su;>B1oB+3M2FGsOol_c{@)*5;9_8R%RAk2%FQX6=(ClU)cntQ+D zn1GG)`pvLH4YSkFp}+Wnk50W|ZWnzv?t5{)xj}qmR`V^`y=GN${^FUlpB8j$4J&KH za7#cfht5WXtcwNFw6?V-Hr?B6;&a2ApbB}4KtYlXkAZY*synbFD~Sa=B3NJMoN-@d z{n_mn3xKDfhwB#(y>j8);X{DnmOok@%lt6KhT>0O#V{04nGD5^;Cn$pk>sAcjAZu5 zkvrf&OJYuW zBc?sR`W$=uJcp422TaqMYc)7K z38(Cdw*#2ns-Q-tL{2|L^gta~P)pV7U=LVzv#h$=WVc8BonzzonD{vaQ(L^sy!F;` zUyI@2>&MrvIkrKJ+1%%+{U^=5^Dl0EQ&hWe%HWp0=1yOIc-fToGw!`-eE-`f+%jwZ z-qmxTnMXXWF|heZoI?=aa$)C7mzOMTo(4y{2iDMJaa=ZV5rXrh*;+SSp-^9+lC8cz zD;Mqj&sr`T_$c{vL;MGWlPa%tyc3FIP_{g_;`&QT9 z{FaLQ;@drMy|Y(KD*a)}u1K--X{`qBt`@LN!}B9(caanbE1w@mqs&Qd;&84ip~<=> znJIKVkW_!UT6Iy>%52ouY}9)04L6_;>Ih7Yr!+%davy$$#lnc@e$w(OVaz-1DIEV| zKayh@i5}_Rbg*0D#;#U>S0pFOf*0uAmn%~8k$01U;0dfML2SquSuI4J=FO2nW3)2Y z)i;l|G>cn>Za$=qDV=-dm^K3IY&pHO3xKr5I`Lnz+GxblDjr!fOtKA=IP5bCyLW&H z@~V+PG=Gil>*vR}qCB%traWyc;iDyMB-3`A-Y7ILi8|ytNZ@?gpCsB})n?z$o`bid$w>%Zh zOHW#a0T8$H1!9b6*5W&7f$+{Eo z7(+-2s_MMMj-{tWI#oP(8w*rp=RP|1@%huHKbAN2{`-cF7R4ko0v?RIQ&^L-R~X!V8QL<@|F!B zGq-p5KDRCzKXIKt{q13))?%x;?b;r<^}qhk@goPdxF;oXV3&d8r`+3f&>c5y0{)SL zyF*I?g~g!4bqse zYg6dChjZF1VbBwQL@=HQ;UZLmJro|pAHl!j0FvAl;-0PUyfdmKaTUp0)nz@KgaioW zn&rF-z}HAM3#G%bPB6GAN4#P_l9_U6+i^?gPrmQTNIf{T&*>3^?`~N~EEAJ+&97op z=MI}Pd(6Nd13tKYNZk~`_Cf6AQLPqky4n=yEv+~(&DoMG6OX+kCyNT`A>2j6ibXp@ z-h!_ZVULmE{EaeH-0gtwsZctv-(dg=_(Xb8n`NoV+h2`H8`WdPf<;3nt~`_9c}mih zfqh2~(`q#}iW;|l{NnP}Q+vGqqq(V$_LnDBMK z5hHgGAFX!lP>`HFxYNKfV+M8^l$Voi9w+RQv>lH1 z0P`b5UPeA;{FBR1@|MJ8RZkn+W5g57N6lF9<|`?p`r2nd>pebs)V=-3jSwT7b$DjT znAIDXbbs>$(L~*P$4%E{O`kTi;PxrNkcZTF)fYJi8#Tl%pBpXGkzDb3I{g7M8W5vEe(ca4Q6l9hUbO^W~O*o1PgbN>!mQIG^<{2E>_;p?52GRUoK^BU8_7} z1Up|x*al}{6N(ouZe{V$EChsP*=}5}UPW%)EGuBc11BSxL}*Kt9us8$T1<|S?=0G= zkxvZGNDcBRc-uTd;1E4pIU^~X>l)`Bz>j=Uu3M4~RL9E#UCV+i%SAR^!y+_o zl3~fzmY57BijuI6%JPS+2a+h|wdzUJadx&W?TS42gbb89CzBrPvco;DEv(TsoO#~ z`-_jgJmvLTRo6VZ_=yhH`Yf6AFaZ?H`3EbpmnKm5@>T4-1^V1J>m1H@5i9 zXX9Alf~>SpB;Q&1hNK8BD94H_K~My?`1EsK|0%4|Qn9zs(snSIy+}Z+gqlBwl3&ba8Lg)pOV+cAE z7&7k)ej6Oss@p@&G(y z6`qqFy!qciMk%t!l*xj6*s+!6;0nb8ZIuixXB#Z|Z=#QevZ_*0CaC;5ghJ9akf+VH_eb za1DBFfRGej8(?uAu6}{Y)A}A_af~a}u9QpdvFM#>#ZYn+bh{L~Wn($LLx1j!Yh*e1 zg8s%gVOEw2s{Ul#vRYtv-{ zV|vcc)byNm6eNf{>9HNr&4|0s)kBNnnZ{k=rlc9w(kT#?Zsn9JcJUu110f17JBzg= zX;n%=)t@tFKVQ^L^&3&TJ*vy?KHoO{bFZc>cl!e4$il2VEY{gubnMkZ@M?Jx#s(n-aF9g%8nIfc zmZP=PdT9mP5N(RKP+O%vuf3wZqg4)THG;b^Jl-CcG2F~xuyF{wPQm* zPd3&({vV&E7>(-a)La6jd1>fZO!jb@L06iXZBx(9o2s z*fH6F$H0Ezr~Zup$rC`vNSAlhY0w(9F`)-^^)0rQ!HT3hwki$Qs@8^|tyRSc5>c&N zkhz!*Kt~t%%hLI7`CU?j;nmL$igce=T3x)~)?dAvIY#T`TQIkG?^2S)Z7aJ53w9bT znGx(gg8{f0p$B+Pv7T6=)fiP3$->IL9z5Inr!hI~rUk%}!v)dQF(!MA6)?nWGeSGm zUTZ40#;Z;Aq5o!&54Z6JJvP1y;l&)sQEh_^Ja}lO(>^ayE<&_u$%dM zlc|X9MLluel*tnfE1#e3W^_6rLcB&;5DPP#IcMZLS<#Z5ECBNQ^Eupz1QQpL*^q(s zDw%8r->a&ceM7s|Zhh%DU9GH(&mdb%FHJmF6;#?8+P~Ru?Nx;BoEV3@Dss$Nd7trm z$ggYn`TCY@!Nhn5g0;05@N2Bn(aHKGcFb3Zjg5}v<<42`FQ3p;Ve)4sR48d&Izy~9 z2O{~iS}0b`Qd@>f^+vGTBqI4!H>(i*hvRJ!U9z z(h!4U06}&Qps@jhWE76XhW_p8@dluHgvFX%;DbY{;5JHB$gYv4pfW2i41v0=@lESy zCi+t1;Y>VIilS2=pgIvcf7d~!s_)Ixug{B!lD~!j{CTs)*Q`uA^O^bc!w;(>`rJol zYQNCiM?NcE_w%u1KdM@P^*rEAJM0TMSA~2P?XizBuG(-8BS=o9vj5^RRK>>(wW5k0 z$;1a?V}g8zQqAB&)Q~PWJ{iSE<8#%i$Ij^LFJI+f_(NA8d_$2 zARts>^n`*UFU;dEse6)xCNtYonPisAIddAB?Rn{_{R|bJy?RKnrV3T+>G9(`4B9{W zr7t>6o@h=HEtfCUMxCB}QuyZ;iq_`To^9s7F~9zdkH?vp&(xa#+Jd${^&3UZD=n7& zHp@KoTlJ&nPq#5;)kdbw4>*k)&__}{(JEm)#kK-6WwAxyGE%wBUb;wNvgGC^2+Ts@ zo+tPQLW_%VbTLr;dc0$nLi1dywBxYE4)bAcxY@Vk%YEPb_?6917QM9p)>BvMzP^ZW zRT^Af{L;D?^`#5fENN3Gbb-#sj<-ogk4Mc@vAW{uh-40Zn24m-st9)RI3Z;4Coy$cQ;b2(ph5p#NX{|)^?CYkdB2k%?hG%p8X_BsO>`sD+kzk7BW>sTi=#6D_rY%!(`$M7#{Ej_V0nW`Z zgsfEt6KjIC$1u!e<J?F|AW;c4`h@G15)564#tiUwEr zE`G|qAgK#iEh3qx+>`%^nR6OJ?8`xw!bXdf?J@wc}R@(rJH@s zyMc!dksuSoN|TV^EId8W!t~Ivq>?alV{|1(?;wNy#;&4?B7m~LG=f?^M?!Z&ob;La zh&GLcXmYFoXUWolJSFm($}*T_{Lo%qtS>R+yQ_Y)WjC>@NG}pwuQOYyf$oT{Ji`Ba zs_kHLs>%Q0OU2&$z~6oVH*!75NLii=v|)Ja)YXU7>1JyhnNehkoQNEuszxA_^Wo#T zc?&6(9(G^7E??c~6XfPBViW)HT(KPzMs{yEF_@yYkq5Rd{XqY9$B~am4FCK4qody( zseig|*BdXsQM7i)F73`q^Old8ziY$tLG#mc&oAF`%hUHwUbAqch+N7fy`+h?7|*#_H!Dh9_z-_@-K?@hCzNmJW({K;jwBf#?GY7ZaWM)v zYgA4YZdTl-o|_d+HSA`U(qkS=jLyyK+e)I7IZ^DR`_-HxZ&oQK>X4w!j@HeJN*$04 zeKWA;EH#2Eb%;aSqg<(jY)~X6P#j`ktG)|ep3#=X7#6E(@5PAl^Xd_Sof?sY2y9xt zOZ)hK*ljCiUzP)%wQDD7?JWO=EqsA@-N3yOxQj|~7o|alL4F~KTjE}rt<&kt7m-A_ zii}@&!@x;3bZrU+gUnY-&mcB;_Nn3PR_;7xe)-dyW#3Ob4C_8* z^Ri$3o3WE*aNNm8n!FU#+*rjhVh)oWY$+#PB#eoo#?lj!5MI?|_8}d`EsbE*PGChI z;!m0*A%Pd#Ml=@4VaaTU61(MsTK$_XGn$EDZzVapnmKRF8a1=ZiYbMwOGck6nI?kU%TlS80RYzo`KQphTf4Y9yul{5?! zJrP*>VV+*YjIBWYRBs47uEQ|W zwy~R!!g0|0Q52Al!VlXCTZ6qQAHn-5js?h3Leg<;k}Z+_i$C-z`i#f$`Hd zNE?-`25YRFz$|5XWYs|+N8DQBLTO*!l}c5va@*Lq4O!N?%5=lmEDz9u7KaM+a=lzZ z#YXio?%~|_s*ek(Kvt;9${^^}bHjoqx`qmBAOZ7$>)FFs3^!bY`mARMGN{WuSqf8- z=AINsmCEbl1GxI>c2I*T@0wTzUD)jy8Gqx$D<`ipe>6`IJvqx~oEPzzN8Mw-^3wL_ z4?Qt$(%Mk3ZR_SO5$l&NDN1bKLi7{Y#jf}jJ-9A?5NBR6_olBAOZD$j0`Ky-ZT6by zdS$6S517Ap>MW9tPVavG&1u}}w#O_>oWijN#b?R{^EA%5vAIhl-82@RGc`+MqDH)6 zWMSdCVL}qKI9myI6b(gi@HrTnYxn|BqYs&4Y!1N0Z-?kE%hRj=BS=@0yd9{ERn~@F z_Y|-44kI#Lt_x$gVXJfw*DF<*Z_W|ThWT*WP8vl?%&bZRw>0B8Qa9|MC7*}M-PK^T z@mYMA02k&`4&$>n@)?Ph__jjb3zr1Q6p={zmn?uIv@RpBG3s2C1P*gKjI>e+U;JYJ z;?=#8Wx8~C{tYLtf*9V%cj1D+_mD)YlD;FZ`k z5hgS+1H$1Ne(5PijdeGDfSC%Li^FVP+jLloy;iOTq2uLkT&j|Y-XS$0)zm~b!x$rm zvl)sJ4Ql6%gmGyHRMD{vs%XfMoL0ywhF-9tKq8b&*H~;+m*0Tp+chGK*A=ht3pUfKJl zPwW19qDcAUc6HVA3A5C~KW3OEU)^=j$OFrjpN;DGn7E{h;Se?h-NT@K>CDPoc5BHQ3n-a zMN`=}UTtt*M2$N$>x(jN+5<=C(56IS&zHW^-Jkmk&2N5vblsKN!jJvTe19Z1R5DXU zen1-{JI~Ls^GN?hvd2FWwh#BZ@hsIrjA~bll9oXWt2N6Wx_m-d=^jc4E8U}Yq13Q)X<>J^q?E9Sno?eqZI7Yo zj(W<*FzXw4g0ZQaH$wy+sLgRKD99O0@sDu5i=6h+cFunRvi>2QA`jKof5>a=3PTk3 z=*peX20uV%mWD19AqcjP6`D8k31agfs<$*$+g(od39p&w1Yp8sxko3<0 z5pk8+X7&w=wPt~Tj1?r(&;RMC!4KY7Jz*m1I{g`;mp*_fkz+G;@r-`09VP;ttq0rC z?SM{(QfNe3U7?9Tb1g+1IyTN48If#3&H!{Wki#68k(LpjE)0bAFl&Y7gba4-;x!e8 z<_MUnIjQYZd!-hn5-?K%Ojnm8+j1)TSBl}=s^P!}ID#JE5D=1BXS51N5syttA`D@7 zR=WDB*(!GbriTVS@W8&a@%#4d*<0!Cfj*Om4&1gcTD(qeOvK*TPoas)Pv`WN`h~yI zzU2K=`byM*ht?i!jcP`A4fxIfp$2@IbeD}7sB9ZlnRt_Fzo}zIN3p1ohBs*>5CrVH zH6U;mZB5WE6F~H+2H;m7Q3~kg0>VhoOd~##m1g70|Fsl6TtKiIaw+)i&`)ZW(9VC9 zg8$S``4p{nagHj%H&|v@f^SHb;7fOUl0m_>>p|j82A4~Qyfg>rN9%EtWx|+(E$RNZ zJt303Jt2lfPl=}F_^5yF4H3pdNENiu!f~1;p~F{GJr147)e+_kvNgnp;&)HJU_L2& zm@kMSD|T#NhIV?@&96mueR#gQ0 z{1XLhbDudR8eGZvRWy8i+u|MOpBL(U zYF+}oX^p!qc;97c65blsE95q>#P%4fHoR@N$MEKj@D0Jy|41Ds1+yHmT|$KrC>IP+ zXJoUmQBhqly_wqlz=Q)An;+dW^OeT^%^$ZN;FlLsEb#*jGP9YF7sA<8WVhG-}EF8u<*BEZr__Q_fB239$j1c!?P{n-4=Pm38Bri$ukQm3DvZhm>1FdqG$OR!SH_(#fNJb^z9TUg?@&w_E^uD|Bu zzQ!T>{{!47c9_Bz$baJgq=U`$2GPy-%y{*O{A1hZ9B9zs)!Ca)Fz(;iC$z`^@u53M z+ql1Ah8Y+-QB)@Q55%shsvPa=K@VQpAy8rP=Z)CAVhpo)^$!e-VRv8nIeE$1Eh2|L zKR78hJ6{IMvwvMh<+yP#xA0%Bw>&WJ!1rqNBin&uIR_pEiq$R?S3mr~p(|Nxm)q|a z8Gi&nH!l;0&7Nm|M?2~ZO4)-QRRu;pU_?rcLN<^c+rjI$H{oa@wIW#ysg<)cr&haK zxYIo50f_0YdC^FgBOxug0l}nq$V>=a>qwX&ArM%nL+Q}yhKDSuUOny1WNqBL6Zc#w zJw4>mi2f_O*P8X?s!tNs-`+@?`Q7|p%l@AC>s!5gOgS^L&20#8 z{o9TG)Wq$Dx_`1GuJBMyA=+aA&V?G|r|8;oDi9e;PTd2-)1`^`7Ei9*6c ztlJ-fb;}x)KAEQl4J53_q`iJy10ikC4d0?bg|Hq{iE7xAsXc>A5~N&onqDQ(AF;%| zw0^Dm=dz_Da@~3n{ggiI*JVq7nyt?IRW$l#mb(9hxoh7Zas7!_C&cx8_nW(qi~XYM zwoT@#J=eX2n`oE;;qHgbijRRV zNpz-%Ndy9j?_93=N6~KcqxDaT${RlyHLK~hFCSa-$GoMY(v~^DH!?el-&b}Y^s2b| zWY$s9?WK=j+wtON^Uaqt51NOKzHP*2gq+feROS;&gdGtTEwZvn_JhW5^944g+b3dc z>=cCTk~tai)4hT{EPY6t2m7)RDa}^}B`yAOD4U-W4YSSH?|MX@OqA#(B9{w&-p^0b z(aiWwH2!sly8n#1p|4q%AtD>n0bPAU+;CvOX`JvK6#3h>n{VxDv)_E@x$WZW1GF2; z4>=3@E*hF{XCqctyNIO>Hc1~W+S$9Yx!ixQD&=GIr4OQadegdOy;SRF9~D#fi6+~& znkV;DP|+5VRHQv){p;391%2$P$uGV=@J=&At5iq)*?sZN z3!gk%IP{f=UMRe4>uqK?f^)37PWue&u7-@IXlu2VqftA3tx-&J=A<@DkAYEf5<0qO#EtbY&saK8`SaQbkwq(q2Hc2OGlU-j$8 zxJj6A9{2VBi06w7M||$(^dQDO>feQD!kpqhlTVMHnP5Hh8uSRC#&dn*oy%61c&^@< zYc{X{ERU%spT|x&nhU|5u0EGt;YFL2K^o7 zGU%<$GyaZEGPYjIay_f^B-eW^;IR6@Hy062iC&PRkw;G+Zkb0<7>|bR@I3~#PmUbX zOP|(mxW06kmef9v;|1&b2A6F1W#0k3y4PH-{o$LBd-qPGx^?fO|0oH%w%@=*P;feP z)frBm=igwQ_1FQxH$9H%Dv6vrU%NUbU_;q(Qs=8k)254Pke!0dZ&rT`wd~&I(5Qpo zPWxfWx#z1d`|OwyZ*L#5yjeSRcRiwqp1ZkSneyR^lE;QO9xRgH+y8A-y(3_YtdziL z*oP9ai>*eo)R~egCq*7zm<#dW{aiM!Q#_F#z4J zP(hEX>6LsS8k_H;+*F)ZAt??8_4Ls1ak0KSv0QBm=i1HOt^LM)xsj8TPyOt0u8i%# zGw->UHwF9_da|85tn^83v+vd`1N>_c+YVbec+eNVwMs4Y6S>t8vY!YdjWYq~s&a0} zPmLz>F0vXCRXKrz(T0BW$UAiNx&}t@B7{ljagk|u?t^0@8Z42Tpk?Q$Bqu;rz-0wt zh?0<##oO~g8moW)*qFn^M;sgb*^k=H-&W3<7vJKx?MuF_ck0mKXYaXVv-#0VQFGVe z(Q_w%J!`@5v(3-VU(7Sd%oCfh$*rELR(@_#+mNU<@#6`jkB=%Vlhvou_9dV^qkv1< z?^WwP`F@ojd@b>QKL5ScoGU8heHOjPx7O{70?!H?h11wtb`g2tWWg*jVmxwISSChT zzC$`Jap^?zt`XO$k-||BsHp4-4NgHwi<99G@+Wl!yc?ESL`SgQBtzx}qzJBJ1vrYS z1;aM(*kg1P?Q@s+UA0Kf6UNSmxA!pjz5UsH`(_O4o40Dw^x0}N(f!(P&mTbQ(B-qo z``v54u<_|_`&(jnZIEN1pzZ<;;<0Cy`v3Y)K}LxM{mn7rB>f>^HP)g(o4qpj*;Hou zxU?J9f+_HUpq}@=;zO;;&wW4Rhp`YJ89DTMEJ`)1!@Q zb;oM+^A}#;ZJu2()MKHC#r4Af>^c#(ObyNa|L2|s@~0H-3~W<1l#zyF+0QJx=Oeb2 zZNA9JicH+b#%d#ni^|eVjVc@$1U&Yz2-VMF=Qv9@LJQ|i4juG}<_sh&!6gOPn}gb9 zPeqRhb+EZK@9jy?Z9%K5`OD|ORaf7(O&5dx!fZ2n@sT$|ZPnMF+w?|ZsJmb2$Buy_ zp(^+mG0yfegs1wXBc{;W?MoQpl^i~X@Je^Z6qOA@93em8>mGu%e9%t(gY-h@YGeP_ z%`ZjG&`-X8p`ZTNdX?_bdg|0BHUvGA~_1%ZVM`Z*9~rGQIc6LE4ccXrME|JezMmtDAF2JQA5(Y4RK~M;ABc zi@GG~r32O*f(^kVGa+Y`Cd4BX+a1mZF?eB{qVM0@0?|N~q!~|3Tx1l-{9{+cO?J*`- z?n$&3H{00i7)H{q6_g)6N|+dpGk|hdCu|JuNzPa(s`FI>Q;gUL=TntQj-H z##D303|7wLsn$6;GiIMfnHk>qUhHWlLmsV#i2}t9?h4ojLgy53&0c==C^Z42u_y4D zDq&-2PjbdWk?qdN0U$JE_-HyOIeM^i8KbTBI?qoz%b^_>b*%}eVSF22?ir}(O{F+Vyp7AntIFk?>G z=(nBG>j9q_YsSW5V~$v30?J@it+96Ptgz`>lmX&X;vEGNof+4PEIc1P1#4__wm8o_ zs)HOwJVp7lY!zU3m)S|%?(2!qQ6PV041yY>tuK#;o$A zM~Ouk4LHHsXJe=wLvWHa7AhNDI5{(BSul{JiPzC+z+hCF4FhLv{jy;fiFRTE;t0~t0`+@c<`@hGS zn|Mqo<()Fq-Vxs{v?H5Wlpjs-H)%%PEA|=5F|;Q+V;KCM88gG4PivH;*DD+48Zo1N zqH@N=))+b?)84f+U%j&k#AH0(%os(Kcbl~%SW4_2IcJ(=J-__uQKAT=u_Gk+C5Mfn z9myFB6{CU~tA>pxs*_;8*f+T3bElknRx3*p4I<}ZJ_8Lb-5lk64bp59ykTREs+=QRT$SWP zN#>3rjHFsNhr|Hq=nc!4wybW443Y)JlS%;r6FL{FC8sFdlO_etIUHLe!olc6DDGSs z%oZ3?G7N2gk(r1--80nmq1X3skr&szbI0C0SBLV~wo=p0lj<6?*k635ci#t_6=XGO z)b;v@7m8=i9{%Fe7TPS*vFov`+B# zFRtg!TO_6PDhCJzu&bSS(89B%1%qln*a2ePqzMtAD6U1u3l~rnKoF1cKC)T-t#yJy&xTE{fd*+cG{scJDMwVzDRuG$vX%6aGplJgXb#0n%Nn_I~l>Hd*37AnNitoz4trl*C?Eu6X6h>t6n z+rC@m+}oVF*NDCq%x$kkuDg{pcM;-VZX-&9tY(jqGk)pJSfs25CSnZsZ?BQ0$eqC~ zjH$;kDpF2Js)ck?)7r;)z#5?_s0P~wyaw@a+B5$7I0O1_Tjm_~`MX1vwa!^Q=}5$~9mfTknzcyz9)f8h4;(&12sVay`V$ zValQV92W?Um4#GcB_67>lN&}ol?E42kzs-Y}3;yv*;9Jfc}A<-?% ziZ&)0aR28=}>og9@rU4vOMibBCY?Fn@Z zD@H+n59$gTPL28W8UAT!LRnh-RxaT^8;a6KmmX9JE)PGRI%6haM+>)z^HU zBN7@w&VS5^l=%yYNN8yBE9YvWeb)uQs%!7tF^c8Lpo1K6rJQy-*qdvJCZm_@?Y6=b zjOrYWTU^)MrjSB%8+y2rpWEI z!|uwDy!-(1Ac?m`I}+cDly4opwY5-*WnVd1R;287@Ybe$NEN>0LE=Hk$_Jk+M4;(E zwKN;cIktkO!0vLiS7LQSUu>ye&YkVdy&C+@<`eew<%}mWM$SmI#e4#ipRG^Gd5D+E zHLelASFpwg7RQh?5-*c85^Xtr(plrx*67V4LL|d9MA*a}q$jUwd`rpEO zwba_zmrayh%@@(*ad>1*PSivZziI`|XH(=o~o~wP&(8WCb+zCAYShGO+ou7;E(&uGg@aMo= zcRb=T){2?_R!W={25rMF%jbJ>{x~i`k)JNsDnI$>;{)g%{P(b#0Od8}aA+!^Pv3)E zLw=7wS1yM(;d7#xFPH|T-Ds5B1keZW!fs^W+Ds=bIZ0h`lvpVxCs3ZP=Mbd7;2mQg z-tjpH()(C<$9MVj>+K!mxx_8ybBn}Hz+>yab#7<-zLzT?*+s6PNTKeflJ;#%{fabJ zhOPCavYsrLNIO<6zAJ51Ljm6c`YvQ6TkersB2lo^BuOrbpfNaiTYi-D5bu=ptXBSZ zc&9C6$$5x(%6S~#>Cs5#JU2V@Y(TQy&14HEU_REnEcb)P;O{eJp&vEKd*5v+ZJsaeB}3>0ur|rTh7m9xw~k zg?xJWF5~Md{#-tnPES6!Nclu^Aw1WX6W8LoPx|T1=(z!`qYreJr)Z zXThsK1xNtuD1>TTw;qDjK8aV~*BaALt{ysey|8&2;Yo6yLgj0hgV@wlZbs6`X~uw3 z_=uz7v%QY^hch#*+4nI&#LR4YI>MHxhs>_pB!&y-;Lm%MmEt_^1ROo%LC4b>UJrpE zc*f)NDE?eRfaG?$@*?F=;FLuL&dTlEO~Qg8Dpy`Ki6II|*f(uHo)6y-Ml`q1@ezJb z7S6G?e*iweRer8);?MKV9^Ub=*6(1RoMrY<3*7O_IOTi(9INy#3f7kMp1et6d$ln_T2$V_{L=ohUU>n&SImz+ z+Eyo?hi_6j&rnfQ-lUkv=KFG<{mwi?l}(5N zDyuEH+ZB-vUlK=&Ahp4b1}hFLe*|>{-RXnnC2lHgiuij@CX4s2oH@jmv8QzE{FV8K z(0><;e}h#dbN$Dz+R<-RjL|G+?ZR0w3OSOw1UXoSB~<` zjn`guH~3PMJqvd1Knm>g#m^k7p6}=kLl>>@_rN=^t9wJ&Zr`zZf%m(bsA?C_5 zP%Ea5Lba01!B|43GqNpuxLf?iEc4$kM~jDX{ubA8#V));Bneowr%2jd^-^D0__D|$%JQQc}>o^Mm$x)jP@-jXM7gxl{2nE zE~>LTCo{kv&2zJaBIhPv=SV2dYHbNc&i#!wH*UKL%qOtc80(h8vjX4p?x)H9Xqi|m z_5L2sJnn27*jo`_*!e8nPt0tXMzvlNr>|#xTtl+B>VK85McZM z>{~X(7v=vBqvzUCEDPDA9Se99Id>VjJau|iv&73ZT6|VEx$Iu$YGvm;)jzKeo&EXh zV%YB3>Z#Rps%!m?&+*PEs}7q*Ed92Sek;HW>jD2S=dwGpVO?+G#L%YVk@o-ehLTj&Wtt;c(k8jK%)VJ8yy%pV_nZXs@8}qyxK!@wPjP>xmnw!)%q=J zpc!9wM#E3mp3fB8u%(NY{fH4?p|L@hkns# zIfnKmXDmcqo&$epMq6{?(Y!`EdcCq+t`RfZ8ju`AXC%iAR%W{Uc4n-5w)iTEgWScC z_w=^4r=Q#vusM+SWXoFRM~@O@JH?(@Mv`^|IfnKmXDn1+t6)a^?%~mVPIB~MWr@39 z=lQN*t2St$l-GNT*E>qwD^~y=*2a8Es~=zm#7_ds&{0_yHHVM*$r-WwzBDhrLno~X z%P{r+O~&kFjOuI~Msu@pe-(j-gcOFWEu@6`t85D~MYnr`oZzpDKZ!mlmTL;JsouK8 z)g6CTdCM<5tTbxC4)y-D>dGlE&XWDuOJyr|Dq-l#Dhm(|g^YsIGV04t{Du0JGYr9B z_(rxcGuri_$T4(^a!eRzI^oJT*70cnQD^iTF~L1^XSA(d%ehr&bP+Iw;g9FrGZH;k z3eXt3!Eg_c;}P&*)Uaqraw9rr$&H4N;Zyc#FmeQ)vK+Dc0iFXR?0Z6vpmoy-va)n> z*X`kHz-&mbTOqwtr}7%glmGM<*tqaN_7?0+MbI4eFt4%d|2tO!H#u+O;>)w4ah`_f z4yrsdhkKtpcMZW`LZ(PrB+m%Yv+o1$QqCOtAVaSZRw##iIj3%0xOudnPD74fjo20Y z)NL=n97E?J$E*>LS1_Zk)jtj`8C}xlXts7pt03V{LtfXb*1Ar+v#`WRhh^=etQa>% z4s%s`Q>-uRBe|-_61x#&s`&}mIy2bbdvqrU6%&QRiUZs&6vN$JvZmza z+*<)FbQ#C!*YG^DOx9t`!5Z+>JDC?8;U|vDuw^OhCI!|PXy^=%Z(;<0GlRcLwBvlv zw$6NCRom8SpFYbuVI#?ADIO`kC~?f!jGry<+)?5*3^6KBKHw&88WZqOMTGhqzxCV^oozf066zgwitlB@98;ci6D z$zwb}d=SjF$GPXt`X8NlwzV%gny^ETE>wtbS=i`|Wbc6ya+ms&53O-v9a01`(4Pq z(221EDIbt*F6D#u$`MJOkT`6cwH!m|EXNFmm7LGnV*!$5i2KMftCekX4dv$vkkl^6 ztQD;QGid>;>d5vy6JvuMwLw&JM!`-*vOVsKLUS&6hptNjm&{g-e>jQLJl<2b+MvLLH)JCp=_p)O*KI02;XdJB0FO1v^LCj2er|CC=N2fK z7#ZGf8t1@$pqbm8PHqW|7UGMeJK??V+`HgQ0izL2QHah=;?5x=VbAczi_S z*HPlf)7p@}V-WABiMF`~+QMJb+7aK4NfY__JzVyFU-Ah_{E6{=M!9I!nfK0<_|M|$ z2e^2Ds=vqElXeZI3`U?2V_Vo8*dkD|iH}65RYOb3Ua6+pd4~ow0I3_g<}_C~a)%Gv zA#&X&dCeXP?xX4C{uSIGD%U3^@2{5Y4sso(mTly^WAgqIxn}Jy$Um)tTq9J)-{)4G z(%cFX*RrmHu0GAJ&&2Ns<$(sdK8E)@-FTYQjdShFKT)pHUUAJzhJ8k^PmpWl#`km! zRwxhL=RfVhmi+!o8$pQ=%C4E zA~!N5J`aee32~K-?TcNSU#F(~jI^`nsh4E`&Z$I|%_a?--#U1NZvwVWrb4xkhrZU% zU=be^)jkQ>*m=EkqlNpNf%9}=JNN%rZ0zR)yv!fRtsj*eoi~5`_g>-farYEI^~T=& zbBUg}$GiOU2L@d~bll)K7v8w=p0`&`ec+)9clWvOgW>NFyy43+pDg;w(arvx;J@vO zv^1Jy*V8)*ow?TFJDobs`z3k3M6eBKp_Om$d%Ti7{MPo6(t@`HPuNN6P`cKyxu zg4_Mlco`DCAXp7@>z~w`T1^-zs~XH+6B65rPGFb56s%nJ(79DBFe2Z%HK2qZ5YEfW zmD@=atX%c*UV;Kr=elm3N!ZrxpZD#0PtZ?!f1(fWpX2SCHBna!(j->Ef_&Ua9+YvY zS42LkI$c-BDqUfar`s_flyay?4%O1TQX<(qR|&L?jQr`XNKZO2*+cDN9V~UW@p8Cxy93xr#%L$5@ z2tRtpX+2b*c$yu-evG;~$vNa9u~~K!d@hiB)786Pca={517owyBq&CGm8Wg>kFWylIY=`W4-%xDbX6p03WUT&|G_dXo!S;HbJ$WA2}AA--4 zesHXhy;68op`#Tq&ztCfO#F?pzGl3%%Z_+_TR)%pXGou7%SrlGlK$#gpHzD+;`>Ux z^aH^M{eb7&$F4S$1s~{wx!!+VuMaIvm+|i>sqX}KFC|x4llW;G?>Eii9eahMx5rZt zWTc7rvZQpFNWK5NT-hecyO^zj+yBWPg*pWJI9?Lu^Pj9~0~;5|OU~fEj0^wPPL7#O zTB%_00l}E82g?{RR<47d@_)WJ{x$Y!=A=2zhbtA5wyN;zCMZp0XGfVy+qHy8I=B!t z4;I8jolp|ju2xl+Z%N6!%0@G2XNR+(orii8tN3rSoewI?YZLI(przeBAZY2K-Wdm& z2UMlUv!uN;-Pw#n*HW82_L0T;yJ!?$ZMqcYbr15t(cf;yyMCsicUSt{eTmc}OuIgw zQB;>@37#JCjd#c~;2Srqr-GfkaLz;;$w%e{K|VvhmQ`3t z@~yhb9YaB$4ht?%N_j(ac9Y~pRjGqrg@4~}Hkb|lUAwrXl<75!w|~Uebad%8mTS46 z=0i{1cP-#qcz(PEWR=UcK>MP+qXL}5mD!cBj`Te5>ULw(MC#<8gevNLgw(I6Hv<#l zAa}LXyEu_v_9<1T)=|h}i)4lt3v$0YY4exd<#Bis##X`T?Ie9^-?fta&1y@~zDW9s zkun&w-F`ARX0tLlRCbf4$QZ$V!O?h-%TTqTs&&Pofh!|Al(_aJ$nkGm<;iTs?F$QX zpM>RhQi4hDv|%5C+xsP)7rQ`4_JoWvNqr7yPnCEajWd&u>mt5_#)k@RZir)eM^*mG z31(I4*%V~%mznpT0K+*++LZq0ardc#Pw8Fqx zSv7fQnmr~+FJsYU@(IR}DfTVz`ncqskS%1~NV|?S0f(M~tagM;^Cuh2TN3$rGub_Q zYNC~su4(Ed_YIOKYolEfd6IrPv#&T+Bux%GC3|Tw)>Y*{Lw$FE{4Dukv@qZ@{ilAOS{X?I@%Gs7GE9Er?h`UG7)~}`hG%! z7OIfld$g=P^^s7uP)FjaHksGQr z`Vl@t{La{xf(|^DQT9*%Dj_>=E=v=wmDnIwijc+iIys1^g8myKl|t11K(JG&O4Dh$ou1Dxu=90 zuqP*8l4Q9PyO$(yq57cQQ|uV1e*bbOQU`fAN#^bRLJdfyPUhV{K9U9H{*Kf^-tVxl zG&7MpiIYU?cVcCsPtrm`-qLr`x;XwypB`(c1-VH4gVLuzV@$>(h4|wVJV4UFhnzf1 zYb(z8r7q z3T8KPj3sx>C-&N~258?F-TW)@)NfSj0Fz!F61#Qx&%1}$MC)3WMIcd(~lDwt;*=q$|(9ZU4>v$8nNPN)FhcN!R zm3YygOZ)^GGh~h|ba8o*K2*aWL_SUyo|yhxkY3vS4e#{;1`fBBPJX zuM_xZ=Zi9j;U%F_;6*ms4sNklmPZn1Nurr>J9ly#IfDupG}ZFGr>3dC8S`x&=ddxq zt{nJosoRl(CrLgaTlEnU_Z^zUQrB?Z*Lma{6?KmeK7rtz(&JsyedAHAm)u7WZ2t+l z$IKr!r?7A?A3uma;oY7)Vee%#CXb!#K8^D3XCd!*|AT=;ydyn}g_d{N@Eg6Sa5=fR zC>*Q2Bltkd@3hV+zms4g@DI|~Tjx!H52vfsp_#$Rp7~jaP`4a{VBh!R*nQ5&D!L$6 zXPs8sgnj2pa4PD}&wHmWj6?^bz8pG*2w?LnTIlE|l;_8?C$kod1i|E82@Ly(X8MB;BJ z|LKzdo_KkXQ_0_@cl%)4s6_g+lIicSmi`Kf|AO=fOZq(WN%QhfbGf+M=1OW-5M6A0 z7h69zA#J{-{fSs`7FsEJGzVvUB{dpViLWE^HDfuUK~7T!&kArn$$y%B>clRyJ)BhL zof5=*8^yxJ=_H+vb(-o$yk^`{7AX)3qq({zzhSW3y7B;DmXau-?DQFy&9 zafr%?kgNQgC-@L3R-|52Hbd_fi=l!F~5q03?M83V3jwk%UTdIdETyYYt zZ;6fd?p?L}*P__PufCe=jpFi_MTI}kxA(_hFh9(ivBI`tg0!yc>0$ zeLHoXTyOU=u~R99j|SbY2Nw<0z4^6LzH6KuELZTdCQ3HRY3ynM?EQDd$oi#JLX~JAbo$ya87{-SA|Or>64tx!bqrdPl_8 z?9fBc+INr6KTChT?>O5h*J~I1F*i0U zdg<$AyP+fa#(GsN=clKO3-fm?-O{+;@Fl@qr`3(g+|8hc41t|w(Z$>5SJyA4U*V9GA*_R z&lqkVNE^DR6#GluQ`+C}DOdNzQ|?{0gb&IX!8=;{rNTA0m@UEwWsD$~n8cGl?HozZ z$~O{7cIXO;|CD^rm-IV>csoeq4<$ZL(u;cpbCMFtteT#M!z_Q~PH6()>)h<+@`!WYv}d9eR?#c_0=u zxh7T-+2^0_?acJ{oVL&3s5^!B{ixf8a!s$j(;Ya93f5>T*}(kFl#(SC2d*&Hq!wA= zOGqsu!pJAIvhzYXp{w@AR98e1Q*aySzEu)0VdG<5Ax+KL@3}fwu_tz0ckle%W4!aa z$3~Q=#V+$ET1vim>Z`Asi}z~BL*jdqDC5w4n^MMV2&;z5YLZpLWnO;WS^@pnt=4-T zmt)9D$F53xEMaZt()3Gw{1FINrNm>(y?v+08pRr%>h1eI8f(?VTkWmx5o=YVSM2Mk zKi_w{UXiOO@4H&Rx$hEJZghrD!l2y4sEsC6 zck0&n+`dz;oy2{<(EE|DA7B^!Y3zF9Z`8{|@0xUVmiLl>gHqRCdx}fV>X22k(!^vQW)k`pCX zWJLB6eF5d?tvys>)to+Qb)VRm6zJW zulG!~SA*&O*JfCIi2FTeA1^vXmp?i~N;B0yQI&sES6I79K1u`5nAx*GZ9D1F7E1d5 z#2!GW8t9SyL8O`~`3HK!sis3!{z9g%{GlR5J*QLkk0AX$vQv3nkiRakTBDQnjz1^U z2fMY?Poq5D;^kRTrL#@yCD1z^UZvNnEj!1MYvSckuIeT=6X><#dk9!N#50b=58Ol2 z-&a-sB>q{^bf2-I{JRimpO*al1?kP_v~C zq@60A`Ky9|*S?N5xb_-c)xJq)n_Q9gVSILxb)K{JuM{ZAD8r_(7CuZ&$t&y@_APJn)Bn7k{(-}0b+|Y z3LBl2^u%8&@h*S2-?RY<4E6U4^k7<4wyY9j7Yi1-OY zCv9S7sUC&M|0jt*jCxHHFF)O-%2ddP3GO(~qbLHe3 zjRtmm?)qQJYb=zx4#s=>g85FaS0wJ+_HzA&Tz^Y>J-KEa3i1;x(KKfz8eE4?l>3Y1 zS}ZED6HId!mGSo%$o)VU(~0*v3&1pI0m%K9T$e`{D1ut`9c61}_8P z>nq8RGT7Eq2JkOsxGGtO1XpdzS7j@mgrPmD)r8?=E^w|7%9XcjwVzP}WVNxkpl!*@mCmdnPT)GK9rkc3P54JQZU!*yr zWR1d!b8&<9(EMp19KKN z=@Kwo>ZGx&iGTBo?-h2-%{8~po%-VH-13hX7T!AIx5CeJM|?gkckSDsem(Q+H{SaA zQ*+h5kB`4~+^3VqUpuZ5FS;bIG;p&& z_q|FKANK0p+`ZeVOhdj8G{L({x7k-{pWOF@?(&D*jWjCO*ZHu416-fqBIRqjGQCTb zM&!3d`y^({(mu(e)vF_)53K${c0Qq5<=?21kuSG2$ZfFT<4=n0y6N7aw%)Z6gQV;p4SFwW;=T9g zdn5(DH?c=?1U+f9eF~mXEN4CGi7e_gCAM_O{zoNNE?x9;>#CE}#AS+ntK?AaQeUjYQ?Zl~E5@pH}hL~e_p zo0NE)avnmWd@!CSjrb4a=jrMc{C)&^vWLjC@$*`$ftMXW&twE_9Y3$F2C|_mH+kjR`bk~!9II%;>^LBE$nza4o ziCejI6ZhQPJMsRY1V=MdI$q-3^-zI;X>RWE046Vqy6>lBEaWMJcC~x`)aW|=J z2~+FUsoGWbJA+7nBRINV@N+9U-at;SltIm0U2o%kuH?PAH;8u)7aR;G&F!4Kw~yfb zHu7*dJQZwTO}gN!`ZFE4e_(95cDaowyCeDMs5|7}iF~T^>O>hvfYltZnp%!qiRnel zoz5KleDvdIum>ig~b-Q!-Mpr@?qG(}7U;f^@c&ZGJHHmMn&gN_#wK^RB)0X|F z?eLk9xFTJ*!|F)h6|eDrR?Zn7Lr7*TL)Tb@h(* zy0gpqBzB9O;hpK-?>+22?mel`)Mx2)bWhz&pQq2)7wF!)kM654)EDWCbwAx-573wB zOZ8=XpuSvRp|8|e>8tfMdXOHhhv*0SUdLGdsD50J(@*hr+voH@^^1Hr_Z9t`enU^t zZ|QgRyZSvnMNiWo>W}p&da9AWcj%}t*A=?b^fecni_FEQpXqM~m`lxNW}vy;Tw$&>SDCBLAT!tu zG1r>w%=P95bC(%q?l$+Bd(D03elyxUU>-CNnK9;JGuAv}9yO1d$ITOFoO#kbWoDZ> zX0BObelqLr+4fv}zU^lR*vst=($-qlJnB8=nVTIYd7q@^<-C^jT3TUx=g!@8&dgbS z)SaD|q~~^9+--4}>~5nvmAbQ|?#$_3^X8g6yByUeJLj#OkzHGN+nUq5*1*owatb?d zsP#tIahZ#|j_W$E^VXcgoJO_hc4<_nMc1)}xjBV(?(90Jb9Zv>UT0@kBztS!#r3Z3 z(x~3BdLz4zYj|wqdX4uq+1WIsX`QAGn%8OGp!vDY?`i&f*B86K*fO)*;+Ah6{Likf z5833(kP~&`q0`*G)~6kA4}b3PXqzQno3-uTb!^Ai+KxJ6Lr!7)q3z%4II82QoWc&@ zckJ!XI*#hxol?EkrBTP%atgc7>DsK@sBWXWHp_Xf<04n@oYy+_?liK~=uVG!dau*$ zPTzG}=P(fbyBx){DgT_sotFfESCZhLNPEJ0Rr_z~EPscc#J@|UE{(`} zS^{zw2Y-iqQtt=dz-{7viB{=U>i)qUch_N`r?(~`r;+>9UhW?+nLFl;?6$Q_BiDNF z&-<6SoR7MbQq%gKm*ljTH;oEnb9#3HhBR0p4AirT)~`wNDQ3pk#}?w(dH% z+u{Uf1Q+1X#k#r)g+)mn2N$1An}X4Q8@C^R|BP>kkt$s7e-0kNWPnG9O8|ViT6Z1m zC`^vypwl@n-r?@3JL!3k)88ELPUG)kubD|)ef}1HdL;a{16;EfT+`_Z&roL~au=41RXY~1SIDp4APWMzR{_)$nSlo7mHssc!Zfdrj3X-XY#0>Nc;v*O8fSXRoum6JFgF zzdPr6=crNMFlR!HVH(QPNKKDLX4|of_h3Y|XG4ua1-V(eOJ?s@Q*MCH} z(?_aDbw}M%J??nBdIIi#j(QRfKTJKPhwEF|bvjbtt)}bI`cX9--u<}x3jRG#Er5qV zr53`+pHYk8<*%x*9sgF#;Nb76m2mMXY89M(npzDv|4{u1NB>x@fvbO_euA^JOBn7x zQ~eBw|4bFZ<^QGD!s)+J>-4w!TeVFW=mHhdKj~~fd7ZpF2;aTRmnK8RqbXhh^Su~56aaZ#)AsAS6AvvwU2S3zlt#)+~8R= z%nb7yn48VbUPCj&jPM$nk!GaV*o_BX6UKvwy=L(L$Gp~X|7X0m<~j4c*U`LS#(O#D z4f7@|X%o#v?`ZS3dE3i1lgxYGF=ndC^Nu(9Cf_^N%rG;((-<%2cs&?1zV^;AOU$?4 z1*X6(_4=3}%^L4wQ)G&~{$`yi_68VMFug0y4%^7P+BUIGyvJ=b+tz!+=GYwXW!u$u z^LFamJ+g`Sp_YR}c1>Pikk?rqIwwKyVy{UGfz1*8- zue4WsAKF27koS=tVuyHn_6B={_pyDS{qOlmAjk4eyJf&Ce~s4_=#uVXAH-OIgaJ{2*<~G<_X|Q;A!Al0Nm&ofR})mfmeaofj5DPz}vvbu|0Yr zM{uRT0Sal~B48b`k@x-rYz9hzEx=bUCapLZ|8g@=XY?t zFSf@}Uh^b0@U*|qJVX3*z(0W(NK3iQ8yw#SJ|x{oq{%04CfBn#eh$pzd;#|sa&HmG zuQ`58d;#!1um&guihvEI-2@Z^+qm9A`ZCf-IhJ$W$+3dtE{>HPcXRxe;~tK`ar~X* z9~}2`+{ZD-(f8L`<@d85N6pc2v>Zbm)3Fn*0n`F&16e>_pgzzLXbwPI_F%wSEFK0N z4zvZ@0quc~Kn~Ca=;m*=M+3(I#{tI!Cjut}r~0M#bl?o27j)c;{<}(b_lwo>eng#! zPIDR8tNc}Xb1SAlucAM%VnnE;hxlvh*Q@B)tLWFObc8Pk>>w`cuQmOFYk?bpC;e6C zP1emO0&fG8h@0UTo4Nj4dkSzG&;#h@ud<|9%_u=0CD_i}m-6;J-k!(XxAXQq-k!&s zm-6O3-kisq^LXo0-nx{xF6FIDdFxW%n#Y@#@}}*)X(?}7%A1z*rlq_Io<-i-suQ;7 z$N4+-)xb5tAYd@?F|YyH1QY{dpcL5Z?=biIJ8W0rD4snR86g{KAe)_04H%>A!Cy+@ zFQxF8Qus?Lyrq;`ZGHGjDg2}q9^&{%Dg2`po>2F1^N^HTbGDgC^ZeqKr+Ev1i^(nm|_qowrGQu=5qeYBK5T1p=+ zrH_`5&gD-o~~ z0V@%(5&g0}(I~0Rs^*5CH=bFc1L)5ik$|0}(I~0Rs^*5CH=bFc1L) z5ik$|0}(I~0Rs^*5CH=bFc1L)5o*o)I`BF0El>b_4-^91SSwBkY5=u>+CUai7pM<3 z1lj@ZfsQ~I>e86;CBk?Rffq;goxoiHJB;DQ5%^;S{uqHjM&NT1_*(=%7J>If;5!le zd4zr*p`SGT=m--cqh!u={6@1CJ(rfBh zc*Fdi-i^Rbz|Fud{!T`c3PzF&xOfE|y8=#J0T-@-3s;!Q{!a5AFcp}|^*mq$un8#k zE8s#EaG?sgPzCaCTf+80H{fXCA>cXSB_JR8ir%)IQltZofM!4ope4`>I2O2=lC%Sk z1jtKw0Qv$00cxYK0ImeC0v-h(2gU(U0j~j+Tu%Vr0u}&^fW^RXl(-)-2zU(O8S@zc zcFd2!Pr%RAgfdymWGNH7)++3wKx?24a0EcPEM>BtfX=}C)aztw9;W7DY96NMVQL;9&S*=)|;4g>o zuR!K1M&>G3U-_HVPyTY`s$yiLVq~LYWTRqaqhe&EVq~LYWTRrngcZmz#mFzk$S%ct z2iH-51@c5OGsW(+T8{4QpkS;087f^lYrJ>Oq$`vJTUJzTcmlD^uKS{6{d z0%}*F7SVSy{Q~-LOZsn1`fp46Z%b-gKurs%X#q7Ypr!@Xw1AoxP|E^pSwJlds9gay zE1)(7)S`gW7f|{FN?kyy3n+B~r7ob<1(dpgQWsF_0!m##sS7A|0i`ZLYW@mczEQ?&mnU$X97s0KI;MPTO>mt<$`lSEB&sM98I9^QLC5+aW`WxX68{yO1`86!<@@ZKQ{b zs3@=#r~q~WyGj2mNBW@p9oPr>^mXkQd6r{ie>L1`BO^x~n!z_S2&VALsM)G1=rDPq(qV$>;O)G1=rDPq(q(sOwaIMH7MUjYkw$Jf9& zz((@_1=tLf09$}NQ|T1K)W^DOtDXylj~WWe-6y!{9BF%!1usP?ym;ckY^#+MI1Mf zW)n~hlyYyIU&P2*#K>60$XLY4Sj5O!#K>60$XLY4Sj1Sinz3v(W7%rPvek@bs~O8y zGnTDp)GT7uEMn9wVq9Cz$XSHUx)zyrEi&s`dmL~)fHaECx|Y#mBcsJeMvIM>cC|eL z_`SUb7z|tsU5sS>DrEdBgp#9BauiCALdj7mHwxvJLAgaxZV{9lg>s`%ZW)vtg>s9a z)(AZ!3rgJzrADFDD3rPYN-cv@OQ6IkR2PNXilDYA)E0%(qEJ{A3X4KvQO3wZ#>hg( z$U?@*LdM8Ks4fcCMWMPVR2PNnqEJ^E)Kvy`l|fx)P*)MuRRncKp{^*@6@|K@P*)V{ zib7pcs4EI}MWL=J)D?xgqEJ^9>WV@^Wl&HV6jTNUl|eyeP*52ZR0IV@p`J1*rwGa^ zgKEm4nkbYKg;I*3lqeKZ1cekaW*3_GfT=(}@iU2=#qo1s9_Qb3EC9X-3V{v8Z32pc zZR~hS2WkMdfZ9M7P#35VGz8iK?SYO!7oeM8MvIrx;$^gW87*E$i5NuwM@L%fWs**k1_t7lOrduviWj%fVtfSS$yNs|5Ngfxb$huM+611o|q0zDl6466mW0`YM6GN}#V2=&J-8 zDuHH7pqUcrr3Bh2fi6m*ixOy}1ez#;CQ6`*66l}=Iw*k-N}z)h=%55TD1i=2po0?V zpaeQ7feuQbgA(YV1P$vq^tuRbSm{sox*i|2gY-X;HoOAZF7nD0z0=>WcLBSZ?Y{_o2`mM+ z`rGXVK!4I@^3+bA+R0Npd15C|?Bt1^Jh77}cJjndp4iC~J9%QKIvCEfOP;!%BQplL z%P#jc++-J=Vi%lZ7aU<1xmA!`1-ZGo&n`H^F3I%`j_(39fq6jUEgLxB1QY}Aji>s% z==rWt1>X3CrMrVM^y@E!GK0 zzY6$?^lPa(^1RM zQtPmHu>XtK6?wdyzX17a8Ty#z-U-NDJvcuHIFEGaL;V-PdHQp2fd37AcL{uV34C`6 ze0K?acZtaBBmHGyF$@;N$VAJKiI(XvfvGjvwYP z1LI-y0ImHb@;V;dkb#yV|16^w!n8sevd=PPpJnjquyOMKyBsI`OW@N>;L}Txg_a=) zEkjqdl9mdiFIqush0Pb_^(D{$z;P+Zm84k>tmj=DxWAF(CXT;wEatdbRrS6VBlK7%^?nl z66Vt4uC>c(?J`<=E-gKm*8PSSTu)1Fr>EX z85o`mhUbFexnS4H1Z7}wE?6rAQ)OU@z2(3>U<0rTD3-CfjM|h@lQL>BmsKieoX}?p z^tluIEP)=&DOs43g`vTn(BKYeu#{4Up}%rUx)gdUp@d;d_&p^ILqny|P6>3g9l8la zH%p^HrR$ zL2FpVdC)^Qs0fe@!Mm#No&Gle&9ln>c(Fc@*)%D&ba6EV{dVx~(0;T8$N_9`PioJmIfb)S1fZhPl zX=;wnpcI`!DLR8vbOxp93`%L4_4+~XqiND(fk%mZ92f^Y1-u5Jf!7m&w}1t}A^@!? zExLgg-9U?OphefyqU-fmDkh4>kaQh-%yIap_G>1Knt%o z9}+i%^UsKz1I#6E0db3fAG!Vs_!)4$GEBM%@!NqNKor;s>;iTJdw}18y+8~*Km};P z0^r<&a|_PVWt7@Of!079;0OR*qRS|?oq*23DgJsWX+4y*9!lCEJ-ZJ_*Sjy|cpZ6O z4^S`k9;NJEYEB1;bIW8U>qC`i$e7QTj{;m@F55If?5T#LwmEc%I{T z>$$%X_yutMEaF#EvnVx-QnM&ED;M77c-3{>BTx1Y9ga*IaDy;>p$>f^4E<-x_kSHn zSV5fQ3TvSApExf9)-tYd@HY#02vbv50O{{H zwXnHP)d6daGRQbQ8*m%qCK2}`*E2Yx=`ddqw}9(Kzz>|SC;dj?7hto$89IdH5FY`y zlV%4H1$F|vfZf0z;CEmz5K~#uVivTR1ubUL0&X;MBS|>mQmPL0wb}N8?)q}PkYhjM zC@(aYMXQ9_V{j}wmJ`76iRjaoalV4{RUFrdZf!HPwHeylqRNqe4bYV_zB|x|algOl z){4Q>FVNI4(9|!`R54g`dNrq0D~6^vgPme%Y73b81)ACnX50!-G4!+9$d# zO_ZpZ5*1UTVoJ0Po&K?eC(;*}aa<*DV{Ml;&LK#EtQqpQZM_Q$WXQVAdVk<*ZD??H%V}vb3<5h;_ zRfgnMhU8VIzhaCZ20RNq54;FR7|-!_-~-?j;7j6`0xLOR4U_^~;Rxi3R8z*N8MPO4 zgySH=lp(>CA;FYkeOk4mP>BRni3C$g$#+pgx2jM{2`ed8N3C5i~wE$ z-T>YOs;@3oBC%8=u~Z_lR3fodB7;>Tu~gbKcwbHUO9S4z9p18C{Q-@1L*h6Q7=RQP zX0Ff&xR867{7G{Z>=lSIqYN}gPFs}F4ka`~Ztb7-S?{m3LUXt`pV6891I!e+9Z(~5 zpmqDl;NwpKPXhmqHYjBcUbH`MJ>9LNJFQQ!W*%i07&T7AlhE#b%XtCdG&{jMc+|Lc z@NKl{f70sw`?cvRjZd&P9aV2Jm#@tTP@CNuQ81o|&La<ddwVBW7iN^V2j#cyd zJaiy==s@z=E9K_%d1{eAm6n)~E+kKVi=H6jPk|SFq;|7ntO4VHZ#fqtA1WA1(MA@Yg zrM2_W!{nid$wLp5haM(RA4ubz&;vZgGY`w z4!j9W1l|TxwabA{ATQ7!GbTCBG1LS#Wy*d2x+#9+ZQ|m^4*7f;@QZN2ZMQ0}K!n%FDAgSh=qS)CRJExyi~mceElON5yu&v z^i65t4pBB+XNnZwjdLU!I7Ac<5p_}|Tp|jWh&o9QN<9nh!r6fHnc5S$7 z1{MPm_B@qiFJH;%yPNAh{;!^vw>0q%a`XsvgFcVrcp@V(d3n8ne!u`mUUW}-IDr01 zqkm#wU8a5vcmjA5cp7*X;NAKK;3eQ?;8oyt;7wp6@HRT0p};f1KLOI2d|(#vIq)q| z0DKP=0%8AGvyJ0+)x@T&Ol(3jZ7rZSkOknm)z$|Z0_}kIKu4ep(8vE3O#KR`ny|Yh z(5OV=|GVJ-NPCP7Zd5C0eZ~O$X;$F%32lngOz*Ev2}Yvo+7#M{@wB=|B`TxQ^^C7I z8HHA(Rawm_vl^|$YP1ro(MqgFE3ul9WHnlW)n+PbGH9jQj7>iSLV!Br(^ z@sSEkr^QGOOQ?T=|F8HHGfA_GC#K_Hw}2;pK+af3Udz$Jx|l7*Y$HuMF`Ff3r=%fg zVs^Oqz*W(Z!pAT3-(g=-eacrs`O4$vD<_xZd0QdRT|`dL^4!T-M4ZbEVE}Wd%kayQ z!LysyO#fT;9eb2!lj9u5^ZC4){UlBw%X`?R<7NlgV-29EKj6Q~xKXLTVn^U2o?YX= z2PH1?&ZW=I_7{<=Hu;}Q4`rVo`*-RP`z^U{A=eUeEg{zuw2`!+q;-3L>XLSo+v`Kx z>7@OMv_FydC({1J?%~?J9jfFzNoCB@w^!41=RseAp1U4p`H(%m_0(4M0};Lxw*y+- z%iLX|O-o~b-yDredw;Fh5kAp{>tlcuDcLFD=v@DE?;_Inr!+0pVg6SNDG%(dS1*I@ znbdR^dcCi>`wd?na5g;KW6J3<735e>Z>gZSY~jfj)c0J`@IlDb2H!^P5piEBhKZ}^H+|^$U zcFI{HvS^9>`JeK(ulX*@EOif_EgtaCQ)B(7)MNfcF!3Qzf5YnZedkvyWB;)+)Ih?=k4Pu zbs_EZ0PQoL_PG~4d_o&d0JHai*;l~qFfbdYt^PsHo&!H0&}MhjW?A6rS*N3+jvqlm zpMmYq!1iZQ&}ZIv{v5DgF1=|P^rI=wH@tBNe03(;UDoB)7sLmxyMcO?P>;>jV+So= zk2-9j+&@yDA1TWU%CefWETk+Y*a+74E|4*1wYq8g0;!HaLMcs6#1-(gx>H?@UU1vUf_XoO;jq&c*-n`FHfYHB-wdX^=GrTHiy1DpYkpSmH-9x)}_EQct#E0vR+MR#GCZ5#|MBNPns^ZIs{BfyRdoM-JRRcG zm|Z2AsxCdf9+dVUfAkgw&J^jZ{lLP1_#w~z?H~LrVs4n=`<*cqN3BS5QR3fD1{||nC*hkw#iIcVBdef(Sey8cT4?&OUFp7FEtW;B^HYI`6QyG8 zPjWc(k4;Ch=IIxjTd^Vgv+n?yq@)yv1lz*Rp4`Cbkgx|!^_M^^22oj-wk z22|*--TNG*(3`(KPB~Q%S384m|K*QS<=^}gbb6p9w6i>m?tH(Wi?5FP{Sy4!%RlE= zl{~d|t6~#p{`kb%e|z-r{Oc!t=E&}D5T>RRJ_4Q6mX0SxQt!!m^*%2&l#<5v2WDL^ zOo^>_%9zK`f1z4r{KCEO0Pj3d(*5FGP5xY){Sy7@(m%=Xz?ZSR0d1kEbQ18LM3wIM z^hfw({pZLt%g>}|k8+R3uHkwalAL0UtoDo1C*4;!k*wth9ZCNYsuoPU=wJl!C;89% zpTmbgr-yH$p9H`7k(GJHC_~?f-6+pI7QY`q{Cf;l@xaul{JT=Gs-Lq5 zc)Hjs_VApQ;#pp2ud_N=tQ32Sm0~Zf6i2A@ypi4=>LRf~>?an81H=OH60tzM3=70t z)IhO4dhWgVq^G` z*cj%Cjp4^)V>nlA4CjfB;e4?%{6cIDzZ4t8uf)c1f!G)>6dS`uVq^HV*cdJr8^dqJ z#&8KXhP&0bVpq7**%hingI%G*3d-E9u!Axq6jlOeq}uN63e^s0SE!=Su2B8%>Z zJ|wn;W5kwltk@DhBDRE&iY?(|VoUfqvv$^^`Fldg9&~&-H0^xm8TM1Rg{F_-AA-8u zLHW+VK{_Ubxw3;?jDO&cpU!>sL^>fKAwLasPP0w z{1f?S(@RcbR6K)!J#2i>L?Sthe*@_=4W-XCqR;fj;_yQLjp;oXk;Ym4Hj)0*l>Rdi zTc*qTH>D?CfhQ+t_gkO7lt-`on7_uyLO!MXguj;F)l_;{Bk5iBrFR`9y(?XMR~Egi zh`Oxh-%|Qmy7aMh>0<{;A3I3;*um1rnn@q4FMX^PeQY1Prx^eG($iW=PirMTP1DmF ztHxdvuL(23re0IklwQ}KlpVYds)g5)9(b_yz#7s6Ye)|~7*CtSnH!FvA9~UcJ^CTM zMjweia7cP%NP1&PdSfQNv5(Stdgx1<3w1x0hOdXqR62eht|I-_dN3YbhUg*eD7aP+ z!xHpHG@cE_ez+lhcqDeAcj&uSV|wxfswtiz9wfJi^h2Z^!+NgP59^0HAIrL~){p2% zIDb?>%DWyzOWHuJj;($IZD|9sJ+}Huw5AQj0@>=P(VjLCJLC{N;yKFpJbKiIc$fGm z=P#g7ZHS+V7dd|ky=p@|PK@XLW%R2J@jdYh=dYq?Z3t(1hZ;@NSgGQN;$6<2C3CuP znRMYY>B42wh0A0Jm#HCKrlxS2n!;sj3YVz~mtm~ab2YZEc(0hp`FuT}^Dp!loPVjm z;(UQ#0QMH@g&2XZgDrGp;Zse7Pc;!f)kOGIrtqmu;ZvEyr!s_3 zWeA_j5I&V5d@4iuREF@WI`AoWQE2uQ(+cb_;JjRytGb$fb*j18NY~Z7^e)bwrF31r z8@|>YzSdW1d}&;$(wsjHm5xV^ekz1ljsEPrxYS(A-OJ2n%HUsPAZac)m#ezY&ju;4 zGFPb@c-y#!^Fd}1PYpJMSydQfhMeBSWIV|d92tpHS^7U^7(=t z3t8q%^Cczu%6vu40`@Oxv(PLg&qeHG(B^CNHRnsr67v6+m4Swg6WW)I`MwQbEg&Q>^YWBH1>ZEM?do?~+evG!LPZiFU0 z#h$|I)v2t0HMOT;5aKC-x8Ny& zQBQlr7_|c*8wrWE5o2y$#!Dx+V!JQny&LH>@L$xP(2efRWGv6Xd(qLv9K*l4jOaCF zM6W3$dMz2zGi5|?EF*et8PS`_h;A6k&p~?V$=}K-9+FW!O-At$t9KU@-=BXvy8tdh zGH?=cmW=2vWJJ%B5j|Ty#6Lql$3KJhzUO)BCH@(#`;F)P75;TnM*58SNbmf7SQ+oL zWV{ctKDd~eCH(7%pN|^&T3Sv%EBM#NzrZS_87E&iX8bQA#z_DT)dv3cWV{c_c;5o= z`cW`j&cD9esdjPhq-={*a$PH&`Xg5W|$PlR_L!^qDB30BDslp&t@NGSjCqg1mr0IL~ z{aCa+sUj;ysxT>1g-MYrj7Sw3B2`$CDl$Z>up(7th*V)ks>l$j!s=&Pm9-*ISdk>G z$PiYf2P<-e#e3Cj)Z%shIw{}KZ*cymev|VFdIIMY^+e9!(rWTv=oOr=)GIk(rB`vj zTCe8(NBtw`YxEkW$#gc~YsVf6>2iUaX5b->f%t z9@b&bOLPh6&bLZUy+yMVPNa&OdYj(Hx%0DE9T?0|~=P6&WH`)Q(FPPLgOMazlo3vO;a+WQE2eCDb-USqm2rE{tKr z&2UCsH{VJ#ZoZXeZa23R<7QoH<_>cQ=T25=CQ?GfxRl_efeeuYGDHrjA#y-tkpqm# z0oFWgo+W=L4Wx-Q5E5y?iZqZV(m)H52CPT}A@j0%neq5_^EyvC$skK4gG`YOWLAf? z;Ut6FA{k_v$;NpLo60^7PvnD8ihN*1GO*?o^9i{*`Jk4_2U%v8nMK_{GoMj@Co5!# ztYAe}s4cQWmPiSWMM`LqA|IF(`M`)|U_~;pA{jIm$)JT0XERh%*io}p*Hk-|irYSY0zeKCSg4;ORhSg1!lXzQCPk_+DN=<=kt$4zRAEx23X>vLm=vkP zq(~JeMXE3&Pgs#8tjG{nqz5ZU2GTPojg&~cC+2sW$L7gn)YaWH0Q_gW$ZfkIC~u7@s=62J<*;> zc(Og2&`BP(Me@iJ$)mPN9$6xJ)E3Dj%bsHy3v5r@lh8>XHAM1gERshH+uQa=ChKGS zs0OyL?aTRv_Cn5`ED{n~q_M~%E$lV+8e#_9!Gzb^YYDGoPi$R#J-blqixg7Z-ehk= z)^V~(hH^d?S;o?78QCh;_v6{(`*EcBetd^fsAtuyYLfaWCAEjnp&`~p?T}bbLwC?mU8RQN{qjEbD3Zf#>RmJfRe7@?2-&9< z-okS6ad{q6$kpl}c;38UJ%)twx|)ncafC`c_0lu&KYDuKi(0As&by#jEA`&_r}k^5 zR`$K%yjGsN=;FSun7O;s)<;`X8_D4iB&e=POFi(KIRGD~!?2MZjYi_1>J9ZCdWfKA z773&Y`&Bw1Q=P$%l}qp{cB8sOJ)oXYFYpE5_mN?Olp!RdrsxSfB6pq1zLrbzJT@FH zEWW7JbfRd1(njkZuPKw zny(hVtvP@2no*lK)pweRnH)&y`w&KUM>f9y>*ZsAmJ4f z4wi7}-wFrac(c8E(Ek(;9(KcZ_D%`!lW>fLkN>T3_)Rz3X9m0QMG0S%@U6cSUOVFI zLH51>Eu_d-+k6RU4;y~_jds3-izNI`!sUM}ylK!dyJnaR*GX7RW+UuY38ND3mT>Ri z32!1%NK2R@VI2t@{GIS-_iQr>TS?eP!VZ5Yy!FOGH;1}Pc&vmcN!a6Wg|~L@5<2%* z7xtF0pM(SdX4o}!4Jo^Zu9tAQgtz_8uv=&pDZ7P6OE^}-aep&BD)byFj|z>K@C^yy z`J3UA_%`i9gB`I@5izWPC!j*qBJSJ2~%40$sBn(R!`8(lljy85m zxJSa63)Af12^lZ`%9pS6K3qfYyY*YQZsS7M<_K#`c)EmVNZ3Qd(+CaR@f5}$_x(mz zZzVnm`IH3Do+ROk5*{yMO$k{c<8Cbp&yw&Q3D1`BObI(n*j2(V66Q$g*2+D2xC@Vy z@E8e05~fR-CZQY6JlUV%{Dr&oh7#77u!)4tBy1{SV+r|k0V!Kb$X*i8n@iYA!b2rI zL_)Wc?lGdcu#JR=OL&-sM@V?2gzY43DG_rbVMhtuOL&xoxe^{NVK>HfH;3o% zq$c-IZ;(E}PH+C#)_FAkpIfImt6u!yCM)=N&kFwMX9fSOvV#Aptl&Q&^4#dtZ28 zdS5v&o!%nvYy5P6GBL@7^EYUT>clLpkQzBCWMSQ5Mo^I$dYz8oH*grE_$a=7WT~ zfo`Z9>BhQ=ZmOH>7P_TANdKYt>U}zYg-n`BHyNgescCANOjFy`FuGS)5J72%}jIC!W?8;nuAR%bBHGo4Q!_Ks`>}Phi{g<6%Keu!3 zJUichVZXFr*#&l?=i5d0YrEKfW0%-(?RU1oes6!UOYJhd+^(=I?JE1DU1JM%GyAiy zV^{0?y0-mEXX<*i<9b^1fA!M+FtX$S@24A|ga0r3>8|RHx2c)`OJCG`O%6TrcSk*m z-sbVyFrlKQ(9Z#TU1~3_)&m>U`~KG+cm99X=l)N6T+rVZOKPsk*9}eP@!pBvDc)K7T=a_9>Ff0kdZ_+~9)^B#xV}l>tZ&gH^sV|feLK3wJM^9U zE;qf5ir zh2D)e>KU|9cpgUc^a2{Em(Vo5Y+f<1n%B@Xy1p6|1an6tqmkoe&&bGhE}=&&RK?$!5`TV5{8d%)`h%4Cv#a9G zD=G1vQ{rDsiEmOBZ<`_udCZTeQmQ}#$>76JEtyA;h|lkqsJ&htwAkl*gT4E_XXvpJ zZ#QFBSKWg)dKCTYcX}P8Q8PxGTys4dzx*1k)}qLl)hUBm*2Uq2 z+vOU+qd%29&&!>eaz{$Qiluwv1sBiCLnai|1Szkzy_1;9tZ%#WT}Jr6eaWR^mHW^2 z9Vlrpm$X+(+7^UU>}bNNwi#i7$Co*KkJhh=B;820&`aF4WhIwXuM$qv-&HH~Qn~-S z+*w^!X8WeZ6ds@?S952wzQ#SLHxRy$2F#UY4B=EXW3D6t<|lG|-@Yv|aU8L>%hRmw zx>8M&J1H1Jo9pr(B6oWbzRwDs%lj0RMtil`QE`9 zI%sI@sbrk%lU20yj7wpkb8&ilwRV^xcm64NW>vKV>)h^%7hQZc+PRCE$$GB4t49*P zZ^yeddj0{*@5(hLe~nG=djH zh)2P@;7zmK1P$VV;8hd}A}GvcLh=DTc^45ui5laA%U4i5`TM`w-iykRntoN)-SxWr zy{`UOXPUUG?4N@!5^q)6vibq3^w@c>>$sU{%}dK)WNdzw$R8$>m8Q+{DB-OB!xBB6 zC0DzZiI&Kc0<;phpo`$CvZUG@Jg-QfB%J!#QMsiSNy?$8G}9vN4p7-Q66sm!0&!iH zJqE3h9ir&uRgYKu|EI2X??g}Psb7uM?g3{Rs>Cx6%VT=v^n z`jN*5|u?x9_oK-{<=|InwmH}0U7q(mycT+L+?G?)OGKHM{D2?w0YC01eAq`)Qlj4U`Br+rjrpn_^jNL9 z(K~%_T#2hO71J>jv)LRm+mw1|%qR!>nx*WZoTh!M<8SHztzz`pW%6^%0pqCJADn~6 zjA|g|y3W!6PK#bM{#U_X+Zw!jeU{7Hv&NOn<@fR ztwXymTPf`gXQi*$TYG2kZPh;5nxFPjAM-PQD!!1bHFG!HX}_J6gIDfL_?h$3{s$0B B#Bu-t literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-ThinItalic.ttf b/js/assets/fonts/Roboto/ttf/Roboto-ThinItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..07172ff666ad2d590e29324165b6c7b8e2be72ee GIT binary patch literal 168276 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%0Ay~d>kvf8cPe?;(_E`Q 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/v15/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2 b/js/assets/fonts/Roboto/v15/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4411cbc8754cf7ec78501ba711efabe15b936675 GIT binary patch literal 10324 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/v15/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2 b/js/assets/fonts/Roboto/v15/Pru33qjShpZSmG3z6VYwnYX0hVgzZQUfRDuZrPvH3D8.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..feec9f1e6a187f63cbb826958bbc01c050b5b9c8 GIT binary patch literal 8040 zcmV-uAD7^FPew8T0RR9103T=o4gdfE078%e03Qzk0ssI200000000000000000000 z0000RjeHz|CI(;thYS%63fg$g1QLP-0X7081BYY_gLD7{AO(UL2Ot|aIJ2U5v|0%f zMcL&1C5o~^X=eYI0&c(%aG3Rr#wD!)d#d`@Ztc-h9a_V$g;X{5O)KU*pMSqoJ36$g zRS^CTiFw-eiFk~U_%VNl)rJxz&wuIo?A%tjG=B^TL4tr8W9rCW0<3&$MhEv z9So8PGrqeNSgpWr&$F^%WVM;y53tUE7b;HVzMYtk!zO1Tr(zrzIFWZ87T9JgH(iI> z%tG{7sHH{zsaRRC`aQRAclYkzM^K{>Wkr<*Ju?GzHM4sPO8FVlGzfsl|Eskj3#^^J zDJror-9oW~0K9LmcP4N!vwKjM|5d08SN60}K)7T~_J5b{30V}9*tM!I@LENF{b>pR z0A^xGTI`&aAb9PyzAl3A&_9(Wa<&{*1Ld9%=VU>wSsrC6XP| zDr7s!Nm`P9jOCSxG6a~aW2&x1Xn~6MitftxIx5=g{Qu_OY<_260eIB73SZ&kWPW-} zJ9$fVmzZQ^&q^f6q)50mZv7hii??el5PpmezZf~h9K&$P*akLwuM>2lqR;M*cYL98tS zLcQGJ1n7fcARz5oFrcZn837(RA|ea20s#-T0f{oiCl02;SwRpVs4G6Iv0AHw4>{-Y&&)fo0Opcd`RR$*P2VaL5YY}Oa@VzwVI~=|Jfvz7ssEES2P;_X!%(mQoeY6>V!V7Ez@v64ZQBb^Yfm*D$ z^?nH3)=3%|Y3+WcP?wPxLhO9b%SJ84$;W z@oq5#EC8DXaV8kR3k3;MEFRS~_6d9I z7H|P3sJg+-0Vf1BVNy_yOO2Xqv@My{d4L;y;4$H*x5Ermp>BQy!XVkB5p;+_R7ANg zax6w7$#a0yooMFh4c;O`EOL9x3NYDRV2veozNrhA#Km?tShC9=zvS`Do!&)xz@GvF zZ9}nKEO5eo433Hm{7S4YdJFvE0B;!z&Td;a?u00~;m>zJ{Dc7an1)fiX%zYuWlVr^ zeQ1Fk?n z-LAwhY@HUZy7asE1Au^oH++$ed^DpU>o~>1@B>L=uC<@e=2^Be93A)gap4 zc6SF3h@b*M;mZ${S9!Fjc^xRD9j$Ibe*jpw{_uZj`LKDv`~D}u4?p})-Zs4bdHW3r zfaA5FV{sMNle1lqY`U9$xo)&Wj~@fqTvw`0xeAr4;22JzJ7dJyUH1$cGHe8%|CGHe zuPk}(jed9BH(-y$2yfk3#lzP~EAs$u2jSI2xe)}j3;qJa2XX{>5JXlC

    bDLv#~} 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/LICENSE.txt b/js/assets/fonts/RobotoMono/LICENSE.txt new file mode 100755 index 000000000..75b52484e --- /dev/null +++ b/js/assets/fonts/RobotoMono/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/js/assets/fonts/RobotoMono/font.css b/js/assets/fonts/RobotoMono/font.css new file mode 100644 index 000000000..6a86af729 --- /dev/null +++ b/js/assets/fonts/RobotoMono/font.css @@ -0,0 +1,56 @@ +/* cyrillic-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz0ExlR2MysFCBK8OirNw2kM.woff2) format('woff2'); + unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F; +} +/* cyrillic */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz2dsm03krrxlabhmVQFB99s.woff2) format('woff2'); + unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; +} +/* greek-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59FzyJ0caWjaSBdV-xZbEgst_k.woff2) format('woff2'); + unicode-range: U+1F00-1FFF; +} +/* greek */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz2MSHb9EAJwuSzGfuRChQzQ.woff2) format('woff2'); + unicode-range: U+0370-03FF; +} +/* vietnamese */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz-pRBTtN4E2_qSPBnw6AgMc.woff2) format('woff2'); + unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB; +} +/* latin-ext */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz9Dnm4qiMZlH5rhYv_7LI2Y.woff2) format('woff2'); + unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF; +} +/* latin */ +@font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 300; + src: local('Roboto Mono Light'), local('RobotoMono-Light'), url(./v4/N4duVc9C58uwPiY8_59Fz9TIkQYohD4BpHvJ3NvbHoA.woff2) format('woff2'); + unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000; +} diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-Bold.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-Bold.ttf new file mode 100755 index 0000000000000000000000000000000000000000..07ef607d50c2e0b48d251910fc75c7eb83a41b34 GIT binary patch literal 114752 zcmbS!2S8j^+V&~;&d@>_U>G_x48s6JA7+NmKxhF1B!L7%3WS6-l8{PzFRoB!8=LP2zLPPMYyKZuO)yKNi5%}Ij2&-?IoRj|~{cMmBeg)2V_b%=knEc5t zIr#oBLIM`{u3l-JL!(*=eQ-L?U)MJ1VTc(37uCue{Rp5AF{$sgs!*_=biKML!c5k1>fJm_mugISFTBV<%t#ej`G5i z`-&ZKERPPTWi6oQI>e{9@lz?6(WO!ITLsu;B9l&qsPW2`E-UA4uzbF4g zuctTA8|h8-W_k;~mEJ~=(A()9^iFygy_+7TZ_;D*9(pgmj~=J@(+B8-^db82|JOb5 zvuoII@wyhrb?ka}1G|yk#BOG{uv^(}>{&*FFv$MZN|!0`thFX1?W<0Ouk zar_a-D>zOGXaSF#TVe8oyvE(^+&L-9$HIJ=}~L`VAdsam>X!*^?N%lj!Mxa>_Xm z8j!2}5 z6^T0%zfJsS;*UuajKM~|G0~W8Of}{j?Z#qbsj=F)(zw}poAD0gF_UbHFh!Y?O{u1A z)68U+tVtf59G)DToS1A&u21exo@;se-_I+gjF&xa;)b>D8x~p6);0eY*N| z*6ECQUJQDT9imrxXRoLSIi>#f{`oWB-bQO6eQDyTSNEuE2%Sy)M}HsvnNAbmaK$G4 zJ?uS0(K7mPOc#{M+;|C{_;x{PNDERiLV-Si{Kn?3Xsaw)lt>}AcYg|)JYkWZ7?WY)&o*%UUFb+AryIr$Bn z#=6*aHiOM%vsgFTPYyte&1Su94x7vR$U$;Q$TLW@^=t#%NYBzw={GExUC9o!tJu|S z1zX7m*&1>ba_?($5Br9F%f7=}yN~_Ieq!gyaW=#}2LEhmu zp2@Qy?>-@C$)`MzU6s5pM1ydk&E?&rs zcrnZZN*OQVlXxlRRH8EfiBINjG=fG_J&oe+df)Vz8vm4k#=H1*Nh<~L&-oX$ zkQVVT`B$`A zpD*T1_)=O;YxuYPJHDOoptZD)@8r9rKq-jU^W9P~-@`AZbLd=Yj1)rG@(<~HqQT6= zKPVKTQ%3)zkhb1`{`b*mM}PL-iP;YuN`@}d!g2~EK_nO!+87c_#=?%&k#G`0B8i?v z5d(=PG0?to&|wL%!IFp(S}PfvIfYnADzTC@l1?&+4c1u}$tF1@m*kOrVu!AF5GQew zLQ+JENeMK087U_f#7!zm6?A$vsUfwbj?|O!q=7V&CNhCElNQoSCXz{HGHE02WD1!| zI!Gs(M!H}F%pfz#ETKKcilyJue`3WBV|{9{Hnmun0W64xuuwLJjb&jhoatBui^MuL zV5LU0Sgh1|tWvB|x`Zqxvq>+RM+e9%*cFS(0=k*3AoJ-yvYBk9my!W`IsFZpOIFey zbQj%8o~M_Qg=8&x6l;GMv~~~ar+dhibT7G&EF$aZa>5}`zNCs+v0~ilBH9n#J)i8P z`8of6D{#WHIl<6$2U;Gi}VDyNz12#+?#&%`naYJi|+Zr0ocnD*Ja?%q(HJZ}K zu|Z6d}MwgJy!!~K9=4#Bm8h2IrShOlXhjE!T z5XvM*r2!(zOp=$Vol00QkvW&A5?SV*1j2Dbd1;|5FE>6m+Mo;51Vq|sK{m5yb4Nir zb2;q#M6Nd#q?(gMnLaX+8SphSlxg*52QD$;7kj>w&x&z%R?NM9mAiQ1;psO`+dtQ( ze70n!y)oBda7`OG_qJ6P#r;>$ys`bJ^$paJF>XrMq9t@wMx`?=Dy4PdzMl4d^WA}O zz7^6ic=MdK8{_h-tk$xEoaoevi}rPQ?CUEFeBp(Fl7XXZ>U)Z!=b#xfF%N$s-6j74 zE7*qBHWjO<++ET&4a%&OYP4uNh8At_#pKayByBG&EL=lKbtBPe#mYAf}NDVHDi%X3PQdaI}dAp@!#eGd# zSxtS#6N=_e$jqEDx5!{KMMRivh6(-;Lr04G#Hqfb=Ayo)%*>`f-!&Q0&4vtdafact zN=d4Ot=>5Nx%3A5Edw&EiL7)-lts&&$~oD_7|3rkCJb-zE|FyPk-y8Jhq^dSg|bEs zl_cM1hSg!b@S;xQzlL|A$Lo1hr+aLsZG4@rD6_~MnV6}?k`+DeN=+5hOYLwmo3s&5 zCpuiCHJGd#jp%+k-|3>-P)xQ&#v`K)u5wo3ABaXv^{kSTN>|_h&c^jqbB%?Kw$>kv z=C8&#KdC%d*>vl?xwkAUrOy=1$yR<0NKDmhqcbZE7UPU0J-t+w%_wDJ9Ih=9u@6`Ca z*vF{x)WM7^W4ia;_r~{oP(Hba9G8A8JqUdo>o$ar2?-7g4A5#g0{{f0oh*o?0eTy? zxMXhU7K2Q+oLgD4vZjg-ro3aNE31^{G~|KTUw@Eo?0)rjdY{s8>tDK*r?%3S%2n%8 zelIyFjh7yQ)=qVsvEG^7E>UP8ign$CNe9ysI&p$3WFfR-ZPcVU>2NskV(-u;%0cA^ z3R~E9D$Uk8Tgt^CPWah1Hyr`{3OhjurcQ{P!#Uy8=?NEd% zI+V&$MQaA;SesHBCQWyJCi*s(g-c!RpIA-NZoRNnXghv|636EWx-fOnQ4gtW=xJWb z!rvG7+&=sTPs7BBAig=$g&%8ZQ(B6++%jq{h{;cHkIk>o%Bs(ci^~)5`LQ=!$K@p? z8{LPSQ zDinrBFVmdL-{K|5*H?Mw(CxgtyQiCOS2oDqGiT3Y8T;Nm z(9m$;&3$yb|I>%mbm;QK*Bw*d+ke^BFbXKVY{H#rvxY>vbuub1!Mq|cyqdzq7@ABv z*uf8QDW5j%dV1y3qbo|YCanJ?nJ63YQ3Pi z$pDeH8m+7uK!vn2feJfcPmMVn#O^|q?n zd|F$*&P?*p7Pg*gQGn5gQh^Nag#T3lqGciqB_I(x!E zcS)Nw7EORcF2NYg#@GcxYS`RqV=xK-F27pndjDEHiyP~4$-Nwc;8oEpr!Zn7l#(Jgj_M+tI)5tcvc1}br;E0!!oF( zfmtAFWQ`;bpf(zbX+)o@BaVl{91=RKhBu`pN2Zx|I&DCl4Z2fr;!dYuQHk!en#81r zUEu3x?X{D6n&&BV((;A{N0yZquX$v{%=>n?a~dABs;jUi&yY|$tt`DXJ0%Rb;|E_T z&xEIr+w{na*~fP_7xrI2ch>xjhQ5;Gp4!yVs064FMi!v%4f2!lLJEl6U8cn}wNP0S z_8dOTRO&@{@-7W{}xFW$+Iw?1= zwJ?xEH<*LreWD<-wBX-P}3?=2~r zGae>5g*QZ`YIW@9B^F zikq|YCKSZSI$Gb&?bHWF5c`9sRPpnxza~##gajG0~4I-_oV;)1}IH z-oCwoCQ7aRe#|f}Np>fpBp4jEw9ba(I4<7?fyO+9&u$zvtu-KdPxR7+Wg!H`jA zNiEHYqL0^fPpGsc)r@aS?P`m_)b6`#PF{ZR!S1?MbGvMb*||k&%3n-H;*KJdu`tbG zNGtUAv1Rx_(qZ`)pdr)9PIq)P4P;ZAVu0@lptUY4lR~PIWf&w0Fi6q^fO}E6t1t&8 zN!vxVS_q23Kvm$?3DKwNf;(5HfstZG2L^H$*n81?&R^N-4(;rK<&u_WO-o4$65e?z zHz%k1+zxb|JwM98H9o26^tygp-*;H(xHy}+oZ()jKsCa^aTPcn5yIk;4)T<`B@^tE zqmAwPrPB)a0l`Jn)-^TvCfS&FY-CWZ&8U-X(=VOYck7BONzUoLYIagpMUlZ6JFcN2 z`QRIuR><N<2Uiw$-Ew-z&J#PT0>(y$?23qw2<(1f_{JM()Sm`BZ~ajDZpF%&6u_YL zX?_@8g}A5m3S_Ys+SuYw4ie5Xv?Hdj1l&jnWC64Q0TC9qY6wviHvu$+VCK9UTb~=Et8_tffm)OoH2H}yN& zB}xxnI&IDX{Uhz3(bq|_;#y!M52|ah&ubK0gihg1#xjJtDPtLO?$<6b7X_xE8p;0` z*9oK99f}*UTCrTyQ?#%z)!7HM!7qIcrfkeGU@dx~e4H+6wRYm}Czo$MvAe!$?@Jrj zJh8ngNI5Gdm2{R@c2^{>-L_6M|V(&e|#UpM>am2R>2 zDLI5X%tsx9NxC}~%9>!g_h4ZQ7>Z*e_-p}T`>C_e>(=R1$4)qR68GHAo*1(6zk2Es zVA!P0{Xjnckq8!1awW=MjIslX*=_XAV@PgQW((`$=W|)ulWLhsp8d+l{FJAP4X`fH z5mDeuls6SNMnCkdP1uiCXj%LwEHH*x0)tJiA;7<7@q}Ma2A$rTtd4G+&EgdoqefRa zMq+f~;tTaEAVH}=ZsyjTrf)cL`GkqTd3M?QM>o|4D_?~!8gNdpPNO?7HMt9I!Sq`e zc()0Hy5sh5fBWKZzrC}geAS%`29~)NUO(@|D{s-DaKjiH@K@0n>(Lj&&I%?bcOv>i zm<2sz#7i6D`3UdkeE-5>8abqDV@R`80;o2|FL2zvQ8<^>E8+-=f^s!X)|l(AfD$ zH&hocy>r>B1r~Rw9nac|`s3+{0l@YQf=b1VXkciE5Oivvgh%MYRkf~Fd&C7vM@`Ie zjq)*#-HwP}hZ04Hln2<9yOhc3m$?tnPdyuk-ay%hQT8;HEt42`l;4;|B+xhK!h}U@ zQG0|QXLk>k(%26$alLC|Gw$uimr&uC1_|M)dVnaE(E-@}qBne!7&nBH&l`!ggkxO(GW#J1>a@npIYgC>@Lr4Hp8=AnTV%&=f*gE3M7f{ zI4z)Jh<$m}hE}35kn=#0w>3OgfD~>_o$b!V%tq)$bgc&GcU7 z6Z+lYGrPu*-}TJkTW^(ilq4jSbdvVVw_#o$N8g1*U!dM&g$(iA2P*z1EYXpvnPSQ?`FwTNQ}=bA zmg-?L2tXp$Y-Y>;hVDDN_JzwDEj2x*v`BefiTU&3)=lgG#EhQzgQ^%hz5NQB?zjW9*1 z;G8Q$nn1^GestB6`#054AyVh|%v($;)_BRf-*2m~zU1k3{0~DV`}XhO$NwOn2MAlb z7thlWy*pggd6a$~@!laj=OR+=RO*y7NwjK_a$0FFijqHMP*k15}S#_|w8%|n>_ zb{6Ex_9U}#&sQLPLA#1)nDC4fct!w;cgG0K8;=;>4S0aR8@P$1^p!M;Ius{W&Qhg} z7H}QAaj0GifE|2Hln2OB+KTc5g?W zZQgSC-AW~WT7Le=KfI~^6gQD?fHUh+KQGRV)~-PDrLZDYs5`<$P2a$MFeyXw@gHCJ zJ-2n_xtP+Bc|CX-W$i-dp(Tt8e) zSQ}bASMBEWFt<+CtO#1!shL}~^x^kt#YtLz`nX=t?&EZ5n7-K7hH|bLwn{0e@_)hW zWwE$Yh6eclx873w?poPI3!HYl3LlJuyLE`b=~b-Ap_;FeQ9LgwR5p~3@32q4Y);{@=i0vR_Gaa? zvQ>92o_*Jb+945(WSSy!rwrB}eZt+`HNLE7!%SE1%-_sZ za;Gj&*F7I;OxHgilT~3UY*72`5c+I7VrqIgOY0hs$Dq%~j-e7yN@OxnV_*X4xY56W z9V2>ATo{MmDi>hB3Vx|L0qGLvjq0eu(!B62)|G$~{Nl3H9cW26>mpKA_d}JIsaCB} zYd#p*q#7+6tW|6i`FXBhklN|KH7aRz-zkVYmpYSa1rY_xft4{KVp&O<7e_?D|Oi)R&_(%TwF- z&o61e;-%$@%U`-;O6lTjyVL3mlAP04mM2!M>U3gwu_gvEzJ>qTX_!o?$H@Y8Xz$lu1NROYp;L`bAvVo!{*UxR= znokYqLhYA!^;6OY1ZT{ zb5?XzxGp4!K(Y#qRtDfS;z8>5K5IolQCvX#CJ-^$H5*?!*wVcBnPsaU-CX5K4#;bo zU7S9#!5w{B?Br#aF3V{yNeiMU7;yW@N&B8&oVMZBD<)0Y`-j2RuCA(-u%zsy!PFAtQMUv0FfKjXz@=egVq}q)C*S#oEA8Rh%YQPSC&^Kho^Q|Ub33*RMzpuua+#j zZJUrc9CQ(61KA(JQ@6-2mw*3K)|fRg)nb z#2I>#Gd>w%1a9aR3aWhYhSS7osH>_{a2rxE!72n@M3oG`a#^Q4$dYccS|R}EAY7!v zs~{`bbv`r8>heZF9X?Cm7kV3+bj!+?-_kd0cW$t!ao1DJ^9Gj8Hg9z7Y+ki3Z`+i) zH!m-vhPc8hCF3yzXVsNVDT?>bKzGT!bDu6bwz@1bqcZER(u$2M%AKYD*;trQU$(o{ z*+|JgjNuflGlS{@!T*VX8paq(5>}SaMy&IDn7RmyK3O%pe4-A^#V_nIl=N2TwcYKP z_Z2ChB{-XMYv-Ai&p<;w(lX87f7hUA89PwiRuGe)HS|wB5aabGo;_av0Cr6b$#Q4- zi8rcfR-Vt(LA_9IXm^3g7)PBU%yy$@!utuOpb%fqz6R2hAa$2CgLXC!ul9Yz2 zQyWrBG7M7j(4A+_uvPRwMwc~ea%JV@C@Z)bjGR^)`7+eO06l_8Q7~plkhce9SsirL z21`&xeKFQP?{z#yW%M-`AF;qYmVz>&x(N=Q$v4ivT2VX8C|`Z|;;iWzp&_=c^q{ml zd!q8SVo3K_FdY>Q}Art8d-K0EZF+gbf4$>_F;JBjT{?@W;6ma8Ap#I46{KU1I>%YAZ(0cf#mWq0l;I8Y;BeQk%Ct4hkw77X&nz6Swuf4+T855N-HX$we`w)G6n9&;S zk&3s~PF&$EOKI6SZD@$gNoj__IK$A3T$7X*6_}DZ^mnNkPxh{*$!M>E%<;BY%p?-2 zPA6D#c!vcpR+q1>5$Xa{L7b5#2El{?uB6U2pIq_5JDu(^c#44-MC(+9XQW-DS0UY_ zE53d1q}{z>*ojqGHz!H?R4P6^u`_qUk=33)cGx{RH=-ziXc)C-WFBmaIjFP1XUhFF z4;E5z}W=N;}^fzQ_wv8@QruUqn}5jre0y@M}!5eIj?%#Q|r85MC>u>V81!mO9nCTM29gn15`P`RBLw{6+z~)NjNIxVKU?N!WV${X$C+W!LzwxWGoB zK3h+?+WxNpg{{}=T69C-)a`j#X*4K*ch|fd`Y{kOj>#qCXT-+NXjH9)h}AD2YAbar zOn!S|X;sUCKd!GHoSI)$pp@Fn3Z@N?L)(_2ZAHGe`R&_LMi2)L5B4p7p+2)n{4!$S ziiUdEh`()U5o4;_5_Zw~zQ7p!TJOK&f;Nv*Siru#VAC&DRN>+q=S|;}ulrv4H1Cr3 zz8m_BXjF88XmMQJ4A@1E7?!&Jl>@ESPW`~OEVp#d%ibbY$*NTEw`^*?bKBnq1saY4Kd_HE(v^LLb zsrdfs3$WJLVcoQ&t}Zg$yJ}z!Tu7!JQJ#LQ95$zFH2g1@siepdXF+a`Ej{^HU@8&3 zRrv6o#lv7)`!9-VHA3ku6`S=L;?wj<9yZ(CJn zg*ChiZQq2pH_PLI^Yprd#==<-gW1P?B(VgTdPK8an0=&En1C1v$a^2n07CrN&wJ^h zm{_ul5 zPWjag*iakcbO|SeSGca7-nMs+i$+Cc zROd~eA4d&CS5KT?uQ`8)ihUhg^T@g?nU$m>I)K^v;*}G5ICUdTQ8)f&TFIZD z=h#sM%L{*+`lq^coemBb`GbQeEX)!$y09E7_7U2aDg4A>fHY_u+5}+^ z+CAcrqK%?iQ*pK6tq{2-)0S*9CW%Z5v`=r7qf{dT@lf!>MR-~3%1@Nk5V#(K5C(^2 zrcHSjDWP$N?Io+0$ca^D$+b({N>g>~w`^G-nO5G`U-h!LHO2F%)y3pLzS7&C>(i>c z<}WF@br+hwLo^#9RWZh~be*(@7ZS6GyO{;ACn6kmhG&GC#;1z<1F`g{4RF$ulAd}& z5Xw6`$K zly6SUjLRxciki5q$5~yOkrAI=qH@C-J)>;rR&a+nq*sZT2_q=Del*KB`BVcZTnqrA zGe%AW=6NK|;)7Q0Sb~1I-$(pm%oC=Zp-zLXRHgE$)SgnCfjNd+W0Q zYNS%Es@0IWf3>5xZN#QeiL~gVbh^l3!5%VzNhsVTdpUPlp|!jd0%o$;cEmC@nDi`H zlaS1AIQM>Mbb?NnZ@E@mwdRgFi*8?5qWm)QKml+XP&|?4WU11kb9{xz$D5YcW!a8vqW1|tVMVKLOY#`)Ga)5?o zIyc1V7_B#J5oc^X9tBWTSobPb!KeJt6crAQz#t2=3u0&_Vgyj5AU`85Dl%EZ;#3tJ zAW*BykaW7NF4Z~)%3)9`lxm>Tr@#GdLB6}}iir~smCxDNZ%(zPuH3i0^s)&P_Li=^ zd`)V)C3)a-Pi1b~vP$=|wp_fsEAif(o1dTEw|`0L<;|0?C?DLvDkCd9WAMQG@`Dqb zFDqSkfEnsHbU7Sd8|v%V3ol{4I`u&qQe!buLaqi<8UPQJvf1!0k*OkcsV4}E0|E?4 zxZEV}8AzJ*#}jK2l|-mZZ2%sFl#+>bg|fEezP0RwF|g5)R801XP_} z2Zz;8&w4x_CLisF(EU~bkSBM|J9_J&kMgw*h>f60OE%0|#&@Bw{8 zH=Z;V7Z%t>_!A^o1p6)|xmvvTi5Md_y~{a@@_K%@;v!g`7D0#;ip2n;3b^2f zTva`O=TocZKL6VpG%CAsR_=XDl<)dv(_iuvJ+}o(syR=vgPlYGwrfjdFeejuc0N4nYz|-rh+V6 zOk&;a?OoINWZL)4nX<3fS-AM7dA0_ZF(#uhDb<;k7A?;A=%e)$^3sZOZE?Z+5JOXL zN@0FBrUb?!Ph83$wtBiuthND81QB z`cxr%5q9?uI8>_&;sGlDS)=*PT`Nm_s#8*`drDXBT2(zR#c2r-w>VSAjr07mX3fph zyKY)jQ?ur#uIV?gsp)Dv@Z6Fm&+Tt(+b`Y^w9&^0S7tOVteoavG{H8wy1pVlzb3sa zqb4uDv|&!~vCZ}Mn~(MO-o2@=4usOxuU<7}%2ltf9(?ucDO0X~RUIcCdywCYd7erf zxH=F*z2zl9 zx@kcF2P^a!m#Y{rpm^9L60$AMUns1v^QA(gcDnUxRzh;Jtd2AXstdkhYHFY$;an_e zHlhGT(CmVk8S{+Qgr>V{GfHPvnC`f3Pf6U`G$X3kJ2IQmY?u10}zstN9SOptV4Tg3zf^_?41* zSV9+sY6Uce%UAsT_s)j_*Q#y_qGJvdA3EXL!N(yDSUQUGCDH*OYzyYTSceYcCc7Ta zr`iC&Czb;N4YW^UNOU2A0din32?(OdKiBsB5{Oa(s{f}u1a#$&OiOc@7dq20Y*8k? zSo^^vC_OZ^&o*-XOnJ#jHvtJ4=&m-xZ1oXVq>z55fR3$nAj|Hr1U^xZ)0X= zV{c*6?1qethS^1NS*D0^Q+8ZjjyWR2jP0G6%K5ZneFY=$9y}tzH4w)zuE8N9Oe-^C zXlXjJa1lN7DdsSdj;p5gsnZH75|fMlkI=;5E5~Tt_tZ9Y8=uaPoK-HT%g@qTKMj4L z_E!eGmftQvLE_2bhao3|7JcK*^n#3)kYw*mq(Z73#6$=t{;ypDg@G$V|H~Dk zjQ@6fC!m7plyIw$LX8a$7S?&=@g!6_ z6Agz?Gb)u#g9IpP)<_35qW8Thv=+_C_{HV^%(I`}CYDxk3c#zBaFKO}(NalXf-3KC zmsnjFWZ2kMI!S=mCsMfFDjtBK+qinHrosTKZ?w72M3}DBaoJ>cBwxMA|(V;kM>jgJiihzY3Ocx>*RV;k#! zY8CzT6-(n8d@|&S$Zr)LCp>piGNCQrgwdX)d2J!N!>ybqVr=oIg2 z+@I1%6espTkx_Q@!w>|33L1~+qE{m&3bzHAL9cio01)h%fgX(+^)sq4)prs+{Z2Qq z8Wa-|sf!iFHj6(uz^d{MtuA(3aJ(}kHgoEhcCEd-rYT7-lnv=+Hpi5*2tdc50g zZkt|OHGX|(etzfr@%Ye@pWm^5e0sG#KHgrPzACLcKOrF>xCU&156EUIlLJqqtA=Nz zrdsUB@s6l6&Q(JC9h4s=IrQ0K%DyhThNRNfp#j*9>jhdx2)^rtrNF-SS_;Plyg66c zA4Tx>9%8uqWPrF^ImNyyx(4?h#y%hZ`_#*Yfx*7<-6y=D=j6x4eY3@VFJKQ5T#fsl zAJ((8zUO)GpjU31&a1xJ>bWjD^uNlF4{DUC_Ar=}Jpg@z^-q^8;v$FR-SJ&o=ZQ(a?A z#^i|+Y3{7KSI*A0_a2;8yL#UA%!JHrR~pTU&r8wkQ}W_tvyvktle5HJ!+tYF`YqP@ zSg>&`-Q_w#^$}bWO@OTF38dJ@5LQ)>i1YXoDInB4A^Fv;=&-QxF#m2OVL_19VEmf_ z%9@0cBl2pgj!VDwoPBF1i0-G^s{g$879Ha`dl)g~2jt@)iUhTJbUKUle1W=9?9B2f zX@ay5`dss1AQyRUl)BIX6xJp-6?7Nujjs=SIFU`lAoZOTiu=r-jK z${%h6@fSg8!N$uSzFFELe?=02in_>LcX+G;IsG}wCN9ar0Sqt&h9=*P_v=+SdiTg^bAG@TwPWb>`uk84Fs^&cx`u&Ykt(A~cb$$9U4kw?G8~tO>C(LUzA#;Vrmf(t0cH>>JHi2^ zH-517ML`gMaq9;n$>W3S?y~s!vTme`DBq4-eWYjhk->4wX?)WuZcF(@n{85gsu=TI zV8>sti3MJ?8f+JEY*K{Jim?&uFbX}bDjhG8LiMweMgX%(P`F}8oyB|{A=rS9hBybx z25=?N;R{c};R>#-u%#OlEwG!Qx)1;#$y=0wO5o+?t9dyY0-lfrEbe!7_4HBY^P2TX z` t_+Kbj|odFsVPZw^j$g2I;qL6cZOvbRhi4G)n9cniNM*@@?*>u*>O_A>POaB zWKG{QJ-^sSb)|EE^L4Z?Oym(i0aphOS8};2nw(P z@PLCcxtO*WnR8qQM@*LM8bd=^KmcODV*u29Ls$8@sqnww1T?{aOJgVv3Gsgs3bxFD zD+$)J;Hh{j5f24ycK)Hiem@4vQd^7N6(-eAYHFygC@sm$$w*I0PD+T0j*1K$i#+3E zT0BVk)=IOF{*HN|6RPLOY!^ZC6%!PDxGrgw+!>K0M7W z={Z@-xtxxTEeED%EURx=+n%G8g=bXdCIczbyCTabOuO%STW)fClveqpE_p1qRc0An zk>y3vnZ}5$NvrGcdSuX1l;aGnUp*wAk8P{Z&S=?`w_{*cRPva&GWwS+^Nfo~jvbrZGQZH-J>KS+v30^M zA+I>;CwruR={0;B3yFoyLi7vT$zjGpl2HP+1l2ngVnD#@lH8J#nqu~)iomU-ARDWm zHZpL%YF4=2_#*WWLF9SnPO7b&G^wt364R#@ntdP3KA@(u*48q-JmHB2sZkTfM{j-R z4X*&-%mSIx+8+L*dip;W=z6{bL67Qozm3Iw|; z2=>T-xk4q>24-Z0r-!RdVK0-yr%Alx39Mm(uzFRAN}I+$TF@}6L{^zH^QYEbKfilU z^(DVwJ9A>)^?iueM;T)2SZkhO%FsVYL@NI=rwaCrmo;NN@VACf_p7{_*n@wr|Mqaz zicDtH3Cc{-ybRBW!GcADj_`43G+NlFR?>F?QCd)^y_EJ}FrhEPpSc)y26PP({X_uj z0xrpD{>-m(rNN)MzOO^&&qU>In>r8s2!K9Q&{jNtW^C+CL7y=&FMY1oFHL35<%j-LBeWJOAbqhEdXmFMV_m>(*i zPK_0h;?rHoYZS1C>i%DpPv>VYV$3!n*Gc5@aPTEtyqW|06BHn9SOS+*#9_q6RbVc2rCsnh<6s!+7l<3`$T&C)~WUDI`dA{m!`W+ zW8~xK4z_OY$WCwDGIi#Z80=nwIVF)srCFLPKZ70@%;qA};%)+;Qsd=QhR~p(z^-5# z7+4MB9-t>MgGI<5_KWNVc!brWS_+8X7drEEGc!_CRLDnP?Fbtq1_TTWq1Hz+EzK5_ zNJ|k3A`zoRg=N%dcAVZ+wB&}lMRQ!CNDI#m&F`qRobudE?|I+T|M^F!ii?U$N{Wh# zS)KnAxR}q(zp1}a8+3=@Vn%~c!w=s*G;sIb>|^>&j@zA+T~U$ad&d~xh{ivPG5$sF z=>NjUoPLMkV=kgrBxY`+S1Q-hqx+OIQn8Y{nRY2|&rXzWN7;iI^D%<&AU4rLEDj_P zK@aflisDZs)$1ZvtktCll?e=Ltph|8`s&%UBBgZ879?h_u718+$^C%!Sf01Ay+R%$ zhX&=(2j5dC;@o1JE^qlFM9;a@3CUM}L4;GMM_f~-09*93kN$}rl~jBe`L@X5^YTDX z&_d-&HiMtr`20rC-Dl3ww=aGEQhEb`ION-a!%>GeMUxVDp&=abyqF>aNZ}1SD9Q1l zMEb2*FN+IRg}aZx(Ii@@w^&sAZkPXE9VwygZ`nBr%tx=WkbI~TG-_rJ}2sQCF)cNEZRbLc`eg$fPf?!WCgH;Bz$2K ztTOSVeBqBi9-0?T6&r>Lx|xp-?7ngi zn*N?f)7Hj*Upgs2D$h3b4d$%S1$D4fZpWSm$owa#RIB~rBz3uAIs_1+`=n=NDqXv{ zrg)_I@dgly7!PDUqdE_?XUIsYOK^d)i&t4`Rb^>SS&h|dwwm=Rh*J1Bq!hu|5#v~u z*)D@<==mfT{3tj<0(^z7Y!QEi<(!&3WB1g$<(cXI<61XO%~GbfcEqM7C+SKpt6OiI zo4LBNWA}_aD%;A-Y(dfKNr~3zAeNGV-AQh>u&w<^2P?8NY+1B?;KrV}lNStVg2x6v zWX_wFlUu&}=;D=Y*Q`2O*imXUmUa|=kyJdz)jqBnBL$-X|NjNaf}9Z@vARcO=YA%Snon%#rv z9`wnVg?L6fsc<9rRwJ9Rw-+=Ko+XyCm{XFh!Lv}8PLXS)QXc$^HNs*M2`b(wgL!1} z32whrr5&meDL?^#x{96O|C(#wl{0f^=8g@rW~7Bos=xW>%60cGwa>Cg$B)ZgvFtUz zcxb0!0*C3}4G0O4=XLXSueS7Ezt9z}I~5w%JF^AtXJiKE$$Ro?#3%B}M0ZdG<=C?T z?jFpsNGv$PYNha>sn~z-Jba;s7evOIIEx;>;AH2c=^6U;6jfmRTw;GTSVZl`j+($V z{FB4)UOA-QqqFSSJy#nW{akZn<^P&$-_aV^TeI<~ZT}M&Nw`~zsxM5f^SN|T&8i0~$gg@#JbBjD*A0dJk^)?vF#N-~#R&TOi9n4xE?1jj* zIr-vwdsGEAFxFNzfzP-3fY@R*LTvq_q8+Sz{U7!;)Ng-$Iiy@UdrF&D(^FB@)l`+# zlGxUNNndt@(;TRDMCUh4Et7up+_JR6mk&**wIF%lP%yp5IwmSn_fT|}IcjL5xvVWe zCacjYNQBt$M0%Gml)r!}nc$8EBTNKW8Zg$#MuvVaXHEVjb-fvGst9r{eD|8)zD1L7 zmVS)iygBh(l<_0V_>cUhmy?Vgn!rgG%XfuHi%UW=iyolcU@Cbh`r*l(t z%cjnp6JwJdRyfjQQ=0ydoD5V+4)FH>cvS%u9281;ueRnbsqL^ zE;Jeov4?YWv1xfxMux+Ykx?Z5DWkq1F|h!#cU(;oDJ4wI4(z(CK1dWR<3jO|&GWh33R})?`mCHTN$J zPs_}UOR$D&t{IyUS1`do;c!0MhLPVQo#h=!hm2F@9_*V?%myTGP*#tAQwVC*27s3{O|5xcFDFJZ*!TqP!-5 zrTjnxl^-xfzf&&feE11<%qzTOsdRR@PNQL3a?81|MbRibRr*@F zQL_X62fs2Ll2SOVsFdJL3o$7o#vBj;B+mqVM4T3kS#_OTy=+1=$oeYxLGLLZGrlq^ z)tRJy?D5zPXT0?F9y!4n85gGAv0$3n4x$NylNk4NKS&=AH=iGOA%@QX{{Z~sZl+?? zO^S3@d51=`iub;U%lIJ;QvNN#AGu)~ zg!I9hw5RIzsdlV_8tFTJw`ME)+F$Odjs;;y3ozHj&Fo65e`~L1tFjCzDVI)2 z*o5&SC%tzHhRH=vif3NzciaRrjQHmc1QQD!b&XbR+s(~C?{IHaz!${AdSW|i*qw)z zJ7LHglL{<)yeAp)&MZIwMH{F*xgkE+92sfOjgQL}A=KQ2_#E*)C*Jov`geF3|4*$n z{GUoDGYwf?fu2$Gq)UKVc=zzaY!gYzX+rp?3!xImwNO!TD6tD&iD!}W3BOl*>t#PAmFWrcZE#N9l@ycm>?O9^rOQh`&FpdgFy%W((>o|$_BcfwvD#` ze`S}gzSF1vZ}!=un7u@L2<=z*143)lR75FV-DXbhH!MjUY!3E{e1|@RmOrb!ExFE} z6zxV!*W&(qwg0rx;iApZqi~tQ5tCJj3LPnyy1yfZj2CkU78L%EUD%%)ueJP7LwWt| zU!IUoe)Z6NY%w?S9bWvQxKAx#;8E%xODIIe7e-eyOwvZ%5M=a@ZyosFb1=fM`A1lk zu@oC)u0a_gB9mQg(Pqy*S9negF#@^A{z#UT#00~bAQ)lDVZ%#(3i>ua zPL(N%zW*DC*aSihy9+TDgszdxDI?YZ7@nu}Vb`j0Ywzq+&i36UKHb$vqm{hb?d`MK zw(hpJZt08QDSMwBaD!6UW?*^9te&3Yf7d(k;e-p`S^oKWWyi)IZGIBrq z0hyfAJE&irs9Q{Eu!!+sgC+2z#B^6zi{4;}RGSV#FZ=@dI(S3%#22vz2e&pg)7bLm zH}@)M=ijxalE%zv6QVlm%Kgmgd3n<_yIMn(J7`DHgx$|?5x?xeGKw$5P~!Ph{tsv0 z0oYb~u6@39j^q``OR~IeS(4?wWXao>_nsM!W5+YGvz)#6PRJxAKoV#O8yZH!D3rY~ ztBe-fatmdJ-S#%O{Irnh_W3C#SGc9RTq({@1WO8lU za@ULHi`z4-CO^Xj_OU4;w`Y9~&9^8VR~E?o;Jb`Km8FeNfR(gT642p5os0$Y%m_CC z1~&^}hVFY?7t?vQ+nFozC#6NG9ak(^Aawk$F*hdL5Vn zBUprw7bO$ZnREfwi2cQZ2_b|ybNk;sq(Jn$$u4e~bI z_w^1#Ca+RheAC4 z$w5BILxD96tqyLhMYJD*N}-T8H;`~1m6qgWXIRY|9F`t8jTZ%|-I*lgg4tYFAvzi| z7P!WUS;=|%*W5YR_q7~qP1V^;tIZ7^6U^oI|M|9N=L_pMzO<{xK7CcC*fF#{rlh~T ztfwT}R5l~OystDy{XyB9a8ld;=N9WGA6nWR z=%2j9b)a(fbh~}}>PlVC-04m~d*^beI*!}W=NsiFMDvlSfmPrIfveFXYsZV~1(0sL z2;d0(^b!WKt2m&{MnlZ^SC-Vsg#6r$w4_8pV}mF9tKbK|aMS_dabKh7kcRm+t_aRp zvKWnrO)nnUurjJ}Mp+>e1(?3`;3GXNU)tY1GQW4YcIVTpW<9hMR9mK!Nm=C`IeLSA zYU$_f)#AE{Op8Hp&WPyTG$}E4^6IAUjdAAHwM{EplG3KEZHh{b4GcA<86rVJ{RGXO z(5kGHQz6UKDfWa3#sL!0VIgtssiB zddfxR8trnb(pNUK(iECfk@mQAZevn%S&MalCW@N)MWw}`?%UOom^N+uv@cvYYEGR{ zCKnD4j#OrprAPZ%0xSiSi&J{0w?;0oO^pqTjR?`k2AB1$X=pvT|LWF%enf5Ftn|x` zkf(ZKzA8=0=PSSfL4vxQgG2qr9k(&i5z)mtI51U`l;qwLk;a=jiZ7pQ>CO za887nz{NpwaV%Ja9Zv@d9cgT*~+`;%=zW2^0HO@XPNSia;+h)DlN4#-GCJB zd4}|=w6w~!P|;`mt5;Q5U-jyCcJ1~z_SV+!ePg@wr<+=4mqtXC&Te5VHZ{*Fi;4nc zCe6!(=wB)K+0{FJF((rIc90cnKe;!BTz6a`d4z?VapdCnQz?N}5BEH25D1vNPaHSx zI#h@U#hkE2M@(8vWLjKFaY=@Z>e2zqkoe( zz-N&vtWzWEL2#0YDMmj;X3)NP_$?xx_ z0ps|P%RZ&vV2#Og77*W$Sn3iSff_HWBEzsnXx+g3M*uwoqkuy;*vq}txRq7%VogYm z-yGv_$tpAlCF-<+i76?%y2X=ngIJeulqD^~+sE72N2^QIH7uK2tUDep$JHAv97b7u zOZL&qdF}m)=l8~zX2)XZ{*)}JS{dx}?gmE|pOzj%zO=X19DTCIL!{;Z#0>>6U z##|AgM^&SQ#^ORFJXU1#jDr^eF5wpB<95G2N8S75g_%K)u;k}tN4G7kjE=5aHuc&A zuRNaKzOa0-cusR_a#^c&XJ*2RlJ(DQt+?~}@(p#nU)hw=T3u$8AM=^$qY1S-V&jp1 z{P~tmj@EpOU+6?5qDv{g(_11(Y;6gZF@dqpzJrVQKb@YiqrY?CK#tZwc!Ju;nZQqc zk2M%6ELNwF7NVdoM92p97dpW%%r41waS{04k$gv4C@EZp#7U;2e{j6X7k!F}#q5eA zu0WD33=ssY1HHV!M1)8ZBsY+19`_oOI|*1~lm72v zG}HBGYr4V9-}fo2&e*iBOUyohqcrpP)E80MjvRzuF6UB!E%PV+U=lM0>}=!Zo3JU|g6nZB+QSV#{-K zbN>7r2gmZkcN`B4Oe&pGQNFONCj6*Ze0p9?n$0_vNq^$(g?uhrAlr6eU4`MKEK?;~ zC_$F$Od_8f!3)?QT7;RuKOv}xKvj(+ZAyIYA#Nx$T|{cWy4 zju9%AES!{;HECf9`oV-U^urhZ2p5_>yWxV22Ga>lD*}XEBBZbM0ZHjcKywdxF0G_1 zh-s{QU*)6$Xd+vU331}0;`nL1`?8f=P`7)Ml2lY}@-+m!9i*S2N$ESbkiGK-+DE)I zlhM9d4^vezj})Li7;A#~^L=^go75Jb3qod$!9uzxtQhxrCWuzhC60}D5Ic;*ZfQl6 z?O|d;8uK?K#RcaqeSGJVM>bXB2su#OUlc)1I6L52PhYtCaQm9y-_)JA{8#J6h1io# zN<6qps$rMg$qPUc=R}Jh>M(QB#Zntn}G;ts&fYT1i463y4aL0KQbe z;KrwiCLi6gFzJYOdf#A1!JKK8da)4sq$xc|o*f)~{OEk0k|sW@tLT{Js8~8V(~QC& zv=*w+m-jK&CfbMb`d}o;k<$wDvXcPFII4Mk2HD1j@NjiZ(MVuVjcV1TaV9}dW=JY90pfPIzNU9c>BjF?bbfn${>!&63Q^M7yTQ{A zy|tVDMG0zJ(NPd2O{R7ce)=TZl}A=b3eI9`6r9LRScKrJB&BfQlH5(o8;)4?B~QpR zW8U>vZ*nKXOYNC^h+ogk@ylS$tR-&=yCc;mYA1#V2gjn+pLwDoHaH|aKr7l|`-fVi zgN)4^XSA(Nw61OK+1P9hj<&*vU9XJpsNOoOIHq!>1$7+nY#FJHDW18tX8fY*>gmG& zH~oH1`{B(C)3J6AqhD|0{7pl9fmh5*OMwj)fsS!>1kgBGMX1xNQr1EZbZezh1Jlzi z`b56XKnZ_gC0pF*jh!4nW1fs46wM?bi|Xu<-;5}TL#%LQ{sW-)_Kig;wvN7;cdo9; zo3&@sl%2h{f-KiV{XMB^Y58KccYt06##&HD?VV-jO-uWAUEA*J5AD8Y z$dNbq*nsk_&jbY6_8D13eTB1{uO*0f#mJEnTAIkS?gH}Re& z;doWW=(tay+KQt334tNTeKPJlq?3*NWZZYiQ$6mJvG0t3({nj@LO){8(OKg8xDtn; z2kzm;O=OiZ48{#t)k0t|SLU7=jxUci$g%#W+(6~Om9LZ!gYu0NVkJXFnF+N+E2570 zPn7SwcKd`0e-feTx!RR*_7CwEQ@kX;Kfy1$d`_b>+X-K@I68{8KRMO-rUUp$QJ943IAZNvD#6t0`eE1#R zFXhoSF_!q|%{^1LCM9j2(!04i-V!}uBPb6^mRKb`&LV09BXxRnWFRvKMuPVsGEgfm z9{6n2z-=qa2YP!4%2(Vru<5gbS6qu0eL?@Hww73E54`aP?Ep)08|~lN(ZBP$KSp5y zIk+IffC)f>0>V=BTo3q71+PxzorcoEDFOi{qNF@dPScgH&}ac)Sb3t0$2cP(Z>WMU$tE+io%3Y6ejZfJRj2$43kOa3aI|XO&sMM2 zT~91q|KjethF#Ar+wknJCY1Wo7)yK07jIyHR1%G4J;jSQc(a#BQ0`~SFFxAKBKLf9 zd@5BFEFUb3d-AEsPh)2toRP9(2lgfM6L6qY-dF^kSist0;86`30cugx2|ff(D6i(r zpm$LM7i6gw)$wq31i-?HMjtIs_VLL?fbEk{i^HVGr4>nj0n_%+wA*LypLTZFeGi4} zN*!Xi!IB$~iORPin@FzNaNp4E`!>|bue(+#zgNEep&+?T!anbIm}46h&jwhVETo zEe^R*xXKl#L?u>E%S`X6;CxY5G=yr^Ah+IW#!4ltkTW22vmun54F+DgC`1nqTbglW z5Ht@og#7Sm4%TCm;++4$#%kq@nL}8De}K?`UAcwX=iD@3DPk{-bc(KJp0zik9FZv= z>%A|cuc&eTfJpg$ul4CQ+wlvB!Q$}fQA&X(W!p;bA; zX7e?%75$ij`%->chBH-w=s`9i^2;b(iw%h<5ZV)KMC}dI%i=N2=n>cR#>N;A8aKXj zwrk#P8(!H{U%%&-4NAFmKYlImFN=*W>n}$iUoBg4*U;>fYmjN?l9lv?@@ZKa?ZqZq zqiM=9c_(jAxBz|toE?(ThI!@^5DOIEOo>N+us{((2J2Fgy7jqrC4qDajCi03fMNw} zOYZ$&*L#0Wb);9OM`;tqH|Mz?)r7<(hOxqXm1As3IVRSIO+ECdpH7k`GZ&63}(DhiOnDo^V~E4X7{2cM6=s_>ZzG1AS@rnPBUg zP@)3=^M#0_75G0W=exWE${)Y`h$ZYu`!0DSOZe0OD!&&STo2PpbE(nl~3d4@E~;DngWE5S(j)`Kp8+T z8cDPCoDq;aM$dr&&4BhWYz>b~$mllz`%AWl4p=$Hi zjW4`V+L<32Q_@?OJ+;)Ld@*VN<8xNOw5L(FWOuifhb5ofNJU?>hEFU?u64x5<~5`) zpZ$Kcqaoc|lM@?}S()5-WNtpH#L`$JmL|xh7;9dG2%J@tlr|r=)Nel zEMs)xM}dTh;42URAkK-;BsK_VswiS~iL96ua4^2x^_H=5^&E6#+IMb{+^c*Zk(X-= znScM<3Knk2tj*G8=jKJw0E;PJeqM6!vWM5R7nQ=gzI=n^g`BNh@hm75@*&K^ozuDQS1XkL=kOcV88&3K z;6G$GZnYFTPE^)Q*B0f@9_(tYC3THq- zKtN_5sMf*i=^v*>?ERf5eNBO0(~!o>w9DdBM%q)9^{i3 zI8@*&M7*{iQiU@ELiA#-Q2o&uzE(1Xj3gok)T{cQr+_Hulyi$(gGbc5b3OnSV@2Ay z(hghEK&3_5%r;UutGKr$N~3&Hx9ize%b(xd+_>+R^$VZ83c}?~`Rv++#Lm65te;x@ z_I9Nv)XlA!^Vr_DNyk3iqrAQMgQM-0TOMCY^DGLJA)`ikydg#CRTDa5p|OHr2|b{Q zFzFB&S<2?1ErsKQYN&dy;GY3QfSgSYKVzVVyQyMuCDiaFD=K6Mg@A1kYB==5crnOM z#~{u>dtk6FJ2+?zdopH)%Og*ozUy@7_uqHo$CJvaZ+LQCq{ZOtYp_JdC5QX6bISJw z&|_ZxuG_GXw{ODO1FolhAKx(SjEZs&Hz-o$Y{svck;j-2B zdtO@0e(y@#uy3VkHAWG}5d!0a*cizTWtOQn1{ zTpS7xGC?Rn>M`iJvrxQsb&Vk>ijY zhT)EBlG3#E(fRsCPwj4=eE79hdNJX77XR{!Fu%~4GM&vS zP0O0B?D@|@gXnxx%*ifxU|%0Vd$ZBri?Cg2oT_U8+l95jwG1Ql*d@w0pwXIk{w{n0 z^Ji3^kUzr9Kpb{hV-S)|B>j{N@300?a6njc%^5ZcRv0jixHgbZjZm_nh(CnnIGwss zIbhI}o_a99IL1rVO2Nl;isD+Te6JTx-lhar{Pjovo!jo{W(&^W?)rerEr@3Jmm~k0 zAud5b;?a-W(3YRjQN#X29o64{HfO!^myh3LVe694rmSP(fA|!V`zSa+@E3$(=hRpD z&Cm5X+OPyNvIjBpJd%+FVf^9$uh6YEiyvU`=QkwZEU>7xVexa*&;H~BMYO%&o87wf)Q+?VOT#__r@ z7cy#XOKXr^2yfPZrwrb@DoZrl%S;m(bw!%?%?)4P*!)>?&$aUy2pgFI2o^Z;-Mr$c zK!$U%p5h>34T!$G6?dxJN2VgyyeUXBNfZSW`;V~h?{0ql#_!m4)*${5h6$B+#YWdd zxS4z0sSlUctEGYGS|(S*_y`&KKH{SUBqrKDpIqYXF#g`AbYpPp*{?kJq`ABZ^Edu} zfuxsv?j{%EPVq9Opa}me8R!d4U@eu$sm!1}H3=Q$tAex7*gU1l8F@iNlhl<)zj+#LV4S5b|irijy zI!diUI0?v#Gr+g1&&{28!%P-F>&AI`dGme&wBpPg=H*ILgRO;$iG|i+*MmWpg2cpp zOR#92`M|z@Js}Qt{reu6rJsdgb=cI$^!PR_E# zeuO<9TLRKhD@a7&$zV$`hAtpQgy$=eJ6{E7!Nqs^WiZ{FztwmyyxCzpr;+ zZx)-Re28PV%MVnh@o5phe&BMZpW^bNdpFcVL!P%{-lIDkt5)CEs~{-tx-)OMH6x>S zIB!MnaBF5}>u@d~8zi^LZCGmo$asZ*2of~a1|eI7Y!C^=O|&cB2bmy*8$xxsdLs5F z*&qxpCfA|c3X!Po=mVx&Zd1NK|9j=k-v{QDuDE;NgZgA=D)Sx{(koKAs=?MO+u1Ku zj}10&?QHF%n)+Z#Go zh=9obVRC!(-WpDoRI+)2dJvpbcJIdhVpuL3z8u|BFKaq&m z%vCo{96kUOIN;2lKuwrC-PG-uA*R;LFX0o(uTZy;`{GWdD+;D~V;mk42^}yIt}F`d zxUDTr)tD{_xIS}h8d5?3u{n8pK*}ipTA18@aM&suDypOj0mf{zIolWjMeAmk+qb=? zb?1P?ttp;;>^b%uS8ilhLKp)#egvqp)ws@0=-*Gob@-P5(YOw@;R|wE-QVN4$E(0qcD=;v=NTs(CSRNiF3Z zvluh1p6TwE;Pu6R&>j>QP_)2C zK_v{RWTCK5$cA9pL25wLESOEe!&KC zv<;%_(zfl(n7X2-Zi&Ubu!{IpUCGw8WG1C&n&PoST83_zZLh?C_SrWKiKksHGrPKG zUieA-7AKp$7MzH*u2J=dsLhsu&|JcTA?FjESg3D^_$Ag0A(s$LGZ+jeLp*s?DW2x5 zhOfu3ZIB$%>2+asi=Qd~e0SvJ^5WvndVlW|nVn=zi3-rNci+`aj7m3I)5Cn_A6W75RdvlPI|?m~nNgBv=ZYT3cezPK;}t)KX$etmsHb#NL+Ov1-qerire@*hx%i zg6?-hZo}F8vZ^g*2|m7FzCIVy2*B)!kwzXtzu@bu?IN59b~LOY?v{lP=+>X?Kk-HW z6<=RIL^!<1f7zM;^S{T>d-^hj93G634$dNKE(>vU>CD0AzzICW$(1Tcu1yW^sG3%g zTLCke2)zb#)h2EImA4_)l9{D(NyUBZDrR2OpDlMQ|Bv}~YixZ72OBo_I+#nGU`U8E zr5JqJuh@&`_Nw%v@~!%m$`&)pDiIu6w9P2q zHIZTj6Ol7T-Y2M55YhuU{~)v6zFyj8hLulMJu{_OIm7M*Pt{$@ z8D-I5r$4Imun${qSVKBJQE=+_;Ywgn^4lz04_ud7=<5%0a_{uMDt)6 zIaPHb9&+CxbyKLlg`ifQ@gX+2k8F~(JNc&6X=jG^e*E!cPruI`pDCZ-)5acEYCV4u zk$FwBBOJGuy)xDg^qtxP?1-HRbd8Sanv5L!$#$Y5)dP6q@dz0EYassKD8)Gfkqs3*3 z4I|acU*!npoANoe3CdS~Vdn5)4#KfqFw{x@+k!%jk59cb(87*~ssNOgw5;lMqV#H9!y(ZlgaGMTSMvRWmSgJ2`xp+g^j$of8!LO(4Z zbQl>9O_FznIN`&h{u?ZQ! zF-nv4D&u;a2%LlYIMW|oHIfm%k$;&q!Pe95=`(6 za2YR{DQB7U{?*C_(a_8hsi+6p1-? z>H1moX(&b>+Em>;W&Yyw)prkP)f7i1Wdyeu&22@p!qhbl_PNW}F8{>~o}mzz=*(Hs zIpwdL>lZgpU2Te6HKl3wq*V7%{6begeNkD(%(A$;{EDj6lGe?cBXJziYUpfgt{5a9 z6iaAMU|!^qrU?CbQ&z7T1A*Et<5Iy^Urqv`1cc>v zSE*#?>}+&Nf7Jyp^WKx+?BzV>eJB62_pyj+*DWX^3iCI-JFlBxtTLD*vH_jFhv%)t z0XIpSv04}q2tGGZDfR+)5(1&|MnkAI!I%=C5)~O5XNXHOd%NA>7kPH<P@pQYel!+-d$mJ&9Ibp+JSVo zKyRCXT_$Os12UqFYEy9RD&dNQuFzv7BGaQ*QJ$lp+B_fFs&(!}#|w>wGRO@MwUJz}JZ=l%+ zp1`w!Jz!ZqGoU)HTk}L^P@XH3n=9GCaiAXPs(mM3o7A$jzG`l**-|sNs%~j(67vn} zJ@vIuTwZ&DZ)9Ycm#huZ>on2Uh>05gkyA=nc42g4m~UD^VK)0<@uOR6YPLMOn0@DY zrM!KgSa~icp{vy)p(5E41S*mXii6wbvf|y>TkGdlxgOnf-D(skSudSS%WWNUzPJf2Xy z~{1>Ij= zuJ^pS=CoLI#c^}}v1R|f($abRTlCHQ=a-hw-%p`ZU^ZGuSHYf6!bo}nnQ9a6RXLf` z0l(C+A$YssAf7Eq000jOz+#HS7#0sY1!&Q3oB=T?!K03I#`teZNZ$0)N?u6bl*Of2 z{u%(sFp7cXpvU}-FK|yZaj(F};42ou7iiqJv6VZPkTHgW8AEM|FTL=B_`(b9!ONwu zN8Wm5usoB!_}0s(|^1Vm;S zOOhwD^M$7AhW|H4L*qzA_AdLDm!!ooYA}pH@+~5cO~bQjEIp6-+7t-p)$A0-s`Q%C01D72ip%HnVrNp!zkqe{@R3Gs? zd+moi*asi1c!gH?D=U726jBm0z`H1UB?~z~*i8lR{BSAr_niv)hf*+Lsz5n*RwwxT z`uO_$zz6^ry%u30Kf%}E&vy_t8Gt#M;DaKCl*pvAn!!?!l>5ixU$URZhKTZejVd6TP)lN*&2*Y(iRcj&o}D>xTMuvpdY``Pv^%HL0PggFUU3 zbu=|h5^ospWuNb`q$OlJf-Q^YB&1oCJ;^l*y+hGOjx@4SfLDY*aZK}P==zg|KH))U zNDcGx?He1{I_6KltVArkBEjEB@bRZ8fI7T5pI9Usr^&~1M7%bm`M;^OI@#gmICH8)mO;QT|b&d-@3SVnw?przC3)42u*Dp^jK zPm+AmBqh}C94^kCvC3JyBtCv|ZP}_Bxy7@0)W@Vo`&(1PEuns2`$r^1q{R70r^LLL z*06f8-I7tTYs13$(o$zlOS)3#o-MgKv;WY5vbl3>M@n;DU2{su)=su@;81_&v%#rN z1A&kgyR`q8JHi3HaQA=rk9x#4r_p`o z`+x5ihu*qgIfQ!QF9NHkW^<5-&Yd|$$V{rf=nketqefc1E`_5zn92`DVvEEX%4E3J zI&2A>G@yJj_m``jHCunZWa)$J%9Jm9<^%N=Wv-c1^^kIi^##tl@wJsKe%ps9rk8Je zV$I%Nd9$u+Q{HdeJu4qFgbAmWgYtCfW@cg1SY1du-lE4^b|Jn4`Ot|kMGzboRUy@! zuS;4U3peQ_!1|7F``Cd$E>)d3evN-cV{p768Q>8L}!F zBwSzNI)V|Q*sVpvDUqw;e{B+e7dx4;R{7xJ`#)AbtYMZ{l|R=p)35J2!z_);N9@^q zHvLk0mhC^e=_H$da?43pt;{>Q@t5>`msP%H^aqU#YkIG`jl-}&nFwtHM(8lqTQx%` zl)J4-0|4oY`*UIGB_9*HYA8Mipb^sj;!m9*i1mB`50u2FpmP#}T)-Iu>8WOUL#$w% zYbbQCx8@qH2EFUO2bdVoPHW;eu)ob`?^B!4pVJsde*hkrV~j997%GWF+(8CI=PQMS zL&5Dd!OvSO7#K(!2!2~4BNNmMe7NcYG?}cf2_Td-i-wDR)Q)X-2tIClTB`%m6|`)wzVZ#%l}=(UFq z?BBg>!PW&^H?Cj3YT1%$BhyCa3=aq$m*3enKibipmDQXZy~xjy5J^CJ z_Gi46nbndTz1TM_Aup$vU}P2 zJL8`x|0Ag?JBliO>&#I>K~ZL%^37%M_+0vq>-$UJQO;cYjwa&Lca)!TAMA(kUsVQ~ zkLD$8Hy=cX!0ZYOGG4F>BhFZ3Tqu%^t?|)e1_;gotZHB6Yb98sB9ZCfse@#oXtGFz zpOnYxKArgqpog&o=_5-03LH4x7+#X=H-2mSstYFIA2G(CH7a+WTjsAk$fip-ip*K5{OSBZMCF+( zmXH#3xa=jVFX-Cx7mFq;_p*NZmWixgIiUniST|5pNdK_=0*_X{e13n>(W;llGa{?5 zQrN2N4N`_5s>P@R1U_;A?lZI-JQlT+)_mn^vBHRviRBwi9PF@tvj!vz>aV zi!e@*X|0hbFk}Itsj}OB5(y(;tpEw{iMv)6yeAw!OME@tx#ac*!<@b33Qw)7L`s-N z2r1XX-Arn7u7}=BJ-q?l@X+6sFHi>OvtQ-TJ3iFGt5z}J>|I?{>j7n}?2`)XW<*5H zpt4nA-fispwrML~Jv6zRk}q9XQ4_s z%RP!Ja5IxT=uA|^g#O6GMxvb+A7uvlH;kBPsq`x9+TdQjn&nrx7kB(!`Ch$NN^=k& zW_qcUQKkbcqu{ z+Hr*19S9`wHiIemo~u4QJ~e;S>xc5%^36IgcIQp^sN}iIs`^9kU$gM-+Xml_v)8sv zN_hO&t`m4T^$A6iw!*geP_odZsz z(ugNB0S7v|c?$m5`Q&Yd)lwgfe_(48n}HFIB4{{T*6-sDFAAnj6gjB@AivNqpoh_V z^jrhQ2~`zE&$aF=IR7T@&vS{P(gYJE#78trpqx`73zSR+zY>_X|BLl2H@KqjY(tIK zh_*X}{)!mc;`1MhU7vmCx*f0YX5i}(JJ9ZJ7@?=p1D$}{OKQ6jNOCvU(-2=DG#U;&vaf)V~RDRD&lp9ZHAFZOigsP)yKoq%Lu2DJC56- z9RX;^n;5@|ge$^ER#B1g3<2^$P-POi#6NH$0b(p#kJS!vvMt2O;EX;}pnR#kBDUCn z$EuK$)uuctwzy8qPoH%?DOR|uUA}l$B%bvO`utPRLaNTceb)Vz%BRY2#MbJgY(V)d z%T)HVtCW>e?f+7wR}ow<;aR14);;K#zkr+$^puhmsYk4n?yrKTkO_qO#DAXc0drK{ z#enxT!s6^y9#Z~+T(^HPf2l`oKYOlBB^|*1r{b2BdUWOctH7t9y#F$krcPGARX$O^ zQ$Ara;vRPY+4GO^`gOFfvz6O`2cnoSc-zr_H8BmQIMp*iQn|{^fq)a`*P;u-Q9%(% z{)AKBhPbY7q72?G4fdAI5g>ejiT|Tte#^}Ckd%tP4XvUjD>ldr)xLsa(&IvuZ*Nz= z6`z#K+3Y*tp4WJ2>%z7Sc7_>qtD9O(kqxcQC06D-B|mbm4o%|gX0q}P=l_8Z*qNz^ z@MraYzQhtnrh$L}x+uCO02#*+Z_!j|Gt3YQ82}}lw~=#$(f%ji1+|Gk44qh5l-RnW zae1;Mc7k7AZi@2l0pVxwb? zeRrMN#>(N+pYqp?$xADgC#D=2E|~V&F6Ny5z}AN5ea|gZ-d^{Ise$axDc2O{?rdg_ z4MW9|%XaZGs~G)Keh23|a%qKfXQ_=z+B7&qF=FtBa!HEbs&H`})ni~j_0-0+Q(!YS zJTV;or!!_;|GA|NwM5N>MDNE;Z_dr@>HQe^TYhKO$=bs0_3Pg_)KPzuYAFy&}I1&iIOCZGE+4K4Gqvxt! zC*3*vM&z83oWIg@R4MUup7X&I;*NV*5Q{yGt?DY4>du~Z-6_?df5`PVE93J>IczoP zj|A=UnA0}~VG^uf4KaKA@`DiiqlAcp23KgLnY;iJ*J5x)t5HZbB!fIPx)2;!KYk_L zgD7qmdXj_hzV?jFr`;@~`DfoiXy8`)uc*E_tvwN;gK)_>Bn-VkVY;Og@Hi;2L${tKq?a^ z8Y`T8QZOz!>xc*f$X5Jf5a9DRaSjMVvAT(~5ZL9=Oz6`qnaMVszwlREYnfJg9~`Fj zj=W)Lv91sN{7ct@#h{EmT>vOapr302WbWv@qhHB;HO~`gd*^lT9_I_{@~5+ zFN9TY94KTy0Xn~b#ih!x74@zx$jF#A$$@i558UWM$V|!jVz+G z19z=&^eXNzj~9QfNk|B6TylNa+*{`7GUj^FD=w!dEv+Iq-LR_arM+gmIaJFMMWlS_ zYBxVLFQ|HGOH);UMAz}9=eCA=z+Y@<(9)L@dymX3fT3|1h6dnd z?3$~7N6PY21c;_f*}AR+&#ztZ_U$wO5a+0EX-|0k5za7hKXSQYk12nYS7U!i2|#(O z+J=Ni00QSuMdXTxTh9Q6fQEd9Xo%a=$R$m~ExdszOsQWrC7mTr-8o}XS06JuXXHOf z>hkh`u^w@HXw$;0rx$KtKNt4KhW?`I#YV}K(u-Y$w(O%ir5KZN(%(@zPvfudJ8VY{ zG)>4?I!DL`qrnjg42CQnd^KDMCs;>Nkc!Tyqr`3By7P1J22u>~V5?X}PXAuy;-G+P zPIzIdvP<~_`*6Rw0`rrkuP zO}V`1j;obTKhSzjo6KIP6koJS1V-v>c^Qv0qze^JXAEX5S{iwx{phQ#Q~*}AsW?$VJrbR zO&1cIkWZha@_f*>e@h z#~xK?M}P4GA@;I{ZyqCaI=JCctj#6La(N}j-z>~=`cWIrY8x9)W#Vu%|4380NahPQ zf`C)TOD_YoP3Hauo(UbsdCe1lPLIg@WS9J1H%Rv|<+`WdXxaPh65ge-*n&y6f*Gap zmfCsMyQOKLJfaN8eD&PWO}tYJljGCSDsL`MARk%V*+3?6SYlnAg=XCd1rEI(4HkE zAF2EyDiD>T#F8DAm?Jm5ytlr7@5>urf4#il85`^DFPBb~c`9Qi*fTT$qy^Ak=CCS+wMCPak8 zcaNZfU}h%TDq}6;Y)jy`paK9mMZBPVSuQkE3>ms*NpbO#TZSYoGHXs8kPzMhh5#1i z9}$A8u#VX`3@a~7iA7eO&RUe{X|*Vv%VzoA%L>z0u3wp!wtVfX%(br_Z2jbtzH~u9 zxE1x$sOByZXV6K7{A6IQjc^|Va)!mZ1o|4zNyL!dw2Tz;hxN#*V-aOeN-!sdh6HoO znd*H$kC|E~w9U#$EJER@6yOI8@dCVY&hekz9Vq6Rh^bZdK zD{$V7)fHVkljCO;*Dh*IWT(R7BQ2r6K6*=JQna@ywk~{PXJeiyp0hb>#e1)v`P$5^ z!CAw$J#X%+6pJg1Dylc!JIoG-r8Uhi*yosDW{FL5#{o;x=bJHq4q})IM;8(KgFXNk zHO(PhECS6T&*b3p!9z}D)n^#ZMqoqXt0R33NogL8tLnJp+$;JET@MYVxzu7>+0!U* z7JG8Z@ZhwbH{KYzcSY&yk&>y7FcuMB0E#;FIXEIk6swkA*Iv7{Ekj}(vfA=vKbtpq z%HZdYIX4WgxHBubWYSRn{HP@HBz1M*)#1HwTvZ_&YnQardDk%diA?!{IfOumo+-zX zhKUJ8rUwF8@UFwbg6)DJ7Evuhm|!JSMit~9I%P=;jpY4O`D4cQVQl(1g$x|lDwhmi zK#c!oN}HoDO~+!AB4S0Fxd8ug9cIqnxvcE|)4ruezZDO3HZ^trS$k&Q9g7Raf3__& z`==GwCT1o%#H&^}-`Z?#X>ChfeCNVkY4O$uTkbohj{JsCQrkfxA_{k*X3dM3rxYPy za5{_iOcvs}y^x(nzD%U-(^)Jxn4! z_DYwLl!tQ|BB~qf7?fc|w{_XISlApZ3++ypJy(*gXGLn85v2xb52Mt8o4F8*302h^ z+qux|Jv&!SA4=`NVUba9aTo)|>){tSnlz$8_m5z#cu1)7s)fyIlKiUTcux87>7Fyi zTVKCgJaullCF|miYHD1CFuah6@i>L~=Ho%t24it(Abc%)kLh%=34H4Z zM&jHk=-p6NyQDo`mZp4h?5i7F&a#vl2WGL?&%4r!#p|~AKGQSf>Hf`6ZzvTlZ5zSZ zBGh6$?#KEt3bWPqVS>m)zAzm(bnw71^-?1PB(G>>+*AiYauugKxFFh)?}%|V3LxnK z&A#5G(hrW!^SF+w4o(CLq%0ONAtr>`h$ zTr)LW1}D-am1%6 zN>)r%2$=`)7Z5ar`~_||tD7m@<9~H)3w))Chu6P(xUKE*o9maIswgcxFs*#JHX)&Q zxO~N0NsKnIV4YPIr(XS}zUTH&i0b8&+k4Vd-!__x=j>}y{?)dBZn3y#-qcf5r`|Vh z`Mrxl^}r)V1L>5wIqljP<|og8;qWw5?E6tMd7X=Llk*o%=k2HUbQktX zG}Y^KpXQ51w3Tc7+`{KDZh(%l%&{;iI!k5@LMB&S6kC+%q}vcK&&w*Wl0;)P3#R>B zwe9|lL{*unTy(gt^T1Gn1{TOCN~F0sHC$XeTytHG zsjj}>OuB=Z+I!s`PrJU6Q2|aUA#Ii@ehJluHA=OIJaA!XLRtxWgBy(lhnJfL7+Whr zmw=KzD)(;)N{c};@Ss=55NXu@u_8V^<;#eG4xxd|H?6WyE{JX1`{L?>Q`?%A&to0+ zDdoK-F%kLGOJ96(!!}FxP}rg$}lQ;%#snH*N$)}1|c!yHHcyd!gV-*_`M< z-p|AP*Sp_`?{Vz?9j(buORrG7Ld5gO)MM^-$>s|@!Avsb_1RM zphrLg22fWK%o_nA3@DSS zl%4j!&>oHg<2NA80gq1GZIWM9Rz<@0gtV{9Z1br(<%jxzLu0|7m(GYkpglEgw)~nP zJR>-9TfAS5e*RXQf;BfhN?Aus#dQ%GPU{{tkkv$GmE)D|t5P&|Mtn=z z;r@H?x$qME3fqg!C_W4JY)gx)R%a8?41E{T(3dIk!1k4uO4 z^+smu*n`xEQ6N^H!5?^n^(pvE59Qq8eeA@C;_6T6$)C7((mWn!|B_}){|^|kFywpT z4PMon&I^IHB$?IX^03Sab-+~+IwaU(W6@McZbxxkTyclP(NScSg0m(U#m5&-&ML@i zFESd7+OyC#toi?ezqcBN_N+qSXdT}25&~Hae$r>NkWawaH2O?=8owt9fsLb#u6Pf> zMbi2o9VK4_IUV>5ayrlpx`7sU)nDX?kwa*N|GW@P%EQ8XVTUuYut47E!5T|!550FuV(N{-@52p0Hs#1 zTrhvIKPf3KDani?qZ2SEDjbeNl;cKj%*>WNVry(fL#)ied67uH^Z4cT8j@xgy>oeL z6Du`U3^)rqr;G&Yapbl%J44 z)R=0Di!-G*4&_UC6$~||r8N!}nDb{frKUE`%6Cof5vTT?|1B73Lqd$nVF`w0{=$%O z**j8?`c{g;j2AkcF@@(oGqy|EBy~tPVWwl8k%+3QC}4p@W(mOz7K)G{zCw|CZD%%d z*8i$%pctSmW;;R{04}toHwzo3Ht9I-li)OwcM3Oxiy0qH!4D2p$F2C1(uPPRQNfM_ zoSW!ik;-QepFJxbSJs3mYuEvHHQg^v_*6P3zeOtWgSc5{iUqUBZrI93w|-h7{j!4O zk-wNJN8qgUg{Q0C2|%78Q+-j2DUu^m4^@T$D*_{61&{U@(YlL(`XB;ae&JKNK!Mtm z#U^08R62exT!;n)0aYubkeHXW(W)_z>t0e1fI<+aGykP+aS}ldUBL2V*JX zKIwOw#~>Z&HJnO73&49K3Of8VR#Q^_1*w+wF>v9)!y@`62t}L>(en!x08`k-dC=RMd)JiK zni`h1DO&bKPF<=lHNo|s6ohj?{3uu)C}Dt| z%&9^ud5dY>#A1}F%FfEnNC%m7Jms>Xx`HlnB5hHl0S*=DU__2@x58n>|9ZCOm_}j1 zB?e?~DxZka@#67wA9sdD2WiAxk4raPCzr3fb0&FDlz&8Lmz&KcY2g}{uKZDhMACN? zN`{g?`9y1Vl*ZVOE;)Mr@U06A3+Er1VXH|EiOgxSU4N7?aj>MX!yazJy!T4EcswZPHJ*eVvx=lWTxVQTq0hfcp%ht&Pag6#lUf3U|)y) zx*Tj)%5$3o=T=jKe*#~JqjEf*ftcE!cmcynu4CHL^2le z$nb?l(ME@-NFuE&JN{AxcB}#u))Z>GA6D*`GTIhZ*$30&3OALn`OWnmNZdPluXp#+ zH`f*~FN{l>nZ5hA32cgTH|r3+J66{l1A;!C7+AUUwH=2y9NPBs&dQ*PXC?+;bIYL( z5FB>&={UCo2{GR#_&a^4Piw0#%mkDm^Fqe)n9@83@K*i382K@T_SnH>yX*+kK-h`X zO;tk`6~onLbJcKp<#3hh2|qmyueeY@zffem$LW3Frz_|aQ{^zOtTI359~P&>jC%Wp z#`7zcT_iE(M0;;tN@m+gaZ|}iduB>qzdghf6KqJZMK*zE%@7i84t5n6FKElmY+FFr z(2J3hNHCij60&iP`^6Sj^3r}ff&G-IIVhNc%<+CW#ex#*nW}Yb2foOTsTl(kQ9n^| z49BcQ8ZV_pX!X+2_7^uh(`IDZW~4Y~?(eK!)0vew|E6JsqqF?W&dJF!nRdN%<()(R zUS5wQ@qNaeJC+t@bZ%@-F5JC)V`fG{7wQ@Rt?2l)R9nHMX_yzn8LZMgL-DrV<<5LQw9-1a}<%*p1S+ORATwJGyGq!F5W= zwq3i}VfmlR4ZP?~43LD&T%RzIT(Aeo;8W|tsdeEKabI&>posfgIK)fFB19evDV0W! zLq<)vc+Mu5kRS(7d2FzD=d!*^OH$q7@=fK#5AA4n3AuZldw$)iT-~rQUyQO})nhMC ztRGr`psDG=`l0&7_N!l7o}oNyD=aLPlFRayZ&*xDF|^43(eLClntOx{_Ux!p{4)QT zkib?X2yl_S%x)0`{Lbwx@k`PwaeWl7{}|_F277)qQ2biG-tqb~fee(x-OPm~@Vb*bO0!SmkLJb>^0*Jz3O zjru(lV4?OM8rQyWa5;_XLagnX8U<`NB^Xm%QgkrQ6$DGV%1*^g?}mn6Qic2yPJMtM z>e>zz1r&EIDzld4<;5pOmNazb?Rw`>6Ik}wta)N{Mak;ZhfAmBhJ`yiO2DWZ=4;Mt zlzsDyIu8!zX(#CXU-ggF`!D#N^7>1K`~KfU!>#+DTdJQAF42!N+U6E;KK=auEp_t^ zwqzhzA#ZOS^^q-DV_=1SP)jzSi|s=NTWD#NFELZ0xQ{HpX0e8;826v6kAmdgC}a9P6lAz{e< zV7t zAwUQv)XeUPCRj;5|$UeW%nc3&zNdou#{k`u$ zZ}hOw?wmb)=FH5QnKNh3Ak>~;YN&H~a=eADWpYN8Q%FicKuU;HR7SF;twnrtxN~T# zA7uHxQmnb7ixhkyCr6peljYMCDV1wjV}IvlCwJ}PuTh^teC zcmGnqaeJmF>8(E3>&BGJ*G6p_AJ^0JL#=jj@jX~YQ0KP@zsQ4R3&B^&N1e})gRMU% zoPv5JL5!XI+9-`4Y6Pc9JTh%xOkG|`c50H3SA1f6VBWkKtC*R2f$2%{UOvgG*&%r= zVjN>?jTlM5r~}44U?c(~i7@J7G;<3Fh&^z4ppBb@)qukH3I|x>L`|G5*h3sp`00O1 zp-?nAlhEEBEiXI%G-QH{$4-N|IDiQI~K{ zIXhGQtLW8`J?85x-!x~B|K(;JbxqRv3 zd2?pZte#didD8fCqeoQ^8C2T0PeE=*dTK(Dx0|)4$u+ru9@8wx-JVTF{P< zU`L(5AGzaVUhj$dudEUv59~t6u8oFf2TnDHxc?7e!Jw!fm=!hij#x+Z=&Yt z?~j9J(c5wm&41r6N=+^5lbTxC6rbwp>Ee==Jhd{!KOi*J-#=8c_HuFej?ajROpCj} zJ*!%}J~Q*)2W{1w{I*P`u(yXt@1lVH`TINC_vQ1;)OcT?+<0Yh7W>oun92U6z@)sq zq%8VpVR*Ppu!W_cQ+SB-?!ut(@SrUEXQ-=}t9w*rT;w|))6dMx&YpEfGqxdT^yr+1 z(Mqhlvy!oVu*M=F!kqjUi&|*TP&Ot? z6l`*OCd9==MTFU7(y5IJx729Ku!*@Dn>k{f2E#Oy6MkB2oLu~!;x&*ifiyuH(D8J~ zY3X@gPrDw@kpV7&g;R1;#`g;s-;_dK1AXjVJ*;~BJ6T-5e7PDkYOFh!-H*K=t9kpL z8#Zs+dMBsmgyu}`7wnZgxhOd%C&4{FI=ELrNKjnN$hM9O*{TuKa^X3g`h}jO+JOl)h_rKzk4uzOvgaM0I`!E6Y~xkAb+Tf}$rIwW`Dg30v+K^z z|7Jcr3uavJNAg)sj;y!sVQ%S4Vv9&=OK@zK}qw) ziR(m7+)&rxnEc3;iN)co7DV(d>Kl%OA)tFjANiKXp!WNJCc zpo`{T?3*r6iuPhkmTOqLzr1{zlP{cAzpIohFmz52LT& zWgFdge8WnBXCx#|s}iUoaIL|~MjBx@MhrL=M3S=D$(Qy_%&GvisC=@`hx_+m7rk4Q zCyspejr{xS)wjor)=YNbUmLD_jM27u#!?S@q%XB3J;bZ@m!exl@9TJ5ll1M4Biavc zuU;)4RDNOa#>yKs@8~{8U2{X;U7b#a1oFgtMxA&0451oIP@ z$V2Fm`1Xt^mlsx!PR3zU*^5q9fBp5y(L*bLx>h#Q4e<-!ls5+rtScY#m|w4iqQPO6 zD+ULNx0E~mk_(E&7p06`RBS3{jD^af7b>6^LYe&@9=;k$JDbj|&}iY!h#G|zF4kIU zL8FkJCm1S(A}|DE*`duEkIgmC%W;AlrlA=4nWp9P5be+>o}MuG!iE8ZHvDz^taIxI zTPWYJsEH}h3JA;@mJm^v9Vl*{(J&>p|GM*Yo}7FB@%~A;8#6VmWLnNsg){mGJ4N*; z2P=u4dpHX+?gd{xS{)SNeU1IGT&A>v12VNnzN|g0-R*3E*3(z_K%Q)3s^QU_S?g;M zUzz#R*7EW#FI1g7moO|lz&~eHn!I_yW9MeHRzJJ8SaYT$I=Ii2oD=Dj`-hRNno-6n z_t$09qN(|%<87LHbZnJkQ7hv?Oi@^w zjzO7@K$%997a`7Q*Ww$rCM{_Ykpd17#!}UxZo*1Lx>zk;JA^1?CF>C$*mcYgU#3na zn@poVd4$K&HN2N{pD zHZCOzd~Xh0sp1Prv`&TTn5%Ld+pllK0zM9a<0|FN2;uinqInrKE#*xpJEDo2!|d1O z_rW}$GSw}CjHUz1i^?n!|6bN)las^!mqlCUXL-}jj+C1>rArVqXf{L6q2SX&pnbw9 zxVaE96bg1xQ9QjuL{D@K#Igiz$*QwArc%BbaAA>JV=ub&t!o)s)w&>05?w}C7LOL? z%^hLYC+26yPd`*MeTukv4!&^!d>_R(deS$n;Qa~0v;csqAlXgPf7(0P*|TrZVMM-m z6g5}$mEu+r+mpp0ailU#Jf}P(o?ouK0(m&B6{mIF=~xchq_d`iHa~X_8lG&r;s|4n zv(;F*ga@281wr1W^+7vbG8j4!kWoHd2j08}s#MG#$BwBbHr)Tj1z zIQ40iZ997=T3-qhjD4FLU)fRlL3v74eh?kS0ayl+p6@7vNDHMGz*rT^Y9iVM#pLLX z6#_5{auZQj#=4J?WdTf%4;d6e<#twT6Z@}wVa~ks>-zOw_rkn6FFanX{L?GFA|<0D z#ls_YSVnS1nwR*^jC1QsO4gm5@hTluQi2mp#EdB=;o&7y(=Vn^h4pp7)N}|_f}JN< zo(A4rg(&LB(MYKyr}c{m8>>6<8O->^QFSi*V2t9is%g}}PTk|#$Vt=ezp2J;{Ca5 z#9J>83oo9UaWP}+fbj4EQ!}XiCCp9)xfbPP4_(Y+Z}U+eG>QaIW!|NZSF1pPZy3%2 zXG=e98wTs$FzgXw4WYJxF2i4%_BT}6FQ=YbTHupb7Ay8pK2RoHs+=rNsk|iaRi??C zBP!Qa7ET+O=B$MEkQRso@P|@dgK`}O*=5sg31dri>*STHMSOx9Vie^}&Z*4lwop@& zk(QJg9U0&lr9<5&XWQThju_~>)N+PR6?1ddk}0Ff@}Z%o%o`^hRvoHI>9h3sxJhSL z^_NiWaG;3p8|UttT$wZV*u1QMtDdaNTs&)BpHMhg1?E)5#+Ssqiy7WgfnL@g$%Ez( zD_b!vGGy4MiGJx}u8#hZuHNCko;I%OL+dIlR+NX@_@|Z6=^vLLV(%P){2;2DARmC7 zu^^1NJm`&S-^+te!Khu(0-%f!D3ft+d5v78Idi{EbLLCD-vIgK<9#OqdJpGDV1)o$ ziieBg-8mwxV6LYndGH-6{K6$Cr=nO2p;0G}966S>l;xC$>g43=hAGnT z9hOyN$5u(dQ=5$huP@+R7J^5PE2${bRCtcF5qTem1xkDcGi_h`PnvAq3%+B4$^aZX zKTr%5$+M>P9@Q#Q@CB`{_|;RunQT_-S$1d`P%NbV&?Q0vm=p`_z4#xCwDFo$te0F- zW=+G%RQf?<3{oGd2+F0b;|%zILrNw-b3l6|Xv3c*$J0^=bq!8Qn?9forN!D9+vKj% zFqJy$Iy^P@iYt}Be)9#+Xqt!LSsH6`MaPAXXT)_%om4F4p~{Jv-3u~42RV4=xKR+O zE`k7YCI|=tf`%aGi9N(6imVN{|(Ay7s#h_Vk`c;nq8lNzD48nn695L=QV{ zd;C!HqZk_R9PDLh=N0VixlnR(vv;%B<(1@m1iRa6q9|WKVc=XKZ@?S__DZs=qBGYf z2F7a&a2m=>Qktixu;i0-Tm~?U%4ullWV3VNxHMY~=EF_BuW|W-&lho$%0lt@;Gtq! zzli)u9CvdocfrxgQ;y8b3N4-6_YKMCytt-lWps8w_o$q}@*OiWV@9nTnlrO%YT6<2 zMQtV%-^#$Zf*r`l1ubQo$@{9tPx_KcNw5tTY?Mx;bMcc^m17;la>9MnBi-?FvG1b# ziV4RT7xYf(7a3QU>Rr6*^n}5ORt?5_yyy{E5LP+HE2%hgmDDcw%lC-#bL{0F>^^u& zS$KH)va-kl*|E0PQF)cALskxp2p;Mj(+VQ2>(@DH`w>Cunw zADtUwKWR)rQm9WaDM=dk)yF#Po|f_BHxD1QV^&^N<%&VMiCBCN95SJYos%Wy;Qxx(N_)v%;oqOHJRN(QC?wZx|bwzwpR} zsi&6}Rh_%L^@F^zE~7_=b?8$8DrW16j!-fl>dZZY##CPFh)@1BxxDAAv=H%WZN+bHkd*Yz8 zF{6*v^_elebY$+F1H(rgn49ybdsKEH7Vh2MaezP|uAT$(^NLII^NTe@DpmwLCiNK_ zJ9K$@XlVKJp%XWU1g)qjTQVdpY{-(1XZ+%E(hdIcP4GwT{{+c0BP%;St*D5~;CaKZ ztgRW#z|#)(iB924Rzn;Z8yo8(5r`eDlFV#FIdB%620u12(<*9y?(nUX67v=uoiP5$ zqJr^%`E8feZy9AyBL;_LN4Si*>YOsZBsemD;`Y(Q_Rq~rUvzd+N&9d63O*ATMtV&d zKN)_BA%jV^L02Ui?r0h{KG0SEs1x3FQv!D zrKZKlrim#->IMY`4XPV*sBB4DNC^J1D(};${A@)*0b;(1lkm}78hbOnV_>t~*ekBar9a_y)Yy zpSELd&7^;ros6j;Y@slzA1q*JC5m^Hzc}eV{X?DBZVW7$SDHSnB2j!pN{jUlb+gLK zjE}d*de^?D4H`=e-P*dui6zlK8N;BE9DKrD60*AJ-oZ)*7W|GXProM)P=-p&r6V1q zq*^E_pqkojBH420W6d4Z|1v4bu#H~&zFpt8%n4a*@c_a!3i9n$p zC67cQDvwSD0g4T284wT<6cxs10TczrRH9u~A-WYEZ^IfhHK^H?o|sV-RW>ItZ*Ez1 zpNzze@B!1ab7l+(e>O8FCOsoICfy-2GAt@8A|gV{POb3p7@L<`f%OLblQ-7Wy&{!Y z@N#8g82v>>iL(OW{Nf)G0r^Q{D$2hZ?G3TDpko5O+-=NtUXW>irK-H-&MNPtq+vNB zdhe33B^#;ib7v2U$zObYqRolGxL#>-ZXq7lsXKf6XU4jDKDIiosx%75xuMBRj!q75 z>~OOy&P{Rjk8)4IWKa|%rS+N{Y~5G&&trvtqoYJRE3H4v%lc)xT+^X@7QKxNG@{ix zMEJG9NDw;0SL?4gDrdF2s%{uel+s;Mul(oP72ZkxLPPr`dU+-G38me(H3(7@9UT-D zuY2~&jo^Yh5N z7A)P<(Nl2amd=iP=E9JdL`QFb+tMBm*80_Qvl!r{d^jsGCn40@J|;QKdj{nLTeEOF zjHJ5>{TWNAu+kYuh^3(Q#|{cj|5#Di7qy=(R5+y#+D1>F^>|GfYk?uP2$wxUh>i>k z@%1)^iL|8Yg|V5M?92}86RKAaEd5D|vJ_ppytH)L@aPw81JXz*+irA?$P5ThkB{@| z9Wu`~JTt&IH95t*cZjwzfj$9w@m}l~%I{C5 zUSlh~fwFn{x;+bo2IHMA#T-!TB?My^Ym~7XT6=ec-qSOmOk?X%m!!F0S+F!`LPc=F zsDwVFdi&eO`g;dC>g+v(9I}%(_emU->+$<5L|GBgNdWHArx+H8leSiDorVlzFo`iu06oi0MAxMO zunk-heO%y8(SO*m{sHM>F6zIcG4ursN!VLq}Xsf$D(ybV^@^=>Rj(lC>);PXk}xoKj7mPJ@H_*ypz`W zPlLxK?BCZxZ_s@X#?;yD-t8VW=tJuKh4$d1rc!5x9X7Dd8N**PgP$OHxWTH=Hs9;W z{e|*qoDY}-ilJ@mZOp0v+7B*!RnQ~4}J@Nu&%%# z&>xML%7d~lQ_G?$D7BOadyP%|k^RMXl=qE4MQuR-_>7`4skFz~MY-tW-b*uW=I(6^ z=C~ydNjoSdcD$)=|LU#m$%8Uo9rH)jWRG{q%*n9tZQr-F(026nIe$#R(SJ#7K4v0E!s)Xv&MAs^QR4R0jO!M{3 zPLH?saLyfA5ni@+dZzNe7}L4VcO=GU2ioX+^wR#_+SS%Fbo8zn;&+`J0jm?I!N&$2 zg>J!kl($vmK8Iu%l?Mmk(^8_BcT!QXcYaQiorg1mvLqjpWN!PggM-Dt5rXNWRAlqV{eRxnEUEeR?R#-I zNiKDUeTeUI8$HD!)P*8+r&JekM3~vM3_Ur`m0g%`5$&zwdabN6Sh|-IMz1aNNK1;gPjJgFEb`g;?z%h# z0Vvx1?&BjG=NH)8DH}ba0$g=5k;RE#Jv_ohopq>-e_Z6i=~=~#hDJ`P%B}m$tc+PF zYcniuoqC;e@N}@8^yIHw!?*s@J|TWubB(e&YD$px32Rp`o2!@?h4+pPaD;e}*HY#W zd=YC{8OUp5j2liYLPT+YV+67PvW1Qg*5DR_WIMU>fXB$C^`j=VE-jiiFCs6}C4cd; ziKCk5=PS3|BQyL$vcsL7qY9&^FRq>Bk)9N0sVRM5(YYmtd!){6nlkTfq-#;x$SCZe zOH7-#V|YkTq^oCqpYZ4bsow8TUofu5qL+> zeL?3O+S*eG_#g&MP_Pu!(>FBQtzvBNTTT%tuqv@ls0kDzHd*A1TX}n9jds<(nLs|pKgk!FpnIcZpj)AJms-) zhVbdyzFKUTunhBe2nh0H1A3a1aSNG$B6@NfX(6x7(a434>tiD@WVNqDPDtiJ@6@vR zvR3!Ju)<-=kDq_I?bFd;>^_o(J+=cEM2V8MZ%JNIqOZ+!@4Nd=ncCqdefRNa%jYZq z@oZT$dh_ULUt|ya=>p|tnycCt^eJdh=u^}`+(R27-CeSmM@s+3J>s??UfH*3Z797P7Q4J@Xvy81Sf9gk zL?;T7&p$6@yZD38J}WNXe*5^ykw^ZqapBk11D6epiX6VCV$9dlnzPd4iBI0$xoGE| zCnrd2l(89e4_DPqI5aOup~3L~>->qB_Y3ko=)y;z!L8S4(e7Nf^x22S8X#i;{`eW( zw7I}v4Lrvx2d%X*uW9&-!7(;o`kT`I2=3-)jFRP-ly4t$0{2U2H*JFKczoF>QMNWT zdLTaw40F*RQHV0_aFi;F*0hLDy^@6m!lhELL|$r`Q)9I^UUL-NufF|ODU|mp+0RIK zI(kTV&We6`@&)_Gal_1zK9Xr(Rva zmKH(4mKJb9jiwOCHvR7~S@R-27%T(_Vc(AvJIKn8?ayGo1Y}p~+8NR|4FWqvl-;FN zfBLCMT%QP^{LDlLkKUz~W21&|pPKUOtH1xQ%~yVZtMTlL^nuZiI!i0<-|XCMEu$yy zpK;)9<6EL7wI!@&%UAS%h@<2W@#?WByILFtUvunW6i1Omr3uH|gi|Z5!y*L78Quw} zp9!ZPIHOgZ(VcK6nQ&T!&EgmpXG|xYXcJDA;oqDNqHTAkv)+W$EZB>8hz@Y>nA5SS zFye@B8h(ZM4sbNjiOnj`KsXI7)czeffylc~SQxM6F{WUuBVT!1_pH*pAsrSPCY$-< z5YT{wsyIZY!Eu~TIJLr7agd5Ls1r_(38x-7^vS@%Mq4Js5#k(ti|W@LHSZiJ!Gu#Q%oA%=oSIHJ zV@x>pz?rM!%u}oZ3z}1ty#-!wpUc`7+X34xUT(B*SEt=Ly|p$ZVY#t#Tn5FC&GkNW%wt@0Y63@UqdE&wa=n5pr&Kr%zEk<~X0LI69$rybH%rW2&)qo!*pQKi-3(l|u<;noJJF1(O5E`9j5k9HzK(3|IaQmaelf zrPojCoKOD#Pp0&$_gK2ruFBzcl-CIDYe=Vk^Ex39PEI6${`?|;&dRaXpz!)&P>4Ab z4#^Pj0;e7xVbXHe*di`QEDI*^|o$3nzMvJf#eGMxI;)2P8e}nSM zX;l5AbA8zZK8v+)B7K<3CwbtpoREfQG&s&B6$gASkvN9LWx>;bHKo@t(eZTJY5+cY z`bVbps_$94)UKu{ARggcTA~jF8Y{D%n6WS(=nISojzcsEht9_AOoR2YI^u!%u{8!o z%v1GJ9uWZ_ylqn4L$nRNUqddic+UIhT+_Q40gFxQyG@kQUi+jNUSdf$Ji|xpWSf}ZQaSKJ^;qiMBCTRi%a>&4NP7UF}#>%-82FO0%f|uZB z=NcGnXF={=qCf1vYz4}=dz38u2r*2)SsLjN@%_Tci~t+2z}_L&(VoK#qXuXA7ZeOu ziYt_l#LwNusNLH3KL^=|M8taZ4z|`Eu<7lQFd#m2ajfX4yo3FKvm_jACDelNV%Qq9 zg;HTe&agsJZxIZ)5PgEE6%vsNFplw`q+ucVEcBuUd55xy34PcxZrt08#`Yn=PHApwYI0mmfW3cEuoZF>h*`Bd!^bQJC%&^ejmgV^O`;!`-(a(ewX-I|qKDQc zqhDqGkd2d43>^ojj2l|2+{&DPV&;SsON(&AST}*>y&BdxEv)C3+)-(s1FamQ+}$F4 z9bzgL7M*+{r*ve$%)+H(l4Hhf9izkyn;UA^RahAd|LN!x>h!!@WOiUme^yrpqP;BC zd!ZiCc!v6k=fq02zo}H~%6#BtXsKP3{v@1Luuro3Ouc{^oxUbI^`JvzLi2G3qr=)i zr&A9))Ow+1OnR2{Q*5HsB&3VgDxGR`esoqUKRTgF4(C+Dfq?qYY0y}O=cz%6djv0} zuZb6(&~V?36VO-&eK=1~Z77K4xxvuF##S^2F^;XE({(_q|%twiAE0-jiy^z-y%LD2my8iw5KY}o%{uOU)f^rg!6qU zzM}=Ww!rLIuV=@~uql*;Q$Y}wfM$8DMdh*+C|sZb>=4R|q7q6-b-5n)!98=sjHvh=N8Wdk<- zec^)Sk$C~O-cjCr0{bNUY0|t_S%R@b=&AJ15t>P5p1 zvz{33V;IIv)p~00*v$i-P%j+p*2d;26>=Ze-utmSUO%aGf6r;q9Ea0r6r6DU4A&Wr zYW-w1wA4>=8jW9?^;0H3NMCRoO@dc9eZl!4eZgroeNXxVbzIdK!xU$^T1#UrMnl{# ze5G9Ad?**p`M{DZr=b_?Ve#0{sq7~d>UU{wQ=q5(gsC!_(M_&2&Z^M20tfn+$*ovC zujcu@`Yk?>qB#=i0;ff&?lwna<2g3oo`ZLvT7Z2AoNue#>lW$2L} zOphQwwmn*<1GA5CLkOy61`F=1!6`h3a_OKdra-s`F?!xVtO>$UW9R!aw&Hvv zdMZk{hL)ZN-)|@7wzmE2`%X8zwj!vIo0{8@;C1lXPy01SJ+VSjPQIDOv$SOKS75}V zL*T)3Han8&AxbYQ0!A6G_9%uGt+qM&K9c2b%W&{`efnYSe*lm8D_z&;?zcWPFVg(3 z>lLPQEHRa16XuOG)%q|~t$VW!KWKCGnZSwQ^;7&%9IWCDR&j1(d^=S8C2+9&fYssK zhJUNI=HDvLDy63kSpz4MaL}esDQ7v3a#qFJru33evHoj-inB*~M#XtX#o2@QGD0tb z4!MM4>|sb0GgN*uR2)|K^pk;8%5j7v-RkEa#UJx4;)l@zKTj%es^5CkNJj~fM=*XE z9pHScTv2hZnDe8hew)*&5){LJj$>eo0CFaN?&-7`7jQaN;=c_)syIJ(qGRF*`x&-$ ze9mz?J~#3MI*^Z%j?g5wc6_Yje5~S-&dF!d}nH2h1XdP(mZ>m`4e`W(Cqo!IzW=RSvM?AMPo(Krkn4YMnm*@K8i zqmKGdqM;WKt7Bc*ElgwGHOOnb-T^oX45wBYD-KY38Nl-)dIM)XE4y;WOYPv!Ww!?9 z($30`(LlKzW95SUC~CdNUI~ABJS#h*fwD9F-mUC7FIgsD8VsMXc29CKw)?*mFRbi1 zFAY~Zm7Or$@T0s*Pd2$kH9tFi}Hyoa)v8FsV2)!PWCz_9Nej2WK&Xb1{Bx4N&>DcSY+TTg# zs>;h%m6zp;8?8YAhg_41mmigvRh*Yq91kVmj1FWI){FPky?_8+P_E?BeiA82{0o;| zY)_uvlcz6Nk{)~m?P_5)m!}8n#*_L!M*iR<|I@+X7n+fyMxr9Mv!Sq&mqTpK&3QR2tnFs^CD}A2fJjCc`dmL(LH zC@fd@vokG%X-_Yr_enU}fsQJnG;tgvsA@Er&mok68V3vsSZVTiat;h-dwLzPvy8m8 zXi@ipEr&wZI{3mHhMqde*kQM2U65BNb57{Awnce};UbEY$4{M!h3WSD>CgO}=$R8_ zX3;6g)%02Y!a~j8@279xwrw*apAuhtFfJR9xW7@t#2lRVB5R^tU9e#qlRAk{>i9~V z2W!5RyZVS&N4VExe1n$e8{3xjNN4WYJt?c|hh zL$&-oo8*I|$~R3)7M&f!3Sx&;d5GPnZ5fMWHVqz?Fy}8zq?H}Z^F}1QW+zL(-+PV9 z87tWGIX&4gQo%jVt!8%XN2$FvYRNu`p(u1*eN|^0C8m0?{}YXLmBz|$G`J0tXpB^G zcJjI+GD{|FkDLyz>2Nw##y%Z&*SPKj4&+sOTGz;6bZUjw-PSc00B07niH=fn8oSL` zI341d(`mv2{B*UgO;_6qr*j85Li=m3s z_}}0d_X!&Hx_J4jI?^_kF%f)Hl?>L_T}lmX6aO~84s|Ff63mLI=_$kzRF`W>{Q<%n=vRfrN2(7v=wun*Tm5|Cq&^ z^3QQ7|Ad45kMF!r!qQp(d3ybL;vW>${PXuIe>}bFDoZ!z?=pC>q`8%NROMkN{L2^x zH)H-d&Sxf^TGSo0R>1PYaA4jt(y0dyt?hvm)7l=V^Mi^5S^vf`B!&TbKsvG`E2}of z3-z;9TA)Ft#lFM#O>2Jvjguz|YC6{+ z-oBneI<-NJNp8{V74oY37x4Bao6;M9oWRp35C@23f_{?Xm^^ab2J1CC?OfD)I^<%4 zEdC#^+XPee6I!>qExwi7tqUwDC{-h(*dY`O1w!d+aKXCG+XxoW;Rz25YI`ish?eRI zY8}aCG}RH*G_{VfbXG@rdi`iBW2BRv+W5ZC!}NaBjSQYnMgmhh=>-0M!$+Op$81xc zMPo|h2YqgXVVGd1xfqYU?NZtBwp;VD*~%im!P0e9HaxxYGb$VKNM&P6w=tzReH+8m zW2o#zp&4aI@k9KD?3@fU%M;>yTj=!TO*VImB=Ub{X-9Zg7Hniqw}OME{kB;ElCGr& zGa1DsG3ABi#q-+mS!X@RVvMlzI?T$mzOJ*pdAcp$=jn}iYPc+Dq6qptoywD^Hz}RV za}4G>h+(3p(_H7(ZgZV2C{tIai;u7}trvE%GDV4yHfCkY^`tN8aDCf?=ptq_uLn3Z z_aYp$oEifz;F0T3(mV7n>;xETvhp6q%kwhIlVXba3#mCt4{V+ShW~J`6vxwXX8+d~ zPc;CEL3l`6Dla^UO7f7RWPwVI`5;?`nvW){FrJSvUKWUBqNQ^gg2ZE7jwq9^ebNEN zhvJX`=Q!b@JQgdL_}ERkMB>1AP*dcov^Fmyq7B+uts$%1+WaBKmtu|>aX=?mc|)bc zg7q2c$lFXfRl+D`k&3g({96y`pfB_8$mKX4xhf7cf$Ye1G4*fIIZHb0;wIEF#2CSM zSpNrJUhG!K7!9U3IE{w8o!bHLA72Iy>K{>eZrVY%(C2nsw!CkncEHmczomA7bhRB& z`c|F0DgE%=&V3uL<6uMtL$Cx*!vc zhNq~{0u8m#VlgzBZa%}y4RcB}?abN&!(r{68w^n%O5PKTj!dsb&9`TCT88$p=`Oa2rO$zdM%+>+5w`r&0U* z7GW3qW!7@j7$f)&9}iqraZqlu7sv48a^*C7o6;NgOL+Pc^K`7?sNZNti+PtYr1p2s zzws0sU-2==VPQ8PPw>$K1cF!t$}tw7qsv^KCh4+<#pA)0{lCoBaisGj=IWTda<^>6 z@DMjF?CsiVs_sAW$bvlckRH2UjdV}*Gn=PpXKGSs9Gqw#;sbK?h3vO7o%o5ejbherpJDZ=wu`S4OV?39%hQ{F zH|u9XpQraSr8oT4`TL%re?_+nb25LFfnGS-afA3a)UoGl1gx7*BK>u;BeClo*02jW zt-2M!2~%+fcJ-CJwK=7&t|fI8up-U-Al;JOH5X$-e(p}1Zid#Ooqeqi~dbV`GtH|fz|cxg?*{%BmX5v8xc9(4*+O+>3&p)J?y=_x_pnjm-V67yvwPGe+%tak zWWxYID7T0Cr7{`}=h1eK>5%1C-6qg^j>+=mwH|2E(33rQn_r7EtJiHr`gxxIZ!4}7 zta$n=WxQO%-oL=pZ_@i1ji~SQvRY&+tCJsgw@H(qdAaTia1dln)Cs3ve3i5x%JWsG zRw%#JC!NDNw>r#E=$@@-z}Bs!wFumw!kIi1S^7M7-xv6gvHMDPPvzUf?nkhD#+R0S z)p#AM!pL)AT?taj;?v$=4pKIPf)d~wb`&>iUGCMu?=wu7=IWgGa z(kWJy8WX8E-v$B~7ccW@Q8?(cOSC9D+tav#$}Ct^qUs!?S?G~Ft#s_^wF65xoUfVt z;`$QhC&@c=B!$}Y4lSKkG^urQ{($x8XB9rNta@Oi=qQC1Ps?U;xRwSNq{lkBm)7hU zJ8IAL)I0<+i7iX_Mfm&R(7eP5hu-D2J4cM$JvGrSp|oo4pu8~|p6*e(kRxjctX=SS z`M+rwSPzy<*gIGc293RtBWr8oC+vO|?r*a-EVOON-nfQE>ow{c7Iv@PmOs#wFVm+C zr%~|f=F9Xy=^$2qj1QC__~@#WW`U1veK@}HG5?0)L-7edE)bufmVtL3rgzNsR#&~V z7&QB^Z$8bw*;NlQKQrtF(2<`R=y%mixp@C4_CB;T(!1&<=D*3>Wj;%v4Ozo?3H17~ zd-{Hc_Ac`D1M-CV#Yg2_UyuVD=yh$^+tIFvv-iu`*n#=m!51oAfX@X5c)(dQ?6hc6 zsDXo{W+ZB{H=G#YH$|3ycJQE|kEe%=Q%@@_U*qURJsmv=S0)@hXw4$Mo4lO#zBo0S z)oPw|#Soz!pn@zKjKtjNt-`QoxkZA%IyYwqj2Dl%ps92e3z!8>WhyezNm`NN^oNmk4@&2-R6cHdPeFQB8DvWwHckM!@E>}uyD_7Uk?Yc4yshR9?!l+nKqeE5Ap_QmY}b=;58zK8cWu=l(A zOMi*I^K%$}3B!L3_*dBXe&pXP?)*J&Yo|3L15!?V8i6#o7VwyP@_tTx|!O&L!Xw9n5>GI_q0bgZfKOqY7)m zY_Erz&7aetK7rGy`k-^4;0sn~!lc7U& zGt>*wP4ly6HM^JD{RP7>`nTa%6eQcC;^<{t`7Kr+6$wP&`tDYN( zO<7g!9i|_c-5=u;rpvnfQlNI=ypzwt^FS46Z#Q39Ph}_hP6G$yDaiMT$ZU9$(S}#6 z93&rQq@&$a`iry%3kx=1gEf>u4=mA@BOT)(%%!h%R0`WT#x^QKY9GAM!#qjgeO{iS z`#vMC6Jd*2bz+_&S1eNNLXlb*cssfQ9OxWYr@HTbSd2VpXs-i@^bpm}eC&E;t%+u_ zjGsc_e9Cm)v-}?CK7Pj9?`3x16XRBmem2J3PK?G0xl&wByr534R(Xj4jrqE4;K0g> z@0^emF=AmO4d#MC`7Tv7@-DWv{}JJcR}G&Vrt&-)rmA%2!mntIJOKROHsR3zA+!O* z92IAvVsEyOi|E`mEKqS4s5tY1^I+e|!*N(WXZc1w2Y(^TSov9&@8{Y5%gB@2SlI9f z?q6knAv6y1*l4)ZtuOQg&Jm{fZvh9o;>XTZ@cc*!RTGy&t!p?1e$D(Odg1~yO!PaI!ogKUT6PLe40xQx3JIj57ZIjf%yDI z3_`ilKE5Ee+z_7vHV^vlLH1pC&-x17L!MO~WamM9^TZ37*YPr;@gpyjD#Lf(_R;Y& zp)oEmld3N}k8w-!&0YE^q_cVnzP{u74tz0lAmlL@IAgR}Z(;Qke0<$`y@j<`9oBW! z_F7|jPmJJoQY14s$&|N6@*kzP2)o1wf2g(g55i#i?oJ;kH)2V{LJ@czZ zevEqtI34OYIi0TiemIRh6OF^dnMcqd9}l8IzGVktl{U@Dm~63nB#&itqR$ylmEoms zbd~~VJe#-OVR@?Z=v)W-BYh>)2{%+4=h--b%E!3&KM^=f+1&6yoCaGp-rZERBV=R+W%Fn95U;F31@}CdSH?Dz?=^9bw&R=zU$BO z-YS3e@cmc1$AAM}1Upfy{Iv01t*8ELF>Hj{9REe9=Ot3 zCtYLTzhL|7?19ANDb4s_$l+eSf3w zFQ)JBdy8zbpl)W1WppeeOmy}dz8BL~I_YL~igmY5boRdbr%LBf!gx?7%ohc+gzjhi zyisp?+1SB?!s`>cJ+MMT9#|PMA3u_9kbr%q>Dv(&E&mPX{3EY_y+IG+vLv>tA>pUNt&$OXDhqde3p$Z z(LUPb_t^8DsM}Tg3#NBl8xwACusR>24MgY7@h%Zl>wSN(UUclR0Yi3#ev31)fN zrXyLiJc#?Qkw-MO)ea^K$|sYB1?4lC^p&_5Iwwx06K6)JN=M@lPG|3>dn%oK59m<2 zvOO%I16nNZ0ILa9zIJRLNqreLK~~TtV=8Ck-e+p7Q#{!l?|}jx?XaX%Q9ppu zDxZ7!eiU6ba5ktoe;PXNNWu4B29GqRHqvR6|I)4QT?Y=$=YwcI&$#&)!!fc=G8?39 zl$Wr%1RvwH$*&m5;!3_%%u^URQ`-ehe7?`o~|7|*J6y#t0XdHey?om#crFwWB2u)czLKwt4q=f2`4)U73~ z4zcfx`wf?w{~h%eYFq)s-!b-@#Ofb?ANB8TTu26Zw-M(v7{9*{`l^iA3bE|L_vOQ^ zui)R`_icB5#bjVXI*0SH7xp)bX+b;~V_I-KF!dFj&fZVE_Z6&6^kX<3f$AS(HZZwU z+1QiZnIAY*5icZT8L_^C@`n1inD-S_Qq;Q``wF$hSiVOi-(TtBhbHV{X_KyoEKJqK!?>I%mPh3PDeAjZI=$(dco*_(mESUS8hJwokD(2nV|JT;45wCj zteeei0ou@5=6|{$I4H~7&NeSjgJi^M>qG@c&>5z`& zbXw)>-EfM4l#@=(Gr%y6pkvbg+)e_(8eWnR&sJT$GL4bL7vc^3o>1 z&B~9;#;D&GD7&;{@ix09gyUau9n}mZt`GrA|?+`r&a#8n>;ujk_V^LB0Szr9-I!zgVSlj z{xma*pzdLRFxveMoq#yL(ZZ4(8z<3H6C5NVzMUvqXb`T+4dI#s;Ugy_*a4l|q|;%; zpQRrQneh`e;005Hho?<0S3jIo9DUNRvaTznv{@3PgM*+bBPx_DqSNY<-j5*mwLw3Bez-h^q9fLAcZl7Jh{{Fs#`NQI}lEi0|GvkLZEPxnL zcC(cWOb&eSda!sIj`SI57rAkJxt5hOP=ZX$?lqS8UZp{6OKqLje#rJF;lk^LX-xK* zQm-vybpm#9%=fNJN$h(|lzRDhrYFMqbMZU&d@(&|_&;}g?t$l~{VqgDSjX^3G&$r@v9K*-D1bgm5&kcXz zyIBnXy87KHhVO^xNemx$C&o_@!~a0B#onY>Q5KoJEQE1}d0g)s=BaJZNpX<3)7VAK zQgNyb3sszjD$ZuK&k8o*#%v$$!wL7xu+PF7^OxkD1jIUmLOWTVa}Yip%L>@;k5H3nW~LDbl}#)wGD;}rW#Zz$JAyP2ov zXJySlHM8U6`SWqiODH{yEsSt~ z2Afz>#Mlz{{r3OPr}O{7Cr;Vy%4fWK0vsLnBRziW$nrNf_V2&(jpa&Sd%Ng<>(-IH z@wwjKx#RQXyi>UgTBlT7jjc1h$rtq`i0i4J$p$~DS7GiG=x#`6Ih@XkjwmJ!;NCeLx zt``Ntr5N3ZD>k;{Cp(9Y7_qmY7D8vSsc{X#gnA}h%5vq_>#vK>*RPk0;bN&$CBCbi z6#q6~c~*Yz?5irHs`27}vYeGdI$DH}Y;R4LAG(4NmKQwC>F& zD!w}PAtN?W3$B%esbYL5N z7(eK>*mwf<$X1BV!SRC{_}#*K0zJImgHd*@;^3&$*ZyWH zD&LFp)kQe)DM9qce~HTOX;Kdd#X^$xXQf{{#!F2dHl(*iy=8e z^{i&a{d>7Z8sYvbd{6Z`z5Y1Qf)4SUoQr8pgSJ9PX3-f@td8P5 z2{a8ls#)}Pz>j#%wKd`*zFOscl;!6J1bRp z+?A|4c2RzZqpiS~=)Zs8^-uDc*frrIu+tp*nOfK<2_J59q`={EA%XmKEzuur zcR6N3`m)1T?5(`*9F`Fjm=WgU5|$Adlo94Ec4(gd^CRCBdXnPnlM>?M5|RSBQD2-p zeNS%bSeuMHLJte#Lb&*|9YzI$@b2oTNB-w>#|QeiE!G0p61e;i?^#Uf_&^XW4S2nNgqP#uf}&L6mz0*EI{lK_-XG9Ro0$+16x-XT89 z@!rR{)&e#FwgP+set@|E$|vzi_o#2Cd{f?%)%&Hm4gpXeQUDVHM2q-H0t~=6uHrfa zfVxJ!8~%eU(WY{wypn9`UEm76)N2{81SAKN4bjQ~YzI68puCO;^aM~E(MbT1ysH4w z0Lm-Tq%0$%KbMiV8$k3?C)n@J>UABiRF*aX4?s46 z$}J868B!Y&@&O`%JD}_5Tl$JW1}Tv*K;QHNZQ7R{=$U2mr}`I$$M!@51$8 zfXM*xCawpp0=NQt0mAWo7GMd0$~O_v41gS19i#Wh13UpFM=F29uLlGINd9ysp1ucc z0g%kv04D*f@eM~@DUZVdB$MaxEEM1au!X$u@~aq&>qkg;1{?yE1E?(!Kdpc<0HROj zPR|Yi2yYRf2~Y(fUUvf40F3WP;-x^*7`uqRq1OR9x{5@nyhofKh-y0W|Z-lIGrKco*?|LZQ_HhjxL=z(WcCZvNr{|gL68p*^Qz$@!7jaMpvYKL8c zXq$sC?rZ-G%tzYnF7P_;&0#a{r#=Ms;F&oj;GTf;M&ImurF_x%9(7%Y)1HVI%J=`~ zIt+Mo0FSzojEHxV8Rh3;SCp}79C8!CR{^#GC|~rB=?dQ1z4ipV8fkaA8m8c#K>(6h z*DLBc8&A-c>H^jIzXOH?sQ&y0W# ztMU!QI$TR}eFivB1E@W%0?@aqtf=n244`K#)O(Tx>3Cz=df_+W_yVQ_)&dBh=uusv zyir{}1?USPy2dnmPB>Kd^i66@luq;rW&ubK5dVvFe8I(#M-!eej!bNbV$qu2-sWO9A}>69FV=qb!5*n|M|8 z-t}sLd<>@_o!%Ayk@qA|%I_nthEMUGryiZo>KK(Zjf(fJaiEg1ApQL`q%Uq zAnX#Y#Wty2s*xI{tCFG#)0AkYXtrruWh*&Io-2P3o8nUK_qv|C4Z1({R(el;ihhiK zk^Yv&8H+D0(=3l!esAS$m1R|L^_tbsJ%W0a_n6zGt;e;VK0PP&ywFSPHMiHUURQek zVC`;QVm;5g+4`dOXEuUOfK8UoBpbzck?l`*qwHR?x3F)q|H{G7q0XVr;T^}mjx9Kr zzQ*Z$=Pc**E?zDRT#S`->-b{`>pl6?Dw;Oo&Uvv z5rKmOuLZdWH3nM;mjy2hz7$drGB>0pbhW20h|V#{OeV&9MbEiNFgD6TH< za=caigaj#JSHgwFl*INVtE4GOA13=HA4_pfS)Ot$wIH=M^^df^X=l>@OrMheenxf1 zCz&~!&6#(zin5kxwPpR9os_*O`-dFIoRXYvIp=eQ+=$!>xox?3^HTB}^KJ7h@~;#G z6yz1GFSuNoQaG+~N8zQy--^77a*8Gty;Sr=pO8M~eKz!Yr>|$U!I z{x^#gidPpuRU(v>mb45QRccY1Q(9MgVW2#4#K87Jwu5F5x;uF3;7`g@%9fYCKcr&F z-SPuND=MUl&xVZ{_DN+x<=V=N!@Y)A4xc-G(@4jWEhB#&RXu9QsOLuAADuP&!00c= zIF9K*rfy8zm_NrBjQwKVh;duSy)wRF{Dtw#ghdm6o|rJPZsNsB){_=Yx->aqa^J}l zCbv$pp0a+*uTw`&y;_x3_1d)3Y0ppho4$Jb%^6`c7Rz=Cns!mxFwWMOnktNE~yroYqy|&C^S=6#o z%Qh`LyX=eQKFgDqS1-S~{QDJQE9S1)u;Pc62`j5tu3UL$<=s^wtEQ|vv+A|gQ&zXF zKEL{pH9l)LtU0pgowf4X18ZMd`@>_7k9j^8@Ys~co_g%hbrI`kuWMZQ+~ZM?uY3IJ z`mFUu>r2;HtUtE??h^%1EO_FFCzK7g8~ipTY$)1LxncT-x(%B)G;V0$@XChwH~eG6 z9~-SUdTxx`n6t5L}EgJ9Iln?6|b!lN~?oPu#xS-bl08nvr>*YaK4cD3w!YS+bGAMW~o*B`sB zcDwJ6*qyPvboaR3b9b-Zy=V8a-Oug5y!(^gw|3v%W3k75PsE+C6*r zwC;I+&y~GFd+Ya}*?VE{J9}^L{cWFapX%XbL+hEb)-Vo7{)i9`GT*KUk)eSouS{j~ec%|X}hHo0~Hd-{gH-2n z-ngx?rSZ?Eo=u)j5ltCQB~7E6s+#JWHZ?UiwKYB4^h(qFO`kP=)AU2rZ%y}`<>sEv zj?JFU0nHK33C$VJ1u~Aeio;_L*BoAOc-`SWhg%OnfB4Gb&kp}|SUF;Q#P3Mhk+>sS zM+P0KJTm>r(j%LW)E_x>gd^{uO0pH==VqeI3^skIOcvV>{!OJf@9^!rW{*vZ2hr)$J&maKX&!l7sq}+E*!Tw zZhPGCc---V#zyI(6*SQ>QMTdjHf{r+z&xpSC^icRJy8(dmlQRj2Dt zZ#vz0y8ZM^r>~v<;`GmFq%)3Zg3hFz>3`=VTDF!N|Bu!)4 zNV4Q3q!8lVq%5MimccovSoB6fwq($Q0m?n^!|Duw8c+OX@QoOQfO&Q@B5&o z^e(+<=}qDL@9xNwY5Mi|`!LbW?#|A&v-93tt@hpW%Uk}jlJcP)Kw>3epMeU1Gk`?2!Ya<+U+`M&Z)151l-s|K6&;S#Yee)Hm=s?1GXwuXoDAHzw8tO*i3N67>y63r;Qv z=D^Mh>oWW^xImA~7{?wgtH?OvY{zFa?y%g}&5S#7cHQS0cj0vRvl*|mc8TqbH(1T$ zdd8cq_2SixH(Tn=8Y8#Gxts&H80moN*6?7?$-#(|o>li+#K{<}zhw-n7e{SnSe9q%v z82_?pujRh&KhSPl(dN{=+$-EJ(vl0%NJ&vv^uP}FH;B8s5cW(}EmL?Ae@F0be@SaM zi+=OK+_)D!2J3sQUYvwqE3=|~_lm^Y)~a=Ga8lk#Y8iRJX=pYFn8%8*8`>SgXRYl$ zt4ga|QlOv1D9!2-!W+K8J*n+8(v`Q1kf&_kgSHf8&FfK^hLjR;B|WconFXfCZUG!p z;HXNg`*=}vYCo#TD5B>!>=`>3F|Pi4z^BTq2Rh^tE9YWtYxO9gW)ET~g13x}TKnC9(#5+ z;9JSlal*_Q_zn7**xPnC&MkD~-u@iy;@OB_r>kAzTQH_uvGdvs9eSXbit_+QI*9n_ z!|u%i#L6~A%67av<9wWfumj!-L-Q!Kj$@Q|!j4_oO}z)PJc?hxj$s$?IBYtA6N@jx z?#xL%MI6G;yGyJ~F~2WIHb~-^NiVdn!w#(*@hj}>akAD+thZS2x87wfV$Z}2uxI^` z)}L@j#ZA@?*kSZT>k<4?;b!ckder(0GRG^eKUg@y*m|+`HvH!9Hk=;yJN%CJ+t~k% zT}akL)=#h@sS)|7ESjwMh-T4(=ae?lF4o`|ct6H3uzp}YU_FRm!2L+973;)$oMp2C zUvZy~(`U~R9pX%JmN*+<)w}V<_Br?xeIrg+-y}ARr;9D(8DcB;UwB2g=n?1Qy%s*< z7Xi_WFZV;DPxOlcF(|f)^YDuKXNvR11!4zImko=Eh>Dnqi(#=-jEG%gx7Z^t6r*CV z7!&)%xY#cahzW6#I4CAXLL3qoi%Z0%;xci$m=Z~GSfs?XNQ)z4M$C$gxI!EiSurQ( zMNTY;E3pTAwDVY z5}y)xi%*Mt#J%D(; zWV>7=*UEKry*y2Bz-G78S5~&WR;`Hg;{G}4j|WDiQJP%rc?R*7_!j`>uUX6{~TOF zpKD!XU5hh(eq-Gs2jw<-p4={UGm-XJ@UQsee(VCX88g6LHQwhi(HbnEX!qi zQhr$8DnBAWDsPjw%RA)9e7- zQvOQ*T0Sg)BY!J@Cx0*hARm!`#M_1+m4B9hk$;tclYf{0kpGmA$$!bmGV`OgF5I;It%B}JdNDglXMPw zXd`W+&GdBILeIcDO&58on|kP6@{ykc)Js7MQ6Kfw01eVMI*+#FUB>6r1+;^PC`=KG zVjD}GhG{2_&@S4Im7WV}l=jjX?W1wpPX}m%E~0}pNeMbc7t@>HNAmFO59rxSD)T}{uTXVY`&8hS2WOV6X{(+lW@ zbRAt!FQOah#k5E-p_kIj=;ibZtTw%hUQMr|*V60gM!Jb!Pj8?%(wpeb^cH$6{SUp3 z-cIkJchbA)-Si%MFTIc6PdC#C=!5hjx`md=rZO$lN%}C|N*|$*(rt7*-9aCtkJFv> z3Hl`6MW3R(>CX)^c(su{f>T*Gba@0BMac*Rzqsh_iXmPYU+Hk7H8pm44 zI>&m)X^sunUmZ_zobGrkwrP$|?Aha*OQ!O<`PPMWK9ieHrRR(3e0tik^KddRM|R1~ z70pLy^6B(^HaS0?Nl|QmhSKvh&TMXerr_K=o6FBTbNX{af0oo|U1>h!3-tCo3#r-T zNmGjVHq7Lc$I_|X+~I~~s#G*sF_WFvm}54VJE}>0eewF~T=8%^n>+3-=H_#Smgx+X zDr5?})R3Id71P;tCg~hb&dnvA(R8+$bRL*Z7n80%$+^SRNjaI3V;SfE%*(M$*@fAp<1nb4GrHfj>Q|RuC}d!b<7zaJYAh;7j!X{RvWDA<4CQBYu7YCccWOYz zWT~!Xy3zt90Cnc((lf@~-l*T$5)Cly(=g~W<)AOfsWj%UX|6Z2U%X;;)yk3^q%kp|z zPA|*pWjVbpr)FS8_OYIQEVrNa>}PrX zEU%yC^)vr|=HJi!`f%d&;^)&o%62dMP`)OrAF zJpi>HfLaegtp{MZr8GaC&KFWSTm}wjTdpi2+2+&7P?ermF(2>+m}h^mVZKn(7mmCm zo5?3#3+aN&ov~6rr%C-R-tRYR`Tczj=|V9xmn^2I8*=mMbY^C@INMyD#U;kzg{C8! zV->u)0KxN>23$JklF5|1Mk(&`SX?_L9*=9M0Y)3HPUmwyg}Ky1UGX@O(!#n_CZ8(J z9m%FotXyl>R_oMNM_rO?$W|^>HFYZ&tk%QI7b_%dYIMruicw6vhO~HB*no%uQ3GNI z#0?lWV5b2i2JA9mw*h+$xX^%61NIuQ&wz0Q_8V}(fC&RGGT@*AlLjOVIHW;~wx{BS zdJKuKuGij!8yoe|=(>g@xl*1n43VKLWKL+LQIC{C^>`V=`AmhO8JN;Sofc7AFpgaD zYXi$EEz}z^3ei%~MGGk{G_VX{ECNJE0ubEA6biU&X~<{hXEfi2>0}|3%$>+2jj)yR zZ%SR2&t$WiR56okui(lD+4PZOb8UrlrYD&#wq}$08QdSKSOt|cqbi+Q^{G9UoiEL? z0~G2S)5h1OW)0!ECf}_-9hsg?(UHZ6_5*5M$)aj#NzP#+6>yWKN{z$m{2cJZ*+N?t z)m&RD>gj>g7a`wJ)D?yK$)aNx4saY$A4PmL4z2j2F}Z@)4VhcMx}<@wAUf`9T={R26ZE> zIg*sRF?Nj@%`?V3BdlY_z{Zgk^_zB8SvFl!#hZ86=+LZ^O(lupW>wt><1SNy<~=n{ z&DolQYmae6Rs+W#h;(G};Tkpl=S~07nl8=rH3iqG=|68AIiFm}6^i-X!fd*3FB_X< zWA_?ka~ibloh@N1Xl9!!^tuihNks!D%-EL9*iNvyB{p}$ zm|N1oIiaSAv!p&-CTfjsDb<$hCO8I41~wh6s@`A>)LrHE2Av5Qd6u(m{DKXx5u6&tTnbuK+{M~zmXaxN1oho zWOcvMs?JS&Yk2If;j#BgJeu}aJGJgz&2OTH$3zW}i6`-Bomky3QKfC>+-e+R6063W zIjx$8NVP|MO@1|$I*@(lHUimKWmVJ5WLQJQ`PDR-n zo&~0t)*;~2g*CMqRoArFWKz@Dq)^kB6DT*-Fy-8-8``RgQ1Z9QmA2S(wf0dQqy=dr!;P;db?3)GhMxQRWjplHDS?SlfZOq zdrjuj6|ITY5pOb>ZfdLMFI{drR5hb6WGYkJFrx06)e;ZfpHY`v zQ<$hBZrrO@RdoFtwJ1~3MAtaA1V#11czeo+?`xlNXiRKa={%~GsLL7g z`tsHrj>!2E;TEyE)~L28b#LZAnoTn|>O!MlY|^M^7&K3Uz92t|2Kfmz$WNd_egX~h z6KIgHr$HY-A@h@F&^%%Kf_`2ZFpq91^OH7TkAr^h=jSJDKd%V*c}0M4$$|lXf(|gh z06%$~r$}G0m!GtInSU=o!S^!1Ah!pZPmrJBgG?Xd`ViNLD)qdA5aK8N5I@<6Snp8G zbxZI&Cu0g}W$_O?buVAi(A-u|fxy-z}dn;i1a(=oYeIkX`Lfo;N8`8MZ zI$+ix{4rwxwf6paW!;L`6@vWy9}KbeA@*`Vm;2f3ezvlotsG=42ic25 zylyeX>qA5A)gd0G2=j|DzX*>~gxjOs&g+>$Ue63h+1pVb%_w_4%KAiEpD4?ZvOZDP zBg&%?WxJxRSCr+(SdSRXiLsm*%Zag^7|V&V-7%IEW4SSw7h`!bmKS4rF_y>U6^yeV z;w(ST^5ZN&&hq0dFV6DJ5`-@pH~d398$&#cLS`2EV`kk8(2RR*NXtQ4%K_AK0JR)I zZ6~0%6HvS<%e0mSyw|l%MY{sFv~aV zY-nfsVU{0e`IUG#>usQ8`C*oC;>{m3@dn89&AJ@QY=4C1M_9gDr$am2A7S|smLFmH z5w<_V_D5L0iD!Sz#4{khw%^1x z%4~0(<;B@v6X$3j#FM>RVo>QV;H#vQK`q`F9MtCff+m~+dD@t8MA=M>pb0l$(1aVH z76+)s`GRH`0eQL_bug{CeURw~xopA<{dpRjF!TinSl$5h>CC#Lu=*@IyrP3ENU*`mTd@piuG)~*G?TLq(>K>eU zb}#6-yo&CT8g7d25lyH0VZTqnw!CiJnwX3w-0t1CS*`na+phhGChcH{y(KYq#JxB% zY0FK?+v~C6D3$UY?&$2at%PkwJke#?7nuro+c=HdJ$0npmR|R?+rDeec5FVhyhSud zVyW2p#gm<$&W^=Nw>>sC*=g@cbhzySg$*PU?y@0DPTN~h#U;1xQ|&%QdDqya8%iuD z-FD;H

    V$s;yCBeG2QF>X=F-5*@baN+dkCH8z<}B)V<#x?^tJu_+0KoRP6f+vy40 zE>9ThCu}j*Z9BXk=;fX+I}eB5s>KLbpSEKvma=JUC+Z{aMfW0jmwnDnFl*oB)L2Jy zJTd7>pmoRoNi=mRqgZmc?eyApk*;NI)Y7hTq38*F;9^fWY0JY$Y>|R|+qt#duJgK; zl6WM%&0!q|3Dn#%l~5#8QLSXXce$>~ip0WOJ6D|D;9c$fM#DvPK?SJ3Y04d2^d!|l zXir%k%A2;k14>r3v}uzk88srB{zG?rBYL6pifOf-npMnr!plvK6r1eq@N_1&c6Qq> zUL5Zjv!|2MZoAbB1Ke)AIkHRH1;i6h*e$9wj#3Ls-F6$;v}>2R;eiy?wp$}p?!_s$ z-3q65+wI=n2PVso>1bl3-IDg4=(g8*cki3rz28)JbfSKpu3zgdTWyhv$#Pp;#1_f0 z-PWao6rmd~H>-~peAr?GMuIktO_o*U!dc-(46hQqwbO%c6}-c=t1gIr)tZ1M!_a?t z3WK<6sQ$wMmMv?Y2QH4-*7?ggO+`n;IWbDAC-R23qV|EjQveAQh3%jQv{?_(( zfxUd;@ZwZ?t*gr}b#$H2@@_%!HvHh8zYqk>+qd%KmLWySvNo#!NaFK|G9TJLOdJBnLbyjs2e#2&Hb@w=z6pgMIGSvQwNEn?xE? zgW#|A%)d7WyzY?Jw-<92Uf1h2trv%AOeupQtDDz`nQ=KGF)lP9H{+#M(7W;!Dg zRynX9*%b01(G$n)!)UIaN|^Ve%OralnVR<46iH4a4arEd1Nc+|bN9)8l28eW*%MC= zba)^k4!Z!f6!1HR5GbOOr2`27zIP&^klLT52{MNG?o6O3W$v3nptqTQteu;N`6TprAd z9!wIWV-!gPIeaBjEB5~PP#iv0VEligPx(#dm+hW`j?S9#?o6Q?J*D6_1Hno#hw45egrvJtY2q`K(oth_XF%!UW>u6?l>-M6+i9q zs&KS-!>t#3myu_Hi~(F_5(NYN84!J5jmh zbXyi~#_t=)jf!|VGPAk;UMO3x@U7Nx@6#OCR)z0qyijbb-(0^QTLigc)QY-%uCtuF zqA`5ux@%kSYPid}14n%|fTT5iCoVKQ^q;OFD_Y(tZrF!g&l@JoG#xE(R;4@Yuf;EQ scHEG{{TE1Zhn?8bIBIRL-%`J!&e6Q}Hu1!Dw&P{EqD0Hi>8NG>FQr^drT_o{ literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-BoldItalic.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-BoldItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..1cca0bf456a3b6b42b3c92e81b4f4ebfa7d41f95 GIT binary patch literal 122808 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

    my#&Iogj%gPMT!rkQYnYa~3nbMLY z-DaEHFSS25B`ecda2f6hhl#@-E;rAa=4QE&?>6^~bo<$?q$C~*51Wh}kU-7k>?|V5 zPLoRd+Zz0Wj8vziUr(>G18g@MKTvUD{h?~`qHR))K%Af%;?FtVoG8U`gjTDnD_ za95fV5%dem-Mx_tiM?6#O%zN%6YgjT3KY)Fo?+oVv-a+U}6lY-?q<)g1z(MY=<6BPV3m zoAT1Kdb``?htG?2x3i5Ln>lj4iVW+C_zp6@y{+D8n>sPGzHQr7H*-1MZTpjx!gU?> z!SvGxKW^3;B_aA`WY&}C!dQ+<6fcSG*E1Z+JmD~PpOV1$>24NsG8Fm`%|;>KP*lHA zfc1vaAsi-7bsIw(aN>%rC>?A@y}_LmGTm*%9ag712u>Lo4u5l4vmyRqD86VHVmKU? z+4b!${oNJ)!+OC?9g(*V{UhC-Z1s$AXV{r=7hAm`+|^cZB7BRj-b}cgt=>X7%vSG5 zxVx?1pYW}=`T)Xr*sM`*HZ{`SPX->0boZBm(nxm?o8fNL|9_$5ZP2j?cw3<(;hxZu za4+acI2<|>?hPFY_koUtBcLPU+o2=jzR;1d&1M}et3ad;rU}iqrlNeZsXSf4ZX5Yq zl+7L4-yMmXbSIp6D7@`wt5UctDV&i1D?| z&9`H1)_AFJ9O#(y<{FKL;%C*Pc%w58z{9_^A>m2&v8)qvWJms?@Xsd6hGV;uBHi(} zs4jye-3h-&3Mb43c_NC$=-kH|WgSYD7p5FuSvfR(C>o1QH0x*(mkQlhDd^ zMg_rtN#YJj?Vn#66>hZ-t^}_EEw`;viig_-o}jY2v#Gu(kImfAt->0%pGSypSq^Fg z{n4629wdgRqxPXRZ>&nF_pHBa?0IT-UbtJNy7JHr@l;nB!r57pb{G9@N`#F zSU4o4BVRyL3i$nu5GX>8r3noHY;T4`p=ocW2{^itxQ|oSNWgU#Zku=tkVAf)COCMYf$1QK~ zs|xC7=gJP(B?BEJ-FImXQaweJP2F?rEP9G^h%MY2MOI5k!#p@Esy>Q!L9leyTJVIiSb7yURa-z3KJ?s$Wwxcc%`-S-7XmeS|4(@o+jIg;Afku+moUp4k9o?G8 zPNQt(j_#2#>peD{H<5k z5e)_IB^nB35)B2ih$a<*$wWhe`-p}DQ;3EFQ;8-Wf%}Pu0uK-k1+s~T0xqI)Ado{e z6v!nS3gi(D1@dj~fnGCDqYL*CL{FEYyAdjo{)FgcTol^egS^x;=t5G@lp&%nk|83U zWpfYqk`~j2BrTC4BAqQmMEao3eV3QClrAJ`nG6wWxeO6$g>8R;iF*c5j{a`{e7ESG zG0)TG;6r~HjK4V!0~NL$EwdVa&#pHtj)TU~xZ6xdKME%Y-opm^NBDQd5)d4#&>oCKoa7h)8&)ppNtVkT77S}Y%GSJ%QEXlURr$wT^;pb vgdH=<%W^UP0trUgS;>K;jluqX{X6@ag8Ln2%}=;Z&!R_3t2gJR8OHwsUum9p literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-Light.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-Light.ttf new file mode 100755 index 0000000000000000000000000000000000000000..63229b2805b102f626c06e29752fe28e1ce9471f GIT binary patch literal 118976 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-LightItalic.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-LightItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..f25bed56adba942784c953710324ef0bba7577fa GIT binary patch literal 127568 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-MediumItalic.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-MediumItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..307efad8fcaa533cdc695b8f1aae696ba662431e GIT binary patch literal 123640 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-Regular.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-Regular.ttf new file mode 100755 index 0000000000000000000000000000000000000000..b158a334eb372a9ab2ecd4f2566e60d561e71a9f GIT binary patch literal 114624 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

    WH`00`s@p7bm8Ow12>ck9v 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

    lr~Z#iIB^qAyre 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

    3PrzD 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 T%&ip|_-AQmLoP7cAN&6SN7O$Y literal 0 HcmV?d00001 diff --git a/js/assets/images/dapps/blocks-350.jpg b/js/assets/images/dapps/blocks-350.jpg new file mode 100644 index 0000000000000000000000000000000000000000..524f9267c50777c162f3f2081933716329926907 GIT binary patch literal 235011 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

    +); diff --git a/js/src/3rdparty/etherscan/account.js b/js/src/3rdparty/etherscan/account.js new file mode 100644 index 000000000..7a6844759 --- /dev/null +++ b/js/src/3rdparty/etherscan/account.js @@ -0,0 +1,75 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; + +const PAGE_SIZE = 25; + +import util from '../../api/util'; +import { call } from './call'; + +function _call (method, params, test, netVersion) { + return call('account', method, params, test, netVersion); +} + +function balance (address, test, netVersion) { + return _call('balance', { + address: address, + tag: 'latest' + }, test, netVersion).then((balance) => { + // same format as balancemulti below + return { + account: address, + balance: balance + }; + }); +} + +function balances (addresses, test, netVersion) { + return _call('balancemulti', { + address: addresses.join(','), + tag: 'latest' + }, test, netVersion); +} + +function transactions (address, page, test, netVersion) { + // page offset from 0 + return _call('txlist', { + address: address, + offset: PAGE_SIZE, + page: (page || 0) + 1, + sort: 'desc' + }, test, netVersion).then((transactions) => { + return transactions.map((tx) => { + return { + blockNumber: new BigNumber(tx.blockNumber || 0), + from: util.toChecksumAddress(tx.from), + hash: tx.hash, + timeStamp: tx.timeStamp, + to: util.toChecksumAddress(tx.to), + value: tx.value + }; + }); + }); +} + +const account = { + balance, + balances, + transactions +}; + +export { account }; diff --git a/js/src/3rdparty/etherscan/account.spec.js b/js/src/3rdparty/etherscan/account.spec.js new file mode 100644 index 000000000..54eff9f9c --- /dev/null +++ b/js/src/3rdparty/etherscan/account.spec.js @@ -0,0 +1,71 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const etherscan = require('./'); + +const TESTADDR = '0xbf885e2b55c6bcc84556a3c5f07d3040833c8d00'; + +describe.skip('etherscan/account', function () { + this.timeout(60 * 1000); + + const checkBalance = function (balance, addr) { + expect(balance).to.be.ok; + expect(balance.account).to.equal(addr); + expect(balance.balance).to.be.ok; + }; + + it('retrieves an account balance', () => { + return etherscan.account + .balance(TESTADDR) + .then((balance) => { + checkBalance(balance, TESTADDR); + }); + }); + + it('retrieves multi account balances', () => { + const addresses = ['0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae', TESTADDR]; + + return etherscan.account + .balances(addresses) + .then((balances) => { + expect(balances).to.be.ok; + expect(balances.length).to.equal(2); + balances.forEach((balance, idx) => { + checkBalance(balance, addresses[idx]); + }); + }); + }); + + describe('transactions', () => { + it('retrieves a list of transactions (default)', () => { + return etherscan.account + .transactions(TESTADDR) + .then((transactions) => { + expect(transactions).to.be.ok; + expect(transactions.length).to.equal(25); + }); + }); + + it('retrieves a list of transactions (page 1)', () => { + return etherscan.account + .transactions(TESTADDR, 1) + .then((transactions) => { + expect(transactions).to.be.ok; + expect(transactions.length).to.equal(25); + }); + }); + }); +}); diff --git a/js/src/3rdparty/etherscan/call.js b/js/src/3rdparty/etherscan/call.js new file mode 100644 index 000000000..069627d78 --- /dev/null +++ b/js/src/3rdparty/etherscan/call.js @@ -0,0 +1,47 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { stringify } from 'qs'; +import { apiLink } from './links'; + +const options = { + method: 'GET', + headers: { + 'Accept': 'application/json' + } +}; + +export function call (module, action, _params, test, netVersion) { + const query = stringify(Object.assign({ + module, action + }, _params || {})); + + return fetch(apiLink(query, test, netVersion), options) + .then((response) => { + if (!response.ok) { + throw { code: response.status, message: response.statusText }; // eslint-disable-line + } + + return response.json(); + }) + .then((result) => { + if (result.message === 'NOTOK') { + throw { code: -1, message: result.result }; // eslint-disable-line + } + + return result.result; + }); +} diff --git a/js/src/3rdparty/etherscan/helpers.spec.js b/js/src/3rdparty/etherscan/helpers.spec.js new file mode 100644 index 000000000..fa29c3d97 --- /dev/null +++ b/js/src/3rdparty/etherscan/helpers.spec.js @@ -0,0 +1,38 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import nock from 'nock'; +import { stringify } from 'qs'; + +import { url } from './links'; + +function mockget (requests, test, netVersion) { + let scope = nock(url(test, netVersion)); + + requests.forEach((request) => { + scope = scope + .get(`/api?${stringify(request.query)}`) + .reply(request.code || 200, () => { + return { result: request.reply }; + }); + }); + + return scope; +} + +export { + mockget +}; diff --git a/js/src/3rdparty/etherscan/index.js b/js/src/3rdparty/etherscan/index.js new file mode 100644 index 000000000..594e833a8 --- /dev/null +++ b/js/src/3rdparty/etherscan/index.js @@ -0,0 +1,28 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { account } from './account'; +import { stats } from './stats'; +import { txLink, addressLink } from './links'; + +const etherscan = { + account: account, + stats: stats, + txLink: txLink, + addressLink: addressLink +}; + +export default etherscan; diff --git a/js/src/3rdparty/etherscan/links.js b/js/src/3rdparty/etherscan/links.js new file mode 100644 index 000000000..3b08d60e8 --- /dev/null +++ b/js/src/3rdparty/etherscan/links.js @@ -0,0 +1,55 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +// NOTE: Keep 'isTestnet' for backwards library compatibility +const getUrlPrefix = (isTestnet = false, netVersion = '0', defaultPrefix = '') => { + if (isTestnet) { + return 'ropsten.'; + } + + switch (netVersion) { + case '1': + return defaultPrefix; + + case '3': + return 'ropsten.'; + + case '4': + return 'rinkeby.'; + + case '42': + return 'kovan.'; + + default: + return 'testnet.'; + } +}; + +export const url = (isTestnet = false, netVersion = '0', defaultPrefix = '') => { + return `https://${getUrlPrefix(isTestnet, netVersion, defaultPrefix)}etherscan.io`; +}; + +export const txLink = (hash, isTestnet = false, netVersion = '0') => { + return `${url(isTestnet, netVersion)}/tx/${hash}`; +}; + +export const addressLink = (address, isTestnet = false, netVersion = '0') => { + return `${url(isTestnet, netVersion)}/address/${address}`; +}; + +export const apiLink = (query, isTestnet = false, netVersion = '0') => { + return `${url(isTestnet, netVersion, 'api.')}/api?${query}`; +}; diff --git a/js/src/3rdparty/etherscan/links.spec.js b/js/src/3rdparty/etherscan/links.spec.js new file mode 100644 index 000000000..c906940cb --- /dev/null +++ b/js/src/3rdparty/etherscan/links.spec.js @@ -0,0 +1,57 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const { url, txLink, addressLink, apiLink } = require('./links'); + +describe('etherscan/links', function () { + it('builds link with a prefix', () => { + expect(url(false, '1', 'api.')).to.be.equal('https://api.etherscan.io'); + }); + + it('builds link to main network', () => { + expect(url(false, '1')).to.be.equal('https://etherscan.io'); + }); + + it('builds link to ropsten', () => { + expect(url(false, '3')).to.be.equal('https://ropsten.etherscan.io'); + expect(url(true)).to.be.equal('https://ropsten.etherscan.io'); + }); + + it('builds link to kovan', () => { + expect(url(false, '42')).to.be.equal('https://kovan.etherscan.io'); + }); + + it('builds link to rinkeby', () => { + expect(url(false, '4')).to.be.equal('https://rinkeby.etherscan.io'); + }); + + it('builds link to the testnet selector for unknown networks', () => { + expect(url(false, '10042')).to.be.equal('https://testnet.etherscan.io'); + expect(url(false, '51224')).to.be.equal('https://testnet.etherscan.io'); + }); + + it('builds transaction link', () => { + expect(txLink('aTxHash', false, '1')).to.be.equal('https://etherscan.io/tx/aTxHash'); + }); + + it('builds address link', () => { + expect(addressLink('anAddress', false, '1')).to.be.equal('https://etherscan.io/address/anAddress'); + }); + + it('builds api link', () => { + expect(apiLink('answer=42', false, '1')).to.be.equal('https://api.etherscan.io/api?answer=42'); + }); +}); diff --git a/js/src/3rdparty/etherscan/stats.js b/js/src/3rdparty/etherscan/stats.js new file mode 100644 index 000000000..282376c5e --- /dev/null +++ b/js/src/3rdparty/etherscan/stats.js @@ -0,0 +1,36 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { call } from './call'; + +function _call (action, test) { + return call('stats', action, null, test); +} + +function price (test = false) { + return _call('ethprice', test); +} + +function supply (test = false) { + return _call('ethsupply', test); +} + +const stats = { + price: price, + supply: supply +}; + +export { stats }; diff --git a/js/src/3rdparty/etherscan/stats.spec.js b/js/src/3rdparty/etherscan/stats.spec.js new file mode 100644 index 000000000..d837f17f7 --- /dev/null +++ b/js/src/3rdparty/etherscan/stats.spec.js @@ -0,0 +1,37 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const etherscan = require('./'); + +describe.skip('etherscan/stats', function () { + this.timeout(60 * 1000); + + it('retrieves the latest price', () => { + return etherscan.stats + .price() + .then((price) => { + expect(price).to.be.ok; + }); + }); + + it('retrieves the ether total', () => { + return etherscan.stats + .supply() + .then((supply) => { + expect(supply).to.be.ok; + }); + }); +}); diff --git a/js/src/3rdparty/ledger/index.js b/js/src/3rdparty/ledger/index.js new file mode 100644 index 000000000..a5b876dca --- /dev/null +++ b/js/src/3rdparty/ledger/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './ledger'; diff --git a/js/src/3rdparty/ledger/ledger.js b/js/src/3rdparty/ledger/ledger.js new file mode 100644 index 000000000..13a671998 --- /dev/null +++ b/js/src/3rdparty/ledger/ledger.js @@ -0,0 +1,136 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import 'u2f-api-polyfill'; + +import BigNumber from 'bignumber.js'; +import Transaction from 'ethereumjs-tx'; +import u2fapi from 'u2f-api'; + +import Ledger3 from './vendor/ledger3'; +import LedgerEth from './vendor/ledger-eth'; + +const LEDGER_PATH_ETC = "44’/60’/160720'/0'/0"; +const LEDGER_PATH_ETH = "44'/60'/0'/0"; +const SCRAMBLE_KEY = 'w0w'; + +function numberToHex (number) { + return `0x${new BigNumber(number).toString(16)}`; +} + +export default class Ledger { + constructor (api, ledger) { + this._api = api; + this._ledger = ledger; + + this._isSupported = false; + + this.checkJSSupport(); + } + + // FIXME: Until we have https support from Parity u2f will not work. Here we mark it completely + // as unsupported until a full end-to-end environment is available. + get isSupported () { + return false && this._isSupported; + } + + checkJSSupport () { + return u2fapi + .isSupported() + .then((isSupported) => { + console.log('Ledger:checkJSSupport', isSupported); + + this._isSupported = isSupported; + }); + } + + getAppConfiguration () { + return new Promise((resolve, reject) => { + this._ledger.getAppConfiguration((response, error) => { + if (error) { + reject(error); + return; + } + + resolve(response); + }); + }); + } + + scan () { + return new Promise((resolve, reject) => { + this._ledger.getAddress(LEDGER_PATH_ETH, (response, error) => { + if (error) { + reject(error); + return; + } + + resolve([response.address]); + }, true, false); + }); + } + + signTransaction (transaction) { + return this._api.net.version().then((_chainId) => { + return new Promise((resolve, reject) => { + const chainId = new BigNumber(_chainId).toNumber(); + const tx = new Transaction({ + data: transaction.data || transaction.input, + gasPrice: numberToHex(transaction.gasPrice), + gasLimit: numberToHex(transaction.gasLimit), + nonce: numberToHex(transaction.nonce), + to: transaction.to ? transaction.to.toLowerCase() : undefined, + value: numberToHex(transaction.value), + v: Buffer.from([chainId]), // pass the chainId to the ledger + r: Buffer.from([]), + s: Buffer.from([]) + }); + const rawTransaction = tx.serialize().toString('hex'); + + this._ledger.signTransaction(LEDGER_PATH_ETH, rawTransaction, (response, error) => { + if (error) { + reject(error); + return; + } + + tx.v = Buffer.from(response.v, 'hex'); + tx.r = Buffer.from(response.r, 'hex'); + tx.s = Buffer.from(response.s, 'hex'); + + if (chainId !== Math.floor((tx.v[0] - 35) / 2)) { + reject(new Error('Invalid EIP155 signature received from Ledger.')); + return; + } + + resolve(`0x${tx.serialize().toString('hex')}`); + }); + }); + }); + } + + static create (api, ledger) { + if (!ledger) { + ledger = new LedgerEth(new Ledger3(SCRAMBLE_KEY)); + } + + return new Ledger(api, ledger); + } +} + +export { + LEDGER_PATH_ETC, + LEDGER_PATH_ETH +}; diff --git a/js/src/3rdparty/ledger/ledger.spec.js b/js/src/3rdparty/ledger/ledger.spec.js new file mode 100644 index 000000000..406a4bfcd --- /dev/null +++ b/js/src/3rdparty/ledger/ledger.spec.js @@ -0,0 +1,120 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import sinon from 'sinon'; + +import Ledger from './'; + +const TEST_ADDRESS = '0x63Cf90D3f0410092FC0fca41846f596223979195'; + +let api; +let ledger; +let vendor; + +function createApi () { + api = { + net: { + version: sinon.stub().resolves('2') + } + }; + + return api; +} + +function createVendor (error = null) { + vendor = { + getAddress: (path, callback) => { + callback({ + address: TEST_ADDRESS + }, error); + }, + getAppConfiguration: (callback) => { + callback({}, error); + }, + signTransaction: (path, rawTransaction, callback) => { + callback({ + v: [39], + r: [0], + s: [0] + }, error); + } + }; + + return vendor; +} + +function create (error) { + ledger = new Ledger(createApi(), createVendor(error)); + + return ledger; +} + +describe('3rdparty/ledger', () => { + beforeEach(() => { + create(); + + sinon.spy(vendor, 'getAddress'); + sinon.spy(vendor, 'getAppConfiguration'); + sinon.spy(vendor, 'signTransaction'); + }); + + afterEach(() => { + vendor.getAddress.restore(); + vendor.getAppConfiguration.restore(); + vendor.signTransaction.restore(); + }); + + describe('getAppConfiguration', () => { + beforeEach(() => { + return ledger.getAppConfiguration(); + }); + + it('calls into getAppConfiguration', () => { + expect(vendor.getAppConfiguration).to.have.been.called; + }); + }); + + describe('scan', () => { + beforeEach(() => { + return ledger.scan(); + }); + + it('calls into getAddress', () => { + expect(vendor.getAddress).to.have.been.called; + }); + }); + + describe('signTransaction', () => { + beforeEach(() => { + return ledger.signTransaction({ + data: '0x0', + gasPrice: 20000000, + gasLimit: 1000000, + nonce: 2, + to: '0x63Cf90D3f0410092FC0fca41846f596223979195', + value: 1 + }); + }); + + it('retrieves chainId via API', () => { + expect(api.net.version).to.have.been.called; + }); + + it('calls into signTransaction', () => { + expect(vendor.signTransaction).to.have.been.called; + }); + }); +}); diff --git a/js/src/3rdparty/ledger/vendor/README.md b/js/src/3rdparty/ledger/vendor/README.md new file mode 100644 index 000000000..a44c3521b --- /dev/null +++ b/js/src/3rdparty/ledger/vendor/README.md @@ -0,0 +1,11 @@ +# Description + +Vendor files (c) 2016 [Ledger](https://github.com/LedgerHQ) for [Ledger Nano-S](https://www.ledgerwallet.com/) integration + +# Origin + +Files originally created via [https://github.com/kvhnuke/etherwallet/pull/248/files](https://github.com/kvhnuke/etherwallet/pull/248/files) + +# License + +Files in this directory is licensed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) by their original author diff --git a/js/src/3rdparty/ledger/vendor/ledger-eth.js b/js/src/3rdparty/ledger/vendor/ledger-eth.js new file mode 100644 index 000000000..80ff0d0a6 --- /dev/null +++ b/js/src/3rdparty/ledger/vendor/ledger-eth.js @@ -0,0 +1,166 @@ +/******************************************************************************** +* Ledger Communication toolkit +* (c) 2016 Ledger +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +********************************************************************************/ + +/* eslint-disable */ + +'use strict'; + +var LedgerEth = function(comm) { + this.comm = comm; +} + +LedgerEth.splitPath = function(path) { + var result = []; + var components = path.split('/'); + components.forEach(function (element, index) { + var number = parseInt(element, 10); + if (isNaN(number)) { + return; + } + if ((element.length > 1) && (element[element.length - 1] == "'")) { + number += 0x80000000; + } + result.push(number); + }); + return result; +} + +// callback is function(response, error) +LedgerEth.prototype.getAddress = function(path, callback, boolDisplay, boolChaincode) { + var splitPath = LedgerEth.splitPath(path); + var buffer = new Buffer(5 + 1 + splitPath.length * 4); + buffer[0] = 0xe0; + buffer[1] = 0x02; + buffer[2] = (boolDisplay ? 0x01 : 0x00); + buffer[3] = (boolChaincode ? 0x01 : 0x00); + buffer[4] = 1 + splitPath.length * 4; + buffer[5] = splitPath.length; + splitPath.forEach(function (element, index) { + buffer.writeUInt32BE(element, 6 + 4 * index); + }); + var self = this; + var localCallback = function(response, error) { + if (typeof error != "undefined") { + callback(undefined, error); + } + else { + var result = {}; + response = new Buffer(response, 'hex'); + var sw = response.readUInt16BE(response.length - 2); + if (sw != 0x9000) { + callback(undefined, "Invalid status " + sw.toString(16)); + return; + } + var publicKeyLength = response[0]; + var addressLength = response[1 + publicKeyLength]; + result['publicKey'] = response.slice(1, 1 + publicKeyLength).toString('hex'); + result['address'] = "0x" + response.slice(1 + publicKeyLength + 1, 1 + publicKeyLength + 1 + addressLength).toString('ascii'); + if (boolChaincode) { + result['chainCode'] = response.slice(1 + publicKeyLength + 1 + addressLength, 1 + publicKeyLength + 1 + addressLength + 32).toString('hex'); + } + callback(result); + } + }; + this.comm.exchange(buffer.toString('hex'), localCallback); +} + +// callback is function(response, error) +LedgerEth.prototype.signTransaction = function(path, rawTxHex, callback) { + var splitPath = LedgerEth.splitPath(path); + var offset = 0; + var rawTx = new Buffer(rawTxHex, 'hex'); + var apdus = []; + while (offset != rawTx.length) { + var maxChunkSize = (offset == 0 ? (150 - 1 - splitPath.length * 4) : 150) + var chunkSize = (offset + maxChunkSize > rawTx.length ? rawTx.length - offset : maxChunkSize); + var buffer = new Buffer(offset == 0 ? 5 + 1 + splitPath.length * 4 + chunkSize : 5 + chunkSize); + buffer[0] = 0xe0; + buffer[1] = 0x04; + buffer[2] = (offset == 0 ? 0x00 : 0x80); + buffer[3] = 0x00; + buffer[4] = (offset == 0 ? 1 + splitPath.length * 4 + chunkSize : chunkSize); + if (offset == 0) { + buffer[5] = splitPath.length; + splitPath.forEach(function (element, index) { + buffer.writeUInt32BE(element, 6 + 4 * index); + }); + rawTx.copy(buffer, 6 + 4 * splitPath.length, offset, offset + chunkSize); + } + else { + rawTx.copy(buffer, 5, offset, offset + chunkSize); + } + apdus.push(buffer.toString('hex')); + offset += chunkSize; + } + var self = this; + var localCallback = function(response, error) { + if (typeof error != "undefined") { + callback(undefined, error); + } + else { + response = new Buffer(response, 'hex'); + var sw = response.readUInt16BE(response.length - 2); + if (sw != 0x9000) { + callback(undefined, "Invalid status " + sw.toString(16)); + return; + } + if (apdus.length == 0) { + var result = {}; + result['v'] = response.slice(0, 1).toString('hex'); + result['r'] = response.slice(1, 1 + 32).toString('hex'); + result['s'] = response.slice(1 + 32, 1 + 32 + 32).toString('hex'); + callback(result); + } + else { + self.comm.exchange(apdus.shift(), localCallback); + } + } + }; + self.comm.exchange(apdus.shift(), localCallback); +} + +// callback is function(response, error) +LedgerEth.prototype.getAppConfiguration = function(callback) { + var buffer = new Buffer(5); + buffer[0] = 0xe0; + buffer[1] = 0x06; + buffer[2] = 0x00; + buffer[3] = 0x00; + buffer[4] = 0x00; + var localCallback = function(response, error) { + if (typeof error != "undefined") { + callback(undefined, error); + } + else { + response = new Buffer(response, 'hex'); + var result = {}; + var sw = response.readUInt16BE(response.length - 2); + if (sw != 0x9000) { + callback(undefined, "Invalid status " + sw.toString(16)); + return; + } + result['arbitraryDataEnabled'] = (response[0] & 0x01); + result['version'] = "" + response[1] + '.' + response[2] + '.' + response[3]; + callback(result); + } + }; + this.comm.exchange(buffer.toString('hex'), localCallback); +} + +module.exports = LedgerEth; + +/* eslint-enable */ diff --git a/js/src/3rdparty/ledger/vendor/ledger3.js b/js/src/3rdparty/ledger/vendor/ledger3.js new file mode 100644 index 000000000..9601279ad --- /dev/null +++ b/js/src/3rdparty/ledger/vendor/ledger3.js @@ -0,0 +1,72 @@ +/******************************************************************************** +* Ledger Communication toolkit +* (c) 2016 Ledger +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +********************************************************************************/ + +/* eslint-disable */ + +'use strict'; + +var Ledger3 = function(scrambleKey, timeoutSeconds) { + this.scrambleKey = new Buffer(scrambleKey, 'ascii'); + this.timeoutSeconds = timeoutSeconds; +} + +Ledger3.wrapApdu = function(apdu, key) { + var result = new Buffer(apdu.length); + for (var i=0; i. + +const nock = require('nock'); + +const APIKEY = '0x123454321'; + +function mockget (shapeshift, requests) { + let scope = nock(shapeshift.getRpc().ENDPOINT); + + requests.forEach((request) => { + scope = scope + .get(`/${request.path}`) + .reply(request.code || 200, () => { + return request.reply; + }); + }); + + return scope; +} + +function mockpost (shapeshift, requests) { + let scope = nock(shapeshift.getRpc().ENDPOINT); + + requests.forEach((request) => { + scope = scope + .post(`/${request.path}`) + .reply(request.code || 200, (uri, body) => { + scope.body = scope.body || {}; + scope.body[request.path] = body; + + return request.reply; + }); + }); + + return scope; +} + +module.exports = { + APIKEY, + mockget, + mockpost +}; diff --git a/js/src/3rdparty/shapeshift/index.js b/js/src/3rdparty/shapeshift/index.js new file mode 100644 index 000000000..aac05d3eb --- /dev/null +++ b/js/src/3rdparty/shapeshift/index.js @@ -0,0 +1,22 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import initRpc from './rpc'; +import initShapeshift from './shapeshift'; + +export default function (apikey) { + return initShapeshift(initRpc(apikey)); +} diff --git a/js/src/3rdparty/shapeshift/rpc.js b/js/src/3rdparty/shapeshift/rpc.js new file mode 100644 index 000000000..711a41c51 --- /dev/null +++ b/js/src/3rdparty/shapeshift/rpc.js @@ -0,0 +1,67 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const ENDPOINT = 'https://cors.shapeshift.io'; + +function call (method, options) { + return fetch(`${ENDPOINT}/${method}`, options) + .then((response) => { + if (!response.ok) { + throw new Error(response.statusText); + } + + return response.json(); + }) + .then((result) => { + if (result.error) { + throw new Error(result.error); + } + + return result; + }); +} + +export default function (apiKey) { + function get (method) { + return call(method, { + method: 'GET', + headers: { + 'Accept': 'application/json' + } + }); + } + + function post (method, data) { + const params = Object.assign({}, { apiKey }, data); + const body = JSON.stringify(params); + + return call(method, { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Content-Length': body.length + }, + body + }); + } + + return { + ENDPOINT, + get, + post + }; +} diff --git a/js/src/3rdparty/shapeshift/rpc.spec.js b/js/src/3rdparty/shapeshift/rpc.spec.js new file mode 100644 index 000000000..d445fbb05 --- /dev/null +++ b/js/src/3rdparty/shapeshift/rpc.spec.js @@ -0,0 +1,91 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const helpers = require('./helpers.spec.js'); + +const ShapeShift = require('./'); +const initShapeshift = (ShapeShift.default || ShapeShift); + +const mockget = helpers.mockget; +const mockpost = helpers.mockpost; + +describe('shapeshift/rpc', () => { + let rpc; + let shapeshift; + + beforeEach(() => { + shapeshift = initShapeshift(helpers.APIKEY); + rpc = shapeshift.getRpc(); + }); + + describe('GET', () => { + const REPLY = { test: 'this is some result' }; + + let scope; + let result; + + beforeEach(() => { + scope = mockget(shapeshift, [{ path: 'test', reply: REPLY }]); + + return rpc + .get('test') + .then((_result) => { + result = _result; + }); + }); + + it('does GET', () => { + expect(scope.isDone()).to.be.true; + }); + + it('retrieves the info', () => { + expect(result).to.deep.equal(REPLY); + }); + }); + + describe('POST', () => { + const REPLY = { test: 'this is some result' }; + + let scope; + let result; + + beforeEach(() => { + scope = mockpost(shapeshift, [{ path: 'test', reply: REPLY }]); + + return rpc + .post('test', { input: 'stuff' }) + .then((_result) => { + result = _result; + }); + }); + + it('does POST', () => { + expect(scope.isDone()).to.be.true; + }); + + it('retrieves the info', () => { + expect(result).to.deep.equal(REPLY); + }); + + it('passes the input object', () => { + expect(scope.body.test.input).to.equal('stuff'); + }); + + it('passes the apikey specified', () => { + expect(scope.body.test.apiKey).to.equal(helpers.APIKEY); + }); + }); +}); diff --git a/js/src/3rdparty/shapeshift/shapeshift.js b/js/src/3rdparty/shapeshift/shapeshift.js new file mode 100644 index 000000000..5ecf141da --- /dev/null +++ b/js/src/3rdparty/shapeshift/shapeshift.js @@ -0,0 +1,135 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default function (rpc) { + let _subscriptions = []; + let _pollStatusIntervalId = null; + let _subscriptionPromises = null; + + function getCoins () { + return rpc.get('getcoins'); + } + + function getMarketInfo (pair) { + return rpc.get(`marketinfo/${pair}`); + } + + function getRpc () { + return rpc; + } + + function getStatus (depositAddress) { + return rpc.get(`txStat/${depositAddress}`); + } + + function shift (toAddress, returnAddress, pair) { + return rpc.post('shift', { + pair, + returnAddress, + withdrawal: toAddress + }); + } + + function subscribe (depositAddress, callback) { + if (!depositAddress || !callback) { + return; + } + + const index = _subscriptions.length; + + _subscriptions.push({ + callback, + depositAddress, + index + }); + + if (_pollStatusIntervalId === null) { + _pollStatusIntervalId = setInterval(_pollStatus, 2000); + } + } + + function unsubscribe (depositAddress) { + _subscriptions = _subscriptions.filter((sub) => sub.depositAddress !== depositAddress); + + if (_subscriptions.length === 0) { + clearInterval(_pollStatusIntervalId); + _pollStatusIntervalId = null; + } + + return true; + } + + function _getSubscriptionStatus (subscription) { + if (!subscription) { + return Promise.resolve(); + } + + return getStatus(subscription.depositAddress) + .then((result) => { + switch (result.status) { + case 'no_deposits': + case 'received': + subscription.callback(null, result); + return true; + + case 'complete': + subscription.callback(null, result); + unsubscribe(subscription.depositAddress); + return true; + + case 'failed': + subscription.callback({ + message: status.error, + fatal: true + }); + unsubscribe(subscription.depositAddress); + return true; + } + }) + .catch(() => { + return true; + }); + } + + function _pollStatus () { + _subscriptionPromises = Promise.all(_subscriptions.map(_getSubscriptionStatus)); + } + + function _getSubscriptions () { + return _subscriptions; + } + + function _getSubscriptionPromises () { + return _subscriptionPromises; + } + + function _isPolling () { + return _pollStatusIntervalId !== null; + } + + return { + _getSubscriptions, + _getSubscriptionPromises, + _isPolling, + getCoins, + getMarketInfo, + getRpc, + getStatus, + shift, + subscribe, + unsubscribe + }; +} diff --git a/js/src/3rdparty/shapeshift/shapeshift.spec.js b/js/src/3rdparty/shapeshift/shapeshift.spec.js new file mode 100644 index 000000000..0fa6639d8 --- /dev/null +++ b/js/src/3rdparty/shapeshift/shapeshift.spec.js @@ -0,0 +1,220 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const sinon = require('sinon'); + +const ShapeShift = require('./'); +const initShapeshift = (ShapeShift.default || ShapeShift); + +const helpers = require('./helpers.spec.js'); + +const mockget = helpers.mockget; +const mockpost = helpers.mockpost; + +describe('shapeshift/calls', () => { + let clock; + let shapeshift; + + beforeEach(() => { + clock = sinon.useFakeTimers(); + shapeshift = initShapeshift(helpers.APIKEY); + }); + + afterEach(() => { + clock.restore(); + }); + + describe('getCoins', () => { + const REPLY = { + BTC: { + name: 'Bitcoin', + symbol: 'BTC', + image: 'https://shapeshift.io/images/coins/bitcoin.png', + status: 'available' + }, + ETH: { + name: 'Ether', + symbol: 'ETH', + image: 'https://shapeshift.io/images/coins/ether.png', + status: 'available' + } + }; + + let scope; + + beforeEach(() => { + scope = mockget(shapeshift, [{ path: 'getcoins', reply: REPLY }]); + + return shapeshift.getCoins(); + }); + + it('makes the call', () => { + expect(scope.isDone()).to.be.ok; + }); + }); + + describe('getMarketInfo', () => { + const REPLY = { + pair: 'btc_ltc', + rate: 128.17959917, + minerFee: 0.003, + limit: 0, + minimum: 0.00004632 + }; + + let scope; + + beforeEach(() => { + scope = mockget(shapeshift, [{ path: 'marketinfo/btc_ltc', reply: REPLY }]); + + return shapeshift.getMarketInfo('btc_ltc'); + }); + + it('makes the call', () => { + expect(scope.isDone()).to.be.ok; + }); + }); + + describe('getStatus', () => { + const REPLY = { + status: '0x123', + address: '0x123' + }; + + let scope; + + beforeEach(() => { + scope = mockget(shapeshift, [{ path: 'txStat/0x123', reply: REPLY }]); + + return shapeshift.getStatus('0x123'); + }); + + it('makes the call', () => { + expect(scope.isDone()).to.be.ok; + }); + }); + + describe('shift', () => { + const REPLY = { + deposit: '1BTC', + depositType: 'btc', + withdrawal: '0x456', + withdrawalType: 'eth' + }; + + let scope; + + beforeEach(() => { + scope = mockpost(shapeshift, [{ path: 'shift', reply: REPLY }]); + + return shapeshift.shift('0x456', '1BTC', 'btc_eth'); + }); + + it('makes the call', () => { + expect(scope.isDone()).to.be.ok; + }); + + describe('body', () => { + it('has withdrawal set', () => { + expect(scope.body.shift.withdrawal).to.equal('0x456'); + }); + + it('has returnAddress set', () => { + expect(scope.body.shift.returnAddress).to.equal('1BTC'); + }); + + it('has pair set', () => { + expect(scope.body.shift.pair).to.equal('btc_eth'); + }); + }); + }); + + describe('subscriptions', () => { + const ADDRESS = '0123456789abcdef'; + const REPLY = { + status: 'complete', + address: ADDRESS + }; + + let callback; + + beforeEach(() => { + mockget(shapeshift, [{ path: `txStat/${ADDRESS}`, reply: REPLY }]); + callback = sinon.stub(); + shapeshift.subscribe(ADDRESS, callback); + }); + + describe('subscribe', () => { + it('adds the depositAddress to the list', () => { + const subscriptions = shapeshift._getSubscriptions(); + + expect(subscriptions.length).to.equal(1); + expect(subscriptions[0].depositAddress).to.equal(ADDRESS); + }); + + it('starts the polling timer', () => { + expect(shapeshift._isPolling()).to.be.true; + }); + + it('calls the callback once the timer has elapsed', () => { + clock.tick(2222); + + return shapeshift._getSubscriptionPromises().then(() => { + expect(callback).to.have.been.calledWith(null, REPLY); + }); + }); + + it('auto-unsubscribes on completed', () => { + clock.tick(2222); + + return shapeshift._getSubscriptionPromises().then(() => { + expect(shapeshift._getSubscriptions().length).to.equal(0); + }); + }); + }); + + describe('unsubscribe', () => { + it('unbsubscribes when requested', () => { + expect(shapeshift._getSubscriptions().length).to.equal(1); + shapeshift.unsubscribe(ADDRESS); + expect(shapeshift._getSubscriptions().length).to.equal(0); + }); + + it('clears the polling on no subscriptions', () => { + shapeshift.unsubscribe(ADDRESS); + expect(shapeshift._isPolling()).to.be.false; + }); + + it('handles unsubscribe of auto-unsubscribe', () => { + clock.tick(2222); + + return shapeshift._getSubscriptionPromises().then(() => { + expect(shapeshift.unsubscribe(ADDRESS)).to.be.true; + }); + }); + + it('handles unsubscribe when multiples listed', () => { + const ADDRESS2 = 'abcdef0123456789'; + + shapeshift.subscribe(ADDRESS2, sinon.stub()); + expect(shapeshift._getSubscriptions().length).to.equal(2); + expect(shapeshift._getSubscriptions()[0].depositAddress).to.equal(ADDRESS); + shapeshift.unsubscribe(ADDRESS); + expect(shapeshift._getSubscriptions()[0].depositAddress).to.equal(ADDRESS2); + }); + }); + }); +}); diff --git a/js/src/3rdparty/sms-verification/index.js b/js/src/3rdparty/sms-verification/index.js new file mode 100644 index 000000000..79cbf13d2 --- /dev/null +++ b/js/src/3rdparty/sms-verification/index.js @@ -0,0 +1,68 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { stringify } from 'querystring'; + +export const isServerRunning = (isTestnet = false) => { + const port = isTestnet ? 8443 : 443; + + return fetch(`https://sms-verification.parity.io:${port}/health`, { + mode: 'cors', + cache: 'no-store' + }) + .then((res) => { + return res.ok; + }) + .catch(() => { + return false; + }); +}; + +export const hasReceivedCode = (number, address, isTestnet = false) => { + const port = isTestnet ? 8443 : 443; + const query = stringify({ number, address }); + + return fetch(`https://sms-verification.parity.io:${port}/?${query}`, { + mode: 'cors', + cache: 'no-store' + }) + .then((res) => { + return res.ok; + }) + .catch(() => { + return false; // todo: check for 404 + }); +}; + +export const postToServer = (query, isTestnet = false) => { + const port = isTestnet ? 8443 : 443; + + query = stringify(query); + + return fetch(`https://sms-verification.parity.io:${port}/?${query}`, { + method: 'POST', + mode: 'cors', + cache: 'no-store' + }) + .then((res) => { + return res.json().then((data) => { + if (res.ok) { + return data.message; + } + throw new Error(data.message || 'unknown error'); + }); + }); +}; diff --git a/js/src/3rdparty/sms-verification/terms-of-service.js b/js/src/3rdparty/sms-verification/terms-of-service.js new file mode 100644 index 000000000..9451a382b --- /dev/null +++ b/js/src/3rdparty/sms-verification/terms-of-service.js @@ -0,0 +1,27 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React from 'react'; + +export default ( +
      +
    • This privacy notice relates to your use of the Parity SMS verification service. We take your privacy seriously and deal in an honest, direct and transparent way when it comes to your data.
    • +
    • We collect your phone number when you use this service. This is temporarily kept in memory, and then encrypted and stored in our EU servers. We only retain the cryptographic hash of the number to prevent duplicated accounts. You consent to this use.
    • +
    • You pay a fee for the cost of this service using the account you want to verify.
    • +
    • Your phone number is transmitted to a third party US SMS verification service Twilio for the sole purpose of the SMS verification. You consent to this use. Twilio’s privacy policy is here: https://www.twilio.com/legal/privacy/developer.
    • +
    • Parity Technology Limited is registered in England and Wales under company number 09760015 and complies with the Data Protection Act 1998 (UK). You may contact us via email at admin@parity.io. Our general privacy policy can be found here: https://parity.io/legal.html.
    • +
    +); diff --git a/js/src/abi/README.md b/js/src/abi/README.md new file mode 100644 index 000000000..20bc094de --- /dev/null +++ b/js/src/abi/README.md @@ -0,0 +1,32 @@ +# ethabi-js + +A very early, very POC-type port of [https://github.com/paritytech/ethabi](https://github.com/paritytech/ethabi) to JavaScript + +[![Build Status](https://travis-ci.org/jacogr/ethabi-js.svg?branch=master)](https://travis-ci.org/jacogr/ethabi-js) +[![Coverage Status](https://coveralls.io/repos/github/jacogr/ethabi-js/badge.svg?branch=master)](https://coveralls.io/github/jacogr/ethabi-js?branch=master) +[![Dependency Status](https://david-dm.org/jacogr/ethabi-js.svg)](https://david-dm.org/jacogr/ethabi-js) +[![devDependency Status](https://david-dm.org/jacogr/ethabi-js/dev-status.svg)](https://david-dm.org/jacogr/ethabi-js#info=devDependencies) + +## contributing + +Clone the repo and install dependencies via `npm install`. Tests can be executed via + +- `npm run testOnce` (100% covered unit tests) + +## installation + +Install the package with `npm install --save ethabi-js` from the [npm registry ethabi-js](https://www.npmjs.com/package/ethabi-js) + + +## implementation +### approach + +- this version tries to stay as close to the original Rust version in intent, function names & purpose +- it is a basic port of the Rust version, relying on effectively the same test-suite (expanded where deemed appropriate) +- it is meant as a library to be used in other projects, i.e. [ethapi-js](https://www.npmjs.com/package/ethapi-js) + +### differences to original Rust version + +- internally the library operates on string binary representations as opposed to Vector bytes, lengths are therefore 64 bytes as opposed to 32 bytes +- function names are adapted from the Rust standard snake_case to the JavaScript standard camelCase +- due to the initial library focus, the cli component (as implemented by the original) is not supported nor mplemented diff --git a/js/src/abi/abi.js b/js/src/abi/abi.js new file mode 100644 index 000000000..892f531fa --- /dev/null +++ b/js/src/abi/abi.js @@ -0,0 +1,20 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Interface from './spec/interface'; + +export default class Abi extends Interface { +} diff --git a/js/src/abi/decoder/bytesTaken.js b/js/src/abi/decoder/bytesTaken.js new file mode 100644 index 000000000..dbf766f4b --- /dev/null +++ b/js/src/abi/decoder/bytesTaken.js @@ -0,0 +1,30 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class BytesTaken { + constructor (bytes, newOffset) { + this._bytes = bytes; + this._newOffset = newOffset; + } + + get bytes () { + return this._bytes; + } + + get newOffset () { + return this._newOffset; + } +} diff --git a/js/src/abi/decoder/bytesTaken.spec.js b/js/src/abi/decoder/bytesTaken.spec.js new file mode 100644 index 000000000..9329657e4 --- /dev/null +++ b/js/src/abi/decoder/bytesTaken.spec.js @@ -0,0 +1,29 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BytesTaken from './bytesTaken'; + +describe('abi/decoder/BytesTaken', () => { + describe('constructor', () => { + it('sets the bytes of the object', () => { + expect((new BytesTaken(1, 2)).bytes).to.equal(1); + }); + + it('sets the newOffset of the object', () => { + expect((new BytesTaken(3, 4)).newOffset).to.equal(4); + }); + }); +}); diff --git a/js/src/abi/decoder/decodeResult.js b/js/src/abi/decoder/decodeResult.js new file mode 100644 index 000000000..5e41da4b6 --- /dev/null +++ b/js/src/abi/decoder/decodeResult.js @@ -0,0 +1,30 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class DecodeResult { + constructor (token, newOffset) { + this._token = token; + this._newOffset = newOffset; + } + + get token () { + return this._token; + } + + get newOffset () { + return this._newOffset; + } +} diff --git a/js/src/abi/decoder/decodeResult.spec.js b/js/src/abi/decoder/decodeResult.spec.js new file mode 100644 index 000000000..0c4c81c5c --- /dev/null +++ b/js/src/abi/decoder/decodeResult.spec.js @@ -0,0 +1,29 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import DecodeResult from './decodeResult'; + +describe('abi/decoder/DecodeResult', () => { + describe('constructor', () => { + it('sets the token of the object', () => { + expect((new DecodeResult('token', 2)).token).to.equal('token'); + }); + + it('sets the newOffset of the object', () => { + expect((new DecodeResult('baz', 4)).newOffset).to.equal(4); + }); + }); +}); diff --git a/js/src/abi/decoder/decoder.js b/js/src/abi/decoder/decoder.js new file mode 100644 index 000000000..6922c91e8 --- /dev/null +++ b/js/src/abi/decoder/decoder.js @@ -0,0 +1,156 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import utf8 from 'utf8'; + +import Token from '../token/token'; +import BytesTaken from './bytesTaken'; +import DecodeResult from './decodeResult'; +import ParamType from '../spec/paramType/paramType'; +import { sliceData } from '../util/slice'; +import { asAddress, asBool, asI32, asU32 } from '../util/sliceAs'; +import { isArray, isInstanceOf } from '../util/types'; + +const NULL = '0000000000000000000000000000000000000000000000000000000000000000'; + +export default class Decoder { + static decode (params, data) { + if (!isArray(params)) { + throw new Error('Parameters should be array of ParamType'); + } + + const slices = sliceData(data); + let offset = 0; + + return params.map((param) => { + const result = Decoder.decodeParam(param, slices, offset); + + offset = result.newOffset; + return result.token; + }); + } + + static peek (slices, position) { + if (!slices || !slices[position]) { + return NULL; + } + + return slices[position]; + } + + static takeBytes (slices, position, length) { + const slicesLength = Math.floor((length + 31) / 32); + let bytesStr = ''; + + for (let idx = 0; idx < slicesLength; idx++) { + bytesStr = `${bytesStr}${Decoder.peek(slices, position + idx)}`; + } + + const bytes = (bytesStr.substr(0, length * 2).match(/.{1,2}/g) || []).map((code) => parseInt(code, 16)); + + return new BytesTaken(bytes, position + slicesLength); + } + + static decodeParam (param, slices, offset) { + if (!isInstanceOf(param, ParamType)) { + throw new Error('param should be instanceof ParamType'); + } + + const tokens = []; + let taken; + let lengthOffset; + let length; + let newOffset; + + switch (param.type) { + case 'address': + return new DecodeResult(new Token(param.type, asAddress(Decoder.peek(slices, offset))), offset + 1); + + case 'bool': + return new DecodeResult(new Token(param.type, asBool(Decoder.peek(slices, offset))), offset + 1); + + case 'int': + return new DecodeResult(new Token(param.type, asI32(Decoder.peek(slices, offset))), offset + 1); + + case 'uint': + return new DecodeResult(new Token(param.type, asU32(Decoder.peek(slices, offset))), offset + 1); + + case 'fixedBytes': + taken = Decoder.takeBytes(slices, offset, param.length); + + return new DecodeResult(new Token(param.type, taken.bytes), taken.newOffset); + + case 'bytes': + lengthOffset = asU32(Decoder.peek(slices, offset)).div(32).toNumber(); + length = asU32(Decoder.peek(slices, lengthOffset)).toNumber(); + taken = Decoder.takeBytes(slices, lengthOffset + 1, length); + + return new DecodeResult(new Token(param.type, taken.bytes), offset + 1); + + case 'string': + if (param.indexed) { + taken = Decoder.takeBytes(slices, offset, 32); + + return new DecodeResult(new Token('fixedBytes', taken.bytes), offset + 1); + } + + lengthOffset = asU32(Decoder.peek(slices, offset)).div(32).toNumber(); + length = asU32(Decoder.peek(slices, lengthOffset)).toNumber(); + taken = Decoder.takeBytes(slices, lengthOffset + 1, length); + + const str = taken.bytes.map((code) => String.fromCharCode(code)).join(''); + + let decoded; + + try { + decoded = utf8.decode(str); + } catch (error) { + decoded = str; + } + + return new DecodeResult(new Token(param.type, decoded), offset + 1); + + case 'array': + lengthOffset = asU32(Decoder.peek(slices, offset)).div(32).toNumber(); + length = asU32(Decoder.peek(slices, lengthOffset)).toNumber(); + newOffset = lengthOffset + 1; + + for (let idx = 0; idx < length; idx++) { + const result = Decoder.decodeParam(param.subtype, slices, newOffset); + + newOffset = result.newOffset; + tokens.push(result.token); + } + + return new DecodeResult(new Token(param.type, tokens), offset + 1); + + case 'fixedArray': + newOffset = offset; + + for (let idx = 0; idx < param.length; idx++) { + const result = Decoder.decodeParam(param.subtype, slices, newOffset); + + newOffset = result.newOffset; + tokens.push(result.token); + } + + return new DecodeResult(new Token(param.type, tokens), newOffset); + + default: + throw new Error(`Invalid param type ${param.type} in decodeParam`); + } + } +} diff --git a/js/src/abi/decoder/decoder.spec.js b/js/src/abi/decoder/decoder.spec.js new file mode 100644 index 000000000..5065be3a7 --- /dev/null +++ b/js/src/abi/decoder/decoder.spec.js @@ -0,0 +1,319 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; + +import Decoder from './decoder'; +import ParamType from '../spec/paramType'; +import Token from '../token'; +import { padU32 } from '../util/pad'; + +describe('abi/decoder/Decoder', () => { + const stringToBytes = function (str) { + return str.match(/.{1,2}/g).map((code) => parseInt(code, 16)); + }; + + const address1 = '0000000000000000000000001111111111111111111111111111111111111111'; + const address2 = '0000000000000000000000002222222222222222222222222222222222222222'; + const address3 = '0000000000000000000000003333333333333333333333333333333333333333'; + const address4 = '0000000000000000000000004444444444444444444444444444444444444444'; + const bool1 = '0000000000000000000000000000000000000000000000000000000000000001'; + const bytes1 = '1234000000000000000000000000000000000000000000000000000000000000'; + const bytes2 = '1000000000000000000000000000000000000000000000000000000000000000'; + const bytes3 = '10000000000000000000000000000000000000000000000000000000000002'; + const bytes4 = '0010000000000000000000000000000000000000000000000000000000000002'; + const int1 = '0111111111111111111111111111111111111111111111111111111111111111'; + const intn = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85'; + const string1 = '6761766f66796f726b0000000000000000000000000000000000000000000000'; + const string2 = '4665726ee16e64657a0000000000000000000000000000000000000000000000'; + const tokenAddress1 = new Token('address', `0x${address1.slice(-40)}`); + const tokenAddress2 = new Token('address', `0x${address2.slice(-40)}`); + const tokenAddress3 = new Token('address', `0x${address3.slice(-40)}`); + const tokenAddress4 = new Token('address', `0x${address4.slice(-40)}`); + const tokenBool1 = new Token('bool', true); + const tokenFixedBytes1 = new Token('fixedBytes', [0x12, 0x34]); + const tokenBytes1 = new Token('bytes', [0x12, 0x34]); + const tokenBytes2 = new Token('bytes', stringToBytes(bytes2).concat(stringToBytes(bytes2))); + const tokenBytes3 = new Token('bytes', stringToBytes(bytes3)); + const tokenBytes4 = new Token('bytes', stringToBytes(bytes4)); + const tokenInt1 = new Token('int', new BigNumber(int1, 16)); + const tokenIntn = new Token('int', new BigNumber(-123)); + const tokenUint1 = new Token('uint', new BigNumber(int1, 16)); + const tokenUintn = new Token('uint', new BigNumber(intn, 16)); + const tokenString1 = new Token('string', 'gavofyork'); + const tokenString2 = new Token('string', 'Fernández'); + const slices = [ address1, address2, address3, address4 ]; + + describe('peek', () => { + it('returns the slice at the correct position', () => { + expect(Decoder.peek(slices, 1)).to.equal(slices[1]); + }); + + it('returns empty on invalid slices', () => { + expect(Decoder.peek(null, 4)).to.equal('0000000000000000000000000000000000000000000000000000000000000000'); + }); + }); + + describe('takeBytes', () => { + it('returns a single slice', () => { + expect(Decoder.takeBytes(slices, 0, 32).bytes).to.deep.equal(stringToBytes(slices[0])); + }); + + it('returns a single partial slice', () => { + expect(Decoder.takeBytes(slices, 0, 20).bytes).to.deep.equal(stringToBytes(slices[0].substr(0, 40))); + }); + + it('returns multiple slices', () => { + expect(Decoder.takeBytes(slices, 0, 64).bytes).to.deep.equal(stringToBytes(`${slices[0]}${slices[1]}`)); + }); + + it('returns a single offset slice', () => { + expect(Decoder.takeBytes(slices, 1, 32).bytes).to.deep.equal(stringToBytes(slices[1])); + }); + + it('returns multiple offset slices', () => { + expect(Decoder.takeBytes(slices, 1, 64).bytes).to.deep.equal(stringToBytes(`${slices[1]}${slices[2]}`)); + }); + + it('returns the requires length from slices', () => { + expect( + Decoder.takeBytes(slices, 1, 75).bytes + ).to.deep.equal(stringToBytes(`${slices[1]}${slices[2]}${slices[3]}`.substr(0, 150))); + }); + }); + + describe('decodeParam', () => { + it('throws an error on non ParamType param', () => { + expect(() => Decoder.decodeParam({})).to.throw(/ParamType/); + }); + + it('throws an error on invalid param type', () => { + const pt = new ParamType('address'); + + pt._type = 'noMatch'; + + expect(() => Decoder.decodeParam(pt)).to.throw(/noMatch/); + }); + + it('decodes an address', () => { + expect( + Decoder.decodeParam(new ParamType('address'), [address1], 0).token + ).to.deep.equal(tokenAddress1); + }); + + it('decodes a bool', () => { + expect( + Decoder.decodeParam(new ParamType('bool'), [bool1], 0).token + ).to.deep.equal(tokenBool1); + }); + + it('decodes an int', () => { + expect( + Decoder.decodeParam(new ParamType('int'), [int1], 0).token + ).to.deep.equal(tokenInt1); + }); + + it('decodes a negative int', () => { + expect( + Decoder.decodeParam(new ParamType('int'), [intn], 0).token + ).to.deep.equal(tokenIntn); + }); + + it('decodes an uint', () => { + expect( + Decoder.decodeParam(new ParamType('uint'), [int1], 0).token + ).to.deep.equal(tokenUint1); + }); + + it('decodes an uint (negative as int)', () => { + expect( + Decoder.decodeParam(new ParamType('uint'), [intn], 0).token + ).to.deep.equal(tokenUintn); + }); + + it('decodes fixedBytes', () => { + expect( + Decoder.decodeParam(new ParamType('fixedBytes', null, 2), [bytes1], 0).token + ).to.deep.equal(tokenFixedBytes1); + }); + + it('decodes bytes', () => { + expect( + Decoder.decodeParam(new ParamType('bytes'), [padU32(0x20), padU32(2), bytes1], 0).token + ).to.deep.equal(tokenBytes1); + }); + + it('decodes string', () => { + expect( + Decoder.decodeParam(new ParamType('string'), [padU32(0x20), padU32(9), string1], 0).token + ).to.deep.equal(tokenString1); + }); + + it('decodes utf8-invalid string', () => { + expect( + Decoder.decodeParam(new ParamType('string'), [padU32(0x20), padU32(9), string2], 0).token + ).to.deep.equal(tokenString2); + }); + + it('decodes string (indexed)', () => { + expect( + Decoder.decodeParam(new ParamType('string', null, 0, true), [bytes1], 0) + ).to.deep.equal(Decoder.decodeParam(new ParamType('fixedBytes', null, 32, true), [bytes1], 0)); + }); + }); + + describe('decode', () => { + it('throws an error on invalid params', () => { + expect(() => Decoder.decode(null, '123')).to.throw(/array/); + }); + + describe('address', () => { + it('decodes an address', () => { + expect( + Decoder.decode( + [new ParamType('address')], + `${address1}` + ) + ).to.deep.equal([tokenAddress1]); + }); + + it('decodes 2 addresses', () => { + expect( + Decoder.decode( + [new ParamType('address'), new ParamType('address')], + `${address1}${address2}` + ) + ).to.deep.equal([tokenAddress1, tokenAddress2]); + }); + + it('decodes a fixedArray of addresses', () => { + expect( + Decoder.decode( + [new ParamType('fixedArray', new ParamType('address'), 2)], + `${address1}${address2}` + ) + ).to.deep.equal([new Token('fixedArray', [tokenAddress1, tokenAddress2])]); + }); + + it('decodes a dynamic array of addresses', () => { + expect( + Decoder.decode( + [new ParamType('array', new ParamType('address'))], + `${padU32(0x20)}${padU32(2)}${address1}${address2}` + ) + ).to.deep.equal([new Token('array', [tokenAddress1, tokenAddress2])]); + }); + + it('decodes a dynamic array of fixed arrays', () => { + expect( + Decoder.decode( + [new ParamType('array', new ParamType('fixedArray', new ParamType('address'), 2))], + `${padU32(0x20)}${padU32(2)}${address1}${address2}${address3}${address4}` + ) + ).to.deep.equal([ + new Token('array', [ + new Token('fixedArray', [tokenAddress1, tokenAddress2]), + new Token('fixedArray', [tokenAddress3, tokenAddress4]) + ]) + ]); + }); + }); + + describe('int', () => { + it('decodes an int', () => { + expect( + Decoder.decode( + [new ParamType('int')], + `${int1}` + ) + ).to.deep.equal([tokenInt1]); + }); + }); + + describe('uint', () => { + it('decodes an uint', () => { + expect( + Decoder.decode( + [new ParamType('uint')], + `${int1}` + ) + ).to.deep.equal([tokenUint1]); + }); + }); + + describe('fixedBytes', () => { + it('decodes fixedBytes', () => { + expect( + Decoder.decode( + [new ParamType('fixedBytes', null, 2)], + `${bytes1}` + ) + ).to.deep.equal([tokenFixedBytes1]); + }); + }); + + describe('bytes', () => { + it('decodes bytes', () => { + expect( + Decoder.decode( + [new ParamType('bytes')], + `${padU32(0x20)}${padU32(2)}${bytes1}` + ) + ).to.deep.equal([tokenBytes1]); + }); + + it('decodes bytes sequence', () => { + expect( + Decoder.decode( + [new ParamType('bytes')], + `${padU32(0x20)}${padU32(0x40)}${bytes2}${bytes2}` + ) + ).to.deep.equal([tokenBytes2]); + }); + + it('decodes bytes seuence (2)', () => { + expect( + Decoder.decode( + [new ParamType('bytes'), new ParamType('bytes')], + `${padU32(0x40)}${padU32(0x80)}${padU32(0x1f)}${bytes3}00${padU32(0x20)}${bytes4}` + ) + ).to.deep.equal([tokenBytes3, tokenBytes4]); + }); + }); + + describe('bool', () => { + it('decodes a single bool', () => { + expect( + Decoder.decode( + [new ParamType('bool')], + bool1 + ) + ).to.deep.equal([tokenBool1]); + }); + }); + + describe('string', () => { + it('decodes a string', () => { + expect( + Decoder.decode( + [new ParamType('string')], + `${padU32(0x20)}${padU32(9)}${string1}` + ) + ).to.deep.equal([tokenString1]); + }); + }); + }); +}); diff --git a/js/src/abi/decoder/index.js b/js/src/abi/decoder/index.js new file mode 100644 index 000000000..2ead31504 --- /dev/null +++ b/js/src/abi/decoder/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './decoder'; diff --git a/js/src/abi/encoder/encoder.js b/js/src/abi/encoder/encoder.js new file mode 100644 index 000000000..fa1aa0453 --- /dev/null +++ b/js/src/abi/encoder/encoder.js @@ -0,0 +1,75 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { padAddress, padBool, padBytes, padFixedBytes, padU32, padString } from '../util/pad'; +import Mediate from './mediate'; +import Token from '../token/token'; +import { isArray, isInstanceOf } from '../util/types'; + +export default class Encoder { + static encode (tokens) { + if (!isArray(tokens)) { + throw new Error('tokens should be array of Token'); + } + + const mediates = tokens.map((token, index) => Encoder.encodeToken(token, index)); + const inits = mediates + .map((mediate, idx) => mediate.init(Mediate.offsetFor(mediates, idx))) + .join(''); + const closings = mediates + .map((mediate, idx) => mediate.closing(Mediate.offsetFor(mediates, idx))) + .join(''); + + return `${inits}${closings}`; + } + + static encodeToken (token, index = 0) { + if (!isInstanceOf(token, Token)) { + throw new Error('token should be instanceof Token'); + } + + try { + switch (token.type) { + case 'address': + return new Mediate('raw', padAddress(token.value)); + + case 'int': + case 'uint': + return new Mediate('raw', padU32(token.value)); + + case 'bool': + return new Mediate('raw', padBool(token.value)); + + case 'fixedBytes': + return new Mediate('raw', padFixedBytes(token.value)); + + case 'bytes': + return new Mediate('prefixed', padBytes(token.value)); + + case 'string': + return new Mediate('prefixed', padString(token.value)); + + case 'fixedArray': + case 'array': + return new Mediate(token.type, token.value.map((token) => Encoder.encodeToken(token))); + } + } catch (e) { + throw new Error(`Cannot encode token #${index} [${token.type}: ${token.value}]. ${e.message}`); + } + + throw new Error(`Invalid token type ${token.type} in encodeToken`); + } +} diff --git a/js/src/abi/encoder/encoder.spec.js b/js/src/abi/encoder/encoder.spec.js new file mode 100644 index 000000000..9a4a24361 --- /dev/null +++ b/js/src/abi/encoder/encoder.spec.js @@ -0,0 +1,291 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Encoder from './encoder'; +import Token from '../token'; +import { padAddress, padFixedBytes, padU32 } from '../util/pad'; + +describe('abi/encoder/Encoder', () => { + describe('encodeToken', () => { + it('requires token as Token', () => { + expect(() => Encoder.encodeToken()).to.throw(/Token/); + }); + + it('encodes address tokens in Mediate(raw)', () => { + const mediate = Encoder.encodeToken(new Token('address', '123')); + + expect(mediate.type).to.equal('raw'); + expect(mediate.value).to.be.ok; + }); + + it('encodes bool tokens in Mediate(raw)', () => { + const mediatet = Encoder.encodeToken(new Token('bool', true)); + const mediatef = Encoder.encodeToken(new Token('bool', false)); + + expect(mediatet.type).to.equal('raw'); + expect(mediatet.value).to.be.ok; + + expect(mediatef.type).to.equal('raw'); + expect(mediatef.value).to.be.ok; + }); + + it('encodes int tokens in Mediate(raw)', () => { + const mediate = Encoder.encodeToken(new Token('int', '123')); + + expect(mediate.type).to.equal('raw'); + expect(mediate.value).to.be.ok; + }); + + it('encodes uint tokens in Mediate(raw)', () => { + const mediate = Encoder.encodeToken(new Token('uint', '123')); + + expect(mediate.type).to.equal('raw'); + expect(mediate.value).to.be.ok; + }); + + it('encodes fixedBytes tokens in Mediate(raw)', () => { + const mediate = Encoder.encodeToken(new Token('fixedBytes', '123')); + + expect(mediate.type).to.equal('raw'); + expect(mediate.value).to.be.ok; + }); + + it('encodes bytes tokens in Mediate(prefixed)', () => { + const mediate = Encoder.encodeToken(new Token('bytes', '123')); + + expect(mediate.type).to.equal('prefixed'); + expect(mediate.value).to.be.ok; + }); + + it('encodes string tokens in Mediate(prefixed)', () => { + const mediate = Encoder.encodeToken(new Token('string', '123')); + + expect(mediate.type).to.equal('prefixed'); + expect(mediate.value).to.be.ok; + }); + + it('encodes fixedArray tokens in Mediate(fixedArray)', () => { + const mediate = Encoder.encodeToken(new Token('fixedArray', [new Token('uint', '123')])); + + expect(mediate.type).to.equal('fixedArray'); + expect(mediate.value).to.be.ok; + }); + + it('encodes array tokens in Mediate(array)', () => { + const mediate = Encoder.encodeToken(new Token('array', [new Token('uint', '123')])); + + expect(mediate.type).to.equal('array'); + expect(mediate.value).to.be.ok; + }); + + it('throws an Error on invalid tokens', () => { + const token = new Token('address'); + + token._type = 'noMatch'; + + expect(() => Encoder.encodeToken(token)).to.throw(/noMatch/); + }); + }); + + describe('encode', () => { + it('requires tokens array', () => { + expect(() => Encoder.encode()).to.throw(/array/); + }); + + describe('addresses', () => { + const address1 = '1111111111111111111111111111111111111111'; + const address2 = '2222222222222222222222222222222222222222'; + const address3 = '3333333333333333333333333333333333333333'; + const address4 = '4444444444444444444444444444444444444444'; + const encAddress1 = padAddress(address1); + const encAddress2 = padAddress(address2); + const encAddress3 = padAddress(address3); + const encAddress4 = padAddress(address4); + const tokenAddress1 = new Token('address', address1); + const tokenAddress2 = new Token('address', address2); + const tokenAddress3 = new Token('address', address3); + const tokenAddress4 = new Token('address', address4); + + it('encodes an address', () => { + const token = tokenAddress1; + + expect(Encoder.encode([token])).to.equal(encAddress1); + }); + + it('encodes an array of addresses', () => { + const expected = `${padU32(0x20)}${padU32(2)}${encAddress1}${encAddress2}`; + const token = new Token('array', [tokenAddress1, tokenAddress2]); + + expect(Encoder.encode([token])).to.equal(expected); + }); + + it('encodes an fixedArray of addresses', () => { + const expected = `${encAddress1}${encAddress2}`; + const token = new Token('fixedArray', [tokenAddress1, tokenAddress2]); + + expect(Encoder.encode([token])).to.equal(expected); + }); + + it('encodes two addresses', () => { + const expected = `${encAddress1}${encAddress2}`; + const tokens = [tokenAddress1, tokenAddress2]; + + expect(Encoder.encode(tokens)).to.equal(expected); + }); + + it('encodes fixed array of dynamic array addresses', () => { + const tokens1 = new Token('array', [tokenAddress1, tokenAddress2]); + const tokens2 = new Token('array', [tokenAddress3, tokenAddress4]); + const fixed = new Token('fixedArray', [tokens1, tokens2]); + const expected = `${padU32(0x40)}${padU32(0xa0)}${padU32(2)}${encAddress1}${encAddress2}${padU32(2)}${encAddress3}${encAddress4}`; + + expect(Encoder.encode([fixed])).to.equal(expected); + }); + + it('encodes dynamic array of fixed array addresses', () => { + const tokens1 = new Token('fixedArray', [tokenAddress1, tokenAddress2]); + const tokens2 = new Token('fixedArray', [tokenAddress3, tokenAddress4]); + const dynamic = new Token('array', [tokens1, tokens2]); + const expected = `${padU32(0x20)}${padU32(2)}${encAddress1}${encAddress2}${encAddress3}${encAddress4}`; + + expect(Encoder.encode([dynamic])).to.equal(expected); + }); + + it('encodes dynamic array of dynamic array addresses', () => { + const tokens1 = new Token('array', [tokenAddress1]); + const tokens2 = new Token('array', [tokenAddress2]); + const dynamic = new Token('array', [tokens1, tokens2]); + const expected = `${padU32(0x20)}${padU32(2)}${padU32(0x80)}${padU32(0xc0)}${padU32(1)}${encAddress1}${padU32(1)}${encAddress2}`; + + expect(Encoder.encode([dynamic])).to.equal(expected); + }); + + it('encodes dynamic array of dynamic array addresses (2)', () => { + const tokens1 = new Token('array', [tokenAddress1, tokenAddress2]); + const tokens2 = new Token('array', [tokenAddress3, tokenAddress4]); + const dynamic = new Token('array', [tokens1, tokens2]); + const expected = `${padU32(0x20)}${padU32(2)}${padU32(0x80)}${padU32(0xe0)}${padU32(2)}${encAddress1}${encAddress2}${padU32(2)}${encAddress3}${encAddress4}`; + + expect(Encoder.encode([dynamic])).to.equal(expected); + }); + + it('encodes fixed array of fixed array addresses', () => { + const tokens1 = new Token('fixedArray', [tokenAddress1, tokenAddress2]); + const tokens2 = new Token('fixedArray', [tokenAddress3, tokenAddress4]); + const dynamic = new Token('fixedArray', [tokens1, tokens2]); + const expected = `${encAddress1}${encAddress2}${encAddress3}${encAddress4}`; + + expect(Encoder.encode([dynamic])).to.equal(expected); + }); + }); + + describe('bytes', () => { + const bytes1 = '0x1234'; + const bytes2 = '0x10000000000000000000000000000000000000000000000000000000000002'; + const bytes3 = '0x1000000000000000000000000000000000000000000000000000000000000000'; + + it('encodes fixed bytes', () => { + const token = new Token('fixedBytes', bytes1); + + expect(Encoder.encode([token])).to.equal(padFixedBytes(bytes1)); + }); + + it('encodes bytes', () => { + const token = new Token('bytes', bytes1); + + expect(Encoder.encode([token])).to.equal(`${padU32(0x20)}${padU32(2)}${padFixedBytes(bytes1)}`); + }); + + it('encodes bytes (short of boundary)', () => { + const token = new Token('bytes', bytes2); + + expect(Encoder.encode([token])).to.equal(`${padU32(0x20)}${padU32(0x1f)}${padFixedBytes(bytes2)}`); + }); + + it('encodes bytes (two blocks)', () => { + const input = `${bytes3}${bytes3.slice(-64)}`; + const token = new Token('bytes', input); + + expect(Encoder.encode([token])).to.equal(`${padU32(0x20)}${padU32(0x40)}${padFixedBytes(input)}`); + }); + + it('encodes two consecutive bytes', () => { + const in1 = '0x10000000000000000000000000000000000000000000000000000000000002'; + const in2 = '0x0010000000000000000000000000000000000000000000000000000000000002'; + const tokens = [new Token('bytes', in1), new Token('bytes', in2)]; + + expect(Encoder.encode(tokens)).to.equal(`${padU32(0x40)}${padU32(0x80)}${padU32(0x1f)}${padFixedBytes(in1)}${padU32(0x20)}${padFixedBytes(in2)}`); + }); + }); + + describe('string', () => { + it('encodes a string', () => { + const string = 'gavofyork'; + const stringEnc = padFixedBytes('0x6761766f66796f726b'); + const token = new Token('string', string); + + expect(Encoder.encode([token])).to.equal(`${padU32(0x20)}${padU32(string.length.toString(16))}${stringEnc}`); + }); + }); + + describe('uint', () => { + it('encodes a uint', () => { + const token = new Token('uint', 4); + + expect(Encoder.encode([token])).to.equal(padU32(4)); + }); + }); + + describe('int', () => { + it('encodes a int', () => { + const token = new Token('int', 4); + + expect(Encoder.encode([token])).to.equal(padU32(4)); + }); + }); + + describe('bool', () => { + it('encodes a bool (true)', () => { + const token = new Token('bool', true); + + expect(Encoder.encode([token])).to.equal(padU32(1)); + }); + + it('encodes a bool (false)', () => { + const token = new Token('bool', false); + + expect(Encoder.encode([token])).to.equal(padU32(0)); + }); + }); + + describe('comprehensive test', () => { + it('encodes a complex sequence', () => { + const bytes = '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'; + const tokens = [new Token('int', 5), new Token('bytes', bytes), new Token('int', 3), new Token('bytes', bytes)]; + + expect(Encoder.encode(tokens)).to.equal(`${padU32(5)}${padU32(0x80)}${padU32(3)}${padU32(0xe0)}${padU32(0x40)}${bytes.substr(2)}${padU32(0x40)}${bytes.substr(2)}`); + }); + + it('encodes a complex sequence (nested)', () => { + const array = [new Token('int', 5), new Token('int', 6), new Token('int', 7)]; + const tokens = [new Token('int', 1), new Token('string', 'gavofyork'), new Token('int', 2), new Token('int', 3), new Token('int', 4), new Token('array', array)]; + const stringEnc = padFixedBytes('0x6761766f66796f726b'); + + expect(Encoder.encode(tokens)).to.equal(`${padU32(1)}${padU32(0xc0)}${padU32(2)}${padU32(3)}${padU32(4)}${padU32(0x100)}${padU32(9)}${stringEnc}${padU32(3)}${padU32(5)}${padU32(6)}${padU32(7)}`); + }); + }); + }); +}); diff --git a/js/src/abi/encoder/index.js b/js/src/abi/encoder/index.js new file mode 100644 index 000000000..5ac3c0a6b --- /dev/null +++ b/js/src/abi/encoder/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './encoder'; diff --git a/js/src/abi/encoder/mediate.js b/js/src/abi/encoder/mediate.js new file mode 100644 index 000000000..90cc28881 --- /dev/null +++ b/js/src/abi/encoder/mediate.js @@ -0,0 +1,142 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const TYPES = ['raw', 'prefixed', 'fixedArray', 'array']; + +import { padU32 } from '../util/pad'; + +export default class Mediate { + constructor (type, value) { + Mediate.validateType(type); + + this._type = type; + this._value = value; + } + + initLength () { + switch (this._type) { + case 'raw': + return this._value.length / 2; + + case 'array': + case 'prefixed': + return 32; + + case 'fixedArray': + return this._value + .reduce((total, mediate) => { + return total + mediate.initLength(); + }, 0); + } + } + + closingLength () { + switch (this._type) { + case 'raw': + return 0; + + case 'prefixed': + return this._value.length / 2; + + case 'array': + return this._value + .reduce((total, mediate) => { + return total + mediate.initLength(); + }, 32); + + case 'fixedArray': + return this._value + .reduce((total, mediate) => { + return total + mediate.initLength() + mediate.closingLength(); + }, 0); + } + } + + init (suffixOffset) { + switch (this._type) { + case 'raw': + return this._value; + + case 'fixedArray': + return this._value + .map((mediate, idx) => mediate.init(Mediate.offsetFor(this._value, idx)).toString(16)) + .join(''); + + case 'prefixed': + case 'array': + return padU32(suffixOffset); + } + } + + closing (offset) { + switch (this._type) { + case 'raw': + return ''; + + case 'prefixed': + return this._value; + + case 'fixedArray': + return this._value + .map((mediate, idx) => mediate.closing(Mediate.offsetFor(this._value, idx)).toString(16)) + .join(''); + + case 'array': + const prefix = padU32(this._value.length); + const inits = this._value + .map((mediate, idx) => mediate.init(offset + Mediate.offsetFor(this._value, idx) + 32).toString(16)) + .join(''); + const closings = this._value + .map((mediate, idx) => mediate.closing(offset + Mediate.offsetFor(this._value, idx)).toString(16)) + .join(''); + + return `${prefix}${inits}${closings}`; + } + } + + get type () { + return this._type; + } + + get value () { + return this._value; + } + + static offsetFor (mediates, position) { + if (position < 0 || position >= mediates.length) { + throw new Error(`Invalid position ${position} specified for Mediate.offsetFor`); + } + + const initLength = mediates + .reduce((total, mediate) => { + return total + mediate.initLength(); + }, 0); + + return mediates + .slice(0, position) + .reduce((total, mediate) => { + return total + mediate.closingLength(); + }, initLength); + } + + static validateType (type) { + if (TYPES.filter((_type) => type === _type).length) { + return true; + } + + throw new Error(`Invalid type ${type} received for Mediate.validateType`); + } +} diff --git a/js/src/abi/encoder/mediate.spec.js b/js/src/abi/encoder/mediate.spec.js new file mode 100644 index 000000000..ab89909b1 --- /dev/null +++ b/js/src/abi/encoder/mediate.spec.js @@ -0,0 +1,105 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Mediate from './mediate'; + +describe('abi/encoder/Mediate', () => { + const LONG15 = '1234567890abcdef000000000000000000000000000000000000000000000000'; + const DOUBLE15 = `${LONG15}${LONG15}`; + const ARRAY = [new Mediate('raw', DOUBLE15), new Mediate('raw', LONG15)]; + + describe('validateType', () => { + it('validates raw', () => { + expect(Mediate.validateType('raw')).to.be.true; + }); + + it('validates prefixed', () => { + expect(Mediate.validateType('prefixed')).to.be.true; + }); + + it('validates fixedArray', () => { + expect(Mediate.validateType('fixedArray')).to.be.true; + }); + + it('validates array', () => { + expect(Mediate.validateType('array')).to.be.true; + }); + + it('throws an error on invalid types', () => { + expect(() => Mediate.validateType('noMatch')).to.throw(/noMatch/); + }); + }); + + describe('offsetFor', () => { + it('thows an error when offset < 0', () => { + expect(() => Mediate.offsetFor([1], -1)).to.throw(/Invalid position/); + }); + + it('throws an error when offset >= length', () => { + expect(() => Mediate.offsetFor([1], 1)).to.throw(/Invalid position/); + }); + }); + + describe('constructor', () => { + it('throws an error on invalid types', () => { + expect(() => new Mediate('noMatch', '1')).to.throw(/noMatch/); + }); + + it('sets the type of the object', () => { + expect((new Mediate('raw', '1')).type).to.equal('raw'); + }); + + it('sets the value of the object', () => { + expect((new Mediate('raw', '1')).value).to.equal('1'); + }); + }); + + describe('initLength', () => { + it('returns correct variable byte length for raw', () => { + expect(new Mediate('raw', DOUBLE15).initLength()).to.equal(64); + }); + + it('returns correct fixed byte length for array', () => { + expect(new Mediate('array', [1, 2, 3, 4]).initLength()).to.equal(32); + }); + + it('returns correct fixed byte length for prefixed', () => { + expect(new Mediate('prefixed', 0).initLength()).to.equal(32); + }); + + it('returns correct variable byte length for fixedArray', () => { + expect(new Mediate('fixedArray', ARRAY).initLength()).to.equal(96); + }); + }); + + describe('closingLength', () => { + it('returns 0 byte length for raw', () => { + expect(new Mediate('raw', DOUBLE15).closingLength()).to.equal(0); + }); + + it('returns prefix + size for prefixed', () => { + expect(new Mediate('prefixed', DOUBLE15).closingLength()).to.equal(64); + }); + + it('returns prefix + size for array', () => { + expect(new Mediate('array', ARRAY).closingLength()).to.equal(128); + }); + + it('returns total length for fixedArray', () => { + expect(new Mediate('fixedArray', ARRAY).closingLength()).to.equal(96); + }); + }); +}); diff --git a/js/src/abi/index.js b/js/src/abi/index.js new file mode 100644 index 000000000..703ed1c78 --- /dev/null +++ b/js/src/abi/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './abi'; diff --git a/js/src/abi/spec/constructor.js b/js/src/abi/spec/constructor.js new file mode 100644 index 000000000..e9b23b593 --- /dev/null +++ b/js/src/abi/spec/constructor.js @@ -0,0 +1,36 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Encoder from '../encoder/encoder'; +import Param from './param'; + +export default class Constructor { + constructor (abi) { + this._inputs = Param.toParams(abi.inputs || []); + } + + get inputs () { + return this._inputs; + } + + inputParamTypes () { + return this._inputs.map((input) => input.kind); + } + + encodeCall (tokens) { + return Encoder.encode(tokens); + } +} diff --git a/js/src/abi/spec/constructor.spec.js b/js/src/abi/spec/constructor.spec.js new file mode 100644 index 000000000..7c7414bdc --- /dev/null +++ b/js/src/abi/spec/constructor.spec.js @@ -0,0 +1,52 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Constructor from './constructor'; +import Param from './param'; +import Token from '../token'; + +describe('abi/spec/Constructor', () => { + const inputsArr = [{ name: 'boolin', type: 'bool' }, { name: 'stringin', type: 'string' }]; + const bool = new Param('boolin', 'bool'); + const string = new Param('stringin', 'string'); + + const inputs = [bool, string]; + const cr = new Constructor({ inputs: inputsArr }); + + describe('constructor', () => { + it('stores the inputs as received', () => { + expect(cr.inputs).to.deep.equal(inputs); + }); + + it('matches empty inputs with []', () => { + expect(new Constructor({}).inputs).to.deep.equal([]); + }); + }); + + describe('inputParamTypes', () => { + it('retrieves the input types as received', () => { + expect(cr.inputParamTypes()).to.deep.equal([bool.kind, string.kind]); + }); + }); + + describe('encodeCall', () => { + it('encodes correctly', () => { + const result = cr.encodeCall([new Token('bool', true), new Token('string', 'jacogr')]); + + expect(result).to.equal('0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000066a61636f67720000000000000000000000000000000000000000000000000000'); + }); + }); +}); diff --git a/js/src/abi/spec/event/decodedLog.js b/js/src/abi/spec/event/decodedLog.js new file mode 100644 index 000000000..e398c5a1b --- /dev/null +++ b/js/src/abi/spec/event/decodedLog.js @@ -0,0 +1,30 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class DecodedLog { + constructor (params, address) { + this._params = params; + this._address = address; + } + + get address () { + return this._address; + } + + get params () { + return this._params; + } +} diff --git a/js/src/abi/spec/event/decodedLog.spec.js b/js/src/abi/spec/event/decodedLog.spec.js new file mode 100644 index 000000000..f448af011 --- /dev/null +++ b/js/src/abi/spec/event/decodedLog.spec.js @@ -0,0 +1,28 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import DecodedLog from './decodedLog'; + +const log = new DecodedLog('someParams', 'someAddress'); + +describe('abi/spec/event/DecodedLog', () => { + describe('constructor', () => { + it('sets internal state', () => { + expect(log.params).to.equal('someParams'); + expect(log.address).to.equal('someAddress'); + }); + }); +}); diff --git a/js/src/abi/spec/event/decodedLogParam.js b/js/src/abi/spec/event/decodedLogParam.js new file mode 100644 index 000000000..422fbaac8 --- /dev/null +++ b/js/src/abi/spec/event/decodedLogParam.js @@ -0,0 +1,45 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import ParamType from '../paramType/paramType'; +import Token from '../../token/token'; +import { isInstanceOf } from '../../util/types'; + +export default class DecodedLogParam { + constructor (name, kind, token) { + if (!isInstanceOf(kind, ParamType)) { + throw new Error('kind not instanceof ParamType'); + } else if (!isInstanceOf(token, Token)) { + throw new Error('token not instanceof Token'); + } + + this._name = name; + this._kind = kind; + this._token = token; + } + + get name () { + return this._name; + } + + get kind () { + return this._kind; + } + + get token () { + return this._token; + } +} diff --git a/js/src/abi/spec/event/decodedLogParam.spec.js b/js/src/abi/spec/event/decodedLogParam.spec.js new file mode 100644 index 000000000..6a7f52044 --- /dev/null +++ b/js/src/abi/spec/event/decodedLogParam.spec.js @@ -0,0 +1,42 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import DecodedLogParam from './decodedLogParam'; +import ParamType from '../paramType'; +import Token from '../../token'; + +describe('abi/spec/event/DecodedLogParam', () => { + describe('constructor', () => { + const pt = new ParamType('bool'); + const tk = new Token('bool'); + + it('disallows kind not instanceof ParamType', () => { + expect(() => new DecodedLogParam('test', 'param')).to.throw(/ParamType/); + }); + + it('disallows token not instanceof Token', () => { + expect(() => new DecodedLogParam('test', pt, 'token')).to.throw(/Token/); + }); + + it('stores all parameters received', () => { + const log = new DecodedLogParam('test', pt, tk); + + expect(log.name).to.equal('test'); + expect(log.kind).to.equal(pt); + expect(log.token).to.equal(tk); + }); + }); +}); diff --git a/js/src/abi/spec/event/event.js b/js/src/abi/spec/event/event.js new file mode 100644 index 000000000..604f58cb1 --- /dev/null +++ b/js/src/abi/spec/event/event.js @@ -0,0 +1,114 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Decoder from '../../decoder/decoder'; +import DecodedLog from './decodedLog'; +import DecodedLogParam from './decodedLogParam'; +import EventParam from './eventParam'; +import { asAddress } from '../../util/sliceAs'; +import { eventSignature } from '../../util/signature'; + +export default class Event { + constructor (abi) { + this._inputs = EventParam.toEventParams(abi.inputs || []); + this._anonymous = !!abi.anonymous; + + const { id, name, signature } = eventSignature(abi.name, this.inputParamTypes()); + + this._id = id; + this._name = name; + this._signature = signature; + } + + get name () { + return this._name; + } + + get id () { + return this._id; + } + + get inputs () { + return this._inputs; + } + + get anonymous () { + return this._anonymous; + } + + get signature () { + return this._signature; + } + + inputParamTypes () { + return this._inputs.map((input) => input.kind); + } + + inputParamNames () { + return this._inputs.map((input) => input.name); + } + + indexedParams (indexed) { + return this._inputs.filter((input) => input.indexed === indexed); + } + + decodeLog (topics, data) { + const topicParams = this.indexedParams(true); + const dataParams = this.indexedParams(false); + + let address; + let toSkip; + + if (!this.anonymous) { + address = asAddress(topics[0]); + toSkip = 1; + } else { + toSkip = 0; + } + + const topicTypes = topicParams.map((param) => param.kind); + const flatTopics = topics + .filter((topic, idx) => idx >= toSkip) + .map((topic) => { + return (topic.substr(0, 2) === '0x') + ? topic.substr(2) + : topic; + }).join(''); + const topicTokens = Decoder.decode(topicTypes, flatTopics); + + if (topicTokens.length !== (topics.length - toSkip)) { + throw new Error('Invalid topic data'); + } + + const dataTypes = dataParams.map((param) => param.kind); + const dataTokens = Decoder.decode(dataTypes, data); + + const namedTokens = {}; + + topicParams.forEach((param, idx) => { + namedTokens[param.name || idx] = topicTokens[idx]; + }); + dataParams.forEach((param, idx) => { + namedTokens[param.name || idx] = dataTokens[idx]; + }); + + const inputParamTypes = this.inputParamTypes(); + const decodedParams = this.inputParamNames() + .map((name, idx) => new DecodedLogParam(name, inputParamTypes[idx], namedTokens[name || idx])); + + return new DecodedLog(decodedParams, address); + } +} diff --git a/js/src/abi/spec/event/event.spec.js b/js/src/abi/spec/event/event.spec.js new file mode 100644 index 000000000..bf47980fc --- /dev/null +++ b/js/src/abi/spec/event/event.spec.js @@ -0,0 +1,111 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; + +import Event from './event'; +import EventParam from './eventParam'; +import DecodedLogParam from './decodedLogParam'; +import ParamType from '../paramType'; +import Token from '../../token'; + +describe('abi/spec/event/Event', () => { + const inputArr = [{ name: 'a', type: 'bool' }, { name: 'b', type: 'uint', indexed: true }]; + const inputs = [new EventParam('a', 'bool', false), new EventParam('b', 'uint', true)]; + const event = new Event({ name: 'test', inputs: inputArr, anonymous: true }); + + describe('constructor', () => { + it('stores the parameters as received', () => { + expect(event.name).to.equal('test'); + expect(event.inputs).to.deep.equal(inputs); + expect(event.anonymous).to.be.true; + }); + + it('matches empty inputs with []', () => { + expect(new Event({ name: 'test' }).inputs).to.deep.equal([]); + }); + + it('sets the event signature', () => { + expect(new Event({ name: 'baz' }).signature) + .to.equal('a7916fac4f538170f7cd12c148552e2cba9fcd72329a2dd5b07a6fa906488ddf'); + }); + }); + + describe('inputParamTypes', () => { + it('returns all the types', () => { + expect(event.inputParamTypes()).to.deep.equal([new ParamType('bool'), new ParamType('uint', null, 256, true)]); + }); + }); + + describe('inputParamNames', () => { + it('returns all the names', () => { + expect(event.inputParamNames()).to.deep.equal(['a', 'b']); + }); + }); + + describe('indexedParams', () => { + it('returns all indexed parameters (indexed)', () => { + expect(event.indexedParams(true)).to.deep.equal([inputs[1]]); + }); + + it('returns all indexed parameters (non-indexed)', () => { + expect(event.indexedParams(false)).to.deep.equal([inputs[0]]); + }); + }); + + describe('decodeLog', () => { + it('decodes an event', () => { + const event = new Event({ + name: 'foo', + inputs: [ + { name: 'a', type: 'int' }, + { name: 'b', type: 'int', indexed: true }, + { name: 'c', type: 'address' }, + { name: 'd', type: 'address', indexed: true } + ] + }); + const decoded = event.decodeLog([ + '0000000000000000000000004444444444444444444444444444444444444444', + '0000000000000000000000000000000000000000000000000000000000000002', + '0000000000000000000000001111111111111111111111111111111111111111' ], + '00000000000000000000000000000000000000000000000000000000000000030000000000000000000000002222222222222222222222222222222222222222'); + + expect(decoded.address).to.equal('0x4444444444444444444444444444444444444444'); + expect(decoded.params).to.deep.equal([ + new DecodedLogParam('a', new ParamType('int', null, 256), new Token('int', new BigNumber(3))), + new DecodedLogParam('b', new ParamType('int', null, 256, true), new Token('int', new BigNumber(2))), + new DecodedLogParam('c', new ParamType('address'), new Token('address', '0x2222222222222222222222222222222222222222')), + new DecodedLogParam('d', new ParamType('address', null, 0, true), new Token('address', '0x1111111111111111111111111111111111111111')) + ]); + }); + + it('decodes an anonymous event', () => { + const event = new Event({ name: 'foo', inputs: [{ name: 'a', type: 'int' }], anonymous: true }); + const decoded = event.decodeLog([], '0000000000000000000000000000000000000000000000000000000000000003'); + + expect(decoded.address).to.not.be.ok; + expect(decoded.params).to.deep.equal([ + new DecodedLogParam('a', new ParamType('int', null, 256), new Token('int', new BigNumber(3))) + ]); + }); + + it('throws on invalid topics', () => { + const event = new Event({ name: 'foo', inputs: [{ name: 'a', type: 'int' }], anonymous: true }); + + expect(() => event.decodeLog(['0000000000000000000000004444444444444444444444444444444444444444'], '0000000000000000000000000000000000000000000000000000000000000003')).to.throw(/Invalid/); + }); + }); +}); diff --git a/js/src/abi/spec/event/eventParam.js b/js/src/abi/spec/event/eventParam.js new file mode 100644 index 000000000..b49b77814 --- /dev/null +++ b/js/src/abi/spec/event/eventParam.js @@ -0,0 +1,41 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { toParamType } from '../paramType/format'; + +export default class EventParam { + constructor (name, type, indexed = false) { + this._name = name; + this._indexed = indexed; + this._kind = toParamType(type, indexed); + } + + get name () { + return this._name; + } + + get kind () { + return this._kind; + } + + get indexed () { + return this._indexed; + } + + static toEventParams (params) { + return params.map((param) => new EventParam(param.name, param.type, param.indexed)); + } +} diff --git a/js/src/abi/spec/event/eventParam.spec.js b/js/src/abi/spec/event/eventParam.spec.js new file mode 100644 index 000000000..e35ebcebc --- /dev/null +++ b/js/src/abi/spec/event/eventParam.spec.js @@ -0,0 +1,44 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import EventParam from './eventParam'; + +describe('abi/spec/event/EventParam', () => { + describe('constructor', () => { + it('sets the properties', () => { + const param = new EventParam('foo', 'uint', true); + + expect(param.name).to.equal('foo'); + expect(param.kind.type).to.equal('uint'); + expect(param.indexed).to.be.true; + }); + + it('uses defaults for indexed', () => { + expect(new EventParam('foo', 'uint').indexed).to.be.false; + }); + }); + + describe('toEventParams', () => { + it('maps an array of params', () => { + const params = EventParam.toEventParams([{ name: 'foo', type: 'uint' }]); + + expect(params.length).to.equal(1); + expect(params[0].indexed).to.be.false; + expect(params[0].name).to.equal('foo'); + expect(params[0].kind.type).to.equal('uint'); + }); + }); +}); diff --git a/js/src/abi/spec/event/index.js b/js/src/abi/spec/event/index.js new file mode 100644 index 000000000..25441954b --- /dev/null +++ b/js/src/abi/spec/event/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './event'; diff --git a/js/src/abi/spec/function.js b/js/src/abi/spec/function.js new file mode 100644 index 000000000..6010f4e59 --- /dev/null +++ b/js/src/abi/spec/function.js @@ -0,0 +1,88 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Decoder from '../decoder/decoder'; +import Encoder from '../encoder/encoder'; +import Param from './param'; +import { methodSignature } from '../util/signature'; + +export default class Func { + constructor (abi) { + this._abi = abi; + this._constant = !!abi.constant; + this._payable = abi.payable; + this._inputs = Param.toParams(abi.inputs || []); + this._outputs = Param.toParams(abi.outputs || []); + + const { id, name, signature } = methodSignature(abi.name, this.inputParamTypes()); + + this._id = id; + this._name = name; + this._signature = signature; + } + + get abi () { + return this._abi; + } + + get constant () { + return this._constant; + } + + get name () { + return this._name; + } + + get id () { + return this._id; + } + + get payable () { + return this._payable; + } + + get inputs () { + return this._inputs; + } + + get outputs () { + return this._outputs; + } + + get signature () { + return this._signature; + } + + inputParamTypes () { + return this._inputs.map((input) => input.kind); + } + + outputParamTypes () { + return this._outputs.map((output) => output.kind); + } + + encodeCall (tokens) { + return `${this._signature}${Encoder.encode(tokens)}`; + } + + decodeInput (data) { + return Decoder.decode(this.inputParamTypes(), data); + } + + decodeOutput (data) { + return Decoder.decode(this.outputParamTypes(), data); + } +} diff --git a/js/src/abi/spec/function.spec.js b/js/src/abi/spec/function.spec.js new file mode 100644 index 000000000..436ca7365 --- /dev/null +++ b/js/src/abi/spec/function.spec.js @@ -0,0 +1,101 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Func from './function'; +import Param from './param'; +import Token from '../token'; + +describe('abi/spec/Function', () => { + const inputsArr = [{ name: 'boolin', type: 'bool' }, { name: 'stringin', type: 'string' }]; + const outputsArr = [{ name: 'output', type: 'uint' }]; + + const uint = new Param('output', 'uint'); + const bool = new Param('boolin', 'bool'); + const string = new Param('stringin', 'string'); + const inputs = [bool, string]; + const outputs = [uint]; + + const func = new Func({ + name: 'test', + inputs: inputsArr, + outputs: outputsArr + }); + + describe('constructor', () => { + it('returns signature correctly if name already contains it', () => { + const func = new Func({ + name: 'test(bool,string)', + inputs: inputsArr, + outputs: outputsArr + }); + + expect(func.name).to.equal('test'); + expect(func.id).to.equal('test(bool,string)'); + expect(func.signature).to.equal('02356205'); + }); + + it('stores the parameters as received', () => { + expect(func.name).to.equal('test'); + expect(func.constant).to.be.false; + expect(func.inputs).to.deep.equal(inputs); + expect(func.outputs).to.deep.equal(outputs); + }); + + it('matches empty inputs with []', () => { + expect(new Func({ name: 'test', outputs: outputsArr }).inputs).to.deep.equal([]); + }); + + it('matches empty outputs with []', () => { + expect(new Func({ name: 'test', inputs: inputsArr }).outputs).to.deep.equal([]); + }); + + it('sets the method signature', () => { + expect(new Func({ name: 'baz' }).signature).to.equal('a7916fac'); + }); + + it('allows constant functions', () => { + expect(new Func({ name: 'baz', constant: true }).constant).to.be.true; + }); + }); + + describe('inputParamTypes', () => { + it('retrieves the input types as received', () => { + expect(func.inputParamTypes()).to.deep.equal([bool.kind, string.kind]); + }); + }); + + describe('outputParamTypes', () => { + it('retrieves the output types as received', () => { + expect(func.outputParamTypes()).to.deep.equal([uint.kind]); + }); + }); + + describe('encodeCall', () => { + it('encodes the call correctly', () => { + const result = func.encodeCall([new Token('bool', true), new Token('string', 'jacogr')]); + + expect(result).to.equal('023562050000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000066a61636f67720000000000000000000000000000000000000000000000000000'); + }); + }); + + describe('decodeOutput', () => { + it('decodes the result correctly', () => { + const result = func.decodeOutput('1111111111111111111111111111111111111111111111111111111111111111'); + + expect(result[0].value.toString(16)).to.equal('1111111111111111111111111111111111111111111111111111111111111111'); + }); + }); +}); diff --git a/js/src/abi/spec/index.js b/js/src/abi/spec/index.js new file mode 100644 index 000000000..87852d488 --- /dev/null +++ b/js/src/abi/spec/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './interface'; diff --git a/js/src/abi/spec/interface.js b/js/src/abi/spec/interface.js new file mode 100644 index 000000000..b24569525 --- /dev/null +++ b/js/src/abi/spec/interface.js @@ -0,0 +1,77 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Constructor from './constructor'; +import Event from './event/event'; +import Func from './function'; +import Token from '../token'; + +export default class Interface { + constructor (abi) { + this._interface = Interface.parseABI(abi); + } + + get interface () { + return this._interface; + } + + get constructors () { + return this._interface.filter((item) => item instanceof Constructor); + } + + get events () { + return this._interface.filter((item) => item instanceof Event); + } + + get functions () { + return this._interface.filter((item) => item instanceof Func); + } + + encodeTokens (paramTypes, values) { + return Interface.encodeTokens(paramTypes, values); + } + + static encodeTokens (paramTypes, values) { + const createToken = function (paramType, value) { + if (paramType.subtype) { + return new Token(paramType.type, value.map((entry) => createToken(paramType.subtype, entry))); + } + + return new Token(paramType.type, value); + }; + + return paramTypes.map((paramType, idx) => createToken(paramType, values[idx])); + } + + static parseABI (abi) { + return abi.map((item) => { + switch (item.type) { + case 'constructor': + return new Constructor(item); + + case 'event': + return new Event(item); + + case 'function': + case 'fallback': + return new Func(item); + + default: + throw new Error(`Unknown ABI type ${item.type}`); + } + }); + } +} diff --git a/js/src/abi/spec/interface.spec.js b/js/src/abi/spec/interface.spec.js new file mode 100644 index 000000000..ebaa323ed --- /dev/null +++ b/js/src/abi/spec/interface.spec.js @@ -0,0 +1,126 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Interface from './interface'; +import ParamType from './paramType'; +import Token from '../token'; + +describe('abi/spec/Interface', () => { + const construct = { + type: 'constructor', + inputs: [] + }; + const event = { + type: 'event', + name: 'Event2', + anonymous: false, + inputs: [{ name: 'a', type: 'uint256', indexed: true }, { name: 'b', type: 'bytes32', indexed: false }] + }; + const func = { + type: 'function', + name: 'foo', + inputs: [{ name: 'a', type: 'uint256' }], + outputs: [] + }; + + describe('parseABI', () => { + it('throws on invalid types', () => { + expect(() => Interface.parseABI([{ type: 'noMatch' }])).to.throw(/noMatch/); + }); + + it('creates constructors', () => { + expect(Interface.parseABI([ construct ])).to.deep.equal([{ _inputs: [] }]); + }); + + it('creates events', () => { + expect(Interface.parseABI([ event ])[0].name).to.equal('Event2'); + }); + + it('creates functions', () => { + expect(Interface.parseABI([ func ])[0].name).to.equal('foo'); + }); + + it('parse complex interfaces', () => { + expect(Interface.parseABI([ construct, event, func ]).length).to.equal(3); + }); + }); + + describe('constructor', () => { + const int = new Interface([ construct, event, func ]); + + it('contains the full interface', () => { + expect(int.interface.length).to.equal(3); + }); + + it('contains the constructors', () => { + expect(int.constructors.length).to.equal(1); + }); + + it('contains the events', () => { + expect(int.events.length).to.equal(1); + }); + + it('contains the functions', () => { + expect(int.functions.length).to.equal(1); + }); + }); + + describe('encodeTokens', () => { + const int = new Interface([ construct, event, func ]); + + it('encodes simple types', () => { + expect( + int.encodeTokens( + [new ParamType('bool'), new ParamType('string'), new ParamType('int'), new ParamType('uint')], + [true, 'gavofyork', -123, 123] + ) + ).to.deep.equal([ + new Token('bool', true), new Token('string', 'gavofyork'), new Token('int', -123), new Token('uint', 123) + ]); + }); + + it('encodes array', () => { + expect( + int.encodeTokens( + [new ParamType('array', new ParamType('bool'))], + [[true, false, true]] + ) + ).to.deep.equal([ + new Token('array', [ + new Token('bool', true), new Token('bool', false), new Token('bool', true) + ]) + ]); + }); + + it('encodes simple with array of array', () => { + expect( + int.encodeTokens( + [ + new ParamType('bool'), + new ParamType('fixedArray', new ParamType('array', new ParamType('uint')), 2) + ], + [true, [[0, 1], [2, 3]]] + ) + ).to.deep.equal([ + new Token('bool', true), + new Token('fixedArray', [ + new Token('array', [new Token('uint', 0), new Token('uint', 1)]), + new Token('array', [new Token('uint', 2), new Token('uint', 3)]) + ]) + ]); + }); + }); +}); diff --git a/js/src/abi/spec/param.js b/js/src/abi/spec/param.js new file mode 100644 index 000000000..e02b99100 --- /dev/null +++ b/js/src/abi/spec/param.js @@ -0,0 +1,42 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { toParamType } from './paramType/format'; + +export default class Param { + constructor (name, type) { + this._name = name; + this._kind = toParamType(type); + } + + get name () { + return this._name; + } + + get kind () { + return this._kind; + } + + static toParams (params) { + return params.map((param) => { + if (param instanceof Param) { + return param; + } + + return new Param(param.name, param.type); + }); + } +} diff --git a/js/src/abi/spec/param.spec.js b/js/src/abi/spec/param.spec.js new file mode 100644 index 000000000..0ecdb0319 --- /dev/null +++ b/js/src/abi/spec/param.spec.js @@ -0,0 +1,47 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Param from './param'; + +describe('abi/spec/Param', () => { + describe('constructor', () => { + const param = new Param('foo', 'uint'); + + it('sets the properties', () => { + expect(param.name).to.equal('foo'); + expect(param.kind.type).to.equal('uint'); + }); + }); + + describe('toParams', () => { + it('maps an array of params', () => { + const params = Param.toParams([{ name: 'foo', type: 'uint' }]); + + expect(params.length).to.equal(1); + expect(params[0].name).to.equal('foo'); + expect(params[0].kind.type).to.equal('uint'); + }); + + it('converts only if needed', () => { + const _params = Param.toParams([{ name: 'foo', type: 'uint' }]); + const params = Param.toParams(_params); + + expect(params.length).to.equal(1); + expect(params[0].name).to.equal('foo'); + expect(params[0].kind.type).to.equal('uint'); + }); + }); +}); diff --git a/js/src/abi/spec/paramType/format.js b/js/src/abi/spec/paramType/format.js new file mode 100644 index 000000000..5aafd5e30 --- /dev/null +++ b/js/src/abi/spec/paramType/format.js @@ -0,0 +1,80 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import ParamType from './paramType'; + +export function toParamType (type, indexed) { + if (type[type.length - 1] === ']') { + const last = type.lastIndexOf('['); + const length = type.substr(last + 1, type.length - last - 2); + const subtype = toParamType(type.substr(0, last)); + + if (length.length === 0) { + return new ParamType('array', subtype, 0, indexed); + } + + return new ParamType('fixedArray', subtype, parseInt(length, 10), indexed); + } + + switch (type) { + case 'address': + case 'bool': + case 'bytes': + case 'string': + return new ParamType(type, null, 0, indexed); + + case 'int': + case 'uint': + return new ParamType(type, null, 256, indexed); + + default: + if (type.indexOf('uint') === 0) { + return new ParamType('uint', null, parseInt(type.substr(4), 10), indexed); + } else if (type.indexOf('int') === 0) { + return new ParamType('int', null, parseInt(type.substr(3), 10), indexed); + } else if (type.indexOf('bytes') === 0) { + return new ParamType('fixedBytes', null, parseInt(type.substr(5), 10), indexed); + } + + throw new Error(`Cannot convert ${type} to valid ParamType`); + } +} + +export function fromParamType (paramType) { + switch (paramType.type) { + case 'address': + case 'bool': + case 'bytes': + case 'string': + return paramType.type; + + case 'int': + case 'uint': + return `${paramType.type}${paramType.length}`; + + case 'fixedBytes': + return `bytes${paramType.length}`; + + case 'fixedArray': + return `${fromParamType(paramType.subtype)}[${paramType.length}]`; + + case 'array': + return `${fromParamType(paramType.subtype)}[]`; + + default: + throw new Error(`Cannot convert from ParamType ${paramType.type}`); + } +} diff --git a/js/src/abi/spec/paramType/format.spec.js b/js/src/abi/spec/paramType/format.spec.js new file mode 100644 index 000000000..cb0004733 --- /dev/null +++ b/js/src/abi/spec/paramType/format.spec.js @@ -0,0 +1,228 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import ParamType from './paramType'; +import { fromParamType, toParamType } from './format'; + +describe('abi/spec/paramType/format', () => { + describe('fromParamType', () => { + it('errors on invalid types', () => { + expect(() => fromParamType({ type: 'noMatch' })).to.throw(/noMatch/); + }); + + describe('simple types', () => { + it('converts address to address', () => { + const pt = new ParamType('address'); + + expect(fromParamType(pt)).to.equal('address'); + }); + + it('converts bool to bool', () => { + const pt = new ParamType('bool'); + + expect(fromParamType(pt)).to.equal('bool'); + }); + + it('converts bytes to bytes', () => { + const pt = new ParamType('bytes'); + + expect(fromParamType(pt)).to.equal('bytes'); + }); + + it('converts string to string', () => { + const pt = new ParamType('string'); + + expect(fromParamType(pt)).to.equal('string'); + }); + }); + + describe('length types', () => { + it('converts int32 to int32', () => { + const pt = new ParamType('int', null, 32); + + expect(fromParamType(pt)).to.equal('int32'); + }); + + it('converts uint64 to int64', () => { + const pt = new ParamType('uint', null, 64); + + expect(fromParamType(pt)).to.equal('uint64'); + }); + + it('converts fixedBytes8 to bytes8', () => { + const pt = new ParamType('fixedBytes', null, 8); + + expect(fromParamType(pt)).to.equal('bytes8'); + }); + }); + + describe('arrays', () => { + it('converts string[2] to string[2]', () => { + const pt = new ParamType('fixedArray', new ParamType('string'), 2); + + expect(fromParamType(pt)).to.equal('string[2]'); + }); + + it('converts bool[] to bool[]', () => { + const pt = new ParamType('array', new ParamType('bool')); + + expect(fromParamType(pt)).to.equal('bool[]'); + }); + + it('converts bool[][2] to bool[][2]', () => { + const pt = new ParamType('fixedArray', new ParamType('array', new ParamType('bool')), 2); + + expect(fromParamType(pt)).to.equal('bool[][2]'); + }); + + it('converts bool[2][] to bool[2][]', () => { + const pt = new ParamType('array', new ParamType('fixedArray', new ParamType('bool'), 2)); + + expect(fromParamType(pt)).to.equal('bool[2][]'); + }); + }); + }); + + describe('toParamType', () => { + it('errors on invalid types', () => { + expect(() => toParamType('noMatch')).to.throw(/noMatch/); + }); + + describe('simple mapping', () => { + it('converts address to address', () => { + const pt = toParamType('address'); + + expect(pt.type).to.equal('address'); + }); + + it('converts bool to bool', () => { + const pt = toParamType('bool'); + + expect(pt.type).to.equal('bool'); + }); + + it('converts bytes to bytes', () => { + const pt = toParamType('bytes'); + + expect(pt.type).to.equal('bytes'); + }); + + it('converts string to string', () => { + const pt = toParamType('string'); + + expect(pt.type).to.equal('string'); + }); + }); + + describe('number', () => { + it('converts int to int256', () => { + const pt = toParamType('int'); + + expect(pt.type).to.equal('int'); + expect(pt.length).to.equal(256); + }); + + it('converts uint to uint256', () => { + const pt = toParamType('uint'); + + expect(pt.type).to.equal('uint'); + expect(pt.length).to.equal(256); + }); + }); + + describe('sized types', () => { + it('converts int32 to int32', () => { + const pt = toParamType('int32'); + + expect(pt.type).to.equal('int'); + expect(pt.length).to.equal(32); + }); + + it('converts uint16 to uint16', () => { + const pt = toParamType('uint32'); + + expect(pt.type).to.equal('uint'); + expect(pt.length).to.equal(32); + }); + + it('converts bytes8 to fixedBytes8', () => { + const pt = toParamType('bytes8'); + + expect(pt.type).to.equal('fixedBytes'); + expect(pt.length).to.equal(8); + }); + }); + + describe('arrays', () => { + describe('fixed arrays', () => { + it('creates fixed array', () => { + const pt = toParamType('bytes[8]'); + + expect(pt.type).to.equal('fixedArray'); + expect(pt.subtype.type).to.equal('bytes'); + expect(pt.length).to.equal(8); + }); + + it('creates fixed arrays of fixed arrays', () => { + const pt = toParamType('bytes[45][3]'); + + expect(pt.type).to.equal('fixedArray'); + expect(pt.length).to.equal(3); + expect(pt.subtype.type).to.equal('fixedArray'); + expect(pt.subtype.length).to.equal(45); + expect(pt.subtype.subtype.type).to.equal('bytes'); + }); + }); + + describe('dynamic arrays', () => { + it('creates a dynamic array', () => { + const pt = toParamType('bytes[]'); + + expect(pt.type).to.equal('array'); + expect(pt.subtype.type).to.equal('bytes'); + }); + + it('creates a dynamic array of dynamic arrays', () => { + const pt = toParamType('bool[][]'); + + expect(pt.type).to.equal('array'); + expect(pt.subtype.type).to.equal('array'); + expect(pt.subtype.subtype.type).to.equal('bool'); + }); + }); + + describe('mixed arrays', () => { + it('creates a fixed dynamic array', () => { + const pt = toParamType('bool[][3]'); + + expect(pt.type).to.equal('fixedArray'); + expect(pt.length).to.equal(3); + expect(pt.subtype.type).to.equal('array'); + expect(pt.subtype.subtype.type).to.equal('bool'); + }); + + it('creates a dynamic fixed array', () => { + const pt = toParamType('bool[3][]'); + + expect(pt.type).to.equal('array'); + expect(pt.subtype.type).to.equal('fixedArray'); + expect(pt.subtype.length).to.equal(3); + expect(pt.subtype.subtype.type).to.equal('bool'); + }); + }); + }); + }); +}); diff --git a/js/src/abi/spec/paramType/index.js b/js/src/abi/spec/paramType/index.js new file mode 100644 index 000000000..123e198e8 --- /dev/null +++ b/js/src/abi/spec/paramType/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './paramType'; diff --git a/js/src/abi/spec/paramType/paramType.js b/js/src/abi/spec/paramType/paramType.js new file mode 100644 index 000000000..b65465d94 --- /dev/null +++ b/js/src/abi/spec/paramType/paramType.js @@ -0,0 +1,52 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import TYPES from './types'; + +export default class ParamType { + constructor (type, subtype = null, length = 0, indexed = false) { + ParamType.validateType(type); + + this._type = type; + this._subtype = subtype; + this._length = length; + this._indexed = indexed; + } + + get type () { + return this._type; + } + + get subtype () { + return this._subtype; + } + + get length () { + return this._length; + } + + get indexed () { + return this._indexed; + } + + static validateType (type) { + if (TYPES.filter((_type) => type === _type).length) { + return true; + } + + throw new Error(`Invalid type ${type} received for ParamType`); + } +} diff --git a/js/src/abi/spec/paramType/paramType.spec.js b/js/src/abi/spec/paramType/paramType.spec.js new file mode 100644 index 000000000..dc7114721 --- /dev/null +++ b/js/src/abi/spec/paramType/paramType.spec.js @@ -0,0 +1,87 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import ParamType from './paramType'; + +describe('abi/spec/paramType/ParamType', () => { + describe('validateType', () => { + it('validates address', () => { + expect(ParamType.validateType('address')).to.be.true; + }); + + it('validates fixedArray', () => { + expect(ParamType.validateType('fixedArray')).to.be.true; + }); + + it('validates array', () => { + expect(ParamType.validateType('array')).to.be.true; + }); + + it('validates fixedBytes', () => { + expect(ParamType.validateType('fixedBytes')).to.be.true; + }); + + it('validates bytes', () => { + expect(ParamType.validateType('bytes')).to.be.true; + }); + + it('validates bool', () => { + expect(ParamType.validateType('bool')).to.be.true; + }); + + it('validates int', () => { + expect(ParamType.validateType('int')).to.be.true; + }); + + it('validates uint', () => { + expect(ParamType.validateType('uint')).to.be.true; + }); + + it('validates string', () => { + expect(ParamType.validateType('string')).to.be.true; + }); + + it('throws an error on invalid types', () => { + expect(() => ParamType.validateType('noMatch')).to.throw(/noMatch/); + }); + }); + + describe('constructor', () => { + it('throws an error on invalid types', () => { + expect(() => new ParamType('noMatch')).to.throw(/noMatch/); + }); + + it('sets the type of the object', () => { + expect((new ParamType('bool', null, 1)).type).to.equal('bool'); + }); + + it('sets the subtype of the object', () => { + expect((new ParamType('array', 'bool', 1)).subtype).to.equal('bool'); + }); + + it('sets the length of the object', () => { + expect((new ParamType('array', 'bool', 1)).length).to.equal(1); + }); + + it('sets the index of the object', () => { + expect((new ParamType('array', 'bool', 1, true)).indexed).to.be.true; + }); + + it('sets default values where none supplied', () => { + expect(Object.values(new ParamType('string'))).to.deep.equal(['string', null, 0, false]); + }); + }); +}); diff --git a/js/src/abi/spec/paramType/types.js b/js/src/abi/spec/paramType/types.js new file mode 100644 index 000000000..e9749c588 --- /dev/null +++ b/js/src/abi/spec/paramType/types.js @@ -0,0 +1,19 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const TYPES = ['address', 'bytes', 'int', 'uint', 'bool', 'string', 'array', 'fixedBytes', 'fixedArray']; + +export default TYPES; diff --git a/js/src/abi/token/index.js b/js/src/abi/token/index.js new file mode 100644 index 000000000..6a636c3c8 --- /dev/null +++ b/js/src/abi/token/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './token'; diff --git a/js/src/abi/token/token.js b/js/src/abi/token/token.js new file mode 100644 index 000000000..7242248ab --- /dev/null +++ b/js/src/abi/token/token.js @@ -0,0 +1,42 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import TYPES from '../spec/paramType/types'; + +export default class Token { + constructor (type, value) { + Token.validateType(type); + + this._type = type; + this._value = value; + } + + get type () { + return this._type; + } + + get value () { + return this._value; + } + + static validateType (type) { + if (TYPES.filter((_type) => type === _type).length) { + return true; + } + + throw new Error(`Invalid type ${type} received for Token`); + } +} diff --git a/js/src/abi/token/token.spec.js b/js/src/abi/token/token.spec.js new file mode 100644 index 000000000..cf5fc51bf --- /dev/null +++ b/js/src/abi/token/token.spec.js @@ -0,0 +1,75 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Token from './token'; + +describe('abi/token/token', () => { + describe('validateType', () => { + it('validates address', () => { + expect(Token.validateType('address')).to.be.true; + }); + + it('validates fixedArray', () => { + expect(Token.validateType('fixedArray')).to.be.true; + }); + + it('validates array', () => { + expect(Token.validateType('array')).to.be.true; + }); + + it('validates fixedBytes', () => { + expect(Token.validateType('fixedBytes')).to.be.true; + }); + + it('validates bytes', () => { + expect(Token.validateType('bytes')).to.be.true; + }); + + it('validates bool', () => { + expect(Token.validateType('bool')).to.be.true; + }); + + it('validates int', () => { + expect(Token.validateType('int')).to.be.true; + }); + + it('validates uint', () => { + expect(Token.validateType('uint')).to.be.true; + }); + + it('validates string', () => { + expect(Token.validateType('string')).to.be.true; + }); + + it('throws an error on invalid types', () => { + expect(() => Token.validateType('noMatch')).to.throw(/noMatch/); + }); + }); + + describe('constructor', () => { + it('throws an error on invalid types', () => { + expect(() => new Token('noMatch', '1')).to.throw(/noMatch/); + }); + + it('sets the type of the object', () => { + expect((new Token('bool', '1')).type).to.equal('bool'); + }); + + it('sets the value of the object', () => { + expect((new Token('bool', '1')).value).to.equal('1'); + }); + }); +}); diff --git a/js/src/abi/util/address.js b/js/src/abi/util/address.js new file mode 100644 index 000000000..c0153ee5d --- /dev/null +++ b/js/src/abi/util/address.js @@ -0,0 +1,66 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase + +export function isChecksumValid (_address) { + const address = _address.replace('0x', ''); + const hash = keccak_256(address.toLowerCase()); + + for (let n = 0; n < 40; n++) { + const char = address[n]; + const isLower = char !== char.toUpperCase(); + const isUpper = char !== char.toLowerCase(); + const hashval = parseInt(hash[n], 16); + + if ((hashval > 7 && isLower) || (hashval <= 7 && isUpper)) { + return false; + } + } + + return true; +} + +export function isAddress (address) { + if (address && address.length === 42) { + if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) { + return false; + } else if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) { + return true; + } + + return isChecksumValid(address); + } + + return false; +} + +export function toChecksumAddress (_address) { + const address = (_address || '').toLowerCase(); + + if (!isAddress(address)) { + return ''; + } + + const hash = keccak_256(address.slice(-40)); + let result = '0x'; + + for (let n = 0; n < 40; n++) { + result = `${result}${parseInt(hash[n], 16) > 7 ? address[n + 2].toUpperCase() : address[n + 2]}`; + } + + return result; +} diff --git a/js/src/abi/util/address.spec.js b/js/src/abi/util/address.spec.js new file mode 100644 index 000000000..324ba163d --- /dev/null +++ b/js/src/abi/util/address.spec.js @@ -0,0 +1,100 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { isChecksumValid, isAddress, toChecksumAddress } from './address'; + +describe('abi/util/address', () => { + const value = '63Cf90D3f0410092FC0fca41846f596223979195'; + const address = `0x${value}`; + const lowercase = `0x${value.toLowerCase()}`; + const uppercase = `0x${value.toUpperCase()}`; + const invalid = '0x' + value.split('').map((char) => { + if (char >= 'a' && char <= 'f') { + return char.toUpperCase(); + } else if (char >= 'A' && char <= 'F') { + return char.toLowerCase(); + } + + return char; + }).join(''); + const invalidhex = '0x01234567890123456789012345678901234567gh'; + + describe('isChecksumValid', () => { + it('returns false when fully lowercase', () => { + expect(isChecksumValid(lowercase)).to.be.false; + }); + + it('returns false when fully uppercase', () => { + expect(isChecksumValid(uppercase)).to.be.false; + }); + + it('returns false on a mixed-case address', () => { + expect(isChecksumValid(invalid)).to.be.false; + }); + + it('returns true on a checksummed address', () => { + expect(isChecksumValid(address)).to.be.true; + }); + }); + + describe('isAddress', () => { + it('returns true when fully lowercase', () => { + expect(isAddress(lowercase)).to.be.true; + }); + + it('returns true when fully uppercase', () => { + expect(isAddress(uppercase)).to.be.true; + }); + + it('returns true when checksummed', () => { + expect(isAddress(address)).to.be.true; + }); + + it('returns false when invalid checksum', () => { + expect(isAddress(invalid)).to.be.false; + }); + + it('returns false on valid length, non-hex', () => { + expect(isAddress(invalidhex)).to.be.false; + }); + }); + + describe('toChecksumAddress', () => { + it('returns empty when no address specified', () => { + expect(toChecksumAddress()).to.equal(''); + }); + + it('returns empty on invalid address structure', () => { + expect(toChecksumAddress('0xnotaddress')).to.equal(''); + }); + + it('returns formatted address on checksum input', () => { + expect(toChecksumAddress(address)).to.equal(address); + }); + + it('returns formatted address on lowercase input', () => { + expect(toChecksumAddress(lowercase)).to.equal(address); + }); + + it('returns formatted address on uppercase input', () => { + expect(toChecksumAddress(uppercase)).to.equal(address); + }); + + it('returns formatted address on mixed input', () => { + expect(toChecksumAddress(invalid)).to.equal(address); + }); + }); +}); diff --git a/js/src/abi/util/pad.js b/js/src/abi/util/pad.js new file mode 100644 index 000000000..476a27445 --- /dev/null +++ b/js/src/abi/util/pad.js @@ -0,0 +1,77 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import utf8 from 'utf8'; + +import { isArray } from './types'; + +const ZERO_64 = '0000000000000000000000000000000000000000000000000000000000000000'; + +export function padAddress (_input) { + const input = _input.substr(0, 2) === '0x' ? _input.substr(2) : _input; + + return `${ZERO_64}${input}`.slice(-64); +} + +export function padBool (input) { + return `${ZERO_64}${input ? '1' : '0'}`.slice(-64); +} + +export function padU32 (input) { + let bn = new BigNumber(input); + + if (bn.lessThan(0)) { + bn = new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16) + .plus(bn).plus(1); + } + + return `${ZERO_64}${bn.toString(16)}`.slice(-64); +} + +function stringToBytes (input) { + if (isArray(input)) { + return input; + } else if (input.substr(0, 2) === '0x') { + const matches = input.substr(2).toLowerCase().match(/.{1,2}/g) || []; + + return matches.map((value) => parseInt(value, 16)); + } else { + return input.split('').map((char) => char.charCodeAt(0)); + } +} + +export function padBytes (_input) { + const input = stringToBytes(_input); + + return `${padU32(input.length)}${padFixedBytes(input)}`; +} + +export function padFixedBytes (_input) { + const input = stringToBytes(_input); + const sinput = input.map((code) => `0${code.toString(16)}`.slice(-2)).join(''); + const max = Math.floor((sinput.length + 63) / 64) * 64; + + return `${sinput}${ZERO_64}`.substr(0, max); +} + +export function padString (input) { + const array = utf8.encode(input) + .split('') + .map((char) => char.charCodeAt(0)); + + return padBytes(array); +} diff --git a/js/src/abi/util/pad.spec.js b/js/src/abi/util/pad.spec.js new file mode 100644 index 000000000..74463b438 --- /dev/null +++ b/js/src/abi/util/pad.spec.js @@ -0,0 +1,124 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import { padAddress, padBool, padBytes, padFixedBytes, padString, padU32 } from './pad'; + +describe('abi/util/pad', () => { + const SHORT15 = '1234567890abcdef'; + const BYTES15 = [0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef]; + const LONG15 = `${SHORT15}000000000000000000000000000000000000000000000000`; + const PAD123 = '0000000000000000000000000000000000000000000000000000000000000123'; + + describe('padAddress', () => { + it('pads to 64 characters', () => { + expect(padAddress('123')).to.equal(PAD123); + }); + + it('strips leading 0x when passed in', () => { + expect(padFixedBytes(`0x${PAD123}`)).to.equal(PAD123); + }); + }); + + describe('padBool', () => { + const TRUE = '0000000000000000000000000000000000000000000000000000000000000001'; + const FALSE = '0000000000000000000000000000000000000000000000000000000000000000'; + + it('pads true to 64 characters', () => { + expect(padBool(true)).to.equal(TRUE); + }); + + it('pads false to 64 characters', () => { + expect(padBool(false)).to.equal(FALSE); + }); + }); + + describe('padU32', () => { + it('left pads length < 64 bytes to 64 bytes', () => { + expect(padU32(1)).to.equal('0000000000000000000000000000000000000000000000000000000000000001'); + }); + + it('pads hex representation', () => { + expect(padU32(0x123)).to.equal(PAD123); + }); + + it('pads decimal representation', () => { + expect(padU32(291)).to.equal(PAD123); + }); + + it('pads string representation', () => { + expect(padU32('0x123')).to.equal(PAD123); + }); + + it('pads BigNumber representation', () => { + expect(padU32(new BigNumber(0x123))).to.equal(PAD123); + }); + + it('converts negative numbers to 2s complement', () => { + expect(padU32(-123)).to.equal('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85'); + }); + }); + + describe('padFixedBytes', () => { + it('right pads length < 64 bytes to 64 bytes (string)', () => { + expect(padFixedBytes(`0x${SHORT15}`)).to.equal(LONG15); + }); + + it('right pads length < 64 bytes to 64 bytes (array)', () => { + expect(padFixedBytes(BYTES15)).to.equal(LONG15); + }); + + it('right pads length > 64 bytes (64 byte multiples)', () => { + expect(padFixedBytes(`0x${LONG15}${SHORT15}`)).to.equal(`${LONG15}${LONG15}`); + }); + + it('strips leading 0x when passed in', () => { + expect(padFixedBytes(`0x${SHORT15}`)).to.equal(LONG15); + }); + }); + + describe('padBytes', () => { + it('right pads length < 64, adding the length (string)', () => { + const result = padBytes(`0x${SHORT15}`); + + expect(result.length).to.equal(128); + expect(result).to.equal(`${padU32(8)}${LONG15}`); + }); + + it('right pads length < 64, adding the length (array)', () => { + const result = padBytes(BYTES15); + + expect(result.length).to.equal(128); + expect(result).to.equal(`${padU32(8)}${LONG15}`); + }); + + it('right pads length > 64, adding the length', () => { + const result = padBytes(`0x${LONG15}${SHORT15}`); + + expect(result.length).to.equal(192); + expect(result).to.equal(`${padU32(0x28)}${LONG15}${LONG15}`); + }); + }); + + describe('padString', () => { + it('correctly converts & pads strings', () => { + const result = padString('gavofyork'); + + expect(result.length).to.equal(128); + expect(result).to.equal(padBytes('0x6761766f66796f726b')); + }); + }); +}); diff --git a/js/src/abi/util/signature.js b/js/src/abi/util/signature.js new file mode 100644 index 000000000..86ed6f265 --- /dev/null +++ b/js/src/abi/util/signature.js @@ -0,0 +1,49 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase +import { fromParamType } from '../spec/paramType/format'; + +export function eventSignature (eventName, params) { + const { strName, name } = parseName(eventName); + const types = (params || []).map(fromParamType).join(','); + const id = `${strName}(${types})`; + const signature = strName ? keccak_256(id) : ''; + + return { id, name, signature }; +} + +export function methodSignature (methodName, params) { + const { id, name, signature } = eventSignature(methodName, params); + + return { id, name, signature: signature.substr(0, 8) }; +} + +function parseName (name) { + const strName = `${name || ''}`; + const idx = strName.indexOf('('); + + if (idx === -1) { + return { strName, name }; + } + + const trimmedName = strName.slice(0, idx); + + return { + strName: trimmedName, + name: trimmedName + }; +} diff --git a/js/src/abi/util/signature.spec.js b/js/src/abi/util/signature.spec.js new file mode 100644 index 000000000..118ebf4e5 --- /dev/null +++ b/js/src/abi/util/signature.spec.js @@ -0,0 +1,111 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { eventSignature, methodSignature } from './signature'; + +describe('abi/util/signature', () => { + describe('eventSignature', () => { + it('encodes signature baz() correctly', () => { + expect(eventSignature('baz', [])).to.deep.equal({ + id: 'baz()', + name: 'baz', + signature: 'a7916fac4f538170f7cd12c148552e2cba9fcd72329a2dd5b07a6fa906488ddf' + }); + }); + + it('encodes signature baz(uint32) correctly', () => { + expect(eventSignature('baz', [{ type: 'uint', length: 32 }])).to.deep.equal({ + id: 'baz(uint32)', + name: 'baz', + signature: '7d68785e8fc871be024b75964bd86d093511d4bc2dc7cf7bea32c48a0efaecb1' + }); + }); + + it('encodes signature baz(uint32, bool) correctly', () => { + expect(eventSignature('baz', [{ type: 'uint', length: 32 }, { type: 'bool' }])).to.deep.equal({ + id: 'baz(uint32,bool)', + name: 'baz', + signature: 'cdcd77c0992ec5bbfc459984220f8c45084cc24d9b6efed1fae540db8de801d2' + }); + }); + + it('encodes no-name signature correctly as ()', () => { + expect(eventSignature(undefined, [])).to.deep.equal({ + id: '()', + name: undefined, + signature: '' + }); + }); + + it('encodes no-params signature correctly as ()', () => { + expect(eventSignature(undefined, undefined)).to.deep.equal({ + id: '()', + name: undefined, + signature: '' + }); + }); + }); + + describe('methodSignature', () => { + it('encodes signature baz() correctly', () => { + expect(methodSignature('baz', [])).to.deep.equal({ + id: 'baz()', + name: 'baz', + signature: 'a7916fac' + }); + }); + + it('encodes signature baz(uint32) correctly', () => { + expect(methodSignature('baz', [{ type: 'uint', length: 32 }])).to.deep.equal({ + id: 'baz(uint32)', + name: 'baz', + signature: '7d68785e' + }); + }); + + it('encodes signature baz(uint32, bool) correctly', () => { + expect(methodSignature('baz', [{ type: 'uint', length: 32 }, { type: 'bool' }])).to.deep.equal({ + id: 'baz(uint32,bool)', + name: 'baz', + signature: 'cdcd77c0' + }); + }); + + it('encodes signature in name correctly', () => { + expect(methodSignature('baz(uint32,bool)', [{ type: 'uint', length: 32 }, { type: 'bool' }])).to.deep.equal({ + id: 'baz(uint32,bool)', + name: 'baz', + signature: 'cdcd77c0' + }); + }); + + it('encodes no-name signature correctly as ()', () => { + expect(methodSignature(undefined, [])).to.deep.equal({ + id: '()', + name: undefined, + signature: '' + }); + }); + + it('encodes no-params signature correctly as ()', () => { + expect(methodSignature(undefined, undefined)).to.deep.equal({ + id: '()', + name: undefined, + signature: '' + }); + }); + }); +}); diff --git a/js/src/abi/util/slice.js b/js/src/abi/util/slice.js new file mode 100644 index 000000000..daab54f1c --- /dev/null +++ b/js/src/abi/util/slice.js @@ -0,0 +1,31 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { padAddress } from './pad'; + +export function sliceData (_data) { + if (!_data || !_data.length) { + return []; + } + + let data = (_data.substr(0, 2) === '0x') ? _data.substr(2) : _data; + + if (!data.length) { + data = padAddress(''); + } + + return data.match(/.{1,64}/g); +} diff --git a/js/src/abi/util/slice.spec.js b/js/src/abi/util/slice.spec.js new file mode 100644 index 000000000..1b754ccbb --- /dev/null +++ b/js/src/abi/util/slice.spec.js @@ -0,0 +1,44 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { sliceData } from './slice'; + +describe('abi/util/slice', () => { + describe('sliceData', () => { + const slice1 = '131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'; + const slice2 = '2124768576358735263578356373526387638357635873563586353756358763'; + + it('returns an empty array when length === 0', () => { + expect(sliceData('')).to.deep.equal([]); + }); + + it('returns an array with the slices otherwise', () => { + const sliced = sliceData(`${slice1}${slice2}`); + + expect(sliced.length).to.equal(2); + expect(sliced[0]).to.equal(slice1); + expect(sliced[1]).to.equal(slice2); + }); + + it('removes leading 0x when passed in', () => { + const sliced = sliceData(`0x${slice1}${slice2}`); + + expect(sliced.length).to.equal(2); + expect(sliced[0]).to.equal(slice1); + expect(sliced[1]).to.equal(slice2); + }); + }); +}); diff --git a/js/src/abi/util/sliceAs.js b/js/src/abi/util/sliceAs.js new file mode 100644 index 000000000..e177897a1 --- /dev/null +++ b/js/src/abi/util/sliceAs.js @@ -0,0 +1,47 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; + +import { toChecksumAddress } from './address'; + +export function asU32 (slice) { + // TODO: validation + + return new BigNumber(slice, 16); +} + +export function asI32 (slice) { + if (new BigNumber(slice.substr(0, 1), 16).toString(2)[0] === '1') { + return new BigNumber(slice, 16) + .minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)) + .minus(1); + } + + return new BigNumber(slice, 16); +} + +export function asAddress (slice) { + // TODO: address validation? + + return toChecksumAddress(`0x${slice.slice(-40)}`); +} + +export function asBool (slice) { + // TODO: everything else should be 0 + + return new BigNumber(slice[63]).eq(1); +} diff --git a/js/src/abi/util/sliceAs.spec.js b/js/src/abi/util/sliceAs.spec.js new file mode 100644 index 000000000..c29e34554 --- /dev/null +++ b/js/src/abi/util/sliceAs.spec.js @@ -0,0 +1,55 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { asAddress, asBool, asI32, asU32 } from './sliceAs'; + +describe('abi/util/sliceAs', () => { + const MAX_INT = 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'; + + describe('asAddress', () => { + it('correctly returns the last 0x40 characters', () => { + const address = '1111111111222222222233333333334444444444'; + + expect(asAddress(`000000000000000000000000${address}`)).to.equal(`0x${address}`); + }); + }); + + describe('asBool', () => { + it('correctly returns true', () => { + expect(asBool('0000000000000000000000000000000000000000000000000000000000000001')).to.be.true; + }); + + it('correctly returns false', () => { + expect(asBool('0000000000000000000000000000000000000000000000000000000000000000')).to.be.false; + }); + }); + + describe('asI32', () => { + it('correctly decodes positive numbers', () => { + expect(asI32('000000000000000000000000000000000000000000000000000000000000007b').toString()).to.equal('123'); + }); + + it('correctly decodes negative numbers', () => { + expect(asI32('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85').toString()).to.equal('-123'); + }); + }); + + describe('asU32', () => { + it('returns a maxium U32', () => { + expect(asU32(MAX_INT).toString(16)).to.equal(MAX_INT); + }); + }); +}); diff --git a/js/src/abi/util/types.js b/js/src/abi/util/types.js new file mode 100644 index 000000000..dd408f371 --- /dev/null +++ b/js/src/abi/util/types.js @@ -0,0 +1,27 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export function isArray (test) { + return Object.prototype.toString.call(test) === '[object Array]'; +} + +export function isString (test) { + return Object.prototype.toString.call(test) === '[object String]'; +} + +export function isInstanceOf (test, clazz) { + return test instanceof clazz; +} diff --git a/js/src/abi/util/types.spec.js b/js/src/abi/util/types.spec.js new file mode 100644 index 000000000..177662ae2 --- /dev/null +++ b/js/src/abi/util/types.spec.js @@ -0,0 +1,62 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { isArray, isString, isInstanceOf } from './types'; +import Token from '../token'; + +describe('abi/util/types', () => { + describe('isArray', () => { + it('correctly identifies empty arrays as Array', () => { + expect(isArray([])).to.be.true; + }); + + it('correctly identifies non-empty arrays as Array', () => { + expect(isArray([1, 2, 3])).to.be.true; + }); + + it('correctly identifies strings as non-Array', () => { + expect(isArray('not an array')).to.be.false; + }); + + it('correctly identifies objects as non-Array', () => { + expect(isArray({})).to.be.false; + }); + }); + + describe('isString', () => { + it('correctly identifies empty string as string', () => { + expect(isString('')).to.be.true; + }); + + it('correctly identifies string as string', () => { + expect(isString('123')).to.be.true; + }); + }); + + describe('isInstanceOf', () => { + it('correctly identifies build-in instanceof', () => { + expect(isInstanceOf(new String('123'), String)).to.be.true; // eslint-disable-line no-new-wrappers + }); + + it('correctly identifies own instanceof', () => { + expect(isInstanceOf(new Token('int', 123), Token)).to.be.true; + }); + + it('correctly reports false for own', () => { + expect(isInstanceOf({ type: 'int' }, Token)).to.be.false; + }); + }); +}); diff --git a/js/src/api/README.md b/js/src/api/README.md new file mode 100644 index 000000000..1a2051eaf --- /dev/null +++ b/js/src/api/README.md @@ -0,0 +1,146 @@ +# ethapi-js + +A thin, fast, low-level Promise-based wrapper around the Ethereum APIs. + +[![Build Status](https://travis-ci.org/jacogr/ethapi-js.svg?branch=master)](https://travis-ci.org/jacogr/ethapi-js) +[![Coverage Status](https://coveralls.io/repos/github/jacogr/ethapi-js/badge.svg?branch=master)](https://coveralls.io/github/jacogr/ethapi-js?branch=master) +[![Dependency Status](https://david-dm.org/jacogr/ethapi-js.svg)](https://david-dm.org/jacogr/ethapi-js) +[![devDependency Status](https://david-dm.org/jacogr/ethapi-js/dev-status.svg)](https://david-dm.org/jacogr/ethapi-js#info=devDependencies) + +## contributing + +Clone the repo and install dependencies via `npm install`. Tests can be executed via + +- `npm run testOnce` (100% covered unit tests) +- `npm run testE2E` (E2E against a running RPC-enabled testnet Parity/Geth instance, `parity --testnet` and for WebScokets, `geth --testnet --ws --wsorigins '*' --rpc`) +- setting the environment `DEBUG=true` will display the RPC POST bodies and responses on E2E tests + +## installation + +Install the package with `npm install --save ethapi-js` from the [npm registry ethapi-js](https://www.npmjs.com/package/ethapi-js) + +## usage + +### initialisation + +```javascript +// import the actual EthApi class +import EthApi from 'ethapi-js'; + +// do the setup +const transport = new EthApi.Transport.Http('http://localhost:8545'); // or .Ws('ws://localhost:8546') +const ethapi = new EthApi(transport); +``` + +You will require native Promises and fetch support (latest browsers only), they can be utilised by + +```javascript +import 'isomorphic-fetch'; + +import es6Promise from 'es6-promise'; +es6Promise.polyfill(); +``` + +### making calls + +perform a call + +```javascript +ethapi.eth + .coinbase() + .then((coinbase) => { + console.log(`The coinbase is ${coinbase}`); + }); +``` + +multiple promises + +```javascript +Promise + .all([ + ethapi.eth.coinbase(), + ethapi.net.listening() + ]) + .then(([coinbase, listening]) => { + // do stuff here + }); +``` + +chaining promises + +```javascript +ethapi.eth + .newFilter({...}) + .then((filterId) => ethapi.eth.getFilterChanges(filterId)) + .then((changes) => { + console.log(changes); + }); +``` + +### contracts + +attach contract + +```javascript +const abi = [{ name: 'callMe', inputs: [{ type: 'bool', ...}, { type: 'string', ...}]}, ...abi...]; +const contract = new ethapi.newContract(abi); +``` + +deploy + +```javascript +contract + .deploy('0xc0de', [params], 'superPassword') + .then((address) => { + console.log(`the contract was deployed at ${address}`); + }); +``` + +attach a contract at address + +```javascript +// via the constructor & .at function +const contract = api.newContract(abi).at('0xa9280...7347b'); +// or on an already initialised contract +contract.at('0xa9280...7347b'); +// perform calls here +``` + +find & call a function + +```javascript +contract.instance + .myContractMethodName + .call({}, [myContractMethodParameter]) // or estimateGas or sendTransaction + .then((result) => { + console.log(`the result was ${result}`); + }); +``` + +parse events from transaction receipt + +```javascript +contract + .parseTransactionEvents(txReceipt) + .then((receipt) => { + receipt.logs.forEach((log) => { + console.log('log parameters', log.params); + }); + }); +``` + +## apis + +APIs implement the calls as exposed in the [Ethcore JSON Ethereum RPC](https://github.com/paritytech/ethereum-rpc-json/) definitions. Mapping follows the naming conventions of the originals, i.e. `eth_call` becomes `eth.call`, `personal_accounts` becomes `personal.accounts`, etc. + +- [ethapi.db](https://github.com/paritytech/ethereum-rpc-json/blob/master/interfaces.md#db) +- [ethapi.eth](https://github.com/paritytech/ethereum-rpc-json/blob/master/interfaces.md#eth) +- [ethapi.parity](https://github.com/paritytech/ethereum-rpc-json/blob/master/interfaces.md#parity) +- [ethapi.net](https://github.com/paritytech/ethereum-rpc-json/blob/master/interfaces.md#net) +- [ethapi.personal](https://github.com/paritytech/ethereum-rpc-json/blob/master/interfaces.md#personal) +- [ethapi.shh](https://github.com/paritytech/ethereum-rpc-json/blob/master/interfaces.md#shh) +- [ethapi.signer](https://github.com/paritytech/ethereum-rpc-json/blob/master/interfaces.md#signer) +- [ethapi.trace](https://github.com/paritytech/ethereum-rpc-json/blob/master/interfaces.md#trace) +- [ethapi.web3](https://github.com/paritytech/ethereum-rpc-json/blob/master/interfaces.md#web3) + +As a verification step, all exposed interfaces are tested for existing and pointing to the correct endpoints by using the generated interfaces from the above repo. diff --git a/js/src/api/api.js b/js/src/api/api.js new file mode 100644 index 000000000..a1a7dbbb5 --- /dev/null +++ b/js/src/api/api.js @@ -0,0 +1,184 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import EventEmitter from 'eventemitter3'; + +import { Http, Ws } from './transport'; +import Contract from './contract'; + +import { Db, Eth, Parity, Net, Personal, Shh, Signer, Trace, Web3 } from './rpc'; +import Subscriptions from './subscriptions'; +import Pubsub from './pubsub'; +import util from './util'; +import { isFunction } from './util/types'; + +import LocalAccountsMiddleware from '~/api/local'; + +export default class Api extends EventEmitter { + constructor (transport, allowSubscriptions = true) { + super(); + + if (!transport || !isFunction(transport.execute)) { + throw new Error('EthApi needs transport with execute() function defined'); + } + + this._transport = transport; + + this._db = new Db(transport); + this._eth = new Eth(transport); + this._net = new Net(transport); + this._parity = new Parity(transport); + this._personal = new Personal(transport); + this._shh = new Shh(transport); + this._signer = new Signer(transport); + this._trace = new Trace(transport); + this._web3 = new Web3(transport); + + if (isFunction(transport.subscribe)) { + this._pubsub = new Pubsub(transport); + } + + if (allowSubscriptions) { + this._subscriptions = new Subscriptions(this); + } + // Doing a request here in test env would cause an error + if (LocalAccountsMiddleware && process.env.NODE_ENV !== 'test') { + const middleware = this.parity + .nodeKind() + .then((nodeKind) => { + if (nodeKind.availability === 'public') { + return LocalAccountsMiddleware; + } + + return null; + }) + .catch(() => null); + + transport.addMiddleware(middleware); + } + } + + get isPubSub () { + return !!this._pubsub; + } + + get pubsub () { + if (!this.isPubSub) { + throw Error('Pubsub is only available with a subscribing-supported transport injected!'); + } + + return this._pubsub; + } + + get db () { + return this._db; + } + + get eth () { + return this._eth; + } + + get parity () { + return this._parity; + } + + get net () { + return this._net; + } + + get personal () { + return this._personal; + } + + get shh () { + return this._shh; + } + + get signer () { + return this._signer; + } + + get trace () { + return this._trace; + } + + get transport () { + return this._transport; + } + + get web3 () { + return this._web3; + } + + get util () { + return util; + } + + newContract (abi, address) { + return new Contract(this, abi).at(address); + } + + subscribe (subscriptionName, callback) { + if (!this._subscriptions) { + return Promise.resolve(1); + } + + return this._subscriptions.subscribe(subscriptionName, callback); + } + + unsubscribe (subscriptionId) { + if (!this._subscriptions) { + return Promise.resolve(true); + } + + return this._subscriptions.unsubscribe(subscriptionId); + } + + pollMethod (method, input, validate) { + const [_group, endpoint] = method.split('_'); + const group = `_${_group}`; + + return new Promise((resolve, reject) => { + const timeout = () => { + this[group][endpoint](input) + .then((result) => { + if (validate ? validate(result) : result) { + resolve(result); + } else { + setTimeout(timeout, 500); + } + }) + .catch((error) => { + // Don't print if the request is rejected: that's ok + if (error.type !== 'REQUEST_REJECTED') { + console.error('pollMethod', error); + } + + reject(error); + }); + }; + + timeout(); + }); + } + + static util = util + + static Transport = { + Http: Http, + Ws: Ws + } +} diff --git a/js/src/api/api.spec.js b/js/src/api/api.spec.js new file mode 100644 index 000000000..c72b22849 --- /dev/null +++ b/js/src/api/api.spec.js @@ -0,0 +1,59 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { TEST_HTTP_URL, endpointTest } from '../../test/mockRpc'; + +import util from './util'; +import Api from './api'; + +import ethereumRpc from '../jsonrpc/'; + +describe('api/Api', () => { + describe('constructor', () => { + it('requires defined/non-null transport object', () => { + expect(() => new Api()).to.throw(/Api needs transport/); + expect(() => new Api(null)).to.throw(/Api needs transport/); + }); + + it('requires an execute function on the transport object', () => { + expect(() => new Api({})).to.throw(/Api needs transport/); + expect(() => new Api({ execute: true })).to.throw(/Api needs transport/); + }); + }); + + describe('interface', () => { + const api = new Api(new Api.Transport.Http(TEST_HTTP_URL, -1)); + const ignored = [ + 'eth_subscribe', 'eth_unsubscribe', + 'parity_subscribe', 'parity_unsubscribe', + 'signer_subscribePending', 'signer_unsubscribePending' + ]; + + Object.keys(ethereumRpc).sort().forEach((endpoint) => { + describe(endpoint, () => { + Object.keys(ethereumRpc[endpoint]).sort() + .filter(method => ignored.indexOf(method) !== -1) + .forEach((method) => { + endpointTest(api, endpoint, method); + }); + }); + }); + }); + + it('exposes util as static property', () => { + expect(Api.util).to.equal(util); + }); +}); diff --git a/js/src/api/contract/contract.js b/js/src/api/contract/contract.js new file mode 100644 index 000000000..dee4d6d77 --- /dev/null +++ b/js/src/api/contract/contract.js @@ -0,0 +1,561 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Abi from '~/abi'; + +let nextSubscriptionId = 0; + +export default class Contract { + constructor (api, abi) { + if (!api) { + throw new Error('API instance needs to be provided to Contract'); + } + + if (!abi) { + throw new Error('ABI needs to be provided to Contract instance'); + } + + this._api = api; + this._abi = new Abi(abi); + + this._subscriptions = {}; + this._constructors = this._abi.constructors.map(this._bindFunction); + this._functions = this._abi.functions.map(this._bindFunction); + this._events = this._abi.events.map(this._bindEvent); + + this._instance = {}; + + this._events.forEach((evt) => { + this._instance[evt.name] = evt; + this._instance[evt.signature] = evt; + }); + + this._functions.forEach((fn) => { + this._instance[fn.name] = fn; + this._instance[fn.signature] = fn; + }); + + this._subscribedToPendings = false; + this._pendingsSubscriptionId = null; + + this._subscribedToBlock = false; + this._blockSubscriptionId = null; + + if (api && api.patch && api.patch.contract) { + api.patch.contract(this); + } + } + + get address () { + return this._address; + } + + get constructors () { + return this._constructors; + } + + get events () { + return this._events; + } + + get functions () { + return this._functions; + } + + get receipt () { + return this._receipt; + } + + get instance () { + this._instance.address = this._address; + return this._instance; + } + + get api () { + return this._api; + } + + get abi () { + return this._abi; + } + + at (address) { + this._address = address; + return this; + } + + deployEstimateGas (options, values) { + const _options = this._encodeOptions(this.constructors[0], options, values); + + return this._api.eth + .estimateGas(_options) + .then((gasEst) => { + return [gasEst, gasEst.mul(1.2)]; + }); + } + + deploy (options, values, statecb = () => {}, skipGasEstimate = false) { + let gasEstPromise; + + if (skipGasEstimate) { + gasEstPromise = Promise.resolve(null); + } else { + statecb(null, { state: 'estimateGas' }); + + gasEstPromise = this.deployEstimateGas(options, values) + .then(([gasEst, gas]) => gas); + } + + return gasEstPromise + .then((_gas) => { + if (_gas) { + options.gas = _gas.toFixed(0); + } + + const gas = _gas || options.gas; + + statecb(null, { state: 'postTransaction', gas }); + + const encodedOptions = this._encodeOptions(this.constructors[0], options, values); + + return this._api.parity + .postTransaction(encodedOptions) + .then((requestId) => { + statecb(null, { state: 'checkRequest', requestId }); + return this._pollCheckRequest(requestId); + }) + .then((txhash) => { + statecb(null, { state: 'getTransactionReceipt', txhash }); + return this._pollTransactionReceipt(txhash, gas); + }) + .then((receipt) => { + if (receipt.gasUsed.eq(gas)) { + throw new Error(`Contract not deployed, gasUsed == ${gas.toFixed(0)}`); + } + + statecb(null, { state: 'hasReceipt', receipt }); + this._receipt = receipt; + this._address = receipt.contractAddress; + return this._address; + }) + .then((address) => { + statecb(null, { state: 'getCode' }); + return this._api.eth.getCode(this._address); + }) + .then((code) => { + if (code === '0x') { + throw new Error('Contract not deployed, getCode returned 0x'); + } + + statecb(null, { state: 'completed' }); + return this._address; + }); + }); + } + + parseEventLogs (logs) { + return logs + .map((log) => { + const signature = log.topics[0].substr(2); + const event = this.events.find((evt) => evt.signature === signature); + + if (!event) { + console.warn(`Unable to find event matching signature ${signature}`); + return null; + } + + try { + const decoded = event.decodeLog(log.topics, log.data); + + log.params = {}; + log.event = event.name; + + decoded.params.forEach((param, index) => { + const { type, value } = param.token; + const key = param.name || index; + + log.params[key] = { type, value }; + }); + + return log; + } catch (error) { + console.warn('Error decoding log', log); + console.warn(error); + + return null; + } + }) + .filter((log) => log); + } + + parseTransactionEvents (receipt) { + receipt.logs = this.parseEventLogs(receipt.logs); + + return receipt; + } + + _pollCheckRequest = (requestId) => { + return this._api.pollMethod('parity_checkRequest', requestId); + } + + _pollTransactionReceipt = (txhash, gas) => { + return this.api.pollMethod('eth_getTransactionReceipt', txhash, (receipt) => { + if (!receipt || !receipt.blockNumber || receipt.blockNumber.eq(0)) { + return false; + } + + return true; + }); + } + + getCallData = (func, options, values) => { + let data = options.data; + + const tokens = func ? Abi.encodeTokens(func.inputParamTypes(), values) : null; + const call = tokens ? func.encodeCall(tokens) : null; + + if (data && data.substr(0, 2) === '0x') { + data = data.substr(2); + } + + return `0x${data || ''}${call || ''}`; + } + + _encodeOptions (func, options, values) { + const data = this.getCallData(func, options, values); + + return { + ...options, + data + }; + } + + _addOptionsTo (options = {}) { + return { + to: this._address, + ...options + }; + } + + _bindFunction = (func) => { + func.contract = this; + + func.call = (_options = {}, values = []) => { + const rawTokens = !!_options.rawTokens; + const options = { + ..._options + }; + + delete options.rawTokens; + + let callParams; + + try { + callParams = this._encodeOptions(func, this._addOptionsTo(options), values); + } catch (error) { + return Promise.reject(error); + } + + return this._api.eth + .call(callParams) + .then((encoded) => func.decodeOutput(encoded)) + .then((tokens) => { + if (rawTokens) { + return tokens; + } + + return tokens.map((token) => token.value); + }) + .then((returns) => returns.length === 1 ? returns[0] : returns) + .catch((error) => { + console.warn(`${func.name}.call`, values, error); + throw error; + }); + }; + + if (!func.constant) { + func.postTransaction = (options, values = []) => { + let _options; + + try { + _options = this._encodeOptions(func, this._addOptionsTo(options), values); + } catch (error) { + return Promise.reject(error); + } + + return this._api.parity + .postTransaction(_options) + .catch((error) => { + console.warn(`${func.name}.postTransaction`, values, error); + throw error; + }); + }; + + func.estimateGas = (options, values = []) => { + const _options = this._encodeOptions(func, this._addOptionsTo(options), values); + + return this._api.eth + .estimateGas(_options) + .catch((error) => { + console.warn(`${func.name}.estimateGas`, values, error); + throw error; + }); + }; + } + + return func; + } + + _bindEvent = (event) => { + event.subscribe = (options = {}, callback, autoRemove) => { + return this._subscribe(event, options, callback, autoRemove); + }; + + event.unsubscribe = (subscriptionId) => { + return this.unsubscribe(subscriptionId); + }; + + event.getAllLogs = (options = {}) => { + return this.getAllLogs(event); + }; + + return event; + } + + getAllLogs (event, _options) { + // Options as first parameter + if (!_options && event && event.topics) { + return this.getAllLogs(null, event); + } + + const options = this._getFilterOptions(event, _options); + + options.fromBlock = 0; + options.toBlock = 'latest'; + + return this._api.eth + .getLogs(options) + .then((logs) => this.parseEventLogs(logs)); + } + + _findEvent (eventName = null) { + const event = eventName + ? this._events.find((evt) => evt.name === eventName) + : null; + + if (eventName && !event) { + const events = this._events.map((evt) => evt.name).join(', '); + + throw new Error(`${eventName} is not a valid eventName, subscribe using one of ${events} (or null to include all)`); + } + + return event; + } + + _getFilterOptions (event = null, _options = {}) { + const optionTopics = _options.topics || []; + const signature = event && event.signature || null; + + // If event provided, remove the potential event signature + // as the first element of the topics + const topics = signature + ? [ signature ].concat(optionTopics.filter((t, idx) => idx > 0 || t !== signature)) + : optionTopics; + + const options = Object.assign({}, _options, { + address: this._address, + topics + }); + + return options; + } + + _createEthFilter (event = null, _options) { + const options = this._getFilterOptions(event, _options); + + return this._api.eth.newFilter(options); + } + + subscribe (eventName = null, options = {}, callback, autoRemove) { + try { + const event = this._findEvent(eventName); + + return this._subscribe(event, options, callback, autoRemove); + } catch (e) { + return Promise.reject(e); + } + } + + _sendData (subscriptionId, error, logs) { + const { autoRemove, callback } = this._subscriptions[subscriptionId]; + let result = true; + + try { + result = callback(error, logs); + } catch (error) { + console.warn('_sendData', subscriptionId, error); + } + + if (autoRemove && result && typeof result === 'boolean') { + this.unsubscribe(subscriptionId); + } + } + + _subscribe (event = null, _options, callback, autoRemove = false) { + const subscriptionId = nextSubscriptionId++; + const { skipInitFetch } = _options; + + delete _options['skipInitFetch']; + + return this + ._createEthFilter(event, _options) + .then((filterId) => { + this._subscriptions[subscriptionId] = { + options: _options, + autoRemove, + callback, + filterId, + id: subscriptionId + }; + + if (skipInitFetch) { + this._subscribeToChanges(); + return subscriptionId; + } + + return this._api.eth + .getFilterLogs(filterId) + .then((logs) => { + this._sendData(subscriptionId, null, this.parseEventLogs(logs)); + this._subscribeToChanges(); + return subscriptionId; + }); + }) + .catch((error) => { + console.warn('subscribe', event, _options, error); + throw error; + }); + } + + unsubscribe (subscriptionId) { + return this._api.eth + .uninstallFilter(this._subscriptions[subscriptionId].filterId) + .catch((error) => { + console.error('unsubscribe', error); + }) + .then(() => { + delete this._subscriptions[subscriptionId]; + this._unsubscribeFromChanges(); + }); + } + + _subscribeToChanges = () => { + const subscriptions = Object.values(this._subscriptions); + + const pendingSubscriptions = subscriptions + .filter((s) => s.options.toBlock && s.options.toBlock === 'pending'); + + const otherSubscriptions = subscriptions + .filter((s) => !(s.options.toBlock && s.options.toBlock === 'pending')); + + if (pendingSubscriptions.length > 0 && !this._subscribedToPendings) { + this._subscribedToPendings = true; + this._subscribeToPendings(); + } + + if (otherSubscriptions.length > 0 && !this._subscribedToBlock) { + this._subscribedToBlock = true; + this._subscribeToBlock(); + } + } + + _unsubscribeFromChanges = () => { + const subscriptions = Object.values(this._subscriptions); + + const pendingSubscriptions = subscriptions + .filter((s) => s.options.toBlock && s.options.toBlock === 'pending'); + + const otherSubscriptions = subscriptions + .filter((s) => !(s.options.toBlock && s.options.toBlock === 'pending')); + + if (pendingSubscriptions.length === 0 && this._subscribedToPendings) { + this._subscribedToPendings = false; + clearTimeout(this._pendingsSubscriptionId); + } + + if (otherSubscriptions.length === 0 && this._subscribedToBlock) { + this._subscribedToBlock = false; + this._api.unsubscribe(this._blockSubscriptionId); + } + } + + _subscribeToBlock = () => { + this._api + .subscribe('eth_blockNumber', (error) => { + if (error) { + console.error('::_subscribeToBlock', error, error && error.stack); + } + + const subscriptions = Object.values(this._subscriptions) + .filter((s) => !(s.options.toBlock && s.options.toBlock === 'pending')); + + this._sendSubscriptionChanges(subscriptions); + }) + .then((blockSubId) => { + this._blockSubscriptionId = blockSubId; + }) + .catch((e) => { + console.error('::_subscribeToBlock', e, e && e.stack); + }); + } + + _subscribeToPendings = () => { + const subscriptions = Object.values(this._subscriptions) + .filter((s) => s.options.toBlock && s.options.toBlock === 'pending'); + + const timeout = () => setTimeout(() => this._subscribeToPendings(), 1000); + + this._sendSubscriptionChanges(subscriptions) + .then(() => { + this._pendingsSubscriptionId = timeout(); + }); + } + + _sendSubscriptionChanges = (subscriptions) => { + return Promise + .all( + subscriptions.map((subscription) => { + return this._api.eth.getFilterChanges(subscription.filterId); + }) + ) + .then((logsArray) => { + logsArray.forEach((logs, index) => { + if (!logs || !logs.length) { + return; + } + + try { + this._sendData(subscriptions[index].id, null, this.parseEventLogs(logs)); + } catch (error) { + console.error('_sendSubscriptionChanges', error); + } + }); + }) + .catch((error) => { + console.error('_sendSubscriptionChanges', error); + }); + } +} diff --git a/js/src/api/contract/contract.spec.js b/js/src/api/contract/contract.spec.js new file mode 100644 index 000000000..bd8b0fbda --- /dev/null +++ b/js/src/api/contract/contract.spec.js @@ -0,0 +1,597 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import sinon from 'sinon'; + +import { TEST_HTTP_URL, mockHttp } from '../../../test/mockRpc'; + +import Abi from '../../abi'; +import { sha3 } from '../util/sha3'; + +import Api from '../api'; +import Contract from './contract'; +import { isInstanceOf, isFunction } from '../util/types'; + +const transport = new Api.Transport.Http(TEST_HTTP_URL, -1); +const eth = new Api(transport); + +describe('api/contract/Contract', () => { + const ADDR = '0x0123456789'; + + const ABI = [ + { + type: 'function', name: 'test', + inputs: [{ name: 'boolin', type: 'bool' }, { name: 'stringin', type: 'string' }], + outputs: [{ type: 'uint' }] + }, + { + type: 'function', name: 'test2', + outputs: [{ type: 'uint' }, { type: 'uint' }] + }, + { + type: 'constructor', + inputs: [{ name: 'boolin', type: 'bool' }, { name: 'stringin', type: 'string' }] + }, + { type: 'event', name: 'baz' }, + { type: 'event', name: 'foo' } + ]; + + const ABI_NO_PARAMS = [ + { + type: 'function', name: 'test', + inputs: [{ name: 'boolin', type: 'bool' }, { name: 'stringin', type: 'string' }], + outputs: [{ type: 'uint' }] + }, + { + type: 'function', name: 'test2', + outputs: [{ type: 'uint' }, { type: 'uint' }] + }, + { + type: 'constructor' + }, + { type: 'event', name: 'baz' }, + { type: 'event', name: 'foo' } + ]; + + const VALUES = [ true, 'jacogr' ]; + const CALLDATA = ` + 0000000000000000000000000000000000000000000000000000000000000001 + 0000000000000000000000000000000000000000000000000000000000000040 + 0000000000000000000000000000000000000000000000000000000000000006 + 6a61636f67720000000000000000000000000000000000000000000000000000 + `.replace(/\s/g, ''); + const SIGNATURE = '02356205'; + + const ENCODED = `0x${SIGNATURE}${CALLDATA}`; + + const RETURN1 = '0000000000000000000000000000000000000000000000000000000000123456'; + const RETURN2 = '0000000000000000000000000000000000000000000000000000000000456789'; + let scope; + + describe('constructor', () => { + it('needs an EthAbi instance', () => { + expect(() => new Contract()).to.throw(/API instance needs to be provided to Contract/); + }); + + it('needs an ABI', () => { + expect(() => new Contract(eth)).to.throw(/ABI needs to be provided to Contract instance/); + }); + + describe('internal setup', () => { + const contract = new Contract(eth, ABI); + + it('sets EthApi & parsed interface', () => { + expect(contract.address).to.not.be.ok; + expect(contract.api).to.deep.equal(eth); + expect(isInstanceOf(contract.abi, Abi)).to.be.ok; + }); + + it('attaches functions', () => { + expect(contract.functions.length).to.equal(2); + expect(contract.functions[0].name).to.equal('test'); + }); + + it('attaches constructors', () => { + expect(contract.constructors.length).to.equal(1); + }); + + it('attaches events', () => { + expect(contract.events.length).to.equal(2); + expect(contract.events[0].name).to.equal('baz'); + }); + }); + }); + + describe('at', () => { + it('sets returns the functions, events & sets the address', () => { + const contract = new Contract(eth, [ + { + constant: true, + inputs: [{ + name: '_who', + type: 'address' + }], + name: 'balanceOf', + outputs: [{ + name: '', + type: 'uint256' + }], + type: 'function' + }, + { + anonymous: false, + inputs: [{ + indexed: false, + name: 'amount', + type: 'uint256' + }], + name: 'Drained', + type: 'event' + } + ]); + + contract.at('6789'); + + expect(Object.keys(contract.instance)).to.deep.equal([ + 'Drained', + /^(?:0x)(.+)$/.exec(sha3('Drained(uint256)'))[1], + 'balanceOf', + /^(?:0x)(.+)$/.exec(sha3('balanceOf(address)'))[1].substr(0, 8), + 'address' + ]); + expect(contract.address).to.equal('6789'); + }); + }); + + describe('parseTransactionEvents', () => { + it('parses a transaction log into the data', () => { + const contract = new Contract(eth, [ + { + anonymous: false, name: 'Message', type: 'event', + inputs: [ + { indexed: true, name: 'postId', type: 'uint256' }, + { indexed: false, name: 'parentId', type: 'uint256' }, + { indexed: false, name: 'sender', type: 'address' }, + { indexed: false, name: 'at', type: 'uint256' }, + { indexed: false, name: 'messageId', type: 'uint256' }, + { indexed: false, name: 'message', type: 'string' } + ] + } + ]); + const decoded = contract.parseTransactionEvents({ + blockHash: '0xa9280530a3b47bee2fc80f2862fd56502ae075350571d724d6442ea4c597347b', + blockNumber: '0x4fcd', + cumulativeGasUsed: '0xb57f', + gasUsed: '0xb57f', + logs: [{ + address: '0x22bff18ec62281850546a664bb63a5c06ac5f76c', + blockHash: '0xa9280530a3b47bee2fc80f2862fd56502ae075350571d724d6442ea4c597347b', + blockNumber: '0x4fcd', + data: '0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063cf90d3f0410092fc0fca41846f5962239791950000000000000000000000000000000000000000000000000000000056e6c85f0000000000000000000000000000000000000000000000000001000000004fcd00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000d706f7374286d6573736167652900000000000000000000000000000000000000', + logIndex: '0x0', + topics: [ + '0x954ba6c157daf8a26539574ffa64203c044691aa57251af95f4b48d85ec00dd5', + '0x0000000000000000000000000000000000000000000000000001000000004fe0' + ], + transactionHash: '0xca16f537d761d13e4e80953b754e2b15541f267d6cad9381f750af1bae1e4917', + transactionIndex: '0x0' + }], + to: '0x22bff18ec62281850546a664bb63a5c06ac5f76c', + transactionHash: '0xca16f537d761d13e4e80953b754e2b15541f267d6cad9381f750af1bae1e4917', + transactionIndex: '0x0' + }); + const log = decoded.logs[0]; + + expect(log.event).to.equal('Message'); + expect(log.address).to.equal('0x22bff18ec62281850546a664bb63a5c06ac5f76c'); + expect(log.params).to.deep.equal({ + at: { type: 'uint', value: new BigNumber('1457965151') }, + message: { type: 'string', value: 'post(message)' }, + messageId: { type: 'uint', value: new BigNumber('281474976731085') }, + parentId: { type: 'uint', value: new BigNumber(0) }, + postId: { type: 'uint', value: new BigNumber('281474976731104') }, + sender: { type: 'address', value: '0x63Cf90D3f0410092FC0fca41846f596223979195' } + }); + }); + }); + + describe('_pollTransactionReceipt', () => { + const contract = new Contract(eth, ABI); + const ADDRESS = '0xD337e80eEdBdf86eDBba021797d7e4e00Bb78351'; + const BLOCKNUMBER = '555000'; + const RECEIPT = { contractAddress: ADDRESS.toLowerCase(), blockNumber: BLOCKNUMBER }; + const EXPECT = { contractAddress: ADDRESS, blockNumber: new BigNumber(BLOCKNUMBER) }; + + let scope; + let receipt; + + describe('success', () => { + before(() => { + scope = mockHttp([ + { method: 'eth_getTransactionReceipt', reply: { result: null } }, + { method: 'eth_getTransactionReceipt', reply: { result: null } }, + { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT } } + ]); + + return contract + ._pollTransactionReceipt('0x123') + .then((_receipt) => { + receipt = _receipt; + }); + }); + + it('sends multiple getTransactionReceipt calls', () => { + expect(scope.isDone()).to.be.true; + }); + + it('passes the txhash through', () => { + expect(scope.body.eth_getTransactionReceipt.params[0]).to.equal('0x123'); + }); + + it('receives the final receipt', () => { + expect(receipt).to.deep.equal(EXPECT); + }); + }); + + describe('error', () => { + before(() => { + scope = mockHttp([{ method: 'eth_getTransactionReceipt', reply: { error: { code: -1, message: 'failure' } } }]); + }); + + it('returns the errors', () => { + return contract + ._pollTransactionReceipt('0x123') + .catch((error) => { + expect(error.message).to.match(/failure/); + }); + }); + }); + }); + + describe('deploy without parameters', () => { + const contract = new Contract(eth, ABI_NO_PARAMS); + const CODE = '0x123'; + const ADDRESS = '0xD337e80eEdBdf86eDBba021797d7e4e00Bb78351'; + const RECEIPT_DONE = { contractAddress: ADDRESS.toLowerCase(), gasUsed: 50, blockNumber: 2500 }; + + let scope; + + describe('success', () => { + before(() => { + scope = mockHttp([ + { method: 'eth_estimateGas', reply: { result: 1000 } }, + { method: 'parity_postTransaction', reply: { result: '0x678' } }, + { method: 'parity_checkRequest', reply: { result: '0x890' } }, + { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT_DONE } }, + { method: 'eth_getCode', reply: { result: CODE } } + ]); + + return contract.deploy({ data: CODE }, []); + }); + + it('passes the options through to postTransaction (incl. gas calculation)', () => { + expect(scope.body.parity_postTransaction.params[0].data).to.equal(CODE); + }); + }); + }); + + describe('deploy', () => { + const contract = new Contract(eth, ABI); + const ADDRESS = '0xD337e80eEdBdf86eDBba021797d7e4e00Bb78351'; + const RECEIPT_PEND = { contractAddress: ADDRESS.toLowerCase(), gasUsed: 50, blockNumber: 0 }; + const RECEIPT_DONE = { contractAddress: ADDRESS.toLowerCase(), gasUsed: 50, blockNumber: 2500 }; + const RECEIPT_EXCP = { contractAddress: ADDRESS.toLowerCase(), gasUsed: 1200, blockNumber: 2500 }; + + let scope; + + describe('success', () => { + before(() => { + scope = mockHttp([ + { method: 'eth_estimateGas', reply: { result: 1000 } }, + { method: 'parity_postTransaction', reply: { result: '0x678' } }, + { method: 'parity_checkRequest', reply: { result: null } }, + { method: 'parity_checkRequest', reply: { result: '0x890' } }, + { method: 'eth_getTransactionReceipt', reply: { result: null } }, + { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT_PEND } }, + { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT_DONE } }, + { method: 'eth_getCode', reply: { result: '0x456' } } + ]); + + return contract.deploy({ data: '0x123' }, VALUES); + }); + + it('calls estimateGas, postTransaction, checkRequest, getTransactionReceipt & getCode in order', () => { + expect(scope.isDone()).to.be.true; + }); + + it('passes the options through to postTransaction (incl. gas calculation)', () => { + expect(scope.body.parity_postTransaction.params).to.deep.equal([ + { data: `0x123${CALLDATA}`, gas: '0x4b0' } + ]); + }); + + it('sets the address of the contract', () => { + expect(contract.address).to.equal(ADDRESS); + }); + }); + + describe('error', () => { + it('fails when gasUsed == gas', () => { + mockHttp([ + { method: 'eth_estimateGas', reply: { result: 1000 } }, + { method: 'parity_postTransaction', reply: { result: '0x678' } }, + { method: 'parity_checkRequest', reply: { result: '0x789' } }, + { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT_EXCP } } + ]); + + return contract + .deploy({ data: '0x123' }, VALUES) + .catch((error) => { + expect(error.message).to.match(/not deployed, gasUsed/); + }); + }); + + it('fails when no code was deployed', () => { + mockHttp([ + { method: 'eth_estimateGas', reply: { result: 1000 } }, + { method: 'parity_postTransaction', reply: { result: '0x678' } }, + { method: 'parity_checkRequest', reply: { result: '0x789' } }, + { method: 'eth_getTransactionReceipt', reply: { result: RECEIPT_DONE } }, + { method: 'eth_getCode', reply: { result: '0x' } } + ]); + + return contract + .deploy({ data: '0x123' }, VALUES) + .catch((error) => { + expect(error.message).to.match(/not deployed, getCode/); + }); + }); + }); + }); + + describe('bindings', () => { + let contract; + let cons; + let func; + + beforeEach(() => { + contract = new Contract(eth, ABI); + contract.at(ADDR); + cons = contract.constructors[0]; + func = contract.functions.find((fn) => fn.name === 'test'); + }); + + describe('_addOptionsTo', () => { + it('works on no object specified', () => { + expect(contract._addOptionsTo()).to.deep.equal({ to: ADDR }); + }); + + it('uses the contract address when none specified', () => { + expect(contract._addOptionsTo({ from: 'me' })).to.deep.equal({ to: ADDR, from: 'me' }); + }); + + it('overrides the contract address when specified', () => { + expect(contract._addOptionsTo({ to: 'you', from: 'me' })).to.deep.equal({ to: 'you', from: 'me' }); + }); + }); + + describe('attachments', () => { + it('attaches .call, .postTransaction & .estimateGas to constructors', () => { + expect(isFunction(cons.call)).to.be.true; + expect(isFunction(cons.postTransaction)).to.be.true; + expect(isFunction(cons.estimateGas)).to.be.true; + }); + + it('attaches .call, .postTransaction & .estimateGas to functions', () => { + expect(isFunction(func.call)).to.be.true; + expect(isFunction(func.postTransaction)).to.be.true; + expect(isFunction(func.estimateGas)).to.be.true; + }); + + it('attaches .call only to constant functions', () => { + func = (new Contract(eth, [{ type: 'function', name: 'test', constant: true }])).functions[0]; + + expect(isFunction(func.call)).to.be.true; + expect(isFunction(func.postTransaction)).to.be.false; + expect(isFunction(func.estimateGas)).to.be.false; + }); + }); + + describe('postTransaction', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'parity_postTransaction', reply: { result: ['hashId'] } }]); + }); + + it('encodes options and mades an parity_postTransaction call', () => { + return func + .postTransaction({ someExtras: 'foo' }, VALUES) + .then(() => { + expect(scope.isDone()).to.be.true; + expect(scope.body.parity_postTransaction.params[0]).to.deep.equal({ + someExtras: 'foo', + to: ADDR, + data: ENCODED + }); + }); + }); + }); + + describe('estimateGas', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_estimateGas', reply: { result: ['0x123'] } }]); + }); + + it('encodes options and mades an eth_estimateGas call', () => { + return func + .estimateGas({ someExtras: 'foo' }, VALUES) + .then((amount) => { + expect(scope.isDone()).to.be.true; + expect(amount.toString(16)).to.equal('123'); + expect(scope.body.eth_estimateGas.params).to.deep.equal([{ + someExtras: 'foo', + to: ADDR, + data: ENCODED + }]); + }); + }); + }); + + describe('call', () => { + it('encodes options and mades an eth_call call', () => { + scope = mockHttp([{ method: 'eth_call', reply: { result: RETURN1 } }]); + + return func + .call({ someExtras: 'foo' }, VALUES) + .then((result) => { + expect(scope.isDone()).to.be.true; + expect(scope.body.eth_call.params).to.deep.equal([{ + someExtras: 'foo', + to: ADDR, + data: ENCODED + }, 'latest']); + expect(result.toString(16)).to.equal('123456'); + }); + }); + + it('encodes options and mades an eth_call call (multiple returns)', () => { + scope = mockHttp([{ method: 'eth_call', reply: { result: `${RETURN1}${RETURN2}` } }]); + + return contract.functions[1] + .call({}, []) + .then((result) => { + expect(scope.isDone()).to.be.true; + expect(result.length).to.equal(2); + expect(result[0].toString(16)).to.equal('123456'); + expect(result[1].toString(16)).to.equal('456789'); + }); + }); + }); + }); + + describe('subscribe', () => { + const abi = [ + { + anonymous: false, name: 'Message', type: 'event', + inputs: [ + { indexed: true, name: 'postId', type: 'uint256' }, + { indexed: false, name: 'parentId', type: 'uint256' }, + { indexed: false, name: 'sender', type: 'address' }, + { indexed: false, name: 'at', type: 'uint256' }, + { indexed: false, name: 'messageId', type: 'uint256' }, + { indexed: false, name: 'message', type: 'string' } + ] + } + ]; + + const logs = [{ + address: '0x22bff18ec62281850546a664bb63a5c06ac5f76c', + blockHash: '0xa9280530a3b47bee2fc80f2862fd56502ae075350571d724d6442ea4c597347b', + blockNumber: '0x4fcd', + data: '0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063cf90d3f0410092fc0fca41846f5962239791950000000000000000000000000000000000000000000000000000000056e6c85f0000000000000000000000000000000000000000000000000001000000004fcd00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000d706f7374286d6573736167652900000000000000000000000000000000000000', + logIndex: '0x0', + topics: [ + '0x954ba6c157daf8a26539574ffa64203c044691aa57251af95f4b48d85ec00dd5', + '0x0000000000000000000000000000000000000000000000000001000000004fe0' + ], + transactionHash: '0xca16f537d761d13e4e80953b754e2b15541f267d6cad9381f750af1bae1e4917', + transactionIndex: '0x0' + }]; + + const parsed = [{ + address: '0x22bfF18ec62281850546a664bb63a5C06AC5F76C', + blockHash: '0xa9280530a3b47bee2fc80f2862fd56502ae075350571d724d6442ea4c597347b', + blockNumber: new BigNumber(20429), + data: '0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063cf90d3f0410092fc0fca41846f5962239791950000000000000000000000000000000000000000000000000000000056e6c85f0000000000000000000000000000000000000000000000000001000000004fcd00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000d706f7374286d6573736167652900000000000000000000000000000000000000', + event: 'Message', + logIndex: new BigNumber(0), + params: { + at: { type: 'uint', value: new BigNumber(1457965151) }, + message: { type: 'string', value: 'post(message)' }, + messageId: { type: 'uint', value: new BigNumber(281474976731085) }, + parentId: { type: 'uint', value: new BigNumber(0) }, + postId: { type: 'uint', value: new BigNumber(281474976731104) }, + sender: { type: 'address', value: '0x63Cf90D3f0410092FC0fca41846f596223979195' } + }, + topics: [ + '0x954ba6c157daf8a26539574ffa64203c044691aa57251af95f4b48d85ec00dd5', + '0x0000000000000000000000000000000000000000000000000001000000004fe0' + ], + transactionHash: '0xca16f537d761d13e4e80953b754e2b15541f267d6cad9381f750af1bae1e4917', + transactionIndex: new BigNumber(0) + }]; + + let contract; + + beforeEach(() => { + contract = new Contract(eth, abi); + contract.at(ADDR); + }); + + describe('invalid events', () => { + it('fails to subscribe to an invalid names', () => { + return contract + .subscribe('invalid') + .catch((error) => { + expect(error.message).to.match(/invalid is not a valid eventName/); + }); + }); + }); + + describe('valid events', () => { + let cbb; + let cbe; + + beforeEach(() => { + scope = mockHttp([ + { method: 'eth_newFilter', reply: { result: '0x123' } }, + { method: 'eth_getFilterLogs', reply: { result: logs } }, + { method: 'eth_getFilterChanges', reply: { result: logs } }, + { method: 'eth_newFilter', reply: { result: '0x123' } }, + { method: 'eth_getFilterLogs', reply: { result: logs } } + ]); + cbb = sinon.stub(); + cbe = sinon.stub(); + + return contract.subscribe('Message', { toBlock: 'pending' }, cbb); + }); + + it('sets the subscriptionId returned', () => { + return contract + .subscribe('Message', { toBlock: 'pending' }, cbe) + .then((subscriptionId) => { + expect(subscriptionId).to.equal(1); + }); + }); + + it('creates a new filter and retrieves the logs on it', () => { + return contract + .subscribe('Message', { toBlock: 'pending' }, cbe) + .then((subscriptionId) => { + expect(scope.isDone()).to.be.true; + }); + }); + + it('returns the logs to the callback', () => { + return contract + .subscribe('Message', { toBlock: 'pending' }, cbe) + .then((subscriptionId) => { + expect(cbe).to.have.been.calledWith(null, parsed); + }); + }); + }); + }); +}); diff --git a/js/src/api/contract/index.js b/js/src/api/contract/index.js new file mode 100644 index 000000000..74c58e942 --- /dev/null +++ b/js/src/api/contract/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './contract'; diff --git a/js/src/api/format/input.js b/js/src/api/format/input.js new file mode 100644 index 000000000..0ccd10604 --- /dev/null +++ b/js/src/api/format/input.js @@ -0,0 +1,242 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; + +import { isArray, isHex, isInstanceOf, isString } from '../util/types'; +import { padLeft, toHex } from '../util/format'; + +export function inAddress (address) { + // TODO: address validation if we have upper-lower addresses + return inHex(address); +} + +export function inAddresses (addresses) { + return (addresses || []).map(inAddress); +} + +export function inBlockNumber (blockNumber) { + if (isString(blockNumber)) { + switch (blockNumber) { + case 'earliest': + case 'latest': + case 'pending': + return blockNumber; + } + } + + return inNumber16(blockNumber); +} + +export function inData (data) { + if (data && data.length && !isHex(data)) { + data = data.split('').map((chr) => { + return `0${chr.charCodeAt(0).toString(16)}`.slice(-2); + }).join(''); + } + + return inHex(data); +} + +export function inHash (hash) { + return inHex(hash); +} + +export function inTopics (_topics) { + let topics = (_topics || []) + .filter((topic) => topic === null || topic) + .map((topic) => { + if (topic === null) { + return null; + } + + if (Array.isArray(topic)) { + return inTopics(topic); + } + + return padLeft(topic, 32); + }); + + return topics; +} + +export function inFilter (options) { + if (options) { + Object.keys(options).forEach((key) => { + switch (key) { + case 'address': + if (isArray(options[key])) { + options[key] = options[key].map(inAddress); + } else { + options[key] = inAddress(options[key]); + } + break; + + case 'fromBlock': + case 'toBlock': + options[key] = inBlockNumber(options[key]); + break; + + case 'limit': + options[key] = inNumber10(options[key]); + break; + + case 'topics': + options[key] = inTopics(options[key]); + } + }); + } + + return options; +} + +export function inHex (str) { + return toHex(str); +} + +export function inNumber10 (number) { + if (isInstanceOf(number, BigNumber)) { + return number.toNumber(); + } + + return (new BigNumber(number || 0)).toNumber(); +} + +export function inNumber16 (number) { + const bn = isInstanceOf(number, BigNumber) + ? number + : (new BigNumber(number || 0)); + + if (!bn.isInteger()) { + throw new Error(`[format/input::inNumber16] the given number is not an integer: ${bn.toFormat()}`); + } + + return inHex(bn.toString(16)); +} + +export function inOptionsCondition (condition) { + if (condition) { + if (condition.block) { + condition.block = condition.block ? inNumber10(condition.block) : null; + } else if (condition.time) { + condition.time = inNumber10(Math.floor(condition.time.getTime() / 1000)); + } + } + + return condition; +} + +export function inOptions (_options = {}) { + const options = { ..._options }; + + Object.keys(options).forEach((key) => { + switch (key) { + case 'to': + // Don't encode the `to` option if it's empty + // (eg. contract deployments) + if (options[key]) { + options.to = inAddress(options[key]); + } + break; + + case 'from': + options[key] = inAddress(options[key]); + break; + + case 'condition': + options[key] = inOptionsCondition(options[key]); + break; + + case 'gas': + case 'gasPrice': + options[key] = inNumber16((new BigNumber(options[key])).round()); + break; + + case 'value': + case 'nonce': + options[key] = inNumber16(options[key]); + break; + + case 'data': + options[key] = inData(options[key]); + break; + } + }); + + return options; +} + +export function inTraceFilter (filterObject) { + if (filterObject) { + Object.keys(filterObject).forEach((key) => { + switch (key) { + case 'fromAddress': + case 'toAddress': + filterObject[key] = [].concat(filterObject[key]) + .map(address => inAddress(address)); + break; + + case 'toBlock': + case 'fromBlock': + filterObject[key] = inBlockNumber(filterObject[key]); + break; + } + }); + } + + return filterObject; +} + +export function inTraceType (whatTrace) { + if (isString(whatTrace)) { + return [whatTrace]; + } + + return whatTrace; +} + +function inDeriveType (derive) { + return derive && derive.type === 'hard' ? 'hard' : 'soft'; +} + +export function inDeriveHash (derive) { + const hash = derive && derive.hash ? derive.hash : derive; + const type = inDeriveType(derive); + + return { + hash: inHex(hash), + type + }; +} + +export function inDeriveIndex (derive) { + if (!derive) { + return []; + } + + if (!isArray(derive)) { + derive = [derive]; + } + + return derive.map(item => { + const index = inNumber10(item && item.index ? item.index : item); + + return { + index, + type: inDeriveType(item) + }; + }); +} diff --git a/js/src/api/format/input.spec.js b/js/src/api/format/input.spec.js new file mode 100644 index 000000000..eb74b7bd6 --- /dev/null +++ b/js/src/api/format/input.spec.js @@ -0,0 +1,341 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; + +import { + inAddress, inBlockNumber, inData, inFilter, inHex, + inNumber10, inNumber16, inOptions, inTraceType, + inDeriveHash, inDeriveIndex +} from './input'; +import { isAddress } from '../../../test/types'; + +describe('api/format/input', () => { + const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; + + describe('inAddress', () => { + const address = '63cf90d3f0410092fc0fca41846f596223979195'; + + it('adds the leading 0x as required', () => { + expect(inAddress(address)).to.equal(`0x${address}`); + }); + + it('returns verified addresses as-is', () => { + expect(inAddress(`0x${address}`)).to.equal(`0x${address}`); + }); + + it('returns lowercase equivalents', () => { + expect(inAddress(address.toUpperCase())).to.equal(`0x${address}`); + }); + + it('returns 0x on null addresses', () => { + expect(inAddress()).to.equal('0x'); + }); + }); + + describe('inBlockNumber()', () => { + it('returns earliest as-is', () => { + expect(inBlockNumber('earliest')).to.equal('earliest'); + }); + + it('returns latest as-is', () => { + expect(inBlockNumber('latest')).to.equal('latest'); + }); + + it('returns pending as-is', () => { + expect(inBlockNumber('pending')).to.equal('pending'); + }); + + it('formats existing BigNumber into hex', () => { + expect(inBlockNumber(new BigNumber(0x123456))).to.equal('0x123456'); + }); + + it('formats hex strings into hex', () => { + expect(inBlockNumber('0x123456')).to.equal('0x123456'); + }); + + it('formats numbers into hex', () => { + expect(inBlockNumber(0x123456)).to.equal('0x123456'); + }); + }); + + describe('inData', () => { + it('formats to hex', () => { + expect(inData('123456')).to.equal('0x123456'); + }); + + it('converts a string to a hex representation', () => { + expect(inData('jaco')).to.equal('0x6a61636f'); + }); + }); + + describe('inHex', () => { + it('leaves leading 0x as-is', () => { + expect(inHex('0x123456')).to.equal('0x123456'); + }); + + it('adds a leading 0x', () => { + expect(inHex('123456')).to.equal('0x123456'); + }); + + it('returns uppercase as lowercase (leading 0x)', () => { + expect(inHex('0xABCDEF')).to.equal('0xabcdef'); + }); + + it('returns uppercase as lowercase (no leading 0x)', () => { + expect(inHex('ABCDEF')).to.equal('0xabcdef'); + }); + + it('handles empty & null', () => { + expect(inHex()).to.equal('0x'); + expect(inHex('')).to.equal('0x'); + }); + }); + + describe('inFilter', () => { + ['address'].forEach((input) => { + it(`formats ${input} address as address`, () => { + const block = {}; + + block[input] = address; + const formatted = inFilter(block)[input]; + + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(address); + }); + }); + + ['fromBlock', 'toBlock'].forEach((input) => { + it(`formats ${input} number as blockNumber`, () => { + const block = {}; + + block[input] = 0x123; + const formatted = inFilter(block)[input]; + + expect(formatted).to.equal('0x123'); + }); + }); + + it('ignores and passes through unknown keys', () => { + expect(inFilter({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats an filter options object with relevant entries converted', () => { + expect( + inFilter({ + address: address, + fromBlock: 'latest', + toBlock: 0x101, + extraData: 'someExtraStuffInHere', + limit: 0x32 + }) + ).to.deep.equal({ + address: address, + fromBlock: 'latest', + toBlock: '0x101', + extraData: 'someExtraStuffInHere', + limit: 50 + }); + }); + }); + + describe('inNumber10()', () => { + it('formats existing BigNumber into number', () => { + expect(inNumber10(new BigNumber(123))).to.equal(123); + }); + + it('formats hex strings into decimal', () => { + expect(inNumber10('0x0a')).to.equal(10); + }); + + it('formats numbers into number', () => { + expect(inNumber10(123)).to.equal(123); + }); + + it('formats undefined into 0', () => { + expect(inNumber10()).to.equal(0); + }); + }); + + describe('inNumber16()', () => { + it('formats existing BigNumber into hex', () => { + expect(inNumber16(new BigNumber(0x123456))).to.equal('0x123456'); + }); + + it('formats hex strings into hex', () => { + expect(inNumber16('0x123456')).to.equal('0x123456'); + }); + + it('formats numbers into hex', () => { + expect(inNumber16(0x123456)).to.equal('0x123456'); + }); + + it('formats undefined into 0', () => { + expect(inNumber16()).to.equal('0x0'); + }); + }); + + describe('inOptions', () => { + ['data'].forEach((input) => { + it(`converts ${input} to hex data`, () => { + const block = {}; + + block[input] = '1234'; + const formatted = inData(block[input]); + + expect(formatted).to.equal('0x1234'); + }); + }); + + ['from', 'to'].forEach((input) => { + it(`formats ${input} address as address`, () => { + const block = {}; + + block[input] = address; + const formatted = inOptions(block)[input]; + + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(address); + }); + }); + + it('does not encode an empty `to` value', () => { + const options = { to: '' }; + const formatted = inOptions(options); + + expect(formatted.to).to.equal(''); + }); + + ['gas', 'gasPrice', 'value', 'nonce'].forEach((input) => { + it(`formats ${input} number as hexnumber`, () => { + const block = {}; + + block[input] = 0x123; + const formatted = inOptions(block)[input]; + + expect(formatted).to.equal('0x123'); + }); + }); + + it('passes condition as null when specified as such', () => { + expect(inOptions({ condition: null })).to.deep.equal({ condition: null }); + }); + + it('ignores and passes through unknown keys', () => { + expect(inOptions({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats an options object with relevant entries converted', () => { + expect( + inOptions({ + from: address, + to: address, + gas: new BigNumber('0x100'), + gasPrice: 0x101, + value: 258, + nonce: '0x104', + data: '0123456789', + extraData: 'someExtraStuffInHere' + }) + ).to.deep.equal({ + from: address, + to: address, + gas: '0x100', + gasPrice: '0x101', + value: '0x102', + nonce: '0x104', + data: '0x0123456789', + extraData: 'someExtraStuffInHere' + }); + }); + }); + + describe('inTraceType', () => { + it('returns array of types as is', () => { + const types = ['vmTrace', 'trace', 'stateDiff']; + + expect(inTraceType(types)).to.deep.equal(types); + }); + + it('formats single string type into array', () => { + const type = 'vmTrace'; + + expect(inTraceType(type)).to.deep.equal([type]); + }); + }); + + describe('inDeriveHash', () => { + it('returns derive hash', () => { + expect(inDeriveHash(1)).to.deep.equal({ + hash: '0x1', + type: 'soft' + }); + + expect(inDeriveHash(null)).to.deep.equal({ + hash: '0x', + type: 'soft' + }); + + expect(inDeriveHash({ + hash: 5 + })).to.deep.equal({ + hash: '0x5', + type: 'soft' + }); + + expect(inDeriveHash({ + hash: 5, + type: 'hard' + })).to.deep.equal({ + hash: '0x5', + type: 'hard' + }); + }); + }); + + describe('inDeriveIndex', () => { + it('returns derive hash', () => { + expect(inDeriveIndex(null)).to.deep.equal([]); + expect(inDeriveIndex([])).to.deep.equal([]); + + expect(inDeriveIndex([1])).to.deep.equal([{ + index: 1, + type: 'soft' + }]); + + expect(inDeriveIndex({ + index: 1 + })).to.deep.equal([{ + index: 1, + type: 'soft' + }]); + + expect(inDeriveIndex([{ + index: 1, + type: 'hard' + }, 5])).to.deep.equal([ + { + index: 1, + type: 'hard' + }, + { + index: 5, + type: 'soft' + } + ]); + }); + }); +}); diff --git a/js/src/api/format/output.js b/js/src/api/format/output.js new file mode 100644 index 000000000..7bf39d17c --- /dev/null +++ b/js/src/api/format/output.js @@ -0,0 +1,414 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; + +import { toChecksumAddress } from '../../abi/util/address'; +import { isString } from '../util/types'; + +export function outAccountInfo (infos) { + return Object + .keys(infos) + .reduce((ret, _address) => { + const info = infos[_address]; + const address = outAddress(_address); + + ret[address] = { + name: info.name + }; + + if (info.meta) { + ret[address].uuid = info.uuid; + ret[address].meta = JSON.parse(info.meta); + } + + return ret; + }, {}); +} + +export function outAddress (address) { + return toChecksumAddress(address); +} + +export function outAddresses (addresses) { + return (addresses || []).map(outAddress); +} + +export function outBlock (block) { + if (block) { + Object.keys(block).forEach((key) => { + switch (key) { + case 'author': + case 'miner': + block[key] = outAddress(block[key]); + break; + + case 'difficulty': + case 'gasLimit': + case 'gasUsed': + case 'nonce': + case 'number': + case 'totalDifficulty': + block[key] = outNumber(block[key]); + break; + + case 'timestamp': + block[key] = outDate(block[key]); + break; + } + }); + } + + return block; +} + +export function outChainStatus (status) { + if (status) { + Object.keys(status).forEach((key) => { + switch (key) { + case 'blockGap': + status[key] = status[key] + ? status[key].map(outNumber) + : status[key]; + break; + } + }); + } + + return status; +} + +export function outDate (date) { + if (typeof date.toISOString === 'function') { + return date; + } + + try { + if (typeof date === 'string' && (new Date(date)).toISOString() === date) { + return new Date(date); + } + } catch (error) {} + + return new Date(outNumber(date).toNumber() * 1000); +} + +export function outHistogram (histogram) { + if (histogram) { + Object.keys(histogram).forEach((key) => { + switch (key) { + case 'bucketBounds': + case 'counts': + histogram[key] = histogram[key].map(outNumber); + break; + } + }); + } + + return histogram; +} + +export function outLog (log) { + Object.keys(log).forEach((key) => { + switch (key) { + case 'blockNumber': + case 'logIndex': + case 'transactionIndex': + log[key] = outNumber(log[key]); + break; + + case 'address': + log[key] = outAddress(log[key]); + break; + } + }); + + return log; +} + +export function outHwAccountInfo (infos) { + return Object + .keys(infos) + .reduce((ret, _address) => { + const address = outAddress(_address); + + ret[address] = infos[_address]; + + return ret; + }, {}); +} + +export function outNodeKind (info) { + return info; +} + +export function outNumber (number) { + return new BigNumber(number || 0); +} + +export function outPeer (peer) { + const protocols = Object.keys(peer.protocols) + .reduce((obj, key) => { + if (peer.protocols[key]) { + obj[key] = { + ...peer.protocols[key], + difficulty: outNumber(peer.protocols[key].difficulty) + }; + } + + return obj; + }, {}); + + return { + ...peer, + protocols + }; +} + +export function outPeers (peers) { + return { + active: outNumber(peers.active), + connected: outNumber(peers.connected), + max: outNumber(peers.max), + peers: peers.peers.map((peer) => outPeer(peer)) + }; +} + +export function outReceipt (receipt) { + if (receipt) { + Object.keys(receipt).forEach((key) => { + switch (key) { + case 'blockNumber': + case 'cumulativeGasUsed': + case 'gasUsed': + case 'transactionIndex': + receipt[key] = outNumber(receipt[key]); + break; + + case 'contractAddress': + receipt[key] = outAddress(receipt[key]); + break; + } + }); + } + + return receipt; +} + +export function outRecentDapps (recentDapps) { + if (recentDapps) { + Object.keys(recentDapps).forEach((url) => { + recentDapps[url] = outDate(recentDapps[url]); + }); + } + + return recentDapps; +} + +export function outSignerRequest (request) { + if (request) { + Object.keys(request).forEach((key) => { + switch (key) { + case 'id': + request[key] = outNumber(request[key]); + break; + + case 'payload': + request[key].decrypt = outSigningPayload(request[key].decrypt); + request[key].sign = outSigningPayload(request[key].sign); + request[key].signTransaction = outTransaction(request[key].signTransaction); + request[key].sendTransaction = outTransaction(request[key].sendTransaction); + break; + + case 'origin': + const type = Object.keys(request[key])[0]; + const details = request[key][type]; + + request[key] = { type, details }; + break; + } + }); + } + + return request; +} + +export function outSyncing (syncing) { + if (syncing && syncing !== 'false') { + Object.keys(syncing).forEach((key) => { + switch (key) { + case 'currentBlock': + case 'highestBlock': + case 'startingBlock': + case 'warpChunksAmount': + case 'warpChunksProcessed': + syncing[key] = outNumber(syncing[key]); + break; + + case 'blockGap': + syncing[key] = syncing[key] ? syncing[key].map(outNumber) : syncing[key]; + break; + } + }); + } + + return syncing; +} + +export function outTransactionCondition (condition) { + if (condition) { + if (condition.block) { + condition.block = outNumber(condition.block); + } else if (condition.time) { + condition.time = outDate(condition.time); + } + } + + return condition; +} + +export function outTransaction (tx) { + if (tx) { + Object.keys(tx).forEach((key) => { + switch (key) { + case 'blockNumber': + case 'gasPrice': + case 'gas': + case 'nonce': + case 'transactionIndex': + case 'value': + tx[key] = outNumber(tx[key]); + break; + + case 'condition': + tx[key] = outTransactionCondition(tx[key]); + break; + + case 'creates': + case 'from': + case 'to': + tx[key] = outAddress(tx[key]); + break; + } + }); + } + + return tx; +} + +export function outSigningPayload (payload) { + if (payload) { + Object.keys(payload).forEach((key) => { + switch (key) { + case 'address': + payload[key] = outAddress(payload[key]); + break; + } + }); + } + + return payload; +} + +export function outTrace (trace) { + if (trace) { + if (trace.action) { + Object.keys(trace.action).forEach(key => { + switch (key) { + case 'gas': + case 'value': + case 'balance': + trace.action[key] = outNumber(trace.action[key]); + break; + + case 'from': + case 'to': + case 'address': + case 'refundAddress': + trace.action[key] = outAddress(trace.action[key]); + break; + } + }); + } + + if (trace.result) { + Object.keys(trace.result).forEach(key => { + switch (key) { + case 'gasUsed': + trace.result[key] = outNumber(trace.result[key]); + break; + + case 'address': + trace.action[key] = outAddress(trace.action[key]); + break; + } + }); + } + + if (trace.traceAddress) { + trace.traceAddress.forEach((address, index) => { + trace.traceAddress[index] = outNumber(address); + }); + } + + Object.keys(trace).forEach((key) => { + switch (key) { + case 'subtraces': + case 'transactionPosition': + case 'blockNumber': + trace[key] = outNumber(trace[key]); + break; + } + }); + } + + return trace; +} + +export function outTraces (traces) { + if (traces) { + return traces.map(outTrace); + } + + return traces; +} + +export function outTraceReplay (trace) { + if (trace) { + Object.keys(trace).forEach((key) => { + switch (key) { + case 'trace': + trace[key] = outTraces(trace[key]); + break; + } + }); + } + + return trace; +} + +export function outVaultMeta (meta) { + if (isString(meta)) { + try { + const obj = JSON.parse(meta); + + return obj; + } catch (error) { + return {}; + } + } + + return meta || {}; +} diff --git a/js/src/api/format/output.spec.js b/js/src/api/format/output.spec.js new file mode 100644 index 000000000..6ffefaedc --- /dev/null +++ b/js/src/api/format/output.spec.js @@ -0,0 +1,502 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; + +import { outBlock, outAccountInfo, outAddress, outChainStatus, outDate, outHistogram, outHwAccountInfo, outNodeKind, outNumber, outPeer, outPeers, outReceipt, outRecentDapps, outSyncing, outTransaction, outTrace, outVaultMeta } from './output'; +import { isAddress, isBigNumber, isInstanceOf } from '../../../test/types'; + +describe('api/format/output', () => { + const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; + const checksum = '0x63Cf90D3f0410092FC0fca41846f596223979195'; + + describe('outAccountInfo', () => { + it('returns meta objects parsed', () => { + expect(outAccountInfo( + { '0x63cf90d3f0410092fc0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: '{"name":"456"}' } + } + )).to.deep.equal({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: { name: '456' } + } + }); + }); + + it('returns objects without meta & uuid as required', () => { + expect(outAccountInfo( + { '0x63cf90d3f0410092fc0fca41846f596223979195': { name: 'name' } } + )).to.deep.equal({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { name: 'name' } + }); + }); + }); + + describe('outAddress', () => { + it('retuns the address as checksummed', () => { + expect(outAddress(address)).to.equal(checksum); + }); + + it('retuns the checksum as checksummed', () => { + expect(outAddress(checksum)).to.equal(checksum); + }); + }); + + describe('outBlock', () => { + ['author', 'miner'].forEach((input) => { + it(`formats ${input} address as address`, () => { + const block = {}; + + block[input] = address; + const formatted = outBlock(block)[input]; + + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(checksum); + }); + }); + + ['difficulty', 'gasLimit', 'gasUsed', 'number', 'nonce', 'totalDifficulty'].forEach((input) => { + it(`formats ${input} number as hexnumber`, () => { + const block = {}; + + block[input] = 0x123; + const formatted = outBlock(block)[input]; + + expect(isInstanceOf(formatted, BigNumber)).to.be.true; + expect(formatted.toString(16)).to.equal('123'); + }); + }); + + ['timestamp'].forEach((input) => { + it(`formats ${input} number as Date`, () => { + const block = {}; + + block[input] = 0x57513668; + const formatted = outBlock(block)[input]; + + expect(isInstanceOf(formatted, Date)).to.be.true; + expect(formatted.getTime()).to.equal(1464940136000); + }); + }); + + it('ignores and passes through unknown keys', () => { + expect(outBlock({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats a block with all the info converted', () => { + expect( + outBlock({ + author: address, + miner: address, + difficulty: '0x100', + gasLimit: '0x101', + gasUsed: '0x102', + number: '0x103', + nonce: '0x104', + totalDifficulty: '0x105', + timestamp: '0x57513668', + extraData: 'someExtraStuffInHere' + }) + ).to.deep.equal({ + author: checksum, + miner: checksum, + difficulty: new BigNumber('0x100'), + gasLimit: new BigNumber('0x101'), + gasUsed: new BigNumber('0x102'), + number: new BigNumber('0x103'), + nonce: new BigNumber('0x104'), + totalDifficulty: new BigNumber('0x105'), + timestamp: new Date('2016-06-03T07:48:56.000Z'), + extraData: 'someExtraStuffInHere' + }); + }); + }); + + describe('outChainStatus', () => { + it('formats blockGap values', () => { + const status = { + blockGap: [0x1234, '0x5678'] + }; + + expect(outChainStatus(status)).to.deep.equal({ + blockGap: [new BigNumber(0x1234), new BigNumber(0x5678)] + }); + }); + + it('handles null blockGap values', () => { + const status = { + blockGap: null + }; + + expect(outChainStatus(status)).to.deep.equal(status); + }); + }); + + describe('outDate', () => { + it('converts a second date in unix timestamp', () => { + expect(outDate(0x57513668)).to.deep.equal(new Date('2016-06-03T07:48:56.000Z')); + }); + }); + + describe('outHistogram', () => { + ['bucketBounds', 'counts'].forEach((type) => { + it(`formats ${type} as number arrays`, () => { + expect( + outHistogram({ [type]: [0x123, 0x456, 0x789] }) + ).to.deep.equal({ + [type]: [new BigNumber(0x123), new BigNumber(0x456), new BigNumber(0x789)] + }); + }); + }); + }); + + describe('outHwAccountInfo', () => { + it('returns objects with formatted addresses', () => { + expect(outHwAccountInfo( + { '0x63cf90d3f0410092fc0fca41846f596223979195': { manufacturer: 'mfg', name: 'type' } } + )).to.deep.equal({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { manufacturer: 'mfg', name: 'type' } + }); + }); + }); + + describe('outNodeKind', () => { + it('formats the input as received', () => { + const kind = { availability: 'personal', capability: 'full' }; + + expect(outNodeKind(kind)).to.deep.equal(kind); + }); + }); + + describe('outNumber', () => { + it('returns a BigNumber equalling the value', () => { + const bn = outNumber('0x123456'); + + expect(isBigNumber(bn)).to.be.true; + expect(bn.eq(0x123456)).to.be.true; + }); + + it('assumes 0 when ivalid input', () => { + expect(outNumber().eq(0)).to.be.true; + }); + }); + + describe('outPeer', () => { + it('converts all internal numbers to BigNumbers', () => { + expect(outPeer({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + par: { + difficulty: '0x0f', + head: '0x02', + version: 63 + } + } + })).to.deep.equal({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + par: { + difficulty: new BigNumber(15), + head: '0x02', + version: 63 + } + } + }); + }); + + it('does not output null protocols', () => { + expect(outPeer({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + les: null + } + })).to.deep.equal({ + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: {} + }); + }); + }); + + describe('outPeers', () => { + it('converts all internal numbers to BigNumbers', () => { + expect(outPeers({ + active: 789, + connected: '456', + max: 0x7b, + peers: [ + { + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + par: { + difficulty: '0x0f', + head: '0x02', + version: 63 + }, + les: null + } + } + ] + })).to.deep.equal({ + active: new BigNumber(789), + connected: new BigNumber(456), + max: new BigNumber(123), + peers: [ + { + caps: ['par/1'], + id: '0x01', + name: 'Parity', + network: { + localAddress: '10.0.0.1', + remoteAddress: '10.0.0.1' + }, + protocols: { + par: { + difficulty: new BigNumber(15), + head: '0x02', + version: 63 + } + } + } + ] + }); + }); + }); + + describe('outReceipt', () => { + ['contractAddress'].forEach((input) => { + it(`formats ${input} address as address`, () => { + const block = {}; + + block[input] = address; + const formatted = outReceipt(block)[input]; + + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(checksum); + }); + }); + + ['blockNumber', 'cumulativeGasUsed', 'cumulativeGasUsed', 'gasUsed', 'transactionIndex'].forEach((input) => { + it(`formats ${input} number as hexnumber`, () => { + const block = {}; + + block[input] = 0x123; + const formatted = outReceipt(block)[input]; + + expect(isInstanceOf(formatted, BigNumber)).to.be.true; + expect(formatted.toString(16)).to.equal('123'); + }); + }); + + it('ignores and passes through unknown keys', () => { + expect(outReceipt({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats a receipt with all the info converted', () => { + expect( + outReceipt({ + contractAddress: address, + blockNumber: '0x100', + cumulativeGasUsed: '0x101', + gasUsed: '0x102', + transactionIndex: '0x103', + extraData: 'someExtraStuffInHere' + }) + ).to.deep.equal({ + contractAddress: checksum, + blockNumber: new BigNumber('0x100'), + cumulativeGasUsed: new BigNumber('0x101'), + gasUsed: new BigNumber('0x102'), + transactionIndex: new BigNumber('0x103'), + extraData: 'someExtraStuffInHere' + }); + }); + }); + + describe('outRecentDapps', () => { + it('formats the URLs with timestamps', () => { + expect(outRecentDapps({ testing: 0x57513668 })).to.deep.equal({ + testing: new Date('2016-06-03T07:48:56.000Z') + }); + }); + }); + + describe('outSyncing', () => { + ['currentBlock', 'highestBlock', 'startingBlock', 'warpChunksAmount', 'warpChunksProcessed'].forEach((input) => { + it(`formats ${input} numbers as a number`, () => { + expect(outSyncing({ [input]: '0x123' })).to.deep.equal({ + [input]: new BigNumber('0x123') + }); + }); + }); + + it('formats blockGap properly', () => { + expect(outSyncing({ blockGap: [0x123, 0x456] })).to.deep.equal({ + blockGap: [new BigNumber(0x123), new BigNumber(0x456)] + }); + }); + }); + + describe('outTransaction', () => { + ['from', 'to'].forEach((input) => { + it(`formats ${input} address as address`, () => { + const block = {}; + + block[input] = address; + const formatted = outTransaction(block)[input]; + + expect(isAddress(formatted)).to.be.true; + expect(formatted).to.equal(checksum); + }); + }); + + ['blockNumber', 'gasPrice', 'gas', 'nonce', 'transactionIndex', 'value'].forEach((input) => { + it(`formats ${input} number as hexnumber`, () => { + const block = {}; + + block[input] = 0x123; + const formatted = outTransaction(block)[input]; + + expect(isInstanceOf(formatted, BigNumber)).to.be.true; + expect(formatted.toString(16)).to.equal('123'); + }); + }); + + it('passes condition as null when null', () => { + expect(outTransaction({ condition: null })).to.deep.equal({ condition: null }); + }); + + it('ignores and passes through unknown keys', () => { + expect(outTransaction({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats a transaction with all the info converted', () => { + expect( + outTransaction({ + from: address, + to: address, + blockNumber: '0x100', + gasPrice: '0x101', + gas: '0x102', + nonce: '0x103', + transactionIndex: '0x104', + value: '0x105', + extraData: 'someExtraStuffInHere' + }) + ).to.deep.equal({ + from: checksum, + to: checksum, + blockNumber: new BigNumber('0x100'), + gasPrice: new BigNumber('0x101'), + gas: new BigNumber('0x102'), + nonce: new BigNumber('0x103'), + transactionIndex: new BigNumber('0x104'), + value: new BigNumber('0x105'), + extraData: 'someExtraStuffInHere' + }); + }); + }); + + describe('outTrace', () => { + it('ignores and passes through unknown keys', () => { + expect(outTrace({ someRandom: 'someRandom' })).to.deep.equal({ someRandom: 'someRandom' }); + }); + + it('formats a trace with all the info converted', () => { + const formatted = outTrace({ + type: 'call', + action: { + from: address, + to: address, + value: '0x06', + gas: '0x07', + input: '0x1234', + callType: 'call' + }, + result: { + gasUsed: '0x08', + output: '0x5678' + }, + traceAddress: [ '0x2' ], + subtraces: 3, + transactionPosition: '0xb', + transactionHash: '0x000000000000000000000000000000000000000000000000000000000000000c', + blockNumber: '0x0d', + blockHash: '0x000000000000000000000000000000000000000000000000000000000000000e' + }); + + expect(isBigNumber(formatted.action.gas)).to.be.true; + expect(formatted.action.gas.toNumber()).to.equal(7); + expect(isBigNumber(formatted.action.value)).to.be.true; + expect(formatted.action.value.toNumber()).to.equal(6); + + expect(formatted.action.from).to.equal(checksum); + expect(formatted.action.to).to.equal(checksum); + + expect(isBigNumber(formatted.blockNumber)).to.be.true; + expect(formatted.blockNumber.toNumber()).to.equal(13); + expect(isBigNumber(formatted.transactionPosition)).to.be.true; + expect(formatted.transactionPosition.toNumber()).to.equal(11); + }); + }); + + describe('outVaultMeta', () => { + it('returns an exmpt object on null', () => { + expect(outVaultMeta(null)).to.deep.equal({}); + }); + + it('returns the original value if not string', () => { + expect(outVaultMeta({ test: 123 })).to.deep.equal({ test: 123 }); + }); + + it('returns an object from JSON string', () => { + expect(outVaultMeta('{"test":123}')).to.deep.equal({ test: 123 }); + }); + + it('returns an empty object on invalid JSON', () => { + expect(outVaultMeta('{"test"}')).to.deep.equal({}); + }); + }); +}); diff --git a/js/src/api/index.js b/js/src/api/index.js new file mode 100644 index 000000000..978d98fec --- /dev/null +++ b/js/src/api/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './api'; diff --git a/js/src/api/local/accounts/account.js b/js/src/api/local/accounts/account.js new file mode 100644 index 000000000..224a05cd9 --- /dev/null +++ b/js/src/api/local/accounts/account.js @@ -0,0 +1,116 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { createKeyObject, decryptPrivateKey } from '../ethkey'; + +export default class Account { + constructor (persist, data = {}) { + const { + keyObject = null, + meta = {}, + name = '' + } = data; + + this._persist = persist; + this._keyObject = keyObject; + this._name = name; + this._meta = meta; + } + + isValidPassword (password) { + if (!this._keyObject) { + return false; + } + + return decryptPrivateKey(this._keyObject, password) + .then((privateKey) => { + if (!privateKey) { + return false; + } + + return true; + }); + } + + export () { + const exported = Object.assign({}, this._keyObject); + + exported.meta = JSON.stringify(this._meta); + exported.name = this._name; + + return exported; + } + + get address () { + return `0x${this._keyObject.address.toLowerCase()}`; + } + + get name () { + return this._name; + } + + set name (name) { + this._name = name; + + this._persist(); + } + + get meta () { + return JSON.stringify(this._meta); + } + + set meta (meta) { + this._meta = JSON.parse(meta); + + this._persist(); + } + + get uuid () { + if (!this._keyObject) { + return null; + } + + return this._keyObject.id; + } + + decryptPrivateKey (password) { + return decryptPrivateKey(this._keyObject, password); + } + + changePassword (key, password) { + return createKeyObject(key, password).then((keyObject) => { + this._keyObject = keyObject; + + this._persist(); + }); + } + + static fromPrivateKey (persist, key, password) { + return createKeyObject(key, password).then((keyObject) => { + const account = new Account(persist, { keyObject }); + + return account; + }); + } + + toJSON () { + return { + keyObject: this._keyObject, + name: this._name, + meta: this._meta + }; + } +} diff --git a/js/src/api/local/accounts/accounts.js b/js/src/api/local/accounts/accounts.js new file mode 100644 index 000000000..d11ea2bad --- /dev/null +++ b/js/src/api/local/accounts/accounts.js @@ -0,0 +1,229 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Account from './account'; +import localStore from 'store'; +import { debounce } from 'lodash'; +import { decryptPrivateKey } from '../ethkey'; + +const NULL_ADDRESS = '0x0000000000000000000000000000000000000000'; +const LS_STORE_KEY = '_parity::localAccounts'; + +export default class Accounts { + persist = debounce(() => { + this._lastState = JSON.stringify(this); + + localStore.set(LS_STORE_KEY, this); + }, 100); + + constructor (data = localStore.get(LS_STORE_KEY) || {}) { + this._lastState = JSON.stringify(data); + + window.addEventListener('storage', ({ key, newValue }) => { + if (key !== LS_STORE_KEY) { + return; + } + + if (newValue !== this._lastState) { + console.log('Data changed in a second tab, syncing state'); + + this.restore(JSON.parse(newValue)); + } + }); + + this.restore(data); + } + + restore (data) { + const { + last = NULL_ADDRESS, + dappsDefault = NULL_ADDRESS, + store = {} + } = data; + + this._last = last; + this._dappsDefaultAddress = dappsDefault; + this._store = {}; + + if (Array.isArray(store)) { + // Recover older version that stored accounts as an array + store.forEach((data) => { + const account = new Account(this.persist, data); + + this._store[account.address] = account; + }); + } else { + Object.keys(store).forEach((key) => { + this._store[key] = new Account(this.persist, store[key]); + }); + } + } + + _addAccount = (account) => { + const { address } = account; + + if (address in this._store && this._store[address].uuid) { + throw new Error(`Account ${address} already exists!`); + } + + this._store[address] = account; + this.lastAddress = address; + + this.persist(); + + return account.address; + } + + create (secret, password) { + const privateKey = Buffer.from(secret.slice(2), 'hex'); + + return Account + .fromPrivateKey(this.persist, privateKey, password) + .then(this._addAccount); + } + + restoreFromWallet (wallet, password) { + return decryptPrivateKey(wallet, password) + .then((privateKey) => { + if (!privateKey) { + throw new Error('Invalid password'); + } + + return Account.fromPrivateKey(this.persist, privateKey, password); + }) + .then(this._addAccount); + } + + set lastAddress (value) { + this._last = value.toLowerCase(); + } + + get lastAddress () { + return this._last; + } + + get dappsDefaultAddress () { + if (this._dappsDefaultAddress === NULL_ADDRESS) { + return this._last; + } + + if (this._dappsDefaultAddress in this._store) { + return this._dappsDefaultAddress; + } + + return NULL_ADDRESS; + } + + set dappsDefaultAddress (value) { + this._dappsDefaultAddress = value.toLowerCase(); + + this.persist(); + } + + get (address) { + address = address.toLowerCase(); + + const account = this._store[address]; + + if (!account) { + throw new Error(`Account not found: ${address}`); + } + + this.lastAddress = address; + + return account; + } + + getLazyCreate (address) { + address = address.toLowerCase(); + + this.lastAddress = address; + + if (!(address in this._store)) { + this._store[address] = new Account(this.persist); + } + + return this._store[address]; + } + + remove (address, password) { + address = address.toLowerCase(); + + const account = this.get(address); + + if (!account) { + return false; + } + + if (!account.uuid) { + this.removeUnsafe(address); + + return true; + } + + return account + .isValidPassword(password) + .then((isValid) => { + if (!isValid) { + return false; + } + + if (address === this.lastAddress) { + this.lastAddress = NULL_ADDRESS; + } + + this.removeUnsafe(address); + + return true; + }); + } + + removeUnsafe (address) { + address = address.toLowerCase(); + + delete this._store[address]; + + this.persist(); + } + + allAddresses () { + return Object.keys(this._store); + } + + accountAddresses () { + return Object + .keys(this._store) + .filter((address) => this._store[address].uuid); + } + + map (mapper) { + const result = {}; + + Object.keys(this._store).forEach((key) => { + result[key] = mapper(this._store[key]); + }); + + return result; + } + + toJSON () { + return { + last: this._last, + dappsDefault: this._dappsDefaultAddress, + store: this._store + }; + } +} diff --git a/js/src/api/local/accounts/index.js b/js/src/api/local/accounts/index.js new file mode 100644 index 000000000..800cf95f6 --- /dev/null +++ b/js/src/api/local/accounts/index.js @@ -0,0 +1,21 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Accounts from './accounts'; + +const accounts = new Accounts(); + +export default accounts; diff --git a/js/src/api/local/ethkey/ethkey.js b/js/src/api/local/ethkey/ethkey.js new file mode 100644 index 000000000..f8395b007 --- /dev/null +++ b/js/src/api/local/ethkey/ethkey.js @@ -0,0 +1,147 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +/* global WebAssembly */ + +import wasmBuffer from './ethkey.wasm.js'; + +const NOOP = () => {}; + +// WASM memory setup +const WASM_PAGE_SIZE = 65536; +const STATIC_BASE = 1024; +const STATICTOP = STATIC_BASE + WASM_PAGE_SIZE * 2; +const STACK_BASE = align(STATICTOP + 16); +const STACKTOP = STACK_BASE; +const TOTAL_STACK = 5 * 1024 * 1024; +const TOTAL_MEMORY = 16777216; +const STACK_MAX = STACK_BASE + TOTAL_STACK; +const DYNAMIC_BASE = STACK_MAX + 64; +const DYNAMICTOP_PTR = STACK_MAX; + +function mockWebAssembly () { + function throwWasmError () { + throw new Error('Missing WebAssembly support'); + } + + // Simple mock replacement + return { + Memory: class { buffer = new ArrayBuffer(2048) }, + Table: class {}, + Module: class {}, + Instance: class { + exports = { + '_input_ptr': () => 0, + '_secret_ptr': () => 0, + '_public_ptr': () => 0, + '_address_ptr': () => 0, + '_ecpointg': NOOP, + '_brain': throwWasmError, + '_verify_secret': throwWasmError + } + } + }; +} + +const { Memory, Table, Module, Instance } = typeof WebAssembly !== 'undefined' ? WebAssembly : mockWebAssembly(); + +const wasmMemory = new Memory({ + initial: TOTAL_MEMORY / WASM_PAGE_SIZE, + maximum: TOTAL_MEMORY / WASM_PAGE_SIZE +}); + +const wasmTable = new Table({ + initial: 8, + maximum: 8, + element: 'anyfunc' +}); + +// TypedArray views into the memory +const wasmMemoryU8 = new Uint8Array(wasmMemory.buffer); +const wasmMemoryU32 = new Uint32Array(wasmMemory.buffer); + +// Keep DYNAMIC_BASE in memory +wasmMemoryU32[DYNAMICTOP_PTR >> 2] = align(DYNAMIC_BASE); + +function align (mem) { + const ALIGN_SIZE = 16; + + return (Math.ceil(mem / ALIGN_SIZE) * ALIGN_SIZE) | 0; +} + +export function slice (ptr, len) { + return wasmMemoryU8.subarray(ptr, ptr + len); +} + +// Required by emscripten +function abort (what) { + throw new Error(what || 'WASM abort'); +} + +// Required by emscripten +function abortOnCannotGrowMemory () { + abort(`Cannot enlarge memory arrays.`); +} + +// Required by emscripten +function enlargeMemory () { + abortOnCannotGrowMemory(); +} + +// Required by emscripten +function getTotalMemory () { + return TOTAL_MEMORY; +} + +// Required by emscripten - used to perform memcpy on large data +function memcpy (dest, src, len) { + wasmMemoryU8.set(wasmMemoryU8.subarray(src, src + len), dest); + + return dest; +} + +// Synchronously compile WASM from the buffer +const module = new Module(wasmBuffer); + +// Instantiated WASM module +const instance = new Instance(module, { + global: {}, + env: { + DYNAMICTOP_PTR, + STACKTOP, + STACK_MAX, + abort, + enlargeMemory, + getTotalMemory, + abortOnCannotGrowMemory, + ___lock: NOOP, + ___syscall6: () => 0, + ___setErrNo: (no) => no, + _abort: abort, + ___syscall140: () => 0, + _emscripten_memcpy_big: memcpy, + ___syscall54: () => 0, + ___unlock: NOOP, + _llvm_trap: abort, + ___syscall146: () => 0, + 'memory': wasmMemory, + 'table': wasmTable, + tableBase: 0, + memoryBase: STATIC_BASE + } +}); + +export const extern = instance.exports; diff --git a/js/src/api/local/ethkey/ethkey.wasm.js b/js/src/api/local/ethkey/ethkey.wasm.js new file mode 100644 index 000000000..d426f0e0c --- /dev/null +++ b/js/src/api/local/ethkey/ethkey.wasm.js @@ -0,0 +1 @@ +module.exports = new Buffer('AGFzbQEAAAABOgpgA39/fwF/YAF/AX9gAn9/AX9gAX8AYAABf2AAAGACf38AYAR/f39/AGADf39/AGAGf39/f39/AX8CyQELA2VudghTVEFDS1RPUAN/AANlbnYFYWJvcnQAAwNlbnYLX19fc3lzY2FsbDYAAgNlbnYNX19fc3lzY2FsbDE0MAACA2VudhZfZW1zY3JpcHRlbl9tZW1jcHlfYmlnAAADZW52DF9fX3N5c2NhbGw1NAACA2VudgpfbGx2bV90cmFwAAUDZW52DV9fX3N5c2NhbGwxNDYAAgNlbnYGbWVtb3J5AgGAAoACA2VudgV0YWJsZQFwAQgIA2Vudgl0YWJsZUJhc2UDfwADOjkEBAQEBAQDBwMICAgIAwYGBgIIAwMDBgMDCAYGBgMCBwYIAgICBgkDBgEAAAEEBAQAAQAAAQABAAIGBgF/ASMACwdfBw5fdmVyaWZ5X3NlY3JldAAMC19wdWJsaWNfcHRyAAoLX3NlY3JldF9wdHIACQpfaW5wdXRfcHRyAAgJX2VjcG9pbnRnAAcGX2JyYWluAA0MX2FkZHJlc3NfcHRyAAsJDgEAIwELCD0wPjEyNz8rCpClAzlJAQJ/An8jAiEAIwJB0JgBaiQCQagZKAIAQQFGBEAgACQCQawZDwsgACIBEB9BqBlBATYCAEGsGSABQdCYARA8GiAAJAJBrBkLCwYAQbi2AQsGAEG4vgELBgBB2L4BCwYAQZi/AQsKAEG4vgFBIBAlC74HAQt/AkAjAiEIIwJBoJwBaiQCIABBgAhLBEAgAEGACBAnCyAIQaACaiEFQagZKAIAQQFHBEAgBRAfQagZQQE2AgBBrBkgBUHQmAEQPBoLIAghCSAIQcgAaiIEEBQgCEH4mwFqIgFCADcAACABQgA3AAggAUIANwAQIAFCADcAGCAEQbi2ASAAEBAgBSAEQdgBEDwaIAUgAUEgEBIgCEHwmgFqIgMgASkAADcAACADIAEpAAg3AAggAyABKQAQNwAQIAMgASkAGDcAGCAIQZCbAWoiBkEBaiEHIAhB2JsBaiICQQxqIQpBACEAA0AgBBAUIAFCADcAACABQgA3AAggAUIANwAQIAFCADcAGCAEIANBIBAQIAUgBEHYARA8GiAFIAFBIBASIAIgASkAADcAACACIAEpAAg3AAggAiABKQAQNwAQIAIgASkAGDcAGCADIAIpAAA3AAAgAyACKQAINwAIIAMgAikAEDcAECADIAIpABg3ABggAEEBaiELIABBgYABRwRAIAshAAwBCwsgCUEBaiEAA0ACQCAJQawZIANBIBAmIAksAABBAUYEQCAGIAApAAA3AAAgBiAAKQAINwAIIAYgACkAEDcAECAGIAApABg3ABggBiAAKQAgNwAgIAYgACkAKDcAKCAGIAApADA3ADAgBiAAKQA4NwA4IAYgACwAQDoAQCAEEBQgAUIANwAAIAFCADcACCABQgA3ABAgAUIANwAYIAQgB0HAABAQIAUgBEHYARA8GiAFIAFBIBASIAIgASkAADcAACACIAEpAAg3AAggAiABKQAQNwAQIAIgASkAGDcAGEGYvwEgCikAADcAAEGgvwEgCikACDcAAEGovwEgCigAEDYAAEGYvwEsAABFDQELIAQQFCABQgA3AAAgAUIANwAIIAFCADcAECABQgA3ABggBCADQSAQECAFIARB2AEQPBogBSABQSAQEiACIAEpAAA3AAAgAiABKQAINwAIIAIgASkAEDcAECACIAEpABg3ABggAyACKQAANwAAIAMgAikACDcACCADIAIpABA3ABAgAyACKQAYNwAYDAELC0HYvgEgBykAADcAAEHgvgEgBykACDcAAEHovgEgBykAEDcAAEHwvgEgBykAGDcAAEH4vgEgBykAIDcAAEGAvwEgBykAKDcAAEGIvwEgBykAMDcAAEGQvwEgBykAODcAAEG4vgEgAykAADcAAEHAvgEgAykACDcAAEHIvgEgAykAEDcAAEHQvgEgAykAGDcAACAIJAILCwQAEAUL1wsCGX8tfgJAIAApAwAhJCAAQShqIgIpAwAhJSAAQdAAaiIDKQMAITAgAEH4AGoiBCkDACE+IABBoAFqIgUpAwAhJiAAQQhqIgYpAwAhMSAAQTBqIgcpAwAhMiAAQdgAaiIIKQMAIScgAEGAAWoiCSkDACEgIABBqAFqIgopAwAhPyAAQRBqIgspAwAhMyAAQThqIgwpAwAhHSAAQeAAaiINKQMAISEgAEGIAWoiDikDACE0IABBsAFqIg8pAwAhHiAAQRhqIhApAwAhNSAAQcAAaiIRKQMAISggAEHoAGoiEikDACE2IABBkAFqIhMpAwAhGyAAQbgBaiIUKQMAISIgAEEgaiIV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0AkpAwA3AxAgAUHYCSkDADcDGCABQeAJKQMANwMgIAFB6AkpAwA3AyggAUHwCSkDADcDMCABQfgJKQMANwM4IAFBgAopAwA3A0AgASADEBYgACABKQIANwIAIAAgASkCCDcCCCAAIAEpAhA3AhAgACABKQIYNwIYIAAgASkCIDcCICAAIAEpAig3AiggACABKQIwNwIwIAAgASkCODcCOCAAIAEpAkA3AkAgByQCDwsACwsgAxAbIAAgAykCADcCACAAIAMpAgg3AgggACADKQIQNwIQIAAgAykCGDcCGCAAIAMpAiA3AiAgACADKQIoNwIoIAAgAykCMDcCMCAAIAMpAjg3AjggACADKQJANwJAIAckAgsLzx8BD38CQCMCIQwjAkGABWokAiAAQZABaiIELAAABEAgDCQCDwsgDCELIAxBuARqIgIgAEHIAGoiCikCADcCACACIAopAgg3AgggAiAKKQIQNwIQIAIgCikCGDcCGCACIAopAiA3AiAgAiAKKQIoNwIoIAIgCikCMDcCMCACIAopAjg3AjggAiAKKQJANwJAIAIgChAVIAxB8ANqIgEgAikDADcDACABIAIpAwg3AwggASACKQMQNwMQIAEgAikDGDcDGCABIAIpAyA3AyAgASACKQMoNwMoIAEgAikDMDcDMCABIAIpAzg3AzggASACKQNANwNAAkACQCABKAIAIgNBCEYEQEEIIQcCQAJAAkADQCAHQX9qIQMgB0UNBSADQRBPDQEgAUEEaiADQQJ0aigCACIHIANBAnRBxAlqKAIAIgVHDQIgAyEHDAALAAtBvAsgA0EQECgMAQsgByAFTw0CQQghDQsFIANBCE8NASADIQ0LDAELIAFBwAkQFiABKAIAIQ0LIAEoAgQhDiALIAFBCGoiAykCADcCACALIAMpAgg3AgggCyADKQIQNwIQIAsgAykCGDcCGCALIAMpAiA3AiAgCyADKQIoNwIoIAsgAykCMDcCMCALIAMpAjg3AjggDUEBRiAORXEEQCAEQQE6AAAgDCQCDwsgDEGoA2ohCCAMQeACaiEEIAxBmAJqIQUgDEGIAWohBiACIAApAgA3AgAgAiAAKQIINwIIIAIgACkCEDcCECACIAApAhg3AhggAiAAKQIgNwIgIAIgACkCKDcCKCACIAApAjA3AjAgAiAAKQI4NwI4IAIgACkCQDcCQCACIAAQFyABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABEBsgDEHAAGoiCSABKQMANwMAIAkgASkDCDcDCCAJIAEpAxA3AxAgCSABKQMYNwMYIAkgASkDIDcDICAJIAEpAyg3AyggCSABKQMwNwMwIAkgASkDODcDOCAJIAEpA0A3A0AgAiAJKQMANwMAIAIgCSkDCDcDCCACIAkpAxA3AxAgAiAJKQMYNwMYIAIgCSkDIDcDICACIAkpAyg3AyggAiAJKQMwNwMwIAIgCSkDODcDOCACIAkpA0A3A0AgAiAJEBUgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0ACQAJAIAEoAgAiA0EIRgRAQQghBwJAAkACQANAIAdBf2ohAyAHRQ0FIANBEE8NASABQQRqIANBAnRqKAIAIgcgA0ECdEHECWooAgAiD0cNAiADIQcMAAsAC0G8CyADQRAQKAwBCyAHIA9PDQILBSADQQhPDQELDAELIAFBwAkQFgsgBCABKQMANwMAIAQgASkDCDcDCCAEIAEpAxA3AxAgBCABKQMYNwMYIAQgASkDIDcDICAEIAEpAyg3AyggBCABKQMwNwMwIAQgASkDODcDOCAEIAEpA0A3A0AgAiAEKQMANwMAIAIgBCkDCDcDCCACIAQpAxA3AxAgAiAEKQMYNwMYIAIgBCkDIDcDICACIAQpAyg3AyggAiAEKQMwNwMwIAIgBCkDODcDOCACIAQpA0A3A0AgAiAJEBUgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0ACQAJAIAEoAgAiA0EIRgRAQQghBwJAAkACQANAIAdBf2ohAyAHRQ0FIANBEE8NASABQQRqIANBAnRqKAIAIgcgA0ECdEHECWooAgAiCUcNAiADIQcMAAsAC0G8CyADQRAQKAwBCyAHIAlPDQILBSADQQhPDQELDAELIAFBwAkQFgsgBSABKQMANwMAIAUgASkDCDcDCCAFIAEpAxA3AxAgBSABKQMYNwMYIAUgASkDIDcDICAFIAEpAyg3AyggBSABKQMwNwMwIAUgASkDODcDOCAFIAEpA0A3A0AgAiANNgIAIAIgDjYCBCACQQhqIgMgCykDADcDACADIAspAwg3AwggAyALKQMQNwMQIAMgCykDGDcDGCADIAspAyA3AyAgAyALKQMoNwMoIAMgCykDMDcDMCADIAspAzg3AzggCCACEB0gAiAFKQMANwMAIAIgBSkDCDcDCCACIAUpAxA3AxAgAiAFKQMYNwMYIAIgBSkDIDcDICACIAUpAyg3AyggAiAFKQMwNwMwIAIgBSkDODcDOCACIAUpA0A3A0AgAiAIEBcgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0AgARAbIAYgASkDADcDACAGIAEpAwg3AwggBiABKQMQNwMQIAYgASkDGDcDGCAGIAEpAyA3AyAgBiABKQMoNwMoIAYgASkDMDcDMCAGIAEpAzg3AzggBiABKQNANwNAIAIgBikDADcDACACIAYpAwg3AwggAiAGKQMQNwMQIAIgBikDGDcDGCACIAYpAyA3AyAgAiAGKQMoNwMoIAIgBikDMDcDMCACIAYpAzg3AzggAiAGKQNANwNAIAIgBhAXIAEgAikDADcDACABIAIpAwg3AwggASACKQMQNwMQIAEgAikDGDcDGCABIAIpAyA3AyAgASACKQMoNwMoIAEgAikDMDcDMCABIAIpAzg3AzggASACKQNANwNAIAEQGyAEIAEpAwA3AwAgBCABKQMINwMIIAQgASkDEDcDECAEIAEpAxg3AxggBCABKQMgNwMgIAQgASkDKDcDKCAEIAEpAzA3AzAgBCABKQM4NwM4IAQgASkDQDcDQCACIAApAgA3AgAgAiAAKQIINwIIIAIgACkCEDcCECACIAApAhg3AhggAiAAKQIgNwIgIAIgACkCKDcCKCACIAApAjA3AjAgAiAAKQI4NwI4IAIgACkCQDcCQCACIAAQFSABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQAJAAkAgASgCACIDQQhGBEBBCCEHAkACQAJAA0AgB0F/aiEDIAdFDQUgA0EQTw0BIAFBBGogA0ECdGooAgAiByADQQJ0QcQJaigCACILRw0CIAMhBwwACwALQbwLIANBEBAoDAELIAcgC08NAgsFIANBCE8NAQsMAQsgAUHACRAWCyAIIAEpAwA3AwAgCCABKQMINwMIIAggASkDEDcDECAIIAEpAxg3AxggCCABKQMgNwMgIAggASkDKDcDKCAIIAEpAzA3AzAgCCABKQM4NwM4IAggASkDQDcDQCACIAQpAwA3AwAgAiAEKQMINwMIIAIgBCkDEDcDECACIAQpAxg3AxggAiAEKQMgNwMgIAIgBCkDKDcDKCACIAQpAzA3AzAgAiAEKQM4NwM4IAIgBCkDQDcDQCACIAgQFiABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABLABEBEAgAUHACRAVCyAMQdABaiIDIAEpAwA3AwAgAyABKQMINwMIIAMgASkDEDcDECADIAEpAxg3AxggAyABKQMgNwMgIAMgASkDKDcDKCADIAEpAzA3AzAgAyABKQM4NwM4IAMgASkDQDcDQCACIAApAgA3AgAgAiAAKQIINwIIIAIgACkCEDcCECACIAApAhg3AhggAiAAKQIgNwIgIAIgACkCKDcCKCACIAApAjA3AjAgAiAAKQI4NwI4IAIgACkCQDcCQCACIAMQFiABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABLABEBEAgAUHACRAVCyAIIAEpAwA3AwAgCCABKQMINwMIIAggASkDEDcDECAIIAEpAxg3AxggCCABKQMgNwMgIAggASkDKDcDKCAIIAEpAzA3AzAgCCABKQM4NwM4IAggASkDQDcDQCACIAYpAwA3AwAgAiAGKQMINwMIIAIgBikDEDcDECACIAYpAxg3AxggAiAGKQMgNwMgIAIgBikDKDcDKCACIAYpAzA3AzAgAiAGKQM4NwM4IAIgBikDQDcDQCACIAgQFyABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABEBsgBCABKQMANwMAIAQgASkDCDcDCCAEIAEpAxA3AxAgBCABKQMYNwMYIAQgASkDIDcDICAEIAEpAyg3AyggBCABKQMwNwMwIAQgASkDODcDOCAEIAEpA0A3A0AgAiAEKQMANwMAIAIgBCkDCDcDCCACIAQpAxA3AxAgAiAEKQMYNwMYIAIgBCkDIDcDICACIAQpAyg3AyggAiAEKQMwNwMwIAIgBCkDODcDOCACIAQpA0A3A0AgAiAKEBYgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0AgASwARARAIAFBwAkQFQsgBSABKQMANwMAIAUgASkDCDcDCCAFIAEpAxA3AxAgBSABKQMYNwMYIAUgASkDIDcDICAFIAEpAyg3AyggBSABKQMwNwMwIAUgASkDODcDOCAFIAEpA0A3A0AgCiAFKQIANwIAIAogBSkCCDcCCCAKIAUpAhA3AhAgCiAFKQIYNwIYIAogBSkCIDcCICAKIAUpAig3AiggCiAFKQIwNwIwIAogBSkCODcCOCAKIAUpAkA3AkAgACADKQIANwIAIAAgAykCCDcCCCAAIAMpAhA3AhAgACADKQIYNwIYIAAgAykCIDcCICAAIAMpAig3AiggACADKQIwNwIwIAAgAykCODcCOCAAIAMpAkA3AkAgDCQCCwvCFgETfwJAIwIhCSMCQfC1AmokAiAJQZC0AmohAyAJQcizAmohBSAJQbiyAmohByAJQey1AmohCyAJIgRBCDYCACAEQZiv4LcBNgIEIARB24LKzwU2AgggBEHZ0bjuAjYCDCAEQdv57xQ2AhAgBEGHlpz0fDYCFCAEQZXFga0FNgIYIARBrPfyTjYCHCAEQf7M+c0HNgIgIARBJGoiBkIANwIAIAZCADcCCCAGQgA3AhAgBkIANwIYIAZBADoAICAEQQg2AkggBEHMAGoiD0G4qcNYNgIAIARBj6Gf4nk2AlAgBEGZqJW0ejYCVCAEQcjo3mg2AlggBEGokcTwADYCXCAEQfz3k+0FNgJgIARB5YiPtQI2AmQgBEH3tOvBBDYCaCAEQewAaiIGQgA3AgAgBkIANwIIIAZCADcCECAGQgA3AhggBkEAOgAgIARBkAFqIhBBADoAACAJQdi0AmoiASAEQZQBEDwaIAlB6JkBaiICIARBlAEQPBogAkGUAWogAUGUARA8GiACQagCaiABQZQBEDwaIAJBvANqIAFBlAEQPBogAkHQBGogAUGUARA8GiACQeQFaiABQZQBEDwaIAJB+AZqIAFBlAEQPBogAkGMCGogAUGUARA8GiACQaAJaiABQZQBEDwaIAJBtApqIAFBlAEQPBogAkHIC2ogAUGUARA8GiACQdwMaiABQZQBEDwaIAJB8A1qIAFBlAEQPBogAkGED2ogAUGUARA8GiACQZgQaiABQZQBEDwaIAJBrBFqIAFBlAEQPBogAkHAEmogAUGUARA8GiACQdQTaiABQZQBEDwaIAJB6BRqIAFBlAEQPBogAkH8FWogAUGUARA8GiACQZAXaiABQZQBEDwaIAJBpBhqIAFBlAEQPBogAkG4GWogAUGUARA8GiACQcwaaiABQZQBEDwaIAJB4BtqIAFBlAEQPBogAkH0HGogAUGUARA8GiACQYgeaiABQZQBEDwaIAJBnB9qIAFBlAEQPBogAkGwIGogAUGUARA8GiACQcQhaiABQZQBEDwaIAJB2CJqIAFBlAEQPBogAkHsI2ogAUGUARA8GiACQYAlaiABQZQBEDwaIAJBlCZqIAFBlAEQPBogAkGoJ2ogAUGUARA8GiACQbwoaiABQZQBEDwaIAJB0ClqIAFBlAEQPBogAkHkKmogAUGUARA8GiACQfgraiABQZQBEDwaIAJBjC1qIAFBlAEQPBogAkGgLmogAUGUARA8GiACQbQvaiABQZQBEDwaIAJByDBqIAFBlAEQPBogAkHcMWogAUGUARA8GiACQfAyaiABQZQBEDwaIAJBhDRqIAFBlAEQPBogAkGYNWogAUGUARA8GiACQaw2aiABQZQBEDwaIAJBwDdqIAFBlAEQPBogAkHUOGogAUGUARA8GiACQeg5aiABQZQBEDwaIAJB/DpqIAFBlAEQPBogAkGQPGogAUGUARA8GiACQaQ9aiABQZQBEDwaIAJBuD5qIAFBlAEQPBogAkHMP2ogAUGUARA8GiACQeDAAGogAUGUARA8GiACQfTBAGogAUGUARA8GiACQYjDAGogAUGUARA8GiACQZzEAGogAUGUARA8GiACQbDFAGogAUGUARA8GiACQcTGAGogAUGUARA8GiACQdjHAGogAUGUARA8GiACQezIAGogAUGUARA8GiACQYDKAGogAUGUARA8GiACQZTLAGogAUGUARA8GiAQLAAABH8gByAEQZABEDwaIAsgBEGRAWoiBi4AADsAACALIAYsAAI6AAJBAQUgBSAEKQMANwMAIAUgBCkDCDcDCCAFIAQpAxA3AxAgBSAEKQMYNwMYIAUgBCkDIDcDICAFIAQpAyg3AyggBSAEKQMwNwMwIAUgBCkDODcDOCAFIAQpA0A3A0AgBEHIAGoiBigCAEEBRiAPKAIARXEEQCADQdgMKQIANwIAIANB4AwpAgA3AgggA0HoDCkCADcCECADQfAMKQIANwIYIANB+AwpAgA3AiAgA0GADSkCADcCKCADQYgNKQIANwIwIANBkA0pAgA3AjggA0GYDSkCADcCQAUgAUHACSkDADcDACABQcgJKQMANwMIIAFB0AkpAwA3AxAgAUHYCSkDADcDGCABQeAJKQMANwMgIAFB6AkpAwA3AyggAUHwCSkDADcDMCABQfgJKQMANwM4IAFBgAopAwA3A0AgASAGEBYgAyABKQMANwMAIAMgASkDCDcDCCADIAEpAxA3AxAgAyABKQMYNwMYIAMgASkDIDcDICADIAEpAyg3AyggAyABKQMwNwMwIAMgASkDODcDOCADIAEpA0A3A0ALIAcgBSkDADcDACAHIAUpAwg3AwggByAFKQMQNwMQIAcgBSkDGDcDGCAHIAUpAyA3AyAgByAFKQMoNwMoIAcgBSkDMDcDMCAHIAUpAzg3AzggByAFKQNANwNAIAdByABqIgYgAykDADcDACAGIAMpAwg3AwggBiADKQMQNwMQIAYgAykDGDcDGCAGIAMpAyA3AyAgBiADKQMoNwMoIAYgAykDMDcDMCAGIAMpAzg3AzggBiADKQNANwNAQQALIQwgCUGYAWohDSAJQZDmAWoiCkGozABqIQggCiEG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QCACIA4QFyAMQbgIaiIDIAIpAwA3AwAgAyACKQMINwMIIAMgAikDEDcDECADIAIpAxg3AxggAyACKQMgNwMgIAMgAikDKDcDKCADIAIpAzA3AzAgAyACKQM4NwM4IAMgAikDQDcDQCADEBsgDCIGIAMpAwA3AwAgBiADKQMINwMIIAYgAykDEDcDECAGIAMpAxg3AxggBiADKQMgNwMgIAYgAykDKDcDKCAGIAMpAzA3AzAgBiADKQM4NwM4IAYgAykDQDcDQCACIABBkAFqIgkpAgA3AgAgAiAJKQIINwIIIAIgCSkCEDcCECACIAkpAhg3AhggAiAJKQIgNwIgIAIgCSkCKDcCKCACIAkpAjA3AjAgAiAJKQI4NwI4IAIgCSkCQDcCQCACIAkQFyADIAIpAwA3AwAgAyACKQMINwMIIAMgAikDEDcDECADIAIpAxg3AxggAyACKQMgNwMgIAMgAikDKDcDKCADIAIpAzA3AzAgAyACKQM4NwM4IAMgAikDQDcDQCADEBsgDEHIAGoiBSADKQMANwMAIAUgAykDCDcDCCAFIAMpAxA3AxAgBSADKQMYNwMYIAUgAykDIDcDICAFIAMpAyg3AyggBSADKQMwNwMwIAUgAykDODcDOCAFIAMpA0A3A0AgAiAAKQIANwIAIAIgACkCCDcCCCACIAApAhA3AhAgAiAAKQIYNwIYIAIgACkCIDcCICACIAApAig3AiggAiAAKQIwNwIwIAIgACkCODcCOCACIAApAkA3AkAgAiAGEBcgAyACKQMANwMAIAMgAikDCDcDCCADIAIpAxA3AxAgAyACKQMYNwMYIAMgAikDIDcDICADIAIpAyg3AyggAyACKQMwNwMwIAMgAikDODcDOCADIAIpA0A3A0AgAxAbIAxBkAFqIgcgAykDADcDACAHIAMpAwg3AwggByADKQMQNwMQIAcgAykDGDcDGCAHIAMpAyA3AyAgByADKQMoNwMoIAcgAykDMDcDMCAHIAMpAzg3AzggByADKQNANwNAIAIgASkCADcCACACIAEpAgg3AgggAiABKQIQNwIQIAIgASkCGDcCGCACIAEpAiA3AiAgAiABKQIoNwIoIAIgASkCMDcCMCACIAEpAjg3AjggAiABKQJANwJAIAIgBRAXIAMgAikDADcDACADIAIpAwg3AwggAyACKQMQNwMQIAMgAikDGDcDGCADIAIpAyA3AyAgAyACKQMoNwMoIAMgAikDMDcDMCADIAIpAzg3AzggAyACKQNANwNAIAMQGyAMQdgBaiIIIAMpAwA3AwAgCCADKQMINwMIIAggAykDEDcDECAIIAMpAxg3AxggCCADKQMgNwMgIAggAykDKDcDKCAIIAMpAzA3AzAgCCADKQM4NwM4IAggAykDQDcDQCACIABByABqIg0pAgA3AgAgAiANKQIINwIIIAIgDSkCEDcCECACIA0pAhg3AhggAiANKQIgNwIgIAIgDSkCKDcCKCACIA0pAjA3AjAgAiANKQI4NwI4IAIgDSkCQDcCQCACIAYQFyADIAIpAwA3AwAgAyACKQMINwMIIAMgAikDEDcDECADIAIpAxg3AxggAyACKQMgNwMgIAMgAikDKDcDKCADIAIpAzA3AzAgAyACKQM4NwM4IAMgAikDQDcDQCADEBsgDEHwB2oiBCADKQMANwMAIAQgAykDCDcDCCAEIAMpAxA3AxAgBCADKQMYNwMYIAQgAykDIDcDICAEIAMpAyg3AyggBCADKQMwNwMwIAQgAykDODcDOCAEIAMpA0A3A0AgAiAEKQMANwMAIAIgBCkDCDcDCCACIAQpAxA3AxAgAiAEKQMYNwMYIAIgBCkDIDcDICACIAQpAyg3AyggAiAEKQMwNwMwIAIgBCkDODcDOCACIAQpA0A3A0AgAiAOEBcgAyACKQMANwMAIAMgAikDCDcDCCADIAIpAxA3AxAgAyACKQMYNwMYIAMgAikDIDcDICADIAIpAyg3AyggAyACKQMwNwMwIAMgAikDODcDOCADIAIpA0A3A0AgAxAbIAxBoAJqIgogAykDADcDACAKIAMpAwg3AwggCiADKQMQNwMQIAogAykDGDcDGCAKIAMpAyA3AyAgCiADKQMoNwMoIAogAykDMDcDMCAKIAMpAzg3AzggCiADKQNANwNAIAIgAUHIAGoiASkCADcCACACIAEpAgg3AgggAiABKQIQNwIQIAIgASkCGDcCGCACIAEpAiA3AiAgAiABKQIoNwIoIAIgASkCMDcCMCACIAEpAjg3AjggAiABKQJANwJAIAIgBRAXIAMgAikDADcDACADIAIpAwg3AwggAyACKQMQNwMQIAMgAikDGDcDGCADIAIpAyA3AyAgAyACKQMoNwMoIAMgAikDMDcDMCADIAIpAzg3AzggAyACKQNANwNAIAMQGyAEIAMpAwA3AwAgBCADKQMINwMIIAQgAykDEDcDECAEIAMpAxg3AxggBCADKQMgNwMgIAQgAykDKDcDKCAEIAMpAzA3AzAgBCADKQM4NwM4IAQgAykDQDcDQCACIAQpAwA3AwAgAiAEKQMINwMIIAIgBCkDEDcDECACIAQpAxg3AxggAiAEKQMgNwMgIAIgBCkDKDcDKCACIAQpAzA3AzAgAiAEKQM4NwM4IAIgBCkDQDcDQCACIAkQFyADIAIpAwA3AwAgAyACKQMINwMIIAMgAikDEDcDECADIAIpAxg3AxggAyACKQMgNwMgIAMgAikDKDcDKCADIAIpAzA3AzAgAyACKQM4NwM4IAMgAikDQDcDQCADEBsgDEHoAmoiASADKQMANwMAIAEgAykDCDcDCCABIAMpAxA3AxAgASADKQMYNwMYIAEgAykDIDcDICABIAMpAyg3AyggASADKQMwNwMwIAEgAykDODcDOCABIAMpA0A3A0AgAiAHKQMANwMAIAIgBykDCDcDCCACIAcpAxA3AxAgAiAHKQMYNwMYIAIgBykDIDcDICACIAcpAyg3AyggAiAHKQMwNwMwIAIgBykDODcDOCACIAcpA0A3A0AgAiAIEBYgAyACKQMANwMAIAMgAikDCDcDCCADIAIpAxA3AxAgAyACKQMYNwMYIAMgAikDIDcDICADIAIpAyg3AyggAyACKQMwNwMwIAMgAikDODcDOCADIAIpA0A3A0AgAywARARAIANBwAkQFQsgDEGwA2oiCyADKQMANwMAIAsgAykDCDcDCCALIAMpAxA3AxAgCyADKQMYNwMYIAsgAykDIDcDICALIAMpAyg3AyggCyADKQMwNwMwIAsgAykDODcDOCALIAMpA0A3A0AgAiAKKQMANwMAIAIgCikDCDcDCCACIAopAxA3AxAgAiAKKQMYNwMYIAIgCikDIDcDICACIAopAyg3AyggAiAKKQMwNwMwIAIgCikDODcDOCACIAopA0A3A0AgAiABEBYgAyACKQMANwMAIAMgAikDCDcDCCADIAIpAxA3AxAgAyACKQMYNwMYIAMgAikDIDcDICADIAIpAyg3AyggAyACKQMwNwMwIAMgAikDODcDOCADIAIpA0A3A0AgAywARARAIANBwAkQFQsgDEH4A2oiCCADKQMANwMAIAggAykDCDcDCCAIIAMpAxA3AxAgCCADKQMYNwMYIAggAykDIDcDICAIIAMpAyg3AyggCCADKQMwNwMwIAggAykDODcDOCAIIAMpA0A3A0AgCygCAEEBRgRAIAsoAgRFBEACQAJAIAgoAgBBAUcNACAIKAIEDQAgABAkDAELIAJBiAopAwA3AwAgAkGQCikDADcDCCACQZgKKQMANwMQIAJBoAopAwA3AxggAkGoCikDADcDICACQbAKKQMANwMoIAJBuAopAwA3AzAgAkHACikDADcDOCACQcgKKQMANwNAIAJByABqIgFBiAopAwA3AwAgAUGQCikDADcDCCABQZgKKQMANwMQIAFBoAopAwA3AxggAUGoCikDADcDICABQbAKKQMANwMoIAFBuAopAwA3AzAgAUHACikDADcDOCABQcgKKQMANwNAIAJBkAFqIgFB2AwpAgA3AgAgAUHgDCkCADcCCCABQegMKQIANwIQIAFB8AwpAgA3AhggAUH4DCkCADcCICABQYANKQIANwIoIAFBiA0pAgA3AjAgAUGQDSkCADcCOCABQZgNKQIANwJAIAAgAkHYARA8GgsgDCQCDwsLIAxBqAdqIQUgAiALKQMANwMAIAIgCykDCDcDCCACIAspAxA3AxAgAiALKQMYNwMYIAIgCykDIDcDICACIAspAyg3AyggAiALKQMwNwMwIAIgCykDODcDOCACIAspA0A3A0AgAiALEBcgAyACKQMANwMAIAMgAikDCDcDCCADIAIpAxA3AxAgAyACKQMYNwMYIAMgAikDIDcDICADIAIpAyg3AyggAyACKQMwNwMwIAMgAikDODcDOCADIAIpA0A3A0AgAxAbIAxBwARqIgEgAykDADcDACABIAMpAwg3AwggASADKQMQNwMQIAEgAykDGDcDGCABIAMpAyA3AyAgASADKQMoNwMoIAEgAykDMDcDMCABIAMpAzg3AzggASADKQNANwNAIAIgBykDADcDACACIAcpAwg3AwggAiAHKQMQNwMQIAIgBykDGDcDGCACIAcpAyA3AyAgAiAHKQMoNwMoIAIgBykDMDcDMCACIAcpAzg3AzggAiAHKQNANwNAIAIgARAXIAMgAikDADcDACADIAIpAwg3AwggAyACKQMQNwMQIAMgAikDGDcDGCADIAIpAyA3AyAgAyACKQMoNwMoIAMgAikDMDcDMCADIAIpAzg3AzggAyACKQNANwNAIAMQGyAMQYgFaiIHIAMpAwA3AwAgByADKQMINwMIIAcgAykDEDcDECAHIAMpAxg3AxggByADKQMgNwMgIAcgAykDKDcDKCAHIAMpAzA3AzAgByADKQM4NwM4IAcgAykDQDcDQCACIAEpAwA3AwAgAiABKQMINwMIIAIgASkDEDcDECACIAEpAxg3AxggAiABKQMgNwMgIAIgASkDKDcDKCACIAEpAzA3AzAgAiABKQM4NwM4IAIgASkDQDcDQCACIAsQFyADIAIpAwA3AwAgAyACKQMINwMIIAMgAikDEDcDECADIAIpAxg3AxggAyACKQMgNwMgIAMgAikDKDcDKCADIAIpAzA3AzAgAyACKQM4NwM4IAMgAikDQDcDQCADEBsgDEHQBWoiDyADKQMANwMAIA8gAykDCDcDCCAPIAMpAxA3AxAgDyADKQMYNwMYIA8gAykDIDcDICAPIAMpAyg3AyggDyADKQMwNwMwIA8gAykDODcDOCAPIAMpA0A3A0AgAiAIKQMANwMAIAIgCCkDCDcDCCACIAgpAxA3AxAgAiAIKQMYNwMYIAIgCCkDIDcDICACIAgpAyg3AyggAiAIKQMwNwMwIAIgCCkDODcDOCACIAgpA0A3A0AgAiAIEBcgAyACKQMANwMAIAMgAikDCDcDCCADIAIpAxA3AxAgAyACKQMYNwMYIAMgAikDIDcDICADIAIpAyg3AyggAyACKQMwNwMwIAMgAikDODcDOCADIAIpA0A3A0AgAxAbIAQgAykDADcDACAEIAMpAwg3AwggBCADKQMQNwMQIAQgAykDGDcDGCAEIAMpAyA3AyAgBCADKQMoNwMoIAQgAykDMDcDMCAEIAMpAzg3AzggBCADKQNANwNAIAIgBCkDADcDACACIAQpAwg3AwggAiAEKQMQNwMQIAIgBCkDGDcDGCACIAQpAyA3AyAgAiAEKQMoNwMoIAIgBCkDMDcDMCACIAQpAzg3AzggAiAEKQNANwNAIAIgDxAVIAMgAikDADcDACADIAIpAwg3AwggAyACKQMQNwMQIAMgAikDGDcDGCADIAIpAyA3AyAgAyACKQMoNwMoIAMgAikDMDcDMCADIAIpAzg3AzggAyACKQNANwNAAkACQCADKAIAIgFBCEYEQEEIIQYCQAJAAkADQCAGQX9qIQEgBkUNBSABQRBPDQEgA0EEaiABQQJ0aigCACIGIAFBAnRBxAlqKAIAIhBHDQIgASEGDAALAAtBvAsgAUEQECgMAQsgBiAQTw0CCwUgAUEITw0BCwwBCyADQcAJEBYLIAUgAykDADcDACAFIAMpAwg3AwggBSADKQMQNwMQIAUgAykDGDcDGCAFIAMpAyA3AyAgBSADKQMoNwMoIAUgAykDMDcDMCAFIAMpAzg3AzggBSADKQNANwNAIAIgBSkDADcDACACIAUpAwg3AwggAiAFKQMQNwMQIAIgBSkDGDcDGCACIAUpAyA3AyAgAiAFKQMoNwMoIAIgBSkDMDcDMCACIAUpAzg3AzggAiAFKQNANwNAIAIgBxAWIAMgAikDADcDACADIAIpAwg3AwggAyACKQMQNwMQIAMgAikDGDcDGCADIAIpAyA3AyAgAyACKQMoNwMoIAMgAikDMDcDMCADIAIpAzg3AzggAyACKQNANwNAIAMsAEQEQCADQcAJEBULIAxB4AZqIgEgAykDADcDACABIAMpAwg3AwggASADKQMQNwMQIAEgAykDGDcDGCABIAMpAyA3AyAgASADKQMoNwMoIAEgAykDMDcDMCABIAMpAzg3AzggASADKQNANwNAIAIgASkDADcDACACIAEpAwg3AwggAiABKQMQNwMQIAIgASkDGDcDGCACIAEpAyA3AyAgAiABKQMoNwMoIAIgASkDMDcDMCACIAEpAzg3AzggAiABKQNANwNAIAIgBxAWIAMgAikDADcDACADIAIpAwg3AwggAyACKQMQNwMQIAMgAikDGDcDGCADIAIpAyA3AyAgAyACKQMoNwMoIAMgAikDMDcDMCADIAIpAzg3AzggAyACKQNANwNAIAMsAEQEQCADQcAJEBULIAxBmAZqIgYgAykDADcDACAGIAMpAwg3AwggBiADKQMQNwMQIAYgAykDGDcDGCAGIAMpAyA3AyAgBiADKQMoNwMoIAYgAykDMDcDMCAGIAMpAzg3AzggBiADKQNANwNAIAAgBikCADcCACAAIAYpAgg3AgggACAGKQIQNwIQIAAgBikCGDcCGCAAIAYpAiA3AiAgACAGKQIoNwIoIAAgBikCMDcCMCAAIAYpAjg3AjggACAGKQJANwJAIAIgBykDADcDACACIAcpAwg3AwggAiAHKQMQNwMQIAIgBykDGDcDGCACIAcpAyA3AyAgAiAHKQMoNwMoIAIgBykDMDcDMCACIAcpAzg3AzggAiAHKQNANwNAIAIgABAWIAMgAikDADcDACADIAIpAwg3AwggAyACKQMQNwMQIAMgAikDGDcDGCADIAIpAyA3AyAgAyACKQMoNwMoIAMgAikDMDcDMCADIAIpAzg3AzggAyACKQNANwNAIAMsAEQEQCADQcAJEBULIAUgAykDADcDACAFIAMpAwg3AwggBSADKQMQNwMQIAUgAykDGDcDGCAFIAMpAyA3AyAgBSADKQMoNwMoIAUgAykDMDcDMCAFIAMpAzg3AzggBSADKQNANwNAIAIgCCkDADcDACACIAgpAwg3AwggAiAIKQMQNwMQIAIgCCkDGDcDGCACIAgpAyA3AyAgAiAIKQMoNwMoIAIgCCkDMDcDMCACIAgpAzg3AzggAiAIKQNANwNAIAIgBRAXIAMgAikDADcDACADIAIpAwg3AwggAyACKQMQNwMQIAMgAikDGDcDGCADIAIpAyA3AyAgAyACKQMoNwMoIAMgAikDMDcDMCADIAIpAzg3AzggAyACKQNANwNAIAMQGyABIAMpAwA3AwAgASADKQMINwMIIAEgAykDEDcDECABIAMpAxg3AxggASADKQMgNwMgIAEgAykDKDcDKCABIAMpAzA3AzAgASADKQM4NwM4IAEgAykDQDcDQCACIAopAwA3AwAgAiAKKQMINwMIIAIgCikDEDcDECACIAopAxg3AxggAiAKKQMgNwMgIAIgCikDKDcDKCACIAopAzA3AzAgAiAKKQM4NwM4IAIgCikDQDcDQCACIA8QFyADIAIpAwA3AwAgAyACKQMINwMIIAMgAikDEDcDECADIAIpAxg3AxggAyACKQMgNwMgIAMgAikDKDcDKCADIAIpAzA3AzAgAyACKQM4NwM4IAMgAikDQDcDQCADEBsgBCADKQMANwMAIAQgAykDCDcDCCAEIAMpAxA3AxAgBCADKQMYNwMYIAQgAykDIDcDICAEIAMpAyg3AyggBCADKQMwNwMwIAQgAykDODcDOCAEIAMpA0A3A0AgAiABKQMANwMAIAIgASkDCDcDCCACIAEpAxA3AxAgAiABKQMYNwMYIAIgASkDIDcDICACIAEpAyg3AyggAiABKQMwNwMwIAIgASkDODcDOCACIAEpA0A3A0AgAiAEEBYgAyACKQMANwMAIAMgAikDCDcDCCADIAIpAxA3AxAgAyACKQMYNwMYIAMgAikDIDcDICADIAIpAyg3AyggAyACKQMwNwMwIAMgAikDODcDOCADIAIpA0A3A0AgAywARARAIANBwAkQFQsgBiADKQMANwMAIAYgAykDCDcDCCAGIAMpAxA3AxAgBiADKQMYNwMYIAYgAykDIDcDICAGIAMpAyg3AyggBiADKQMwNwMwIAYgAykDODcDOCAGIAMpA0A3A0AgDSAGKQIANwIAIA0gBikCCDcCCCANIAYpAhA3AhAgDSAGKQIYNwIYIA0gBikCIDcCICANIAYpAig3AiggDSAGKQIwNwIwIA0gBikCODcCOCANIAYpAkA3AkAgAiAJKQIANwIAIAIgCSkCCDcCCCACIAkpAhA3AhAgAiAJKQIYNwIYIAIgCSkCIDcCICACIAkpAig3AiggAiAJKQIwNwIwIAIgCSkCODcCOCACIAkpAkA3AkAgAiAOEBcgAyACKQMANwMAIAMgAikDCDcDCCADIAIpAxA3AxAgAyACKQMYNwMYIAMgAikDIDcDICADIAIpAyg3AyggAyACKQMwNwMwIAMgAikDODcDOCADIAIpA0A3A0AgAxAbIAQgAykDADcDACAEIAMpAwg3AwggBCADKQMQNwMQIAQgAykDGDcDGCAEIAMpAyA3AyAgBCADKQMoNwMoIAQgAykDMDcDMCAEIAMpAzg3AzggBCADKQNANwNAIAIgBCkDADcDACACIAQpAwg3AwggAiAEKQMQNwMQIAIgBCkDGDcDGCACIAQpAyA3AyAgAiAEKQMoNwMoIAIgBCkDMDcDMCACIAQpAzg3AzggAiAEKQNANwNAIAIgCxAXIAMgAikDADcDACADIAIpAwg3AwggAyACKQMQNwMQIAMgAikDGDcDGCADIAIpAyA3AyAgAyACKQMoNwMoIAMgAikDMDcDMCADIAIpAzg3AzggAyACKQNANwNAIAMQGyAFIAMpAwA3AwAgBSADKQMINwMIIAUgAykDEDcDECAFIAMpAxg3AxggBSADKQMgNwMgIAUgAykDKDcDKCAFIAMpAzA3AzAgBSADKQM4NwM4IAUgAykDQDcDQCAJIAUpAgA3AgAgCSAFKQIINwIIIAkgBSkCEDcCECAJIAUpAhg3AhggCSAFKQIgNwIgIAkgBSkCKDcCKCAJIAUpAjA3AjAgCSAFKQI4NwI4IAkgBSkCQDcCQCAMJAILC94KAQt/AkAjAiEJIwJBgAVqJAIgCUG4BGohAiAJQfADaiEDIAlBqANqIQQgCUHgAmohBSAJQZgCaiEIIAlB0AFqIQcgCUHAAGoiCiABQZABEDwaIAEoApABIQsgASgClAEhDCAJIgYgAUGYAWoiASkCADcCACAGIAEpAgg3AgggBiABKQIQNwIQIAYgASkCGDcCGCAGIAEpAiA3AiAgBiABKQIoNwIoIAYgASkCMDcCMCAGIAEpAjg3AjggC0EBRiAMRXEEQCAAQYgOQZQBEDwaIAkkAgUgAiALNgIAIAIgDDYCBCACQQhqIgEgBikDADcDACABIAYpAwg3AwggASAGKQMQNwMQIAEgBikDGDcDGCABIAYpAyA3AyAgASAGKQMoNwMoIAEgBikDMDcDMCABIAYpAzg3AzggByACEB0gAiAHKQMANwMAIAIgBykDCDcDCCACIAcpAxA3AxAgAiAHKQMYNwMYIAIgBykDIDcDICACIAcpAyg3AyggAiAHKQMwNwMwIAIgBykDODcDOCACIAcpA0A3A0AgAiAHEBcgAyACKQMANwMAIAMgAikDCDcDCCADIAIpAxA3AxAgAyACKQMYNwMYIAMgAikDIDcDICADIAIpAyg3AyggAyACKQMwNwMwIAMgAikDODcDOCADIAIpA0A3A0AgAxAbIAggAykDADcDACAIIAMpAwg3AwggCCADKQMQNwMQIAggAykDGDcDGCAIIAMpAyA3AyAgCCADKQMoNwMoIAggAykDMDcDMCAIIAMpAzg3AzggCCADKQNANwNAIAIgCikDADcDACACIAopAwg3AwggAiAKKQMQNwMQIAIgCikDGDcDGCACIAopAyA3AyAgAiAKKQMoNwMoIAIgCikDMDcDMCACIAopAzg3AzggAiAKKQNANwNAIAIgCBAXIAMgAikDADcDACADIAIpAwg3AwggAyACKQMQNwMQIAMgAikDGDcDGCADIAIpAyA3AyAgAyACKQMoNwMoIAMgAikDMDcDMCADIAIpAzg3AzggAyACKQNANwNAIAMQGyAFIAMpAwA3AwAgBSADKQMINwMIIAUgAykDEDcDECAFIAMpAxg3AxggBSADKQMgNwMgIAUgAykDKDcDKCAFIAMpAzA3AzAgBSADKQM4NwM4IAUgAykDQDcDQCACIApByABqIgEpAwA3AwAgAiABKQMINwMIIAIgASkDEDcDECACIAEpAxg3AxggAiABKQMgNwMgIAIgASkDKDcDKCACIAEpAzA3AzAgAiABKQM4NwM4IAIgASkDQDcDQCACIAgQFyADIAIpAwA3AwAgAyACKQMINwMIIAMgAikDEDcDECADIAIpAxg3AxggAyACKQMgNwMgIAMgAikDKDcDKCADIAIpAzA3AzAgAyACKQM4NwM4IAMgAikDQDcDQCADEBsgBCADKQMANwMAIAQgAykDCDcDCCAEIAMpAxA3AxAgBCADKQMYNwMYIAQgAykDIDcDICAEIAMpAyg3AyggBCADKQMwNwMwIAQgAykDODcDOCAEIAMpA0A3A0AgBCAHEBcgBBAbIAAgBSkCADcCACAAIAUpAgg3AgggACAFKQIQNwIQIAAgBSkCGDcCGCAAIAUpAiA3AiAgACAFKQIoNwIoIAAgBSkCMDcCMCAAIAUpAjg3AjggACAFKQJANwJAIABByABqIgEgBCkCADcCACABIAQpAgg3AgggASAEKQIQNwIQIAEgBCkCGDcCGCABIAQpAiA3AiAgASAEKQIoNwIoIAEgBCkCMDcCMCABIAQpAjg3AjggASAEKQJANwJAIABBADoAkAEgCSQCCwsLhC0BDX8CQCMCIQwjAkHQCWokAiAMQbgIaiEDIAxB4AZqIQIgACgCkAFBAUYEQCAAKAKUAUUEQCABLACQASEHIAMgAUGQARA8GiAHQQFxBEAgAkGICikDADcDACACQZAKKQMANwMIIAJBmAopAwA3AxAgAkGgCikDADcDGCACQagKKQMANwMgIAJBsAopAwA3AyggAkG4CikDADcDMCACQcAKKQMANwM4IAJByAopAwA3A0AgAkHIAGoiAUGICikDADcDACABQZAKKQMANwMIIAFBmAopAwA3AxAgAUGgCikDADcDGCABQagKKQMANwMgIAFBsAopAwA3AyggAUG4CikDADcDMCABQcAKKQMANwM4IAFByAopAwA3A0AgAkGQAWoiAUHYDCkCADcCACABQeAMKQIANwIIIAFB6AwpAgA3AhAgAUHwDCkCADcCGCABQfgMKQIANwIgIAFBgA0pAgA3AiggAUGIDSkCADcCMCABQZANKQIANwI4IAFBmA0pAgA3AkAFIAIgAykDADcDACACIAMpAwg3AwggAiADKQMQNwMQIAIgAykDGDcDGCACIAMpAyA3AyAgAiADKQMoNwMoIAIgAykDMDcDMCACIAMpAzg3AzggAiADKQNANwNAIAJByABqIgEgA0HIAGoiBykDADcDACABIAcpAwg3AwggASAHKQMQNwMQIAEgBykDGDcDGCABIAcpAyA3AyAgASAHKQMoNwMoIAEgBykDMDcDMCABIAcpAzg3AzggASAHKQNANwNAIAJBkAFqIgFBiAopAwA3AwAgAUGQCikDADcDCCABQZgKKQMANwMQIAFBoAopAwA3AxggAUGoCikDADcDICABQbAKKQMANwMoIAFBuAopAwA3AzAgAUHACikDADcDOCABQcgKKQMANwNACyAAIAJB2AEQPBogDCQCDwsLIAEsAJABBEAgDCQCDwsgAyAAQZABaiIKKQIANwIAIAMgCikCCDcCCCADIAopAhA3AhAgAyAKKQIYNwIYIAMgCikCIDcCICADIAopAig3AiggAyAKKQIwNwIwIAMgCikCODcCOCADIAopAkA3AkAgAyAKEBcgAiADKQMANwMAIAIgAykDCDcDCCACIAMpAxA3AxAgAiADKQMYNwMYIAIgAykDIDcDICACIAMpAyg3AyggAiADKQMwNwMwIAIgAykDODcDOCACIAMpA0A3A0AgAhAbIAwiByACKQMANwMAIAcgAikDCDcDCCAHIAIpAxA3AxAgByACKQMYNwMYIAcgAikDIDcDICAHIAIpAyg3AyggByACKQMwNwMwIAcgAikDODcDOCAHIAIpA0A3A0AgAyABKQIANwIAIAMgASkCCDcCCCADIAEpAhA3AhAgAyABKQIYNwIYIAMgASkCIDcCICADIAEpAig3AiggAyABKQIwNwIwIAMgASkCODcCOCADIAEpAkA3AkAgAyAHEBcgAiADKQMANwMAIAIgAykDCDcDCCACIAMpAxA3AxAgAiADKQMYNwMYIAIgAykDIDcDICACIAMpAyg3AyggAiADKQMwNwMwIAIgAykDODcDOCACIAMpA0A3A0AgAhAbIAxByABqIgQgAikDADcDACAEIAIpAwg3AwggBCACKQMQNwMQIAQgAikDGDcDGCAEIAIpAyA3AyAgBCACKQMoNwMoIAQgAikDMDcDMCAEIAIpAzg3AzggBCACKQNANwNAIAMgAUHIAGoiASkCADcCACADIAEpAgg3AgggAyABKQIQNwIQIAMgASkCGDcCGCADIAEpAiA3AiAgAyABKQIoNwIoIAMgASkCMDcCMCADIAEpAjg3AjggAyABKQJANwJAIAMgBxAXIAIgAykDADcDACACIAMpAwg3AwggAiADKQMQNwMQIAIgAykDGDcDGCACIAMpAyA3AyAgAiADKQMoNwMoIAIgAykDMDcDMCACIAMpAzg3AzggAiADKQNANwNAIAIQGyAMQZABaiIBIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABIAoQFyABEBsgAyAAKQIANwIAIAMgACkCCDcCCCADIAApAhA3AhAgAyAAKQIYNwIYIAMgACkCIDcCICADIAApAig3AiggAyAAKQIwNwIwIAMgACkCODcCOCADIAApAkA3AkAgAyAEEBYgAiADKQMANwMAIAIgAykDCDcDCCACIAMpAxA3AxAgAiADKQMYNwMYIAIgAykDIDcDICACIAMpAyg3AyggAiADKQMwNwMwIAIgAykDODcDOCACIAMpA0A3A0AgAiwARARAIAJBwAkQFQsgDEHYAWoiCSACKQMANwMAIAkgAikDCDcDCCAJIAIpAxA3AxAgCSACKQMYNwMYIAkgAikDIDcDICAJIAIpAyg3AyggCSACKQMwNwMwIAkgAikDODcDOCAJIAIpA0A3A0AgAyAAQcgAaiIEKQIANwIAIAMgBCkCCDcCCCADIAQpAhA3AhAgAyAEKQIYNwIYIAMgBCkCIDcCICADIAQpAig3AiggAyAEKQIwNwIwIAMgBCkCODcCOCADIAQpAkA3AkAgAyABEBYgAiADKQMANwMAIAIgAykDCDcDCCACIAMpAxA3AxAgAiADKQMYNwMYIAIgAykDIDcDICACIAMpAyg3AyggAiADKQMwNwMwIAIgAykDODcDOCACIAMpA0A3A0AgAiwARARAIAJBwAkQFQsgDEGgAmoiBSACKQMANwMAIAUgAikDCDcDCCAFIAIpAxA3AxAgBSACKQMYNwMYIAUgAikDIDcDICAFIAIpAyg3AyggBSACKQMwNwMwIAUgAikDODcDOCAFIAIpA0A3A0AgCSgCAEEBRgRAIAkoAgRFBEACQAJAIAUoAgBBAUcNACAFKAIEDQAgABAkDAELIABBiAopAgA3AgAgAEGQCikCADcCCCAAQZgKKQIANwIQIABBoAopAgA3AhggAEGoCikCADcCICAAQbAKKQIANwIoIABBuAopAgA3AjAgAEHACikCADcCOCAAQcgKKQIANwJAIARBiAopAgA3AgAgBEGQCikCADcCCCAEQZgKKQIANwIQIARBoAopAgA3AhggBEGoCikCADcCICAEQbAKKQIANwIoIARBuAopAgA3AjAgBEHACikCADcCOCAEQcgKKQIANwJAIApB2AwpAgA3AgAgCkHgDCkCADcCCCAKQegMKQIANwIQIApB8AwpAgA3AhggCkH4DCkCADcCICAKQYANKQIANwIoIApBiA0pAgA3AjAgCkGQDSkCADcCOCAKQZgNKQIANwJACyAMJAIPCwsgDEHQBWohBiADIAkpAwA3AwAgAyAJKQMINwMIIAMgCSkDEDcDECADIAkpAxg3AxggAyAJKQMgNwMgIAMgCSkDKDcDKCADIAkpAzA3AzAgAyAJKQM4NwM4IAMgCSkDQDcDQCADIAkQFyACIAMpAwA3AwAgAiADKQMINwMIIAIgAykDEDcDECACIAMpAxg3AxggAiADKQMgNwMgIAIgAykDKDcDKCACIAMpAzA3AzAgAiADKQM4NwM4IAIgAykDQDcDQCACEBsgDEHoAmoiASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0AgAyAAKQIANwIAIAMgACkCCDcCCCADIAApAhA3AhAgAyAAKQIYNwIYIAMgACkCIDcCICADIAApAig3AiggAyAAKQIwNwIwIAMgACkCODcCOCADIAApAkA3AkAgAyABEBcgAiADKQMANwMAIAIgAykDCDcDCCACIAMpAxA3AxAgAiADKQMYNwMYIAIgAykDIDcDICACIAMpAyg3AyggAiADKQMwNwMwIAIgAykDODcDOCACIAMpA0A3A0AgAhAbIAxBsANqIgsgAikDADcDACALIAIpAwg3AwggCyACKQMQNwMQIAsgAikDGDcDGCALIAIpAyA3AyAgCyACKQMoNwMoIAsgAikDMDcDMCALIAIpAzg3AzggCyACKQNANwNAIAMgASkDADcDACADIAEpAwg3AwggAyABKQMQNwMQIAMgASkDGDcDGCADIAEpAyA3AyAgAyABKQMoNwMoIAMgASkDMDcDMCADIAEpAzg3AzggAyABKQNANwNAIAMgCRAXIAIgAykDADcDACACIAMpAwg3AwggAiADKQMQNwMQIAIgAykDGDcDGCACIAMpAyA3AyAgAiADKQMoNwMoIAIgAykDMDcDMCACIAMpAzg3AzggAiADKQNANwNAIAIQGyAMQfgDaiINIAIpAwA3AwAgDSACKQMINwMIIA0gAikDEDcDECANIAIpAxg3AxggDSACKQMgNwMgIA0gAikDKDcDKCANIAIpAzA3AzAgDSACKQM4NwM4IA0gAikDQDcDQCADIAUpAwA3AwAgAyAFKQMINwMIIAMgBSkDEDcDECADIAUpAxg3AxggAyAFKQMgNwMgIAMgBSkDKDcDKCADIAUpAzA3AzAgAyAFKQM4NwM4IAMgBSkDQDcDQCADIAUQFyACIAMpAwA3AwAgAiADKQMINwMIIAIgAykDEDcDECACIAMpAxg3AxggAiADKQMgNwMgIAIgAykDKDcDKCACIAMpAzA3AzAgAiADKQM4NwM4IAIgAykDQDcDQCACEBsgDEGYBmoiCCACKQMANwMAIAggAikDCDcDCCAIIAIpAxA3AxAgCCACKQMYNwMYIAggAikDIDcDICAIIAIpAyg3AyggCCACKQMwNwMwIAggAikDODcDOCAIIAIpA0A3A0AgAyAIKQMANwMAIAMgCCkDCDcDCCADIAgpAxA3AxAgAyAIKQMYNwMYIAMgCCkDIDcDICADIAgpAyg3AyggAyAIKQMwNwMwIAMgCCkDODcDOCADIAgpA0A3A0AgAyANEBUgAiADKQMANwMAIAIgAykDCDcDCCACIAMpAxA3AxAgAiADKQMYNwMYIAIgAykDIDcDICACIAMpAyg3AyggAiADKQMwNwMwIAIgAykDODcDOCACIAMpA0A3A0ACQAJAIAIoAgAiAUEIRgRAQQghBwJAAkACQANAIAdBf2ohASAHRQ0FIAFBEE8NASACQQRqIAFBAnRqKAIAIgcgAUECdEHECWooAgAiDkcNAiABIQcMAAsAC0G8CyABQRAQKAwBCyAHIA5PDQILBSABQQhPDQELDAELIAJBwAkQFgsgBiACKQMANwMAIAYgAikDCDcDCCAGIAIpAxA3AxAgBiACKQMYNwMYIAYgAikDIDcDICAGIAIpAyg3AyggBiACKQMwNwMwIAYgAikDODcDOCAGIAIpA0A3A0AgAyAGKQMANwMAIAMgBikDCDcDCCADIAYpAxA3AxAgAyAGKQMYNwMYIAMgBikDIDcDICADIAYpAyg3AyggAyAGKQMwNwMwIAMgBikDODcDOCADIAYpA0A3A0AgAyALEBYgAiADKQMANwMAIAIgAykDCDcDCCACIAMpAxA3AxAgAiADKQMYNwMYIAIgAykDIDcDICACIAMpAyg3AyggAiADKQMwNwMwIAIgAykDODcDOCACIAMpA0A3A0AgAiALEBYgAkHEAGoiASwAAARAA0AgAkHACRAVIAEsAAANAAsLIAxBiAVqIgEgAikDADcDACABIAIpAwg3AwggASACKQMQNwMQIAEgAikDGDcDGCABIAIpAyA3AyAgASACKQMoNwMoIAEgAikDMDcDMCABIAIpAzg3AzggASACKQNANwNAIAAgASkCADcCACAAIAEpAgg3AgggACABKQIQNwIQIAAgASkCGDcCGCAAIAEpAiA3AiAgACABKQIoNwIoIAAgASkCMDcCMCAAIAEpAjg3AjggACABKQJANwJAIAMgCykDADcDACADIAspAwg3AwggAyALKQMQNwMQIAMgCykDGDcDGCADIAspAyA3AyAgAyALKQMoNwMoIAMgCykDMDcDMCADIAspAzg3AzggAyALKQNANwNAIAMgABAWIAIgAykDADcDACACIAMpAwg3AwggAiADKQMQNwMQIAIgAykDGDcDGCACIAMpAyA3AyAgAiADKQMoNwMoIAIgAykDMDcDMCACIAMpAzg3AzggAiADKQNANwNAIAIsAEQEQCACQcAJEBULIAYgAikDADcDACAGIAIpAwg3AwggBiACKQMQNwMQIAYgAikDGDcDGCAGIAIpAyA3AyAgBiACKQMoNwMoIAYgAikDMDcDMCAGIAIpAzg3AzggBiACKQNANwNAIAMgBSkDADcDACADIAUpAwg3AwggAyAFKQMQNwMQIAMgBSkDGDcDGCADIAUpAyA3AyAgAyAFKQMoNwMoIAMgBSkDMDcDMCADIAUpAzg3AzggAyAFKQNANwNAIAMgBhAXIAIgAykDADcDACACIAMpAwg3AwggAiADKQMQNwMQIAIgAykDGDcDGCACIAMpAyA3AyAgAiADKQMoNwMoIAIgAykDMDcDMCACIAMpAzg3AzggAiADKQNANwNAIAIQGyABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCADIAQpAgA3AgAgAyAEKQIINwIIIAMgBCkCEDcCECADIAQpAhg3AhggAyAEKQIgNwIgIAMgBCkCKDcCKCADIAQpAjA3AjAgAyAEKQI4NwI4IAMgBCkCQDcCQCADIA0QFyACIAMpAwA3AwAgAiADKQMINwMIIAIgAykDEDcDECACIAMpAxg3AxggAiADKQMgNwMgIAIgAykDKDcDKCACIAMpAzA3AzAgAiADKQM4NwM4IAIgAykDQDcDQCACEBsgCCACKQMANwMAIAggAikDCDcDCCAIIAIpAxA3AxAgCCACKQMYNwMYIAggAikDIDcDICAIIAIpAyg3AyggCCACKQMwNwMwIAggAikDODcDOCAIIAIpA0A3A0AgAyABKQMANwMAIAMgASkDCDcDCCADIAEpAxA3AxAgAyABKQMYNwMYIAMgASkDIDcDICADIAEpAyg3AyggAyABKQMwNwMwIAMgASkDODcDOCADIAEpA0A3A0AgAyAIEBYgAiADKQMANwMAIAIgAykDCDcDCCACIAMpAxA3AxAgAiADKQMYNwMYIAIgAykDIDcDICACIAMpAyg3AyggAiADKQMwNwMwIAIgAykDODcDOCACIAMpA0A3A0AgAiwARARAIAJBwAkQFQsgDEHABGoiACACKQMANwMAIAAgAikDCDcDCCAAIAIpAxA3AxAgACACKQMYNwMYIAAgAikDIDcDICAAIAIpAyg3AyggACACKQMwNwMwIAAgAikDODcDOCAAIAIpA0A3A0AgBCAAKQIANwIAIAQgACkCCDcCCCAEIAApAhA3AhAgBCAAKQIYNwIYIAQgACkCIDcCICAEIAApAig3AiggBCAAKQIwNwIwIAQgACkCODcCOCAEIAApAkA3AkAgCiAJEBcgChAbIAwkAgsLklcBE38CQCMCIREjAkHwB2okAiAAKAKQAUEBRiIIBEAgACgClAFFBEAgESQCDwsLIBFBqAdqIQIgEUHgBmohASARQZgGaiEDIBFB0AVqIQUgEUGIBWohBiARQcAEaiEOIBFB+ANqIQcgEUGwA2ohCyARQegCaiENIBFBoAJqIQQgEUHYAWohCSARQZABaiEKIBFByABqIRAgESEPIABBkAFqIRICfwJAIAhFDQAgACgClAFBAUcNACACIAApAgA3AgAgAiAAKQIINwIIIAIgACkCEDcCECACIAApAhg3AhggAiAAKQIgNwIgIAIgACkCKDcCKCACIAApAjA3AjAgAiAAKQI4NwI4IAIgACkCQDcCQCACIAAQFyABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABEBsgCSABKQMANwMAIAkgASkDCDcDCCAJIAEpAxA3AxAgCSABKQMYNwMYIAkgASkDIDcDICAJIAEpAyg3AyggCSABKQMwNwMwIAkgASkDODcDOCAJIAEpA0A3A0AgAiAAQcgAaiIMKQIANwIAIAIgDCkCCDcCCCACIAwpAhA3AhAgAiAMKQIYNwIYIAIgDCkCIDcCICACIAwpAig3AiggAiAMKQIwNwIwIAIgDCkCODcCOCACIAwpAkA3AkAgAiAMEBcgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0AgARAbIAQgASkDADcDACAEIAEpAwg3AwggBCABKQMQNwMQIAQgASkDGDcDGCAEIAEpAyA3AyAgBCABKQMoNwMoIAQgASkDMDcDMCAEIAEpAzg3AzggBCABKQNANwNAIAIgBCkDADcDACACIAQpAwg3AwggAiAEKQMQNwMQIAIgBCkDGDcDGCACIAQpAyA3AyAgAiAEKQMoNwMoIAIgBCkDMDcDMCACIAQpAzg3AzggAiAEKQNANwNAIAIgBBAXIAEgAikDADcDACABIAIpAwg3AwggASACKQMQNwMQIAEgAikDGDcDGCABIAIpAyA3AyAgASACKQMoNwMoIAEgAikDMDcDMCABIAIpAzg3AzggASACKQNANwNAIAEQGyANIAEpAwA3AwAgDSABKQMINwMIIA0gASkDEDcDECANIAEpAxg3AxggDSABKQMgNwMgIA0gASkDKDcDKCANIAEpAzA3AzAgDSABKQM4NwM4IA0gASkDQDcDQCACIAApAgA3AgAgAiAAKQIINwIIIAIgACkCEDcCECACIAApAhg3AhggAiAAKQIgNwIgIAIgACkCKDcCKCACIAApAjA3AjAgAiAAKQI4NwI4IAIgACkCQDcCQCACIAQQFSABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQAJAAkAgASgCACIEQQhGBEBBCCEIAkACQAJAA0AgCEF/aiEEIAhFDQUgBEEQTw0BIAFBBGogBEECdGooAgAiCCAEQQJ0QcQJaigCACITRw0CIAQhCAwACwALQbwLIARBEBAoDAELIAggE08NAgsFIARBCE8NAQsMAQsgAUHACRAWCyADIAEpAwA3AwAgAyABKQMINwMIIAMgASkDEDcDECADIAEpAxg3AxggAyABKQMgNwMgIAMgASkDKDcDKCADIAEpAzA3AzAgAyABKQM4NwM4IAMgASkDQDcDQCACIAMpAwA3AwAgAiADKQMINwMIIAIgAykDEDcDECACIAMpAxg3AxggAiADKQMgNwMgIAIgAykDKDcDKCACIAMpAzA3AzAgAiADKQM4NwM4IAIgAykDQDcDQCACIAMQFyABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABEBsgBSABKQMANwMAIAUgASkDCDcDCCAFIAEpAxA3AxAgBSABKQMYNwMYIAUgASkDIDcDICAFIAEpAyg3AyggBSABKQMwNwMwIAUgASkDODcDOCAFIAEpA0A3A0AgAiAFKQMANwMAIAIgBSkDCDcDCCACIAUpAxA3AxAgAiAFKQMYNwMYIAIgBSkDIDcDICACIAUpAyg3AyggAiAFKQMwNwMwIAIgBSkDODcDOCACIAUpA0A3A0AgAiAJEBYgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0AgASwARARAIAFBwAkQFQsgBiABKQMANwMAIAYgASkDCDcDCCAGIAEpAxA3AxAgBiABKQMYNwMYIAYgASkDIDcDICAGIAEpAyg3AyggBiABKQMwNwMwIAYgASkDODcDOCAGIAEpA0A3A0AgAiAGKQMANwMAIAIgBikDCDcDCCACIAYpAxA3AxAgAiAGKQMYNwMYIAIgBikDIDcDICACIAYpAyg3AyggAiAGKQMwNwMwIAIgBikDODcDOCACIAYpA0A3A0AgAiANEBYgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0AgASwARARAIAFBwAkQFQsgCyABKQMANwMAIAsgASkDCDcDCCALIAEpAxA3AxAgCyABKQMYNwMYIAsgASkDIDcDICALIAEpAyg3AyggCyABKQMwNwMwIAsgASkDODcDOCALIAEpA0A3A0AgCxAaIAIgCSkDADcDACACIAkpAwg3AwggAiAJKQMQNwMQIAIgCSkDGDcDGCACIAkpAyA3AyAgAiAJKQMoNwMoIAIgCSkDMDcDMCACIAkpAzg3AzggAiAJKQNANwNAIAIgCRAVIAEgAikDADcDACABIAIpAwg3AwggASACKQMQNwMQIAEgAikDGDcDGCABIAIpAyA3AyAgASACKQMoNwMoIAEgAikDMDcDMCABIAIpAzg3AzggASACKQNANwNAAkACQCABKAIAIgRBCEYEQEEIIQgCQAJAAkADQCAIQX9qIQQgCEUNBSAEQRBPDQEgAUEEaiAEQQJ0aigCACIIIARBAnRBxAlqKAIAIhNHDQIgBCEIDAALAAtBvAsgBEEQECgMAQsgCCATTw0CCwUgBEEITw0BCwwBCyABQcAJEBYLIAMgASkDADcDACADIAEpAwg3AwggAyABKQMQNwMQIAMgASkDGDcDGCADIAEpAyA3AyAgAyABKQMoNwMoIAMgASkDMDcDMCADIAEpAzg3AzggAyABKQNANwNAIAIgAykDADcDACACIAMpAwg3AwggAiADKQMQNwMQIAIgAykDGDcDGCACIAMpAyA3AyAgAiADKQMoNwMoIAIgAykDMDcDMCACIAMpAzg3AzggAiADKQNANwNAIAIgCRAVIAEgAikDADcDACABIAIpAwg3AwggASACKQMQNwMQIAEgAikDGDcDGCABIAIpAyA3AyAgASACKQMoNwMoIAEgAikDMDcDMCABIAIpAzg3AzggASACKQNANwNAAkACQCABKAIAIgRBCEYEQEEIIQgCQAJAAkADQCAIQX9qIQQgCEUNBSAEQRBPDQEgAUEEaiAEQQJ0aigCACIIIARBAnRBxAlqKAIAIglHDQIgBCEIDAALAAtBvAsgBEEQECgMAQsgCCAJTw0CCwUgBEEITw0BCwwBCyABQcAJEBYLIAcgASkDADcDACAHIAEpAwg3AwggByABKQMQNwMQIAcgASkDGDcDGCAHIAEpAyA3AyAgByABKQMoNwMoIAcgASkDMDcDMCAHIAEpAzg3AzggByABKQNANwNAIAIgBykDADcDACACIAcpAwg3AwggAiAHKQMQNwMQIAIgBykDGDcDGCACIAcpAyA3AyAgAiAHKQMoNwMoIAIgBykDMDcDMCACIAcpAzg3AzggAiAHKQNANwNAIAIgBxAXIAEgAikDADcDACABIAIpAwg3AwggASACKQMQNwMQIAEgAikDGDcDGCABIAIpAyA3AyAgASACKQMoNwMoIAEgAikDMDcDMCABIAIpAzg3AzggASACKQNANwNAIAEQGyADIAEpAwA3AwAgAyABKQMINwMIIAMgASkDEDcDECADIAEpAxg3AxggAyABKQMgNwMgIAMgASkDKDcDKCADIAEpAzA3AzAgAyABKQM4NwM4IAMgASkDQDcDQCACIAMpAwA3AwAgAiADKQMINwMIIAIgAykDEDcDECACIAMpAxg3AxggAiADKQMgNwMgIAIgAykDKDcDKCACIAMpAzA3AzAgAiADKQM4NwM4IAIgAykDQDcDQCACIAsQFiABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABLABEBEAgAUHACRAVCyAFIAEpAwA3AwAgBSABKQMINwMIIAUgASkDEDcDECAFIAEpAxg3AxggBSABKQMgNwMgIAUgASkDKDcDKCAFIAEpAzA3AzAgBSABKQM4NwM4IAUgASkDQDcDQCACIAUpAwA3AwAgAiAFKQMINwMIIAIgBSkDEDcDECACIAUpAxg3AxggAiAFKQMgNwMgIAIgBSkDKDcDKCACIAUpAzA3AzAgAiAFKQM4NwM4IAIgBSkDQDcDQCACIAsQFiABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABLABEBEAgAUHACRAVCyAOIAEpAwA3AwAgDiABKQMINwMIIA4gASkDEDcDECAOIAEpAxg3AxggDiABKQMgNwMgIA4gASkDKDcDKCAOIAEpAzA3AzAgDiABKQM4NwM4IA4gASkDQDcDQCAGIA0pAwA3AwAgBiANKQMINwMIIAYgDSkDEDcDECAGIA0pAxg3AxggBiANKQMgNwMgIAYgDSkDKDcDKCAGIA0pAzA3AzAgBiANKQM4NwM4IAYgDSkDQDcDQCAGEBogBhAaIAYQGiAPIA4pAwA3AwAgDyAOKQMINwMIIA8gDikDEDcDECAPIA4pAxg3AxggDyAOKQMgNwMgIA8gDikDKDcDKCAPIA4pAzA3AzAgDyAOKQM4NwM4IA8gDikDQDcDQCACIAspAwA3AwAgAiALKQMINwMIIAIgCykDEDcDECACIAspAxg3AxggAiALKQMgNwMgIAIgCykDKDcDKCACIAspAzA3AzAgAiALKQM4NwM4IAIgCykDQDcDQCACIA4QFiABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABLABEBEAgAUHACRAVCyADIAEpAwA3AwAgAyABKQMINwMIIAMgASkDEDcDECADIAEpAxg3AxggAyABKQMgNwMgIAMgASkDKDcDKCADIAEpAzA3AzAgAyABKQM4NwM4IAMgASkDQDcDQCACIAcpAwA3AwAgAiAHKQMINwMIIAIgBykDEDcDECACIAcpAxg3AxggAiAHKQMgNwMgIAIgBykDKDcDKCACIAcpAzA3AzAgAiAHKQM4NwM4IAIgBykDQDcDQCACIAMQFyABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABEBsgBSABKQMANwMAIAUgASkDCDcDCCAFIAEpAxA3AxAgBSABKQMYNwMYIAUgASkDIDcDICAFIAEpAyg3AyggBSABKQMwNwMwIAUgASkDODcDOCAFIAEpA0A3A0AgAiAFKQMANwMAIAIgBSkDCDcDCCACIAUpAxA3AxAgAiAFKQMYNwMYIAIgBSkDIDcDICACIAUpAyg3AyggAiAFKQMwNwMwIAIgBSkDODcDOCACIAUpA0A3A0AgAiAGEBYgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0AgASwARARAIAFBwAkQFQsgECABKQMANwMAIBAgASkDCDcDCCAQIAEpAxA3AxAgECABKQMYNwMYIBAgASkDIDcDICAQIAEpAyg3AyggECABKQMwNwMwIBAgASkDODcDOCAQIAEpA0A3A0AgAiAMKQIANwIAIAIgDCkCCDcCCCACIAwpAhA3AhAgAiAMKQIYNwIYIAIgDCkCIDcCICACIAwpAig3AiggAiAMKQIwNwIwIAIgDCkCODcCOCACIAwpAkA3AkAgAiAMEBUgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0ACQAJAIAEoAgAiBEEIRgRAQQghCAJAAkACQANAIAhBf2ohBCAIRQ0FIARBEE8NASABQQRqIARBAnRqKAIAIgggBEECdEHECWooAgAiAkcNAiAEIQgMAAsAC0G8CyAEQRAQKAwBCyAIIAJPDQILBSAEQQhPDQELDAELIAFBwAkQFgsgCiABKQMANwMAIAogASkDCDcDCCAKIAEpAxA3AxAgCiABKQMYNwMYIAogASkDIDcDICAKIAEpAyg3AyggCiABKQMwNwMwIAogASkDODcDOCAKIAEpA0A3A0AgDAwBCyACIAApAgA3AgAgAiAAKQIINwIIIAIgACkCEDcCECACIAApAhg3AhggAiAAKQIgNwIgIAIgACkCKDcCKCACIAApAjA3AjAgAiAAKQI4NwI4IAIgACkCQDcCQCACIAAQFyABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABEBsgCSABKQMANwMAIAkgASkDCDcDCCAJIAEpAxA3AxAgCSABKQMYNwMYIAkgASkDIDcDICAJIAEpAyg3AyggCSABKQMwNwMwIAkgASkDODcDOCAJIAEpA0A3A0AgAiAAQcgAaiIMKQIANwIAIAIgDCkCCDcCCCACIAwpAhA3AhAgAiAMKQIYNwIYIAIgDCkCIDcCICACIAwpAig3AiggAiAMKQIwNwIwIAIgDCkCODcCOCACIAwpAkA3AkAgAiAMEBcgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0AgARAbIAQgASkDADcDACAEIAEpAwg3AwggBCABKQMQNwMQIAQgASkDGDcDGCAEIAEpAyA3AyAgBCABKQMoNwMoIAQgASkDMDcDMCAEIAEpAzg3AzggBCABKQNANwNAIAIgBCkDADcDACACIAQpAwg3AwggAiAEKQMQNwMQIAIgBCkDGDcDGCACIAQpAyA3AyAgAiAEKQMoNwMoIAIgBCkDMDcDMCACIAQpAzg3AzggAiAEKQNANwNAIAIgBBAXIAEgAikDADcDACABIAIpAwg3AwggASACKQMQNwMQIAEgAikDGDcDGCABIAIpAyA3AyAgASACKQMoNwMoIAEgAikDMDcDMCABIAIpAzg3AzggASACKQNANwNAIAEQGyANIAEpAwA3AwAgDSABKQMINwMIIA0gASkDEDcDECANIAEpAxg3AxggDSABKQMgNwMgIA0gASkDKDcDKCANIAEpAzA3AzAgDSABKQM4NwM4IA0gASkDQDcDQCACIAApAgA3AgAgAiAAKQIINwIIIAIgACkCEDcCECACIAApAhg3AhggAiAAKQIgNwIgIAIgACkCKDcCKCACIAApAjA3AjAgAiAAKQI4NwI4IAIgACkCQDcCQCACIAQQFSABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQAJAAkAgASgCACIEQQhGBEBBCCEIAkACQAJAA0AgCEF/aiEEIAhFDQUgBEEQTw0BIAFBBGogBEECdGooAgAiCCAEQQJ0QcQJaigCACITRw0CIAQhCAwACwALQbwLIARBEBAoDAELIAggE08NAgsFIARBCE8NAQsMAQsgAUHACRAWCyADIAEpAwA3AwAgAyABKQMINwMIIAMgASkDEDcDECADIAEpAxg3AxggAyABKQMgNwMgIAMgASkDKDcDKCADIAEpAzA3AzAgAyABKQM4NwM4IAMgASkDQDcDQCACIAMpAwA3AwAgAiADKQMINwMIIAIgAykDEDcDECACIAMpAxg3AxggAiADKQMgNwMgIAIgAykDKDcDKCACIAMpAzA3AzAgAiADKQM4NwM4IAIgAykDQDcDQCACIAMQFyABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABEBsgBSABKQMANwMAIAUgASkDCDcDCCAFIAEpAxA3AxAgBSABKQMYNwMYIAUgASkDIDcDICAFIAEpAyg3AyggBSABKQMwNwMwIAUgASkDODcDOCAFIAEpA0A3A0AgAiAFKQMANwMAIAIgBSkDCDcDCCACIAUpAxA3AxAgAiAFKQMYNwMYIAIgBSkDIDcDICACIAUpAyg3AyggAiAFKQMwNwMwIAIgBSkDODcDOCACIAUpA0A3A0AgAiAJEBYgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0AgASwARARAIAFBwAkQFQsgBiABKQMANwMAIAYgASkDCDcDCCAGIAEpAxA3AxAgBiABKQMYNwMYIAYgASkDIDcDICAGIAEpAyg3AyggBiABKQMwNwMwIAYgASkDODcDOCAGIAEpA0A3A0AgAiAGKQMANwMAIAIgBikDCDcDCCACIAYpAxA3AxAgAiAGKQMYNwMYIAIgBikDIDcDICACIAYpAyg3AyggAiAGKQMwNwMwIAIgBikDODcDOCACIAYpA0A3A0AgAiANEBYgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0AgASwARARAIAFBwAkQFQsgCyABKQMANwMAIAsgASkDCDcDCCALIAEpAxA3AxAgCyABKQMYNwMYIAsgASkDIDcDICALIAEpAyg3AyggCyABKQMwNwMwIAsgASkDODcDOCALIAEpA0A3A0AgCxAaIAIgCSkDADcDACACIAkpAwg3AwggAiAJKQMQNwMQIAIgCSkDGDcDGCACIAkpAyA3AyAgAiAJKQMoNwMoIAIgCSkDMDcDMCACIAkpAzg3AzggAiAJKQNANwNAIAIgCRAVIAEgAikDADcDACABIAIpAwg3AwggASACKQMQNwMQIAEgAikDGDcDGCABIAIpAyA3AyAgASACKQMoNwMoIAEgAikDMDcDMCABIAIpAzg3AzggASACKQNANwNAAkACQCABKAIAIgRBCEYEQEEIIQgCQAJAAkADQCAIQX9qIQQgCEUNBSAEQRBPDQEgAUEEaiAEQQJ0aigCACIIIARBAnRBxAlqKAIAIhNHDQIgBCEIDAALAAtBvAsgBEEQECgMAQsgCCATTw0CCwUgBEEITw0BCwwBCyABQcAJEBYLIAMgASkDADcDACADIAEpAwg3AwggAyABKQMQNwMQIAMgASkDGDcDGCADIAEpAyA3AyAgAyABKQMoNwMoIAMgASkDMDcDMCADIAEpAzg3AzggAyABKQNANwNAIAIgAykDADcDACACIAMpAwg3AwggAiADKQMQNwMQIAIgAykDGDcDGCACIAMpAyA3AyAgAiADKQMoNwMoIAIgAykDMDcDMCACIAMpAzg3AzggAiADKQNANwNAIAIgCRAVIAEgAikDADcDACABIAIpAwg3AwggASACKQMQNwMQIAEgAikDGDcDGCABIAIpAyA3AyAgASACKQMoNwMoIAEgAikDMDcDMCABIAIpAzg3AzggASACKQNANwNAAkACQCABKAIAIgRBCEYEQEEIIQgCQAJAAkADQCAIQX9qIQQgCEUNBSAEQRBPDQEgAUEEaiAEQQJ0aigCACIIIARBAnRBxAlqKAIAIglHDQIgBCEIDAALAAtBvAsgBEEQECgMAQsgCCAJTw0CCwUgBEEITw0BCwwBCyABQcAJEBYLIAcgASkDADcDACAHIAEpAwg3AwggByABKQMQNwMQIAcgASkDGDcDGCAHIAEpAyA3AyAgByABKQMoNwMoIAcgASkDMDcDMCAHIAEpAzg3AzggByABKQNANwNAIAIgBykDADcDACACIAcpAwg3AwggAiAHKQMQNwMQIAIgBykDGDcDGCACIAcpAyA3AyAgAiAHKQMoNwMoIAIgBykDMDcDMCACIAcpAzg3AzggAiAHKQNANwNAIAIgBxAXIAEgAikDADcDACABIAIpAwg3AwggASACKQMQNwMQIAEgAikDGDcDGCABIAIpAyA3AyAgASACKQMoNwMoIAEgAikDMDcDMCABIAIpAzg3AzggASACKQNANwNAIAEQGyAOIAEpAwA3AwAgDiABKQMINwMIIA4gASkDEDcDECAOIAEpAxg3AxggDiABKQMgNwMgIA4gASkDKDcDKCAOIAEpAzA3AzAgDiABKQM4NwM4IA4gASkDQDcDQCAGIA0pAwA3AwAgBiANKQMINwMIIAYgDSkDEDcDECAGIA0pAxg3AxggBiANKQMgNwMgIAYgDSkDKDcDKCAGIA0pAzA3AzAgBiANKQM4NwM4IAYgDSkDQDcDQCAGEBogBhAaIAYQGiACIA4pAwA3AwAgAiAOKQMINwMIIAIgDikDEDcDECACIA4pAxg3AxggAiAOKQMgNwMgIAIgDikDKDcDKCACIA4pAzA3AzAgAiAOKQM4NwM4IAIgDikDQDcDQCACIAsQFiABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABLABEBEAgAUHACRAVCyADIAEpAwA3AwAgAyABKQMINwMIIAMgASkDEDcDECADIAEpAxg3AxggAyABKQMgNwMgIAMgASkDKDcDKCADIAEpAzA3AzAgAyABKQM4NwM4IAMgASkDQDcDQCACIAMpAwA3AwAgAiADKQMINwMIIAIgAykDEDcDECACIAMpAxg3AxggAiADKQMgNwMgIAIgAykDKDcDKCACIAMpAzA3AzAgAiADKQM4NwM4IAIgAykDQDcDQCACIAsQFiABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABLABEBEAgAUHACRAVCyAPIAEpAwA3AwAgDyABKQMINwMIIA8gASkDEDcDECAPIAEpAxg3AxggDyABKQMgNwMgIA8gASkDKDcDKCAPIAEpAzA3AzAgDyABKQM4NwM4IA8gASkDQDcDQCACIAspAwA3AwAgAiALKQMINwMIIAIgCykDEDcDECACIAspAxg3AxggAiALKQMgNwMgIAIgCykDKDcDKCACIAspAzA3AzAgAiALKQM4NwM4IAIgCykDQDcDQCACIA8QFiABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABLABEBEAgAUHACRAVCyADIAEpAwA3AwAgAyABKQMINwMIIAMgASkDEDcDECADIAEpAxg3AxggAyABKQMgNwMgIAMgASkDKDcDKCADIAEpAzA3AzAgAyABKQM4NwM4IAMgASkDQDcDQCACIAcpAwA3AwAgAiAHKQMINwMIIAIgBykDEDcDECACIAcpAxg3AxggAiAHKQMgNwMgIAIgBykDKDcDKCACIAcpAzA3AzAgAiAHKQM4NwM4IAIgBykDQDcDQCACIAMQFyABIAIpAwA3AwAgASACKQMINwMIIAEgAikDEDcDECABIAIpAxg3AxggASACKQMgNwMgIAEgAikDKDcDKCABIAIpAzA3AzAgASACKQM4NwM4IAEgAikDQDcDQCABEBsgBSABKQMANwMAIAUgASkDCDcDCCAFIAEpAxA3AxAgBSABKQMYNwMYIAUgASkDIDcDICAFIAEpAyg3AyggBSABKQMwNwMwIAUgASkDODcDOCAFIAEpA0A3A0AgAiAFKQMANwMAIAIgBSkDCDcDCCACIAUpAxA3AxAgAiAFKQMYNwMYIAIgBSkDIDcDICACIAUpAyg3AyggAiAFKQMwNwMwIAIgBSkDODcDOCACIAUpA0A3A0AgAiAGEBYgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0AgASwARARAIAFBwAkQFQsgECABKQMANwMAIBAgASkDCDcDCCAQIAEpAxA3AxAgECABKQMYNwMYIBAgASkDIDcDICAQIAEpAyg3AyggECABKQMwNwMwIBAgASkDODcDOCAQIAEpA0A3A0AgAiAMKQIANwIAIAIgDCkCCDcCCCACIAwpAhA3AhAgAiAMKQIYNwIYIAIgDCkCIDcCICACIAwpAig3AiggAiAMKQIwNwIwIAIgDCkCODcCOCACIAwpAkA3AkAgAiASEBcgASACKQMANwMAIAEgAikDCDcDCCABIAIpAxA3AxAgASACKQMYNwMYIAEgAikDIDcDICABIAIpAyg3AyggASACKQMwNwMwIAEgAikDODcDOCABIAIpA0A3A0AgARAbIAogASkDADcDACAKIAEpAwg3AwggCiABKQMQNwMQIAogASkDGDcDGCAKIAEpAyA3AyAgCiABKQMoNwMoIAogASkDMDcDMCAKIAEpAzg3AzggCiABKQNANwNAIAIgCikDADcDACACIAopAwg3AwggAiAKKQMQNwMQIAIgCikDGDcDGCACIAopAyA3AyAgAiAKKQMoNwMoIAIgCikDMDcDMCACIAopAzg3AzggAiAKKQNANwNAIAIgChAVIAEgAikDADcDACABIAIpAwg3AwggASACKQMQNwMQIAEgAikDGDcDGCABIAIpAyA3AyAgASACKQMoNwMoIAEgAikDMDcDMCABIAIpAzg3AzggASACKQNANwNAAkACQCABKAIAIgRBCEYEQEEIIQgCQAJAAkADQCAIQX9qIQQgCEUNBSAEQRBPDQEgAUEEaiAEQQJ0aigCACIIIARBAnRBxAlqKAIAIgJHDQIgBCEIDAALAAtBvAsgBEEQECgM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ACAAIAEoAgQ2AgQgACABKAIINgIIIAAgASgCDDYCDCAAIAEoAhA2AhAgACABKAIUNgIUIAAgASgCGDYCGCAAIAEoAhw2AhwgACABKAIgNgIgIAAgASgCJDYCJCAAIAEoAig2AiggACABKAIsNgIsIAAgASgCMDYCMCAAIAEoAjQ2AjQgACABKAI4NgI4IAAgASgCPDYCPCAAQcAAaiEAIAFBwABqIQEMAQsLA0AgACACSARAIAAgASgCADYCACAAQQRqIQAgAUEEaiEBDAELCwUgA0EEayECA0AgACACSARAIAAgASwAADoAACAAIAEsAAE6AAEgACABLAACOgACIAAgASwAAzoAAyAAQQRqIQAgAUEEaiEBDAELCwsDQCAAIANIBEAgACABLAAAOgAAIABBAWohACABQQFqIQEMAQsLIAQLCwsAAn9BABAAQQALCwsAAn9BARAAQQALCwsAAn9BAhAAQQALCwu9DA0AQYAIC+QBAQAAAAAAAACCgAAAAAAAAIqAAAAAAACAAIAAgAAAAICLgAAAAAAAAAEAAIAAAAAAgYAAgAAAAIAJgAAAAAAAgIoAAAAAAAAAiAAAAAAAAAAJgACAAAAAAAoAAIAAAAAAi4AAgAAAAACLAAAAAAAAgImAAAAAAACAA4AAAAAAAIACgAAAAAAAgIAAAAAAAACACoAAAAAAAAAKAACAAAAAgIGAAIAAAACAgIAAAAAAAIABAACAAAAAAAiAAIAAAACACAAAAC/8///+////////////////////////////////////AEGICgsFAQAAAAEAQdAKCzyxCQAAIgAAAPYCAABYCQAAWQAAADwBAAAIAAAAQUE20Ixe0r87oEiv5tyuuv7///////////////////8AQbALC6kBMwoAACIAAADwAgAA0wkAAGAAAAA9AAAA0wkAAGAAAACBAAAA0wkAAGAAAACLAAAA0wkAAGAAAACTAAAA0wkAAGAAAACbAAAA0wkAAGAAAADvAAAA0wkAAGAAAAD3AAAA0wkAAGAAAAC6AAAA0wkAAGAAAABeAQAA0wkAAGAAAAAxAQAA0wkAAGAAAAAyAQAA0wkAAGAAAAA4AQAA0wkAAGAAAAA9AQAAAQBBoA0LadMJAABgAAAAbgMAAFUKAABcAAAAEAAAADMKAAAiAAAA9gIAANMJAABgAAAAHgQAABQLAAAoAAAAsQoAAGMAAABCAAAAsQoAAGMAAAA9AAAAsQoAAGMAAABQAAAAsQoAAGMAAABSAAAAAQBB0A4LAQEAQZgPC00BAAAAXgsAACAAAAB+CwAAEgAAAFgMAAAGAAAAXgwAACIAAAA8CwAAIgAAAKACAACADAAAFgAAAJYMAAANAAAAPAsAACIAAACmAgAABQBB8A8LAQEAQYgQCw4BAAAAAgAAALRfAAAABABBoBALAQEAQa8QCwUK/////wBBnBILAiRZAEHUEgvPBuQHAAAvaG9tZS9tYWNpZWovLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvdGlueS1rZWNjYWstMS4yLjEvc3JjL2xpYi5ycy9jaGVja291dC9zcmMvbGliY29yZS9zbGljZS9tb2QucnMvaG9tZS9tYWNpZWovLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvdGlueS1zZWNwMjU2azEtMC4xLjAvc3JjL2JpZ19udW0ucnMvY2hlY2tvdXQvc3JjL2xpYmNvcmUvc2xpY2UvbW9kLnJzL2hvbWUvbWFjaWVqLy5jYXJnby9yZWdpc3RyeS9zcmMvZ2l0aHViLmNvbS0xZWNjNjI5OWRiOWVjODIzL3Rpbnktc2VjcDI1NmsxLTAuMS4wL3NyYy9uYWYucnMvaG9tZS9tYWNpZWovLmNhcmdvL3JlZ2lzdHJ5L3NyYy9naXRodWIuY29tLTFlY2M2Mjk5ZGI5ZWM4MjMvdGlueS1zZWNwMjU2azEtMC4xLjAvc3JjL2VjX3BvaW50X2cucnNpbnRlcm5hbCBlcnJvcjogZW50ZXJlZCB1bnJlYWNoYWJsZSBjb2RlL2NoZWNrb3V0L3NyYy9saWJjb3JlL3NsaWNlL21vZC5yc2luZGV4IG91dCBvZiBib3VuZHM6IHRoZSBsZW4gaXMgIGJ1dCB0aGUgaW5kZXggaXMgMDAwMTAyMDMwNDA1MDYwNzA4MDkxMDExMTIxMzE0MTUxNjE3MTgxOTIwMjEyMjIzMjQyNTI2MjcyODI5MzAzMTMyMzMzNDM1MzYzNzM4Mzk0MDQxNDI0MzQ0NDU0NjQ3NDg0OTUwNTE1MjUzNTQ1NTU2NTc1ODU5NjA2MTYyNjM2NDY1NjY2NzY4Njk3MDcxNzI3Mzc0NzU3Njc3Nzg3OTgwODE4MjgzODQ4NTg2ODc4ODg5OTA5MTkyOTM5NDk1OTY5Nzk4OTlpbmRleCAgb3V0IG9mIHJhbmdlIGZvciBzbGljZSBvZiBsZW5ndGggc2xpY2UgaW5kZXggc3RhcnRzIGF0ICBidXQgZW5kcyBhdCA=', 'base64'); diff --git a/js/src/api/local/ethkey/index.js b/js/src/api/local/ethkey/index.js new file mode 100644 index 000000000..07ca34ba1 --- /dev/null +++ b/js/src/api/local/ethkey/index.js @@ -0,0 +1,47 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import workerPool from './workerPool'; + +export function createKeyObject (key, password) { + return workerPool.action('createKeyObject', { key, password }) + .then((obj) => JSON.parse(obj)); +} + +export function decryptPrivateKey (keyObject, password) { + return workerPool + .action('decryptPrivateKey', { keyObject, password }) + .then((privateKey) => { + if (privateKey) { + return Buffer.from(privateKey); + } + + return null; + }); +} + +export function phraseToAddress (phrase) { + return phraseToWallet(phrase) + .then((wallet) => wallet.address); +} + +export function phraseToWallet (phrase) { + return workerPool.action('phraseToWallet', phrase); +} + +export function verifySecret (secret) { + return workerPool.action('verifySecret', secret); +} diff --git a/js/src/api/local/ethkey/index.spec.js b/js/src/api/local/ethkey/index.spec.js new file mode 100644 index 000000000..ce4cc29df --- /dev/null +++ b/js/src/api/local/ethkey/index.spec.js @@ -0,0 +1,58 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { randomPhrase } from '@parity/wordlist'; +import { phraseToAddress, phraseToWallet } from './'; + +// TODO: Skipping until Node.js 8.0 comes out and we can test WebAssembly +describe.skip('api/local/ethkey', () => { + describe('phraseToAddress', function () { + this.timeout(30000); + + it('generates a valid address', () => { + const phrase = randomPhrase(12); + + return phraseToAddress(phrase).then((address) => { + expect(address.length).to.be.equal(42); + expect(address.slice(0, 4)).to.be.equal('0x00'); + }); + }); + + it('generates valid address for empty phrase', () => { + return phraseToAddress('').then((address) => { + expect(address).to.be.equal('0x00a329c0648769a73afac7f9381e08fb43dbea72'); + }); + }); + }); + + describe('phraseToWallet', function () { + this.timeout(30000); + + it('generates a valid wallet object', () => { + const phrase = randomPhrase(12); + + return phraseToWallet(phrase).then((wallet) => { + expect(wallet.address.length).to.be.equal(42); + expect(wallet.secret.length).to.be.equal(66); + expect(wallet.public.length).to.be.equal(130); + + expect(wallet.address.slice(0, 4)).to.be.equal('0x00'); + expect(wallet.secret.slice(0, 2)).to.be.equal('0x'); + expect(wallet.public.slice(0, 2)).to.be.equal('0x'); + }); + }); + }); +}); diff --git a/js/src/api/local/ethkey/worker.js b/js/src/api/local/ethkey/worker.js new file mode 100644 index 000000000..76ccf06b2 --- /dev/null +++ b/js/src/api/local/ethkey/worker.js @@ -0,0 +1,138 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { bytesToHex } from '~/api/util/format'; +import { extern, slice } from './ethkey.js'; + +const isWorker = typeof self !== 'undefined'; + +// Stay compatible between environments +if (!isWorker) { + const scope = typeof global === 'undefined' ? window : global; + + scope.self = scope; +} + +// keythereum should never be used outside of the browser +let keythereum = require('keythereum'); + +if (isWorker) { + keythereum = self.keythereum; +} + +function route ({ action, payload }) { + if (action in actions) { + return actions[action](payload); + } + + return null; +} + +const input = slice(extern._input_ptr(), 1024); +const secret = slice(extern._secret_ptr(), 32); +const publicKey = slice(extern._public_ptr(), 64); +const address = slice(extern._address_ptr(), 20); + +extern._ecpointg(); + +const actions = { + phraseToWallet (phrase) { + const phraseUtf8 = Buffer.from(phrase, 'utf8'); + + if (phraseUtf8.length > input.length) { + throw new Error('Phrase is too long!'); + } + + input.set(phraseUtf8); + + extern._brain(phraseUtf8.length); + + const wallet = { + secret: bytesToHex(secret), + public: bytesToHex(publicKey), + address: bytesToHex(address) + }; + + return wallet; + }, + + verifySecret (key) { + const keyBuf = Buffer.from(key.slice(2), 'hex'); + + secret.set(keyBuf); + + return extern._verify_secret(); + }, + + createKeyObject ({ key, password }) { + key = Buffer.from(key); + password = Buffer.from(password); + + const iv = keythereum.crypto.randomBytes(16); + const salt = keythereum.crypto.randomBytes(32); + const keyObject = keythereum.dump(password, key, salt, iv); + + return JSON.stringify(keyObject); + }, + + decryptPrivateKey ({ keyObject, password }) { + password = Buffer.from(password); + + try { + const key = keythereum.recover(password, keyObject); + + // Convert to array to safely send from the worker + return Array.from(key); + } catch (e) { + return null; + } + } +}; + +self.onmessage = function ({ data }) { + try { + const result = route(data); + + postMessage([null, result]); + } catch (err) { + console.error(err); + postMessage([err.toString(), null]); + } +}; + +// Emulate a web worker in Node.js +class KeyWorker { + postMessage (data) { + // Force async + setTimeout(() => { + try { + const result = route(data); + + this.onmessage({ data: [null, result] }); + } catch (err) { + this.onmessage({ data: [err, null] }); + } + }, 0); + } + + onmessage (event) { + // no-op to be overriden + } +} + +if (exports != null) { + exports.KeyWorker = KeyWorker; +} diff --git a/js/src/api/local/ethkey/workerPool.js b/js/src/api/local/ethkey/workerPool.js new file mode 100644 index 000000000..d7db73b41 --- /dev/null +++ b/js/src/api/local/ethkey/workerPool.js @@ -0,0 +1,105 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +// Allow a web worker in the browser, with a fallback for Node.js +const hasWebWorkers = typeof Worker !== 'undefined'; +const KeyWorker = hasWebWorkers ? require('worker-loader!./worker') + : require('./worker').KeyWorker; + +class WorkerContainer { + busy = false; + _worker = new KeyWorker(); + + action (action, payload) { + if (this.busy) { + throw new Error('Cannot issue an action on a busy worker!'); + } + + this.busy = true; + + return new Promise((resolve, reject) => { + this._worker.postMessage({ action, payload }); + this._worker.onmessage = ({ data }) => { + const [err, result] = data; + + this.busy = false; + + if (err) { + // `err` ought to be a String + reject(new Error(err)); + } else { + resolve(result); + } + }; + }); + } +} + +class WorkerPool { + pool = [ + new WorkerContainer(), + new WorkerContainer() + ]; + + queue = []; + + _getContainer () { + return this.pool.find((container) => !container.busy); + } + + action (action, payload) { + let container = this.pool.find((container) => !container.busy); + + let promise; + + // const start = Date.now(); + + if (container) { + promise = container.action(action, payload); + } else { + promise = new Promise((resolve, reject) => { + this.queue.push([action, payload, resolve]); + }); + } + + return promise + .catch((err) => { + this.processQueue(); + + throw err; + }) + .then((result) => { + this.processQueue(); + + // console.log('Work done in ', Date.now() - start); + + return result; + }); + } + + processQueue () { + let container = this._getContainer(); + + while (container && this.queue.length > 0) { + const [action, payload, resolve] = this.queue.shift(); + + resolve(container.action(action, payload)); + container = this._getContainer(); + } + } +} + +export default new WorkerPool(); diff --git a/js/src/api/local/index.js b/js/src/api/local/index.js new file mode 100644 index 000000000..190a38ea4 --- /dev/null +++ b/js/src/api/local/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default null; diff --git a/js/src/api/local/localAccountsMiddleware.js b/js/src/api/local/localAccountsMiddleware.js new file mode 100644 index 000000000..c452f541a --- /dev/null +++ b/js/src/api/local/localAccountsMiddleware.js @@ -0,0 +1,288 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import EthereumTx from 'ethereumjs-tx'; +import accounts from './accounts'; +import transactions from './transactions'; +import { Middleware } from '../transport'; +import { inNumber16 } from '../format/input'; +import { phraseToWallet, phraseToAddress, verifySecret } from './ethkey'; +import { randomPhrase } from '@parity/wordlist'; + +export default class LocalAccountsMiddleware extends Middleware { + constructor (transport) { + super(transport); + + const register = this.register.bind(this); + + register('eth_accounts', () => { + return accounts.accountAddresses(); + }); + + register('eth_coinbase', () => { + return accounts.lastAddress; + }); + + register('parity_accountsInfo', () => { + return accounts.map(({ name }) => { + return { name }; + }); + }); + + register('parity_allAccountsInfo', () => { + return accounts.map(({ name, meta, uuid }) => { + return { name, meta, uuid }; + }); + }); + + register('parity_changePassword', ([address, oldPassword, newPassword]) => { + const account = accounts.get(address); + + return account + .decryptPrivateKey(oldPassword) + .then((privateKey) => { + if (!privateKey) { + return false; + } + + account.changePassword(privateKey, newPassword); + + return true; + }); + }); + + register('parity_checkRequest', ([id]) => { + return transactions.hash(id) || Promise.resolve(null); + }); + + register('parity_dappsList', () => { + return []; + }); + + register('parity_defaultAccount', () => { + return accounts.dappsDefaultAddress; + }); + + register('parity_exportAccount', ([address, password]) => { + const account = accounts.get(address); + + if (!password) { + password = ''; + } + + return account.isValidPassword(password) + .then((isValid) => { + if (!isValid) { + throw new Error('Invalid password'); + } + + return account.export(); + }); + }); + + register('parity_generateSecretPhrase', () => { + return randomPhrase(12); + }); + + register('parity_getNewDappsAddresses', () => { + return accounts.accountAddresses(); + }); + + register('parity_getNewDappsDefaultAddress', () => { + return accounts.dappsDefaultAddress; + }); + + register('parity_hardwareAccountsInfo', () => { + return {}; + }); + + register('parity_newAccountFromPhrase', ([phrase, password]) => { + return phraseToWallet(phrase) + .then((wallet) => { + return accounts.create(wallet.secret, password); + }); + }); + + register('parity_newAccountFromSecret', ([secret, password]) => { + return verifySecret(secret) + .then((isValid) => { + if (!isValid) { + throw new Error('Invalid secret key'); + } + + return accounts.create(secret, password); + }); + }); + + register('parity_newAccountFromWallet', ([json, password]) => { + if (!password) { + password = ''; + } + + return accounts.restoreFromWallet(JSON.parse(json), password); + }); + + register('parity_setAccountMeta', ([address, meta]) => { + accounts.getLazyCreate(address).meta = meta; + + return true; + }); + + register('parity_setAccountName', ([address, name]) => { + accounts.getLazyCreate(address).name = name; + + return true; + }); + + register('parity_setNewDappsDefaultAddress', ([address]) => { + accounts.dappsDefaultAddress = address; + + return true; + }); + + register('parity_postTransaction', ([tx]) => { + if (!tx.from) { + tx.from = accounts.lastAddress; + } + + tx.nonce = null; + tx.condition = null; + + return transactions.add(tx); + }); + + register('parity_phraseToAddress', ([phrase]) => { + return phraseToAddress(phrase); + }); + + register('parity_useLocalAccounts', () => { + return true; + }); + + register('parity_listGethAccounts', () => { + return []; + }); + + register('parity_listOpenedVaults', () => { + return []; + }); + + register('parity_listRecentDapps', () => { + return {}; + }); + + register('parity_listVaults', () => { + return []; + }); + + register('parity_wsUrl', () => { + // This is a hack, will be replaced by a `hostname` setting on the node itself + return `${window.location.hostname}:8546`; + }); + + register('parity_dappsUrl', () => { + // This is a hack, will be replaced by a `hostname` setting on the node itself + return `${window.location.hostname}:8545`; + }); + + register('parity_hashContent', () => { + throw new Error('Functionality unavailable on a public wallet.'); + }); + + register('parity_killAccount', ([address, password]) => { + return accounts.remove(address, password); + }); + + register('parity_removeAddress', ([address]) => { + return accounts.remove(address, null); + }); + + register('parity_testPassword', ([address, password]) => { + const account = accounts.get(address); + + return account.isValidPassword(password); + }); + + register('parity_upgradeReady', () => { + return false; + }); + + register('signer_confirmRequest', ([id, modify, password]) => { + const { + gasPrice, + gas: gasLimit, + from, + to, + value, + data + } = Object.assign(transactions.get(id), modify); + + transactions.lock(id); + + const account = accounts.get(from); + + return Promise.all([ + this.rpcRequest('parity_nextNonce', [from]), + account.decryptPrivateKey(password) + ]) + .catch((err) => { + transactions.unlock(id); + + // transaction got unlocked, can propagate rejection further + throw err; + }) + .then(([nonce, privateKey]) => { + if (!privateKey) { + transactions.unlock(id); + + throw new Error('Invalid password'); + } + + const tx = new EthereumTx({ + nonce, + to, + data, + gasLimit: inNumber16(gasLimit), + gasPrice: inNumber16(gasPrice), + value: inNumber16(value) + }); + + tx.sign(privateKey); + + const serializedTx = `0x${tx.serialize().toString('hex')}`; + + return this.rpcRequest('eth_sendRawTransaction', [serializedTx]); + }) + .then((hash) => { + transactions.confirm(id, hash); + + return {}; + }); + }); + + register('signer_generateAuthorizationToken', () => { + return ''; + }); + + register('signer_rejectRequest', ([id]) => { + return transactions.reject(id); + }); + + register('signer_requestsToConfirm', () => { + return transactions.requestsToConfirm(); + }); + } +} diff --git a/js/src/api/local/localAccountsMiddleware.spec.js b/js/src/api/local/localAccountsMiddleware.spec.js new file mode 100644 index 000000000..b3de3992d --- /dev/null +++ b/js/src/api/local/localAccountsMiddleware.spec.js @@ -0,0 +1,157 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import LocalAccountsMiddleware from './localAccountsMiddleware'; +import JsonRpcBase from '../transport/jsonRpcBase'; + +const RPC_RESPONSE = Symbol('RPC response'); +const ADDRESS = '0x00a329c0648769a73afac7f9381e08fb43dbea72'; +const SECRET = '0x4d5db4107d237df6a3d58ee5f70ae63d73d7658d4026f2eefd2f204c81682cb7'; +const PASSWORD = 'password'; + +const FOO_PHRASE = 'foobar'; +const FOO_PASSWORD = 'foopass'; +const FOO_ADDRESS = '0x007ef7ac1058e5955e366ab9d6b6c4ebcc937e7e'; + +class MockedTransport extends JsonRpcBase { + _execute (method, params) { + return RPC_RESPONSE; + } +} + +// Skip till all CI runs on Node 8+ +describe.skip('api/local/LocalAccountsMiddleware', function () { + this.timeout(30000); + + let transport; + + beforeEach(() => { + transport = new MockedTransport(); + transport.addMiddleware(LocalAccountsMiddleware); + + // Same as `parity_newAccountFromPhrase` with empty phrase + return transport + .execute('parity_newAccountFromSecret', SECRET, PASSWORD) + .catch((_err) => { + // Ignore the error - all instances of LocalAccountsMiddleware + // share account storage + }); + }); + + it('registers all necessary methods', () => { + return Promise + .all([ + 'eth_accounts', + 'eth_coinbase', + 'parity_accountsInfo', + 'parity_allAccountsInfo', + 'parity_changePassword', + 'parity_checkRequest', + 'parity_defaultAccount', + 'parity_generateSecretPhrase', + 'parity_getNewDappsAddresses', + 'parity_hardwareAccountsInfo', + 'parity_newAccountFromPhrase', + 'parity_newAccountFromSecret', + 'parity_setAccountMeta', + 'parity_setAccountName', + 'parity_postTransaction', + 'parity_phraseToAddress', + 'parity_useLocalAccounts', + 'parity_listGethAccounts', + 'parity_listOpenedVaults', + 'parity_listRecentDapps', + 'parity_listVaults', + 'parity_killAccount', + 'parity_testPassword', + 'signer_confirmRequest', + 'signer_rejectRequest', + 'signer_requestsToConfirm' + ].map((method) => { + return transport + .execute(method) + .then((result) => { + expect(result).not.to.be.equal(RPC_RESPONSE); + }) + // Some errors are expected here since we are calling methods + // without parameters. + .catch((_) => {}); + })); + }); + + it('allows non-registered methods through', () => { + return transport + .execute('eth_getBalance', '0x407d73d8a49eeb85d32cf465507dd71d507100c1') + .then((result) => { + expect(result).to.be.equal(RPC_RESPONSE); + }); + }); + + it('can handle `eth_accounts`', () => { + return transport + .execute('eth_accounts') + .then((accounts) => { + expect(accounts.length).to.be.equal(1); + expect(accounts[0]).to.be.equal(ADDRESS); + }); + }); + + it('can handle `parity_defaultAccount`', () => { + return transport + .execute('parity_defaultAccount') + .then((address) => { + expect(address).to.be.equal(ADDRESS); + }); + }); + + it('can handle `parity_phraseToAddress`', () => { + return transport + .execute('parity_phraseToAddress', '') + .then((address) => { + expect(address).to.be.equal(ADDRESS); + + return transport.execute('parity_phraseToAddress', FOO_PHRASE); + }) + .then((address) => { + expect(address).to.be.equal(FOO_ADDRESS); + }); + }); + + it('can create and kill an account', () => { + return transport + .execute('parity_newAccountFromPhrase', FOO_PHRASE, FOO_PASSWORD) + .then((address) => { + expect(address).to.be.equal(FOO_ADDRESS); + + return transport.execute('eth_accounts'); + }) + .then((accounts) => { + expect(accounts.length).to.be.equal(2); + expect(accounts.includes(FOO_ADDRESS)).to.be.true; + + return transport.execute('parity_killAccount', FOO_ADDRESS, FOO_PASSWORD); + }) + .then((result) => { + expect(result).to.be.true; + + return transport.execute('eth_accounts'); + }) + .then((accounts) => { + expect(accounts.length).to.be.equal(1); + expect(accounts.includes(FOO_ADDRESS)).to.be.false; + }); + }); +}); diff --git a/js/src/api/local/transactions.js b/js/src/api/local/transactions.js new file mode 100644 index 000000000..421e73012 --- /dev/null +++ b/js/src/api/local/transactions.js @@ -0,0 +1,147 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { toHex } from '../util/format'; +import { TransportError } from '../transport'; + +const AWAITING = Symbol('awaiting'); +const LOCKED = Symbol('locked'); +const CONFIRMED = Symbol('confirmed'); +const REJECTED = Symbol('rejected'); + +class Transactions { + constructor () { + this.reset(); + } + + // should only really be needed in the constructor and tests + reset () { + this._id = 1; + this._states = {}; + } + + nextId () { + return toHex(this._id++); + } + + add (tx) { + const id = this.nextId(); + + this._states[id] = { + status: AWAITING, + transaction: tx + }; + + return id; + } + + get (id) { + const state = this._states[id]; + + if (!state || state.status !== AWAITING) { + return null; + } + + return state.transaction; + } + + lock (id) { + const state = this._states[id]; + + if (!state || state.status !== AWAITING) { + throw new Error('Trying to lock an invalid transaction'); + } + + state.status = LOCKED; + } + + unlock (id) { + const state = this._states[id]; + + if (!state || state.status !== LOCKED) { + throw new Error('Trying to unlock an invalid transaction'); + } + + state.status = AWAITING; + } + + hash (id) { + const state = this._states[id]; + + if (!state) { + return null; + } + + switch (state.status) { + case REJECTED: + throw TransportError.requestRejected(); + case CONFIRMED: + return state.hash; + default: + return null; + } + } + + confirm (id, hash) { + const state = this._states[id]; + const status = state ? state.status : null; + + switch (status) { + case AWAITING: break; + case LOCKED: break; + default: throw new Error('Trying to confirm an invalid transaction'); + } + + state.hash = hash; + state.status = CONFIRMED; + } + + reject (id) { + const state = this._states[id]; + + if (!state) { + return false; + } + + state.status = REJECTED; + + return true; + } + + requestsToConfirm () { + const result = []; + + Object.keys(this._states).forEach((id) => { + const state = this._states[id]; + + if (state.status === AWAITING) { + result.push({ + id, + origin: { + signer: '0x0' + }, + payload: { + sendTransaction: state.transaction + } + }); + } + }); + + return result; + } +} + +export default new Transactions(); diff --git a/js/src/api/local/transactions.spec.js b/js/src/api/local/transactions.spec.js new file mode 100644 index 000000000..65f2d8ddc --- /dev/null +++ b/js/src/api/local/transactions.spec.js @@ -0,0 +1,85 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import transactions from './transactions'; +import { TransportError } from '../transport/error'; + +const DUMMY_TX = 'dummy'; + +describe('api/local/transactions', () => { + beforeEach(() => { + transactions.reset(); + }); + + it('can store transactions', () => { + const id1 = transactions.add(DUMMY_TX); + const id2 = transactions.add(DUMMY_TX); + const requests = transactions.requestsToConfirm(); + + expect(id1).to.be.equal('0x1'); + expect(id2).to.be.equal('0x2'); + expect(requests.length).to.be.equal(2); + expect(requests[0].id).to.be.equal(id1); + expect(requests[1].id).to.be.equal(id2); + expect(requests[0].payload.sendTransaction).to.be.equal(DUMMY_TX); + expect(requests[1].payload.sendTransaction).to.be.equal(DUMMY_TX); + }); + + it('can confirm transactions', () => { + const id1 = transactions.add(DUMMY_TX); + const id2 = transactions.add(DUMMY_TX); + + const hash1 = '0x1111111111111111111111111111111111111111'; + const hash2 = '0x2222222222222222222222222222222222222222'; + + transactions.confirm(id1, hash1); + transactions.confirm(id2, hash2); + + const requests = transactions.requestsToConfirm(); + + expect(requests.length).to.be.equal(0); + expect(transactions.hash(id1)).to.be.equal(hash1); + expect(transactions.hash(id2)).to.be.equal(hash2); + }); + + it('can reject transactions', () => { + const id = transactions.add(DUMMY_TX); + + transactions.reject(id); + + const requests = transactions.requestsToConfirm(); + + expect(requests.length).to.be.equal(0); + expect(() => transactions.hash(id)).to.throw(TransportError); + }); + + it('can lock and confirm transactions', () => { + const id = transactions.add(DUMMY_TX); + const hash = '0x1111111111111111111111111111111111111111'; + + transactions.lock(id); + + const requests = transactions.requestsToConfirm(); + + expect(requests.length).to.be.equal(0); + expect(transactions.get(id)).to.be.null; + expect(transactions.hash(id)).to.be.null; + + transactions.confirm(id, hash); + + expect(transactions.hash(id)).to.be.equal(hash); + }); +}); diff --git a/js/src/api/pubsub/eth/eth.js b/js/src/api/pubsub/eth/eth.js new file mode 100644 index 000000000..044473ec6 --- /dev/null +++ b/js/src/api/pubsub/eth/eth.js @@ -0,0 +1,227 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +import PubsubBase from '../pubsubBase'; + +import { inAddress, inBlockNumber, inHex, inNumber16, inOptions, inFilter } from '../../format/input'; +import { outAddress, outBlock, outNumber, outTransaction, outSyncing, outReceipt, outLog } from '../../format/output'; + +export default class Eth extends PubsubBase { + constructor (transport) { + super(transport); + this._api = 'parity'; + } + + newHeads (callback) { + return this.addListener('eth', 'newHeads', callback, null); + } + + logs (callback) { + throw Error('not supported yet'); + } + + // eth API + protocolVersion (callback) { + return this.addListener(this._api, 'eth_protocolVersion', callback); + } + + syncing (callback) { + return this.addListener(this._api, 'eth_syncing', (error, data) => { + error + ? callback(error) + : callback(null, outSyncing(data)); + }); + } + + hashrate (callback) { + return this.addListener(this._api, 'eth_hashrate', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + coinbase (callback) { + return this.addListener(this._api, 'eth_coinbase', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }); + } + + mining (callback) { + return this.addListener(this._api, 'eth_mining', callback); + } + + gasPrice (callback) { + return this.addListener(this._api, 'eth_gasPrice', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + accounts (callback) { + return this.addListener(this._api, 'eth_accounts', (error, accounts) => { + error + ? callback(error) + : callback(null, (accounts || []).map(outAddress)); + }); + } + + blockNumber (callback) { + return this.addListener(this._api, 'eth_blockNumber', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + getBalance (callback, address, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_getBalance', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inAddress(address), inBlockNumber(blockNumber)]); + } + + getStorageAt (callback, address, index = 0, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_getStorageAt', callback, [inAddress(address), inNumber16(index), inBlockNumber(blockNumber)]); + } + + getBlockByHash (callback, hash, full = false) { + return this.addListener(this._api, 'eth_getBlockByHash', (error, data) => { + error + ? callback(error) + : callback(null, outBlock(data)); + }, [inHex(hash), full]); + } + + getBlockByNumber (callback, blockNumber = 'latest', full = false) { + return this.addListener(this._api, 'eth_getBlockByNumber', (error, data) => { + error + ? callback(error) + : callback(null, outBlock(data)); + }, [inBlockNumber(blockNumber), full]); + } + + getTransactionCount (callback, address, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_getTransactionCount', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inAddress(address), inBlockNumber(blockNumber)]); + } + + getBlockTransactionCountByHash (callback, hash) { + return this.addListener(this._api, 'eth_getBlockTransactionCountByHash', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inHex(hash)]); + } + + getBlockTransactionCountByNumber (callback, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_getBlockTransactionCountByNumber', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inBlockNumber(blockNumber)]); + } + + getUncleCountByBlockHash (callback, hash) { + return this.addListener(this._api, 'eth_getUncleCountByBlockHash', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inHex(hash)]); + } + + getUncleCountByBlockNumber (callback, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_getUncleCountByBlockNumber', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inBlockNumber(blockNumber)]); + } + + getCode (callback, address, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_getCode', callback, [inAddress(address), inBlockNumber(blockNumber)]); + } + + call (callback, options, blockNumber = 'latest') { + return this.addListener(this._api, 'eth_call', callback, [inOptions(options), inBlockNumber(blockNumber)]); + } + + estimateGas (callback, options) { + return this.addListener(this._api, 'eth_estimateGas', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inOptions(options)]); + } + + getTransactionByHash (callback, hash) { + return this.addListener(this._api, 'eth_getTransactionByHash', (error, data) => { + error + ? callback(error) + : callback(null, outTransaction(data)); + }, [inHex(hash)]); + } + + getTransactionByBlockHashAndIndex (callback, hash, index = 0) { + return this.addListener(this._api, 'eth_getTransactionByBlockHashAndIndex', (error, data) => { + error + ? callback(error) + : callback(null, outTransaction(data)); + }, [inHex(hash), inNumber16(index)]); + } + + getTransactionByBlockNumberAndIndex (callback, blockNumber = 'latest', index = 0) { + return this.addListener(this._api, 'eth_getTransactionByBlockNumberAndIndex', (error, data) => { + error + ? callback(error) + : callback(null, outTransaction(data)); + }, [inBlockNumber(blockNumber), inNumber16(index)]); + } + + getTransactionReceipt (callback, txhash) { + return this.addListener(this._api, 'eth_getTransactionReceipt', (error, data) => { + error + ? callback(error) + : callback(null, outReceipt(data)); + }, [inHex(txhash)]); + } + + getUncleByBlockHashAndIndex (callback, hash, index = 0) { + return this.addListener(this._api, 'eth_getUncleByBlockHashAndIndex', callback, [inHex(hash), inNumber16(index)]); + } + + getUncleByBlockNumberAndIndex (callback, blockNumber = 'latest', index = 0) { + return this.addListener(this._api, 'eth_getUncleByBlockNumberAndIndex', callback, [inBlockNumber(blockNumber), inNumber16(index)]); + } + + getLogs (callback, options) { + return this.addListener(this._api, 'eth_getLogs', (error, logs) => { + error + ? callback(error) + : callback(null, (logs) => logs.map(outLog)); + }, [inFilter(options)]); + } + + getWork (callback) { + return this.addListener(this._api, 'eth_getWork', callback); + } +} diff --git a/js/src/api/pubsub/eth/index.js b/js/src/api/pubsub/eth/index.js new file mode 100644 index 000000000..3b8d1994c --- /dev/null +++ b/js/src/api/pubsub/eth/index.js @@ -0,0 +1,16 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +export default from './eth'; diff --git a/js/src/api/pubsub/index.js b/js/src/api/pubsub/index.js new file mode 100644 index 000000000..bf342e1de --- /dev/null +++ b/js/src/api/pubsub/index.js @@ -0,0 +1,16 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +export default from './pubsub'; diff --git a/js/src/api/pubsub/net/index.js b/js/src/api/pubsub/net/index.js new file mode 100644 index 000000000..6d13847c5 --- /dev/null +++ b/js/src/api/pubsub/net/index.js @@ -0,0 +1,16 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +export default from './net'; diff --git a/js/src/api/pubsub/net/net.js b/js/src/api/pubsub/net/net.js new file mode 100644 index 000000000..e1dc3c4e1 --- /dev/null +++ b/js/src/api/pubsub/net/net.js @@ -0,0 +1,42 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +import PubsubBase from '../pubsubBase'; + +import { outNumber } from '../../format/output'; + +export default class Net extends PubsubBase { + constructor (transport) { + super(transport); + this._api = 'parity'; + } + + // net API + version (callback) { + return this.addListener(this._api, 'net_version', callback); + } + + peerCount (callback) { + return this.addListener(this._api, 'net_peerCount', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + listening (callback) { + return this.addListener(this._api, 'net_listening', callback); + } +} diff --git a/js/src/api/pubsub/parity/index.js b/js/src/api/pubsub/parity/index.js new file mode 100644 index 000000000..33ce7aa7f --- /dev/null +++ b/js/src/api/pubsub/parity/index.js @@ -0,0 +1,16 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +export default from './parity'; diff --git a/js/src/api/pubsub/parity/parity.js b/js/src/api/pubsub/parity/parity.js new file mode 100644 index 000000000..042d8dc8b --- /dev/null +++ b/js/src/api/pubsub/parity/parity.js @@ -0,0 +1,364 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import PubsubBase from '../pubsubBase'; +import { inAddress, inBlockNumber, inData, inHex, inDeriveHash, inDeriveIndex } from '../../format/input'; +import { outAccountInfo, outAddress, outBlock, outChainStatus, outHistogram, outHwAccountInfo, outNodeKind, outNumber, outPeers, outTransaction, outAddresses, outRecentDapps, outVaultMeta } from '../../format/output'; + +export default class Parity extends PubsubBase { + constructor (transport) { + super(transport); + this._api = 'parity'; + } + + // parity API + accountsInfo (callback) { + return this.addListener(this._api, 'parity_accountsInfo', (error, data) => { + error + ? callback(error) + : callback(null, outAccountInfo(data)); + }); + } + + hardwareAccountsInfo (callback) { + return this.addListener(this._api, 'parity_hardwareAccountsInfo', (error, data) => { + error + ? callback(error) + : callback(null, outHwAccountInfo(data)); + }); + } + + defaultAccount (callback) { + return this.addListener(this._api, 'parity_defaultAccount', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }); + } + + transactionsLimit (callback) { + return this.addListener(this._api, 'parity_transactionsLimit', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + extraData (callback) { + return this.addListener(this._api, 'parity_extraData', callback); + } + + gasFloorTarget (callback) { + return this.addListener(this._api, 'parity_gasFloorTarget', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + gasCeilTarget (callback) { + return this.addListener(this._api, 'parity_gasCeilTarget', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + minGasPrice (callback) { + return this.addListener(this._api, 'parity_minGasPrice', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + devLogs (callback) { + return this.addListener(this._api, 'parity_devLogs', callback); + } + + devLogsLevels (callback) { + return this.addListener(this._api, 'parity_devLogsLevels', callback); + } + + netChain (callback) { + return this.addListener(this._api, 'parity_netChain', callback); + } + + netPeers (callback) { + return this.addListener(this._api, 'parity_netPeers', (error, data) => { + error + ? callback(error) + : callback(null, outPeers(data)); + }); + } + + netPort (callback) { + return this.addListener(this._api, 'parity_netPort', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + rpcSettings (callback) { + return this.addListener(this._api, 'parity_rpcSettings', callback); + } + + nodeName (callback) { + return this.addListener(this._api, 'parity_nodeName', callback); + } + + defaultExtraData (callback) { + return this.addListener(this._api, 'parity_defaultExtraData', callback); + } + + gasPriceHistogram (callback) { + return this.addListener(this._api, 'parity_gasPriceHistogram', (error, data) => { + error + ? callback(error) + : callback(null, outHistogram(data)); + }); + } + + unsignedTransactionsCount (callback) { + return this.addListener(this._api, 'parity_unsignedTransactionsCount', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }); + } + + registryAddress (callback) { + return this.addListener(this._api, 'parity_registryAddress', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }); + } + + listAccounts (callback, count, offset = null, blockNumber = 'latest') { + return this.addListener(this._api, 'parity_listAccounts', (error, data) => { + error + ? callback(error) + : callback(null, (data) => (data || []).map(outAddress)); + }, [count, inAddress(offset), inBlockNumber(blockNumber)]); + } + + listStorageKeys (callback, address, count, hash = null, blockNumber = 'latest') { + return this.addListener(this._api, 'parity_listStorageKeys', callback, [inAddress(address), count, inHex(hash), inBlockNumber(blockNumber)]); + } + + pendingTransactions (callback) { + return this.addListener(this._api, 'parity_pendingTransactions', (error, data) => { + error + ? callback(error) + : callback(null, outTransaction(data)); + }); + } + + futureTransactions (callback) { + return this.addListener(this._api, 'parity_futureTransactions', (error, data) => { + error + ? callback(error) + : callback(null, outTransaction(data)); + }); + } + + pendingTransactionsStats (callback) { + return this.addListener(this._api, 'parity_pendingTransactionsStats', callback); + } + + localTransactions (callback) { + return this.addListener(this._api, 'parity_localTransactions', (error, transactions) => { + if (error) { + return callback(error); + } + + Object.values(transactions) + .filter(tx => tx.transaction) + .map(tx => { + tx.transaction = outTransaction(tx.transaction); + }); + + callback(null, transactions); + }); + } + + dappsUrl (callback) { + return this.addListener(this._api, 'parity_dappsUrl', callback); + } + + wsUrl (callback) { + return this.addListener(this._api, 'parity_wsUrl', callback); + } + + nextNonce (callback, account) { + return this.addListener(this._api, 'parity_nextNonce', (error, data) => { + error + ? callback(error) + : callback(null, outNumber(data)); + }, [inAddress(account)]); + } + + mode (callback) { + return this.addListener(this._api, 'parity_mode', callback); + } + + chain (callback) { + return this.addListener(this._api, 'parity_chain', callback); + } + + enode (callback) { + return this.addListener(this._api, 'parity_enode', callback); + } + + consensusCapability (callback) { + return this.addListener(this._api, 'parity_consensusCapability', callback); + } + + versionInfo (callback) { + return this.addListener(this._api, 'parity_versionInfo', callback); + } + + releasesInfo (callback) { + return this.addListener(this._api, 'parity_releasesInfo', callback); + } + + chainStatus (callback) { + return this.addListener(this._api, 'parity_chainStatus', (error, data) => { + error + ? callback(error) + : callback(null, outChainStatus(data)); + }); + } + + nodeKind (callback) { + return this.addListener(this._api, 'parity_nodeKind', (error, data) => { + error + ? callback(error) + : callback(null, outNodeKind(data)); + }); + } + + getBlockHeaderByNumber (callback, blockNumber = 'latest') { + return this.addListener(this._api, 'parity_getBlockHeaderByNumber', (error, data) => { + error + ? callback(error) + : callback(null, outBlock(data)); + }, [inBlockNumber(blockNumber)]); + } + + cidV0 (callback, data) { + return this.addListener(this._api, 'parity_cidV0', callback, [inData(data)]); + } + + // parity accounts API (only secure API or configured to be exposed) + allAccountsInfo (callback) { + return this.addListener(this._api, 'parity_allAccountsInfo', (error, data) => { + error + ? callback(error) + : callback(null, outAccountInfo(data)); + }); + } + + getDappAddresses (callback, dappId) { + return this.addListener(this._api, 'parity_getDappAddresses', (error, data) => { + error + ? callback(error) + : callback(null, outAddresses(data)); + }, [dappId]); + } + + getDappDefaultAddress (callback, dappId) { + return this.addListener(this._api, 'parity_getDappDefaultAddress', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }, [dappId]); + } + + getNewDappsAddresses (callback) { + return this.addListener(this._api, 'parity_getDappDefaultAddress', (error, addresses) => { + error + ? callback(error) + : callback(null, addresses ? addresses.map(outAddress) : null); + }); + } + + getNewDappsDefaultAddress (callback) { + return this.addListener(this._api, 'parity_getNewDappsDefaultAddress', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }); + } + + listRecentDapps (callback) { + return this.addListener(this._api, 'parity_listRecentDapps', (error, data) => { + error + ? callback(error) + : callback(null, outRecentDapps(data)); + }); + } + + listGethAccounts (callback) { + return this.addListener(this._api, 'parity_listGethAccounts', (error, data) => { + error + ? callback(error) + : callback(null, outAddresses(data)); + }); + } + + listVaults (callback) { + return this.addListener(this._api, 'parity_listVaults', callback); + } + + listOpenedVaults (callback) { + return this.addListener(this._api, 'parity_listOpenedVaults', callback); + } + + getVaultMeta (callback, vaultName) { + return this.addListener(this._api, 'parity_getVaultMeta', (error, data) => { + error + ? callback(error) + : callback(null, outVaultMeta(data)); + }, [vaultName]); + } + + deriveAddressHash (callback, address, password, hash, shouldSave) { + return this.addListener(this._api, 'parity_deriveAddressHash', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }, [inAddress(address), password, inDeriveHash(hash), !!shouldSave]); + } + + deriveAddressIndex (callback, address, password, index, shouldSave) { + return this.addListener(this._api, 'parity_deriveAddressIndex', (error, data) => { + error + ? callback(error) + : callback(null, outAddress(data)); + }, [inAddress(address), password, inDeriveIndex(index), !!shouldSave]); + } + + nodeHealth (callback) { + return this.addListener(this._api, 'parity_nodeHealth', (error, data) => { + error + ? callback(error) + : callback(null, data); + }); + } +} diff --git a/js/src/api/pubsub/pubsub.js b/js/src/api/pubsub/pubsub.js new file mode 100644 index 000000000..4420967ee --- /dev/null +++ b/js/src/api/pubsub/pubsub.js @@ -0,0 +1,79 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Eth from './eth'; +import Parity from './parity'; +import Signer from './signer'; +import Net from './net'; + +import { isFunction } from '../util/types'; + +export default class Pubsub { + constructor (transport) { + if (!transport || !isFunction(transport.subscribe)) { + throw new Error('Pubsub API needs transport with subscribe() function defined. (WebSocket)'); + } + + this._eth = new Eth(transport); + this._net = new Net(transport); + this._parity = new Parity(transport); + this._signer = new Signer(transport); + } + + get net () { + return this._net; + } + + get eth () { + return this._eth; + } + + get parity () { + return this._parity; + } + + get signer () { + return this._signer; + } + + unsubscribe (subscriptionIds) { + // subscriptions are namespace independent. Thus we can simply removeListener from any. + return this._parity.removeListener(subscriptionIds); + } + + subscribeAndGetResult (f, callback) { + return new Promise((resolve, reject) => { + let isFirst = true; + let onSubscription = (error, data) => { + const p1 = error ? Promise.reject(error) : Promise.resolve(data); + const p2 = p1.then(callback); + + if (isFirst) { + isFirst = false; + p2 + .then(resolve) + .catch(reject); + } + }; + + try { + f.call(this, onSubscription).catch(reject); + } catch (err) { + reject(err); + } + }); + } +} diff --git a/js/src/api/pubsub/pubsub.spec.js b/js/src/api/pubsub/pubsub.spec.js new file mode 100644 index 000000000..10fcd2edb --- /dev/null +++ b/js/src/api/pubsub/pubsub.spec.js @@ -0,0 +1,613 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import { TEST_WS_URL, mockWs } from '../../../test/mockRpc'; +import { isBigNumber } from '../../../test/types'; + +import Ws from '../transport/ws'; +import Pubsub from './pubsub'; + +describe('api/pubsub/Pubsub', () => { + let scope; + let instance; + const address = '0x63Cf90D3f0410092FC0fca41846f596223979195'; + + describe('accountsInfo', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: { + '0x63cf90d3f0410092fc0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: '{"data":"data"}' + } + }, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('retrieves the available account info', (done) => { + instance.parity.accountsInfo((error, result) => { + expect(error).to.be.null; + expect(result).to.deep.equal({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: { + data: 'data' + } + } + }); + done(); + }); + }); + }); + + describe('Unsubscribe', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2 }, + { method: 'parity_unsubscribe', reply: true }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('Promise gets resolved on success.', (done) => { + instance.parity.accountsInfo().then(s => { + instance.parity.unsubscribe(s).then(b => { + expect(b).to.be.true; + }); + }); + done(); + }); + }); + + describe('chainStatus', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: { + 'blockGap': [0x123, 0x456] + }, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('retrieves the chain status', (done) => { + instance.parity.chainStatus((error, result) => { + expect(error).to.be.null; + expect(result).to.deep.equal({ + 'blockGap': [new BigNumber(0x123), new BigNumber(0x456)] + }); + done(); + }); + }); + }); + + describe('gasFloorTarget', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123456', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the gasfloor, formatted', (done) => { + instance.parity.gasFloorTarget((error, result) => { + expect(error).to.be.null; + expect(isBigNumber(result)).to.be.true; + expect(result.eq(0x123456)).to.be.true; + done(); + }); + }); + }); + + describe('transactionsLimit', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: 1024, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the tx limit, formatted', (done) => { + instance.parity.transactionsLimit((error, result) => { + expect(error).to.be.null; + expect(isBigNumber(result)).to.be.true; + expect(result.eq(1024)).to.be.true; + done(); + }); + }); + }); + + describe('minGasPrice', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123456', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the min gasprice, formatted', (done) => { + instance.parity.minGasPrice((error, result) => { + expect(error).to.be.null; + expect(isBigNumber(result)).to.be.true; + expect(result.eq(0x123456)).to.be.true; + done(); + }); + }); + }); + + describe('netPeers', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: { active: 123, connected: 456, max: 789, peers: [] }, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the peer structure, formatted', (done) => { + instance.parity.netPeers((error, peers) => { + expect(error).to.be.null; + expect(peers.active.eq(123)).to.be.true; + expect(peers.connected.eq(456)).to.be.true; + expect(peers.max.eq(789)).to.be.true; + done(); + }); + }); + }); + + describe('netPort', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: 33030, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the connected port, formatted', (done) => { + instance.parity.netPort((error, count) => { + expect(error).to.be.null; + expect(isBigNumber(count)).to.be.true; + expect(count.eq(33030)).to.be.true; + done(); + }); + }); + }); + +// Eth API + describe('accounts', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: [address.toLowerCase()], + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns a list of accounts, formatted', (done) => { + instance.eth.accounts((error, accounts) => { + expect(error).to.be.null; + expect(accounts).to.deep.equal([address]); + done(); + }); + }); + }); + + describe('newHeads', () => { + beforeEach(() => { + scope = mockWs([{ method: 'eth_subscribe', reply: 2, subscription: { + method: 'eth_subscription', + params: { + result: '0x123456', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns newHeads for eth_subscribe', (done) => { + instance.eth.newHeads((error, blockNumber) => { + expect(error).to.be.null; + expect(blockNumber).to.equal('0x123456'); + done(); + }); + }); + }); + + describe('blockNumber', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123456', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the current blockNumber, formatted', (done) => { + instance.eth.blockNumber((error, blockNumber) => { + expect(error).to.be.null; + expect(isBigNumber(blockNumber)).to.be.true; + expect(blockNumber.toString(16)).to.equal('123456'); + done(); + }); + }); + }); + + describe('call', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: [], + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('formats the input options & blockNumber', (done) => { + instance.eth.call((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_call', [{ data: '0x12345678' }, 'earliest']]); + done(); + }, { data: '12345678' }, 'earliest'); + }); + + it('provides a latest blockNumber when not specified', (done) => { + instance.eth.call((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_call', [{ data: '0x12345678' }, 'latest']]); + done(); + }, { data: '12345678' }); + }); + }); + + describe('coinbase', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: address.toLowerCase(), + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the coinbase, formatted', (done) => { + instance.eth.coinbase((error, account) => { + expect(error).to.be.null; + expect(account).to.deep.equal(address); + done(); + }); + }); + }); + + describe('estimateGas', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('converts the options correctly', (done) => { + instance.eth.estimateGas((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_estimateGas', [{ gas: '0x5208' }]]); + done(); + }, { gas: 21000 }); + }); + + it('returns the gas used, formatted', (done) => { + instance.eth.estimateGas((error, gas) => { + expect(error).to.be.null; + expect(isBigNumber(gas)).to.be.true; + expect(gas.toString(16)).to.deep.equal('123'); + done(); + }); + }); + }); + + describe('gasPrice', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns the gas price, formatted', (done) => { + instance.eth.gasPrice((error, price) => { + expect(error).to.be.null; + expect(isBigNumber(price)).to.be.true; + expect(price.toString(16)).to.deep.equal('123'); + done(); + }); + }); + }); + + describe('getBalance', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('passes in the address (default blockNumber)', (done) => { + instance.eth.getBalance((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBalance', [address.toLowerCase(), 'latest']]); + done(); + }, address); + }); + + it('passes in the address & blockNumber', (done) => { + instance.eth.getBalance((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBalance', [address.toLowerCase(), '0x456']]); + done(); + }, address, 0x456); + }); + + it('returns the balance', (done) => { + instance.eth.getBalance((error, balance) => { + expect(error).to.be.null; + expect(isBigNumber(balance)).to.be.true; + expect(balance.toString(16)).to.deep.equal('123'); + done(); + }, address); + }); + }); + + describe('getBlockByHash', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: { miner: address.toLowerCase() }, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('formats the input hash as a hash, default full', (done) => { + instance.eth.getBlockByHash((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByHash', ['0x1234', false]]); + done(); + }, '1234'); + }); + + it('formats the input hash as a hash, full true', (done) => { + instance.eth.getBlockByHash((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByHash', ['0x1234', true]]); + done(); + }, '1234', true); + }); + + it('formats the output into block', (done) => { + instance.eth.getBlockByHash((error, block) => { + expect(error).to.be.null; + expect(block.miner).to.equal(address); + done(); + }, '1234'); + }); + }); + + describe('getBlockByNumber', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: { miner: address.toLowerCase() }, + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('assumes blockNumber latest & full false', (done) => { + instance.eth.getBlockByNumber((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByNumber', ['latest', false]]); + done(); + }); + }); + + it('uses input blockNumber & full false', (done) => { + instance.eth.getBlockByNumber((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByNumber', ['0x1234', false]]); + done(); + }, '0x1234'); + }); + + it('formats the input blockNumber, full true', (done) => { + instance.eth.getBlockByNumber((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getBlockByNumber', ['0x1234', true]]); + done(); + }, 0x1234, true); + }); + + it('formats the output into block', (done) => { + instance.eth.getBlockByNumber((error, block) => { + expect(error).to.be.null; + expect(block.miner).to.equal(address); + done(); + }, 0x1234); + }); + }); + + describe('getTransactionCount', () => { + beforeEach(() => { + scope = mockWs([{ method: 'parity_subscribe', reply: 2, subscription: { + method: 'parity_subscription', + params: { + result: '0x123', + subscription: 2 + } + } }]); + instance = new Pubsub(new Ws(TEST_WS_URL)); + }); + + afterEach(() => { + scope.stop(); + }); + + it('passes in the address (default blockNumber)', (done) => { + instance.eth.getTransactionCount((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getTransactionCount', [address.toLowerCase(), 'latest']]); + done(); + }, address); + }); + + it('passes in the address & blockNumber', (done) => { + instance.eth.getTransactionCount((error) => { + expect(error).to.be.null; + expect(scope.body.parity_subscribe.params).to.deep.equal(['eth_getTransactionCount', [address.toLowerCase(), '0x456']]); + done(); + }, address, 0x456); + }); + + it('returns the count, formatted', (done) => { + instance.eth.getTransactionCount((error, count) => { + expect(error).to.be.null; + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); + done(); + }, address, 0x456); + }); + }); +}); diff --git a/js/src/api/pubsub/pubsubBase.js b/js/src/api/pubsub/pubsubBase.js new file mode 100644 index 000000000..c50f45775 --- /dev/null +++ b/js/src/api/pubsub/pubsubBase.js @@ -0,0 +1,38 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class PubsubBase { + // Provider for websocket pubsub transport + constructor (transport) { + this._transport = transport; + } + + addListener (module, eventName, callback, eventParams = []) { + if (eventName) { + return this._transport.subscribe(module, callback, eventParams ? [eventName, eventParams] : [eventName]); + } + + return this._transport.subscribe(module, callback, eventParams); + } + + removeListener (subscriptionIds) { + return this._transport.unsubscribe(subscriptionIds); + } + + unsubscribe (subscriptionIds) { + return this.removeListener(subscriptionIds); + } +} diff --git a/js/src/api/pubsub/signer/index.js b/js/src/api/pubsub/signer/index.js new file mode 100644 index 000000000..caa410722 --- /dev/null +++ b/js/src/api/pubsub/signer/index.js @@ -0,0 +1,16 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +export default from './signer'; diff --git a/js/src/api/pubsub/signer/signer.js b/js/src/api/pubsub/signer/signer.js new file mode 100644 index 000000000..266da6b8a --- /dev/null +++ b/js/src/api/pubsub/signer/signer.js @@ -0,0 +1,37 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . +import PubsubBase from '../pubsubBase'; + +import { outSignerRequest } from '../../format/output'; + +export default class Net extends PubsubBase { + constructor (transport) { + super(transport); + this._api = { + subscribe: 'signer_subscribePending', + unsubscribe: 'signer_unsubscribePending', + subscription: 'signer_pending' + }; + } + + pendingRequests (callback) { + return this.addListener(this._api, null, (error, data) => { + error + ? callback(error) + : callback(null, data.map(outSignerRequest)); + }); + } +} diff --git a/js/src/api/rpc/db/db.js b/js/src/api/rpc/db/db.js new file mode 100644 index 000000000..c87911b8d --- /dev/null +++ b/js/src/api/rpc/db/db.js @@ -0,0 +1,43 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { inHex } from '../../format/input'; + +export default class Db { + constructor (transport) { + this._transport = transport; + } + + getHex (dbName, keyName) { + return this._transport + .execute('db_getHex', dbName, keyName); + } + + getString (dbName, keyName) { + return this._transport + .execute('db_getString', dbName, keyName); + } + + putHex (dbName, keyName, hexData) { + return this._transport + .execute('db_putHex', dbName, keyName, inHex(hexData)); + } + + putString (dbName, keyName, stringData) { + return this._transport + .execute('db_putString', dbName, keyName, stringData); + } +} diff --git a/js/src/api/rpc/db/db.spec.js b/js/src/api/rpc/db/db.spec.js new file mode 100644 index 000000000..94256931b --- /dev/null +++ b/js/src/api/rpc/db/db.spec.js @@ -0,0 +1,38 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; + +import Http from '../../transport/http'; +import Db from './db'; + +const instance = new Db(new Http(TEST_HTTP_URL, -1)); + +describe('api/rpc/Db', () => { + let scope; + + describe('putHex', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'db_putHex', reply: { result: [] } }]); + }); + + it('formats the inputs correctly', () => { + return instance.putHex('db', 'key', '1234').then(() => { + expect(scope.body.db_putHex.params).to.deep.equal(['db', 'key', '0x1234']); + }); + }); + }); +}); diff --git a/js/src/api/rpc/db/index.js b/js/src/api/rpc/db/index.js new file mode 100644 index 000000000..0dc25441b --- /dev/null +++ b/js/src/api/rpc/db/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './db'; diff --git a/js/src/api/rpc/eth/eth.e2e.js b/js/src/api/rpc/eth/eth.e2e.js new file mode 100644 index 000000000..1c8d95a0b --- /dev/null +++ b/js/src/api/rpc/eth/eth.e2e.js @@ -0,0 +1,170 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { createHttpApi } from '../../../../test/e2e/ethapi'; +import { isAddress } from '../../../../test/types'; + +describe('ethapi.eth', () => { + const ethapi = createHttpApi(); + const address = '0x63cf90d3f0410092fc0fca41846f596223979195'; + + let latestBlockNumber; + let latestBlockHash; + + describe('accounts', () => { + it('returns the available accounts', () => { + return ethapi.eth.accounts().then((accounts) => { + accounts.forEach((account) => { + expect(isAddress(account)).to.be.true; + }); + }); + }); + }); + + describe('blockNumber', () => { + it('returns the current blockNumber', () => { + return ethapi.eth.blockNumber().then((blockNumber) => { + latestBlockNumber = blockNumber; + expect(blockNumber.gt(0xabcde)).to.be.true; + }); + }); + }); + + describe('coinbase', () => { + it('returns the coinbase', () => { + return ethapi.eth.coinbase().then((coinbase) => { + expect(isAddress(coinbase)).to.be.true; + }); + }); + }); + + describe('gasPrice', () => { + it('returns the current gasPrice', () => { + return ethapi.eth.gasPrice().then((gasPrice) => { + expect(gasPrice.gt(0)).to.be.true; + }); + }); + }); + + describe('getBalance', () => { + it('returns the balance for latest block', () => { + return ethapi.eth.getBalance(address).then((balance) => { + expect(balance.gt(0)).to.be.true; + }); + }); + + it('returns the balance for a very early block', () => { + const atBlock = '0x65432'; + const atValue = '18e07120a6e164fee1b'; + + return ethapi.eth + .getBalance(address, atBlock) + .then((balance) => { + expect(balance.toString(16)).to.equal(atValue); + }) + .catch((error) => { + // Parity doesn't support pruned-before-block balance lookups + expect(error.message).to.match(/not supported/); + }); + }); + + it('returns the balance for a recent/out-of-pruning-range block', () => { + return ethapi.eth + .getBalance(address, latestBlockNumber.minus(1000)) + .then((balance) => { + expect(balance.gt(0)).to.be.true; + }); + }); + }); + + describe('getBlockByNumber', () => { + it('returns the latest block', () => { + return ethapi.eth.getBlockByNumber().then((block) => { + expect(block).to.be.ok; + }); + }); + + it('returns a block by blockNumber', () => { + return ethapi.eth.getBlockByNumber(latestBlockNumber).then((block) => { + latestBlockHash = block.hash; + expect(block).to.be.ok; + }); + }); + + it('returns a block by blockNumber (full)', () => { + return ethapi.eth.getBlockByNumber(latestBlockNumber, true).then((block) => { + expect(block).to.be.ok; + }); + }); + }); + + describe('getBlockByHash', () => { + it('returns the specified block', () => { + return ethapi.eth.getBlockByHash(latestBlockHash).then((block) => { + expect(block).to.be.ok; + expect(block.hash).to.equal(latestBlockHash); + }); + }); + + it('returns the specified block (full)', () => { + return ethapi.eth.getBlockByHash(latestBlockHash, true).then((block) => { + expect(block).to.be.ok; + expect(block.hash).to.equal(latestBlockHash); + }); + }); + }); + + describe('getBlockTransactionCountByHash', () => { + it('returns the transactions of the specified hash', () => { + return ethapi.eth.getBlockTransactionCountByHash(latestBlockHash).then((count) => { + expect(count).to.be.ok; + expect(count.gte(0)).to.be.true; + }); + }); + }); + + describe('getBlockTransactionCountByNumber', () => { + it('returns the transactions of latest', () => { + return ethapi.eth.getBlockTransactionCountByNumber().then((count) => { + expect(count).to.be.ok; + expect(count.gte(0)).to.be.true; + }); + }); + + it('returns the transactions of a specified number', () => { + return ethapi.eth.getBlockTransactionCountByNumber(latestBlockNumber).then((count) => { + expect(count).to.be.ok; + expect(count.gte(0)).to.be.true; + }); + }); + }); + + describe('getTransactionCount', () => { + it('returns the count for an address', () => { + return ethapi.eth.getTransactionCount(address).then((count) => { + expect(count).to.be.ok; + expect(count.gte(0x1000c2)).to.be.ok; + }); + }); + + it('returns the count for an address at specified blockNumber', () => { + return ethapi.eth.getTransactionCount(address, latestBlockNumber).then((count) => { + expect(count).to.be.ok; + expect(count.gte(0x1000c2)).to.be.ok; + }); + }); + }); +}); diff --git a/js/src/api/rpc/eth/eth.js b/js/src/api/rpc/eth/eth.js new file mode 100644 index 000000000..ffde938ea --- /dev/null +++ b/js/src/api/rpc/eth/eth.js @@ -0,0 +1,321 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { inAddress, inBlockNumber, inData, inFilter, inHash, inHex, inNumber16, inOptions } from '../../format/input'; +import { outAddress, outBlock, outLog, outNumber, outReceipt, outSyncing, outTransaction } from '../../format/output'; + +export default class Eth { + constructor (transport) { + this._transport = transport; + } + + accounts () { + return this._transport + .execute('eth_accounts') + .then((accounts) => (accounts || []).map(outAddress)); + } + + blockNumber () { + return this._transport + .execute('eth_blockNumber') + .then(outNumber); + } + + call (options, blockNumber = 'latest') { + return this._transport + .execute('eth_call', inOptions(options), inBlockNumber(blockNumber)); + } + + coinbase () { + return this._transport + .execute('eth_coinbase') + .then(outAddress); + } + + compileLLL (code) { + return this._transport + .execute('eth_compileLLL', inData(code)); + } + + compileSerpent (code) { + return this._transport + .execute('eth_compileSerpent', inData(code)); + } + + compileSolidity (code) { + return this._transport + .execute('eth_compileSolidity', inData(code)); + } + + estimateGas (options) { + return this._transport + .execute('eth_estimateGas', inOptions(options)) + .then(outNumber); + } + + fetchQueuedTransactions () { + return this._transport + .execute('eth_fetchQueuedTransactions'); + } + + flush () { + return this._transport + .execute('eth_flush'); + } + + gasPrice () { + return this._transport + .execute('eth_gasPrice') + .then(outNumber); + } + + getBalance (address, blockNumber = 'latest') { + return this._transport + .execute('eth_getBalance', inAddress(address), inBlockNumber(blockNumber)) + .then(outNumber); + } + + getBlockByHash (hash, full = false) { + return this._transport + .execute('eth_getBlockByHash', inHex(hash), full) + .then(outBlock); + } + + getBlockByNumber (blockNumber = 'latest', full = false) { + return this._transport + .execute('eth_getBlockByNumber', inBlockNumber(blockNumber), full) + .then(outBlock); + } + + getBlockTransactionCountByHash (hash) { + return this._transport + .execute('eth_getBlockTransactionCountByHash', inHex(hash)) + .then(outNumber); + } + + getBlockTransactionCountByNumber (blockNumber = 'latest') { + return this._transport + .execute('eth_getBlockTransactionCountByNumber', inBlockNumber(blockNumber)) + .then(outNumber); + } + + getCode (address, blockNumber = 'latest') { + return this._transport + .execute('eth_getCode', inAddress(address), inBlockNumber(blockNumber)); + } + + getCompilers () { + return this._transport + .execute('eth_getCompilers'); + } + + getFilterChanges (filterId) { + return this._transport + .execute('eth_getFilterChanges', inNumber16(filterId)) + .then((logs) => logs.map(outLog)); + } + + getFilterChangesEx (filterId) { + return this._transport + .execute('eth_getFilterChangesEx', inNumber16(filterId)); + } + + getFilterLogs (filterId) { + return this._transport + .execute('eth_getFilterLogs', inNumber16(filterId)) + .then((logs) => logs.map(outLog)); + } + + getFilterLogsEx (filterId) { + return this._transport + .execute('eth_getFilterLogsEx', inNumber16(filterId)); + } + + getLogs (options) { + return this._transport + .execute('eth_getLogs', inFilter(options)) + .then((logs) => logs.map(outLog)); + } + + getLogsEx (options) { + return this._transport + .execute('eth_getLogsEx', inFilter(options)); + } + + getStorageAt (address, index = 0, blockNumber = 'latest') { + return this._transport + .execute('eth_getStorageAt', inAddress(address), inNumber16(index), inBlockNumber(blockNumber)); + } + + getTransactionByBlockHashAndIndex (hash, index = 0) { + return this._transport + .execute('eth_getTransactionByBlockHashAndIndex', inHex(hash), inNumber16(index)) + .then(outTransaction); + } + + getTransactionByBlockNumberAndIndex (blockNumber = 'latest', index = 0) { + return this._transport + .execute('eth_getTransactionByBlockNumberAndIndex', inBlockNumber(blockNumber), inNumber16(index)) + .then(outTransaction); + } + + getTransactionByHash (hash) { + return this._transport + .execute('eth_getTransactionByHash', inHex(hash)) + .then(outTransaction); + } + + getTransactionCount (address, blockNumber = 'latest') { + return this._transport + .execute('eth_getTransactionCount', inAddress(address), inBlockNumber(blockNumber)) + .then(outNumber); + } + + getTransactionReceipt (txhash) { + return this._transport + .execute('eth_getTransactionReceipt', inHex(txhash)) + .then(outReceipt); + } + + getUncleByBlockHashAndIndex (hash, index = 0) { + return this._transport + .execute('eth_getUncleByBlockHashAndIndex', inHex(hash), inNumber16(index)); + } + + getUncleByBlockNumberAndIndex (blockNumber = 'latest', index = 0) { + return this._transport + .execute('eth_getUncleByBlockNumberAndIndex', inBlockNumber(blockNumber), inNumber16(index)); + } + + getUncleCountByBlockHash (hash) { + return this._transport + .execute('eth_getUncleCountByBlockHash', inHex(hash)) + .then(outNumber); + } + + getUncleCountByBlockNumber (blockNumber = 'latest') { + return this._transport + .execute('eth_getUncleCountByBlockNumber', inBlockNumber(blockNumber)) + .then(outNumber); + } + + getWork () { + return this._transport + .execute('eth_getWork'); + } + + hashrate () { + return this._transport + .execute('eth_hashrate') + .then(outNumber); + } + + inspectTransaction () { + return this._transport + .execute('eth_inspectTransaction'); + } + + mining () { + return this._transport + .execute('eth_mining'); + } + + newBlockFilter () { + return this._transport + .execute('eth_newBlockFilter'); + } + + newFilter (options) { + return this._transport + .execute('eth_newFilter', inFilter(options)); + } + + newFilterEx (options) { + return this._transport + .execute('eth_newFilterEx', inFilter(options)); + } + + newPendingTransactionFilter () { + return this._transport + .execute('eth_newPendingTransactionFilter'); + } + + notePassword () { + return this._transport + .execute('eth_notePassword'); + } + + pendingTransactions () { + return this._transport + .execute('eth_pendingTransactions'); + } + + protocolVersion () { + return this._transport + .execute('eth_protocolVersion'); + } + + register () { + return this._transport + .execute('eth_register'); + } + + sendRawTransaction (data) { + return this._transport + .execute('eth_sendRawTransaction', inData(data)); + } + + sendTransaction (options) { + return this._transport + .execute('eth_sendTransaction', inOptions(options)); + } + + sign (address, hash) { + return this._transport + .execute('eth_sign', inAddress(address), inHash(hash)); + } + + signTransaction (options) { + return this._transport + .execute('eth_signTransaction', inOptions(options)); + } + + submitHashrate (hashrate, clientId) { + return this._transport + .execute('eth_submitHashrate', inNumber16(hashrate), clientId); + } + + submitWork (nonce, powHash, mixDigest) { + return this._transport + .execute('eth_submitWork', inNumber16(nonce), powHash, mixDigest); + } + + syncing () { + return this._transport + .execute('eth_syncing') + .then(outSyncing); + } + + uninstallFilter (filterId) { + return this._transport + .execute('eth_uninstallFilter', inHex(filterId)); + } + + unregister () { + return this._transport + .execute('eth_unregister'); + } +} diff --git a/js/src/api/rpc/eth/eth.spec.js b/js/src/api/rpc/eth/eth.spec.js new file mode 100644 index 000000000..2738fd2de --- /dev/null +++ b/js/src/api/rpc/eth/eth.spec.js @@ -0,0 +1,474 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; +import { isBigNumber } from '../../../../test/types'; + +import Http from '../../transport/http'; +import Eth from './eth'; + +const instance = new Eth(new Http(TEST_HTTP_URL, -1)); + +describe('rpc/Eth', () => { + const address = '0x63Cf90D3f0410092FC0fca41846f596223979195'; + let scope; + + describe('accounts', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_accounts', reply: { result: [address.toLowerCase()] } }]); + }); + + it('returns a list of accounts, formatted', () => { + return instance.accounts().then((accounts) => { + expect(accounts).to.deep.equal([address]); + }); + }); + }); + + describe('blockNumber', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_blockNumber', reply: { result: '0x123456' } }]); + }); + + it('returns the current blockNumber, formatted', () => { + return instance.blockNumber().then((blockNumber) => { + expect(isBigNumber(blockNumber)).to.be.true; + expect(blockNumber.toString(16)).to.equal('123456'); + }); + }); + }); + + describe('call', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_call', reply: { result: [] } }]); + }); + + it('formats the input options & blockNumber', () => { + return instance.call({ data: '12345678' }, 'earliest').then(() => { + expect(scope.body.eth_call.params).to.deep.equal([{ data: '0x12345678' }, 'earliest']); + }); + }); + + it('provides a latest blockNumber when not specified', () => { + return instance.call({ data: '12345678' }).then(() => { + expect(scope.body.eth_call.params).to.deep.equal([{ data: '0x12345678' }, 'latest']); + }); + }); + }); + + describe('coinbase', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_coinbase', reply: { result: address.toLowerCase() } }]); + }); + + it('returns the coinbase, formatted', () => { + return instance.coinbase().then((account) => { + expect(account).to.deep.equal(address); + }); + }); + }); + + ['LLL', 'Serpent', 'Solidity'].forEach((type) => { + const method = `compile${type}`; + + describe(method, () => { + beforeEach(() => { + scope = mockHttp([{ method: `eth_${method}`, reply: { result: '0x123' } }]); + }); + + it('formats the input as data, returns the output', () => { + return instance[method]('0xabcdef').then((result) => { + expect(scope.body[`eth_${method}`].params).to.deep.equal(['0xabcdef']); + expect(result).to.equal('0x123'); + }); + }); + }); + }); + + describe('estimateGas', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_estimateGas', reply: { result: '0x123' } }]); + }); + + it('converts the options correctly', () => { + return instance.estimateGas({ gas: 21000 }).then(() => { + expect(scope.body.eth_estimateGas.params).to.deep.equal([{ gas: '0x5208' }]); + }); + }); + + it('returns the gas used', () => { + return instance.estimateGas({}).then((gas) => { + expect(isBigNumber(gas)).to.be.true; + expect(gas.toString(16)).to.deep.equal('123'); + }); + }); + }); + + describe('gasPrice', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_gasPrice', reply: { result: '0x123' } }]); + }); + + it('returns the fomratted price', () => { + return instance.gasPrice().then((price) => { + expect(isBigNumber(price)).to.be.true; + expect(price.toString(16)).to.deep.equal('123'); + }); + }); + }); + + describe('getBalance', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getBalance', reply: { result: '0x123' } }]); + }); + + it('passes in the address (default blockNumber)', () => { + return instance.getBalance(address).then(() => { + expect(scope.body.eth_getBalance.params).to.deep.equal([address.toLowerCase(), 'latest']); + }); + }); + + it('passes in the address & blockNumber', () => { + return instance.getBalance(address, 0x456).then(() => { + expect(scope.body.eth_getBalance.params).to.deep.equal([address.toLowerCase(), '0x456']); + }); + }); + + it('returns the balance', () => { + return instance.getBalance(address, 0x123).then((balance) => { + expect(isBigNumber(balance)).to.be.true; + expect(balance.toString(16)).to.deep.equal('123'); + }); + }); + }); + + describe('getBlockByHash', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getBlockByHash', reply: { result: { miner: address.toLowerCase() } } }]); + }); + + it('formats the input hash as a hash, default full', () => { + return instance.getBlockByHash('1234').then(() => { + expect(scope.body.eth_getBlockByHash.params).to.deep.equal(['0x1234', false]); + }); + }); + + it('formats the input hash as a hash, full true', () => { + return instance.getBlockByHash('1234', true).then(() => { + expect(scope.body.eth_getBlockByHash.params).to.deep.equal(['0x1234', true]); + }); + }); + + it('formats the output into block', () => { + return instance.getBlockByHash('1234').then((block) => { + expect(block.miner).to.equal(address); + }); + }); + }); + + describe('getBlockByNumber', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getBlockByNumber', reply: { result: { miner: address.toLowerCase() } } }]); + }); + + it('assumes blockNumber latest & full false', () => { + return instance.getBlockByNumber().then(() => { + expect(scope.body.eth_getBlockByNumber.params).to.deep.equal(['latest', false]); + }); + }); + + it('uses input blockNumber & full false', () => { + return instance.getBlockByNumber('0x1234').then(() => { + expect(scope.body.eth_getBlockByNumber.params).to.deep.equal(['0x1234', false]); + }); + }); + + it('formats the input blockNumber, full true', () => { + return instance.getBlockByNumber(0x1234, true).then(() => { + expect(scope.body.eth_getBlockByNumber.params).to.deep.equal(['0x1234', true]); + }); + }); + + it('formats the output into block', () => { + return instance.getBlockByNumber(0x1234).then((block) => { + expect(block.miner).to.equal(address); + }); + }); + }); + + describe('getBlockTransactionCountByHash', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getBlockTransactionCountByHash', reply: { result: '0x123' } }]); + }); + + it('formats input hash properly', () => { + return instance.getBlockTransactionCountByHash('abcdef').then(() => { + expect(scope.body.eth_getBlockTransactionCountByHash.params).to.deep.equal(['0xabcdef']); + }); + }); + + it('formats the output number', () => { + return instance.getBlockTransactionCountByHash('0x1234').then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); + }); + }); + }); + + describe('getBlockTransactionCountByNumber', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getBlockTransactionCountByNumber', reply: { result: '0x123' } }]); + }); + + it('specified blockNumber latest when none specified', () => { + return instance.getBlockTransactionCountByNumber().then(() => { + expect(scope.body.eth_getBlockTransactionCountByNumber.params).to.deep.equal(['latest']); + }); + }); + + it('formats input blockNumber properly', () => { + return instance.getBlockTransactionCountByNumber(0xabcdef).then(() => { + expect(scope.body.eth_getBlockTransactionCountByNumber.params).to.deep.equal(['0xabcdef']); + }); + }); + + it('formats the output number', () => { + return instance.getBlockTransactionCountByNumber('0x1234').then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); + }); + }); + }); + + describe('getCode', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getCode', reply: { result: '0x1234567890' } }]); + }); + + it('passes in the address (default blockNumber)', () => { + return instance.getCode(address).then(() => { + expect(scope.body.eth_getCode.params).to.deep.equal([address.toLowerCase(), 'latest']); + }); + }); + + it('passes in the address & blockNumber', () => { + return instance.getCode(address, 0x456).then(() => { + expect(scope.body.eth_getCode.params).to.deep.equal([address.toLowerCase(), '0x456']); + }); + }); + + it('returns the code', () => { + return instance.getCode(address, 0x123).then((code) => { + expect(code).to.equal('0x1234567890'); + }); + }); + }); + + describe('getStorageAt', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getStorageAt', reply: { result: '0x1234567890' } }]); + }); + + it('passes in the address (default index& blockNumber)', () => { + return instance.getStorageAt(address).then(() => { + expect(scope.body.eth_getStorageAt.params).to.deep.equal([address.toLowerCase(), '0x0', 'latest']); + }); + }); + + it('passes in the address, index & blockNumber', () => { + return instance.getStorageAt(address, 15, 0x456).then(() => { + expect(scope.body.eth_getStorageAt.params).to.deep.equal([address.toLowerCase(), '0xf', '0x456']); + }); + }); + + it('returns the storage', () => { + return instance.getStorageAt(address, 0x123).then((storage) => { + expect(storage).to.equal('0x1234567890'); + }); + }); + }); + + describe('getTransactionByBlockHashAndIndex', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getTransactionByBlockHashAndIndex', reply: { result: { to: address.toLowerCase() } } }]); + }); + + it('passes in the hash (default index)', () => { + return instance.getTransactionByBlockHashAndIndex('12345').then(() => { + expect(scope.body.eth_getTransactionByBlockHashAndIndex.params).to.deep.equal(['0x12345', '0x0']); + }); + }); + + it('passes in the hash & specified index', () => { + return instance.getTransactionByBlockHashAndIndex('6789', 0x456).then(() => { + expect(scope.body.eth_getTransactionByBlockHashAndIndex.params).to.deep.equal(['0x6789', '0x456']); + }); + }); + + it('returns the formatted transaction', () => { + return instance.getTransactionByBlockHashAndIndex('6789', 0x123).then((tx) => { + expect(tx).to.deep.equal({ to: address }); + }); + }); + }); + + describe('getTransactionByBlockNumberAndIndex', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getTransactionByBlockNumberAndIndex', reply: { result: { to: address.toLowerCase() } } }]); + }); + + it('passes in the default parameters', () => { + return instance.getTransactionByBlockNumberAndIndex().then(() => { + expect(scope.body.eth_getTransactionByBlockNumberAndIndex.params).to.deep.equal(['latest', '0x0']); + }); + }); + + it('passes in the blockNumber & specified index', () => { + return instance.getTransactionByBlockNumberAndIndex('0x6789', 0x456).then(() => { + expect(scope.body.eth_getTransactionByBlockNumberAndIndex.params).to.deep.equal(['0x6789', '0x456']); + }); + }); + + it('returns the formatted transaction', () => { + return instance.getTransactionByBlockNumberAndIndex('0x6789', 0x123).then((tx) => { + expect(tx).to.deep.equal({ to: address }); + }); + }); + }); + + describe('getTransactionByHash', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getTransactionByHash', reply: { result: { to: address.toLowerCase() } } }]); + }); + + it('passes in the hash', () => { + return instance.getTransactionByHash('12345').then(() => { + expect(scope.body.eth_getTransactionByHash.params).to.deep.equal(['0x12345']); + }); + }); + + it('returns the formatted transaction', () => { + return instance.getTransactionByHash('6789').then((tx) => { + expect(tx).to.deep.equal({ to: address }); + }); + }); + }); + + describe('getTransactionCount', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getTransactionCount', reply: { result: '0x123' } }]); + }); + + it('passes in the address (default blockNumber)', () => { + return instance.getTransactionCount(address).then(() => { + expect(scope.body.eth_getTransactionCount.params).to.deep.equal([address.toLowerCase(), 'latest']); + }); + }); + + it('passes in the address & blockNumber', () => { + return instance.getTransactionCount(address, 0x456).then(() => { + expect(scope.body.eth_getTransactionCount.params).to.deep.equal([address.toLowerCase(), '0x456']); + }); + }); + + it('returns the count, formatted', () => { + return instance.getTransactionCount(address, 0x123).then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); + }); + }); + }); + + describe('getUncleByBlockHashAndIndex', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getUncleByBlockHashAndIndex', reply: { result: [] } }]); + }); + + it('passes in the hash (default index)', () => { + return instance.getUncleByBlockHashAndIndex('12345').then(() => { + expect(scope.body.eth_getUncleByBlockHashAndIndex.params).to.deep.equal(['0x12345', '0x0']); + }); + }); + + it('passes in the hash & specified index', () => { + return instance.getUncleByBlockHashAndIndex('6789', 0x456).then(() => { + expect(scope.body.eth_getUncleByBlockHashAndIndex.params).to.deep.equal(['0x6789', '0x456']); + }); + }); + }); + + describe('getUncleByBlockNumberAndIndex', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getUncleByBlockNumberAndIndex', reply: { result: [] } }]); + }); + + it('passes in the default parameters', () => { + return instance.getUncleByBlockNumberAndIndex().then(() => { + expect(scope.body.eth_getUncleByBlockNumberAndIndex.params).to.deep.equal(['latest', '0x0']); + }); + }); + + it('passes in the blockNumber & specified index', () => { + return instance.getUncleByBlockNumberAndIndex('0x6789', 0x456).then(() => { + expect(scope.body.eth_getUncleByBlockNumberAndIndex.params).to.deep.equal(['0x6789', '0x456']); + }); + }); + }); + + describe('getUncleCountByBlockHash', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getUncleCountByBlockHash', reply: { result: '0x123' } }]); + }); + + it('passes in the hash', () => { + return instance.getUncleCountByBlockHash('12345').then(() => { + expect(scope.body.eth_getUncleCountByBlockHash.params).to.deep.equal(['0x12345']); + }); + }); + + it('formats the output number', () => { + return instance.getUncleCountByBlockHash('0x1234').then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); + }); + }); + }); + + describe('getUncleCountByBlockNumber', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'eth_getUncleCountByBlockNumber', reply: { result: '0x123' } }]); + }); + + it('passes in the default parameters', () => { + return instance.getUncleCountByBlockNumber().then(() => { + expect(scope.body.eth_getUncleCountByBlockNumber.params).to.deep.equal(['latest']); + }); + }); + + it('passes in the blockNumber', () => { + return instance.getUncleCountByBlockNumber('0x6789').then(() => { + expect(scope.body.eth_getUncleCountByBlockNumber.params).to.deep.equal(['0x6789']); + }); + }); + + it('formats the output number', () => { + return instance.getUncleCountByBlockNumber('0x1234').then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.toString(16)).to.equal('123'); + }); + }); + }); +}); diff --git a/js/src/api/rpc/eth/index.js b/js/src/api/rpc/eth/index.js new file mode 100644 index 000000000..25a7b3cb4 --- /dev/null +++ b/js/src/api/rpc/eth/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './eth'; diff --git a/js/src/api/rpc/index.js b/js/src/api/rpc/index.js new file mode 100644 index 000000000..c8fa0032b --- /dev/null +++ b/js/src/api/rpc/index.js @@ -0,0 +1,25 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export Db from './db'; +export Eth from './eth'; +export Parity from './parity'; +export Net from './net'; +export Personal from './personal'; +export Shh from './shh'; +export Signer from './signer'; +export Trace from './trace'; +export Web3 from './web3'; diff --git a/js/src/api/rpc/net/index.js b/js/src/api/rpc/net/index.js new file mode 100644 index 000000000..457eeed79 --- /dev/null +++ b/js/src/api/rpc/net/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './net'; diff --git a/js/src/api/rpc/net/net.e2e.js b/js/src/api/rpc/net/net.e2e.js new file mode 100644 index 000000000..c477e2605 --- /dev/null +++ b/js/src/api/rpc/net/net.e2e.js @@ -0,0 +1,46 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { createHttpApi } from '../../../../test/e2e/ethapi'; +import { isBoolean } from '../../../../test/types'; + +describe('ethapi.net', () => { + const ethapi = createHttpApi(); + + describe('listening', () => { + it('returns the listening status', () => { + return ethapi.net.listening().then((status) => { + expect(isBoolean(status)).to.be.true; + }); + }); + }); + + describe('peerCount', () => { + it('returns the peer count', () => { + return ethapi.net.peerCount().then((count) => { + expect(count.gte(0)).to.be.true; + }); + }); + }); + + describe('version', () => { + it('returns the version', () => { + return ethapi.net.version().then((version) => { + expect(version).to.be.ok; + }); + }); + }); +}); diff --git a/js/src/api/rpc/net/net.js b/js/src/api/rpc/net/net.js new file mode 100644 index 000000000..9b14f69d5 --- /dev/null +++ b/js/src/api/rpc/net/net.js @@ -0,0 +1,39 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { outNumber } from '../../format/output'; + +export default class Net { + constructor (transport) { + this._transport = transport; + } + + listening () { + return this._transport + .execute('net_listening'); + } + + peerCount () { + return this._transport + .execute('net_peerCount') + .then(outNumber); + } + + version () { + return this._transport + .execute('net_version'); + } +} diff --git a/js/src/api/rpc/net/net.spec.js b/js/src/api/rpc/net/net.spec.js new file mode 100644 index 000000000..07ad52076 --- /dev/null +++ b/js/src/api/rpc/net/net.spec.js @@ -0,0 +1,36 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; +import { isBigNumber } from '../../../../test/types'; + +import Http from '../../transport/http'; +import Net from './net'; + +const instance = new Net(new Http(TEST_HTTP_URL, -1)); + +describe('api/rpc/Net', () => { + describe('peerCount', () => { + it('returns the connected peers, formatted', () => { + mockHttp([{ method: 'net_peerCount', reply: { result: '0x123456' } }]); + + return instance.peerCount().then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.eq(0x123456)).to.be.true; + }); + }); + }); +}); diff --git a/js/src/api/rpc/parity/index.js b/js/src/api/rpc/parity/index.js new file mode 100644 index 000000000..7fe520c60 --- /dev/null +++ b/js/src/api/rpc/parity/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './parity'; diff --git a/js/src/api/rpc/parity/parity.e2e.js b/js/src/api/rpc/parity/parity.e2e.js new file mode 100644 index 000000000..8820d570a --- /dev/null +++ b/js/src/api/rpc/parity/parity.e2e.js @@ -0,0 +1,79 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { createHttpApi } from '../../../../test/e2e/ethapi'; + +describe('ethapi.parity', () => { + const ethapi = createHttpApi(); + + describe('chainStatus', () => { + it('returns and translates the status', () => { + return ethapi.parity.chainStatus().then((value) => { + expect(value).to.be.ok; + }); + }); + }); + + describe('gasFloorTarget', () => { + it('returns and translates the target', () => { + return ethapi.parity.gasFloorTarget().then((value) => { + expect(value.gt(0)).to.be.true; + }); + }); + }); + + describe('gasPriceHistogram', () => { + it('returns and translates the target', () => { + return ethapi.parity.gasPriceHistogram().then((result) => { + expect(Object.keys(result)).to.deep.equal(['bucketBounds', 'counts']); + expect(result.bucketBounds.length > 0).to.be.true; + expect(result.counts.length > 0).to.be.true; + }); + }); + }); + + describe('netChain', () => { + it('returns and the chain', () => { + return ethapi.parity.netChain().then((value) => { + expect(value).to.equal('morden'); + }); + }); + }); + + describe('netPort', () => { + it('returns and translates the port', () => { + return ethapi.parity.netPort().then((value) => { + expect(value.gt(0)).to.be.true; + }); + }); + }); + + describe('transactionsLimit', () => { + it('returns and translates the limit', () => { + return ethapi.parity.transactionsLimit().then((value) => { + expect(value.gt(0)).to.be.true; + }); + }); + }); + + describe('rpcSettings', () => { + it('returns and translates the settings', () => { + return ethapi.parity.rpcSettings().then((value) => { + expect(value).to.be.ok; + }); + }); + }); +}); diff --git a/js/src/api/rpc/parity/parity.js b/js/src/api/rpc/parity/parity.js new file mode 100644 index 000000000..3a502afab --- /dev/null +++ b/js/src/api/rpc/parity/parity.js @@ -0,0 +1,587 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { inAddress, inAddresses, inBlockNumber, inData, inDeriveHash, inDeriveIndex, inHex, inNumber16, inOptions } from '../../format/input'; +import { outAccountInfo, outAddress, outAddresses, outBlock, outChainStatus, outHistogram, outHwAccountInfo, outNodeKind, outNumber, outPeers, outRecentDapps, outTransaction, outVaultMeta } from '../../format/output'; + +export default class Parity { + constructor (transport) { + this._transport = transport; + } + + acceptNonReservedPeers () { + return this._transport + .execute('parity_acceptNonReservedPeers'); + } + + accountsInfo () { + return this._transport + .execute('parity_accountsInfo') + .then(outAccountInfo); + } + + allAccountsInfo () { + return this._transport + .execute('parity_allAccountsInfo') + .then(outAccountInfo); + } + + addReservedPeer (enode) { + return this._transport + .execute('parity_addReservedPeer', enode); + } + + call (requests, blockNumber = 'latest') { + return this._transport + .execute( + 'parity_call', + requests.map((options) => inOptions(options)), + inBlockNumber(blockNumber) + ); + } + + chainStatus () { + return this._transport + .execute('parity_chainStatus') + .then(outChainStatus); + } + + changePassword (account, password, newPassword) { + return this._transport + .execute('parity_changePassword', inAddress(account), password, newPassword); + } + + changeVault (account, vaultName) { + return this._transport + .execute('parity_changeVault', inAddress(account), vaultName); + } + + changeVaultPassword (vaultName, password) { + return this._transport + .execute('parity_changeVaultPassword', vaultName, password); + } + + checkRequest (requestId) { + return this._transport + .execute('parity_checkRequest', inNumber16(requestId)); + } + + cidV0 (data) { + return this._transport + .execute('parity_cidV0', inData(data)); + } + + closeVault (vaultName) { + return this._transport + .execute('parity_closeVault', vaultName); + } + + composeTransaction (options) { + return this._transport + .execute('parity_composeTransaction', inOptions(options)); + } + + consensusCapability () { + return this._transport + .execute('parity_consensusCapability'); + } + + dappsList () { + return this._transport + .execute('parity_dappsList'); + } + + dappsRefresh () { + return this._transport + .execute('parity_dappsRefresh'); + } + + dappsUrl () { + return this._transport + .execute('parity_dappsUrl'); + } + + decryptMessage (address, data) { + return this._transport + .execute('parity_decryptMessage', inAddress(address), inHex(data)); + } + + defaultAccount () { + return this._transport + .execute('parity_defaultAccount') + .then(outAddress); + } + + defaultExtraData () { + return this._transport + .execute('parity_defaultExtraData'); + } + + devLogs () { + return this._transport + .execute('parity_devLogs'); + } + + devLogsLevels () { + return this._transport + .execute('parity_devLogsLevels'); + } + + deriveAddressHash (address, password, hash, shouldSave) { + return this._transport + .execute('parity_deriveAddressHash', inAddress(address), password, inDeriveHash(hash), !!shouldSave) + .then(outAddress); + } + + deriveAddressIndex (address, password, index, shouldSave) { + return this._transport + .execute('parity_deriveAddressIndex', inAddress(address), password, inDeriveIndex(index), !!shouldSave) + .then(outAddress); + } + + dropNonReservedPeers () { + return this._transport + .execute('parity_dropNonReservedPeers'); + } + + enode () { + return this._transport + .execute('parity_enode'); + } + + encryptMessage (pubkey, data) { + return this._transport + .execute('parity_encryptMessage', inHex(pubkey), inHex(data)); + } + + executeUpgrade () { + return this._transport + .execute('parity_executeUpgrade'); + } + + exportAccount (address, password) { + return this._transport + .execute('parity_exportAccount', inAddress(address), password); + } + + extraData () { + return this._transport + .execute('parity_extraData'); + } + + futureTransactions () { + return this._transport + .execute('parity_futureTransactions'); + } + + gasCeilTarget () { + return this._transport + .execute('parity_gasCeilTarget') + .then(outNumber); + } + + gasFloorTarget () { + return this._transport + .execute('parity_gasFloorTarget') + .then(outNumber); + } + + gasPriceHistogram () { + return this._transport + .execute('parity_gasPriceHistogram') + .then(outHistogram); + } + + generateSecretPhrase () { + return this._transport + .execute('parity_generateSecretPhrase'); + } + + getBlockHeaderByNumber (blockNumber = 'latest') { + return this._transport + .execute('parity_getBlockHeaderByNumber', inBlockNumber(blockNumber)) + .then(outBlock); + } + + getDappAddresses (dappId) { + return this._transport + .execute('parity_getDappAddresses', dappId) + .then(outAddresses); + } + + getDappDefaultAddress (dappId) { + return this._transport + .execute('parity_getDappDefaultAddress', dappId) + .then(outAddress); + } + + getNewDappsAddresses () { + return this._transport + .execute('parity_getNewDappsAddresses') + .then((addresses) => addresses ? addresses.map(outAddress) : null); + } + + getNewDappsDefaultAddress () { + return this._transport + .execute('parity_getNewDappsDefaultAddress') + .then(outAddress); + } + + getVaultMeta (vaultName) { + return this._transport + .execute('parity_getVaultMeta', vaultName) + .then(outVaultMeta); + } + + hardwareAccountsInfo () { + return this._transport + .execute('parity_hardwareAccountsInfo') + .then(outHwAccountInfo); + } + + hashContent (url) { + return this._transport + .execute('parity_hashContent', url); + } + + importGethAccounts (accounts) { + return this._transport + .execute('parity_importGethAccounts', inAddresses(accounts)) + .then(outAddresses); + } + + killAccount (account, password) { + return this._transport + .execute('parity_killAccount', inAddress(account), password); + } + + listAccounts (count, offset = null, blockNumber = 'latest') { + return this._transport + .execute('parity_listAccounts', count, inAddress(offset), inBlockNumber(blockNumber)) + .then((accounts) => (accounts || []).map(outAddress)); + } + + listOpenedVaults () { + return this._transport + .execute('parity_listOpenedVaults'); + } + + listVaults () { + return this._transport + .execute('parity_listVaults'); + } + + listRecentDapps () { + return this._transport + .execute('parity_listRecentDapps') + .then(outRecentDapps); + } + + listStorageKeys (address, count, hash = null, blockNumber = 'latest') { + return this._transport + .execute('parity_listStorageKeys', inAddress(address), count, inHex(hash), inBlockNumber(blockNumber)); + } + + removeAddress (address) { + return this._transport + .execute('parity_removeAddress', inAddress(address)); + } + + listGethAccounts () { + return this._transport + .execute('parity_listGethAccounts') + .then(outAddresses); + } + + localTransactions () { + return this._transport + .execute('parity_localTransactions') + .then(transactions => { + Object.values(transactions) + .filter(tx => tx.transaction) + .map(tx => { + tx.transaction = outTransaction(tx.transaction); + }); + return transactions; + }); + } + + minGasPrice () { + return this._transport + .execute('parity_minGasPrice') + .then(outNumber); + } + + mode () { + return this._transport + .execute('parity_mode'); + } + + // DEPRECATED - use chain instead. + netChain () { + return this._transport + .execute('parity_chain'); + } + + nodeKind () { + return this._transport + .execute('parity_nodeKind') + .then(outNodeKind); + } + + chain () { + return this._transport + .execute('parity_chain'); + } + + netPeers () { + return this._transport + .execute('parity_netPeers') + .then(outPeers); + } + + netMaxPeers () { + return this._transport + .execute('parity_netMaxPeers') + .then(outNumber); + } + + netPort () { + return this._transport + .execute('parity_netPort') + .then(outNumber); + } + + newAccountFromPhrase (phrase, password) { + return this._transport + .execute('parity_newAccountFromPhrase', phrase, password) + .then(outAddress); + } + + newAccountFromSecret (secret, password) { + return this._transport + .execute('parity_newAccountFromSecret', inHex(secret), password) + .then(outAddress); + } + + newAccountFromWallet (json, password) { + return this._transport + .execute('parity_newAccountFromWallet', json, password) + .then(outAddress); + } + + newVault (vaultName, password) { + return this._transport + .execute('parity_newVault', vaultName, password); + } + + nextNonce (account) { + return this._transport + .execute('parity_nextNonce', inAddress(account)) + .then(outNumber); + } + + nodeHealth () { + return this._transport + .execute('parity_nodeHealth'); + } + + nodeName () { + return this._transport + .execute('parity_nodeName'); + } + + openVault (vaultName, password) { + return this._transport + .execute('parity_openVault', vaultName, password); + } + + pendingTransactions () { + return this._transport + .execute('parity_pendingTransactions') + .then(data => data.map(outTransaction)); + } + + pendingTransactionsStats () { + return this._transport + .execute('parity_pendingTransactionsStats'); + } + + phraseToAddress (phrase) { + return this._transport + .execute('parity_phraseToAddress', phrase) + .then(outAddress); + } + + postSign (address, hash) { + return this._transport + .execute('parity_postSign', inAddress(address), inHex(hash)); + } + + postTransaction (options = {}) { + return this._transport + .execute('parity_postTransaction', inOptions(options)); + } + + registryAddress () { + return this._transport + .execute('parity_registryAddress') + .then(outAddress); + } + + releasesInfo () { + return this._transport + .execute('parity_releasesInfo'); + } + + removeReservedPeer (enode) { + return this._transport + .execute('parity_removeReservedPeer', enode); + } + + removeTransaction (hash) { + return this._transport + .execute('parity_removeTransaction', inHex(hash)) + .then(outTransaction); + } + + rpcSettings () { + return this._transport + .execute('parity_rpcSettings'); + } + + setAccountName (address, name) { + return this._transport + .execute('parity_setAccountName', inAddress(address), name); + } + + setAccountMeta (address, meta) { + return this._transport + .execute('parity_setAccountMeta', inAddress(address), JSON.stringify(meta)); + } + + setAuthor (address) { + return this._transport + .execute('parity_setAuthor', inAddress(address)); + } + + setDappAddresses (dappId, addresses) { + return this._transport + .execute('parity_setDappAddresses', dappId, inAddresses(addresses)); + } + + setDappDefaultAddress (dappId, address) { + return this._transport + .execute('parity_setDappDefaultAddress', dappId, address ? inAddress(address) : null); + } + + setEngineSigner (address, password) { + return this._transport + .execute('parity_setEngineSigner', inAddress(address), password); + } + + setExtraData (data) { + return this._transport + .execute('parity_setExtraData', inData(data)); + } + + setGasCeilTarget (quantity) { + return this._transport + .execute('parity_setGasCeilTarget', inNumber16(quantity)); + } + + setGasFloorTarget (quantity) { + return this._transport + .execute('parity_setGasFloorTarget', inNumber16(quantity)); + } + + setMaxTransactionGas (quantity) { + return this._transport + .execute('parity_setMaxTransactionGas', inNumber16(quantity)); + } + + setMinGasPrice (quantity) { + return this._transport + .execute('parity_setMinGasPrice', inNumber16(quantity)); + } + + setMode (mode) { + return this._transport + .execute('parity_setMode', mode); + } + + setChain (specName) { + return this._transport + .execute('parity_setChain', specName); + } + + setNewDappsAddresses (addresses) { + return this._transport + .execute('parity_setNewDappsAddresses', addresses ? inAddresses(addresses) : null); + } + + setNewDappsDefaultAddress (address) { + return this._transport + .execute('parity_setNewDappsDefaultAddress', inAddress(address)); + } + + setTransactionsLimit (quantity) { + return this._transport + .execute('parity_setTransactionsLimit', inNumber16(quantity)); + } + + setVaultMeta (vaultName, meta) { + return this._transport + .execute('parity_setVaultMeta', vaultName, JSON.stringify(meta)); + } + + signMessage (address, password, messageHash) { + return this._transport + .execute('parity_signMessage', inAddress(address), password, inHex(messageHash)); + } + + testPassword (account, password) { + return this._transport + .execute('parity_testPassword', inAddress(account), password); + } + + transactionsLimit () { + return this._transport + .execute('parity_transactionsLimit') + .then(outNumber); + } + + unsignedTransactionsCount () { + return this._transport + .execute('parity_unsignedTransactionsCount') + .then(outNumber); + } + + upgradeReady () { + return this._transport + .execute('parity_upgradeReady'); + } + + versionInfo () { + return this._transport + .execute('parity_versionInfo'); + } + + wsUrl () { + return this._transport + .execute('parity_wsUrl'); + } +} diff --git a/js/src/api/rpc/parity/parity.spec.js b/js/src/api/rpc/parity/parity.spec.js new file mode 100644 index 000000000..6ba7a1c83 --- /dev/null +++ b/js/src/api/rpc/parity/parity.spec.js @@ -0,0 +1,146 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; +import { isBigNumber } from '../../../../test/types'; + +import Http from '../../transport/http'; +import Parity from './parity'; + +const instance = new Parity(new Http(TEST_HTTP_URL, -1)); + +describe('api/rpc/parity', () => { + describe('accountsInfo', () => { + it('retrieves the available account info', () => { + mockHttp([{ method: 'parity_accountsInfo', reply: { + result: { + '0x63cf90d3f0410092fc0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: '{"data":"data"}' + } + } + } }]); + + return instance.accountsInfo().then((result) => { + expect(result).to.deep.equal({ + '0x63Cf90D3f0410092FC0fca41846f596223979195': { + name: 'name', uuid: 'uuid', meta: { + data: 'data' + } + } + }); + }); + }); + }); + + describe('chainStatus', () => { + it('retrieves the chain status', () => { + mockHttp([{ method: 'parity_chainStatus', reply: { + result: { + 'blockGap': [0x123, 0x456] + } + } }]); + + return instance.chainStatus().then((result) => { + expect(result).to.deep.equal({ + 'blockGap': [new BigNumber(0x123), new BigNumber(0x456)] + }); + }); + }); + }); + + describe('gasFloorTarget', () => { + it('returns the gasfloor, formatted', () => { + mockHttp([{ method: 'parity_gasFloorTarget', reply: { result: '0x123456' } }]); + + return instance.gasFloorTarget().then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.eq(0x123456)).to.be.true; + }); + }); + }); + + describe('importGethAccounts', () => { + const ACCOUNTS = ['0x63cf90d3f0410092fc0fca41846f596223979195']; + let scope; + + beforeEach(() => { + scope = mockHttp([{ method: 'parity_importGethAccounts', reply: { result: ACCOUNTS } }]); + }); + + it('passes the addresses through', () => { + return instance.importGethAccounts(ACCOUNTS).then((result) => { + expect(scope.body['parity_importGethAccounts'].params).to.deep.equal([ACCOUNTS]); + }); + }); + }); + + describe('minGasPrice', () => { + it('returns the min gasprice, formatted', () => { + mockHttp([{ method: 'parity_minGasPrice', reply: { result: '0x123456' } }]); + + return instance.minGasPrice().then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.eq(0x123456)).to.be.true; + }); + }); + }); + + describe('netMaxPeers', () => { + it('returns the max peers, formatted', () => { + mockHttp([{ method: 'parity_netMaxPeers', reply: { result: 25 } }]); + + return instance.netMaxPeers().then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.eq(25)).to.be.true; + }); + }); + }); + + describe('netPeers', () => { + it('returns the peer structure, formatted', () => { + mockHttp([{ method: 'parity_netPeers', reply: { result: { active: 123, connected: 456, max: 789, peers: [] } } }]); + + return instance.netPeers().then((peers) => { + expect(peers.active.eq(123)).to.be.true; + expect(peers.connected.eq(456)).to.be.true; + expect(peers.max.eq(789)).to.be.true; + }); + }); + }); + + describe('netPort', () => { + it('returns the connected port, formatted', () => { + mockHttp([{ method: 'parity_netPort', reply: { result: 33030 } }]); + + return instance.netPort().then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.eq(33030)).to.be.true; + }); + }); + }); + + describe('transactionsLimit', () => { + it('returns the tx limit, formatted', () => { + mockHttp([{ method: 'parity_transactionsLimit', reply: { result: 1024 } }]); + + return instance.transactionsLimit().then((count) => { + expect(isBigNumber(count)).to.be.true; + expect(count.eq(1024)).to.be.true; + }); + }); + }); +}); diff --git a/js/src/api/rpc/personal/index.js b/js/src/api/rpc/personal/index.js new file mode 100644 index 000000000..ec9993442 --- /dev/null +++ b/js/src/api/rpc/personal/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './personal'; diff --git a/js/src/api/rpc/personal/personal.e2e.js b/js/src/api/rpc/personal/personal.e2e.js new file mode 100644 index 000000000..d83e9b811 --- /dev/null +++ b/js/src/api/rpc/personal/personal.e2e.js @@ -0,0 +1,53 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { createHttpApi } from '../../../../test/e2e/ethapi'; +import { isAddress, isBoolean } from '../../../../test/types'; + +describe.skip('ethapi.personal', () => { + const ethapi = createHttpApi(); + const password = 'P@55word'; + let address; + + describe('newAccount', () => { + it('creates a new account', () => { + return ethapi.personal.newAccount(password).then((_address) => { + address = _address; + expect(isAddress(address)).to.be.ok; + }); + }); + }); + + describe('listAccounts', () => { + it('has the newly-created account', () => { + return ethapi.personal.listAccounts(password).then((accounts) => { + expect(accounts.filter((_address) => _address === address)).to.deep.equal([address]); + accounts.forEach((account) => { + expect(isAddress(account)).to.be.true; + }); + }); + }); + }); + + describe('unlockAccount', () => { + it('unlocks the newly-created account', () => { + return ethapi.personal.unlockAccount(address, password).then((result) => { + expect(isBoolean(result)).to.be.true; + expect(result).to.be.true; + }); + }); + }); +}); diff --git a/js/src/api/rpc/personal/personal.js b/js/src/api/rpc/personal/personal.js new file mode 100644 index 000000000..dd9c40f62 --- /dev/null +++ b/js/src/api/rpc/personal/personal.js @@ -0,0 +1,46 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { inAddress, inNumber10, inOptions } from '../../format/input'; +import { outAddress } from '../../format/output'; + +export default class Personal { + constructor (transport) { + this._transport = transport; + } + + listAccounts () { + return this._transport + .execute('personal_listAccounts') + .then((accounts) => (accounts || []).map(outAddress)); + } + + newAccount (password) { + return this._transport + .execute('personal_newAccount', password) + .then(outAddress); + } + + sendTransaction (options, password) { + return this._transport + .execute('personal_sendTransaction', inOptions(options), password); + } + + unlockAccount (account, password, duration = 1) { + return this._transport + .execute('personal_unlockAccount', inAddress(account), password, inNumber10(duration)); + } +} diff --git a/js/src/api/rpc/personal/personal.spec.js b/js/src/api/rpc/personal/personal.spec.js new file mode 100644 index 000000000..d67bb9dec --- /dev/null +++ b/js/src/api/rpc/personal/personal.spec.js @@ -0,0 +1,75 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; + +import Http from '../../transport/http'; +import Personal from './personal'; + +const instance = new Personal(new Http(TEST_HTTP_URL, -1)); + +describe('rpc/Personal', () => { + const account = '0x63cf90d3f0410092fc0fca41846f596223979195'; + const checksum = '0x63Cf90D3f0410092FC0fca41846f596223979195'; + let scope; + + describe('listAccounts', () => { + it('retrieves a list of available accounts', () => { + scope = mockHttp([{ method: 'personal_listAccounts', reply: { result: [account] } }]); + + return instance.listAccounts().then((result) => { + expect(result).to.deep.equal([checksum]); + }); + }); + + it('returns an empty list when none available', () => { + scope = mockHttp([{ method: 'personal_listAccounts', reply: { result: null } }]); + + return instance.listAccounts().then((result) => { + expect(result).to.deep.equal([]); + }); + }); + }); + + describe('newAccount', () => { + it('passes the password, returning the address', () => { + scope = mockHttp([{ method: 'personal_newAccount', reply: { result: account } }]); + + return instance.newAccount('password').then((result) => { + expect(scope.body.personal_newAccount.params).to.deep.equal(['password']); + expect(result).to.equal(checksum); + }); + }); + }); + + describe('unlockAccount', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'personal_unlockAccount', reply: { result: [] } }]); + }); + + it('passes account, password & duration', () => { + return instance.unlockAccount(account, 'password', 0xf).then(() => { + expect(scope.body.personal_unlockAccount.params).to.deep.equal([account, 'password', 15]); + }); + }); + + it('provides a default duration when not specified', () => { + return instance.unlockAccount(account, 'password').then(() => { + expect(scope.body.personal_unlockAccount.params).to.deep.equal([account, 'password', 1]); + }); + }); + }); +}); diff --git a/js/src/api/rpc/shh/index.js b/js/src/api/rpc/shh/index.js new file mode 100644 index 000000000..1094fe437 --- /dev/null +++ b/js/src/api/rpc/shh/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './shh'; diff --git a/js/src/api/rpc/shh/shh.js b/js/src/api/rpc/shh/shh.js new file mode 100644 index 000000000..c58754abf --- /dev/null +++ b/js/src/api/rpc/shh/shh.js @@ -0,0 +1,91 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class Shh { + constructor (transport) { + this._transport = transport; + } + + info () { + return this._transport + .execute('shh_info'); + } + + newKeyPair () { + return this._transport + .execute('shh_newKeyPair'); + } + + addPrivateKey (privKey) { + return this._transport + .execute('shh_addPrivateKey', privKey); + } + + newSymKey () { + return this._transport + .execute('shh_newSymKey'); + } + + getPublicKey (identity) { + return this._transport + .execute('shh_getPublicKey', identity); + } + + getPrivateKey (identity) { + return this._transport + .execute('shh_getPrivateKey', identity); + } + + getSymKey (identity) { + return this._transport + .execute('shh_getSymKey', identity); + } + + deleteKey (identity) { + return this._transport + .execute('shh_deleteKey', identity); + } + + post (messageObj) { + return this._transport + .execute('shh_post', messageObj); + } + + newMessageFilter (filterObj) { + return this._transport + .execute('shh_newMessageFilter', filterObj); + } + + getFilterMessages (filterId) { + return this._transport + .execute('shh_getFilterMessages', filterId); + } + + deleteMessageFilter (filterId) { + return this._transport + .execute('shh_deleteMessageFilter', filterId); + } + + subscribe (filterObj, callback) { + return this._transport + .subscribe('shh', callback, filterObj); + } + + unsubscribe (subscriptionId) { + return this._transport + .unsubscribe(subscriptionId); + } +} diff --git a/js/src/api/rpc/signer/index.js b/js/src/api/rpc/signer/index.js new file mode 100644 index 000000000..cc1e4dc1c --- /dev/null +++ b/js/src/api/rpc/signer/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './signer'; diff --git a/js/src/api/rpc/signer/signer.js b/js/src/api/rpc/signer/signer.js new file mode 100644 index 000000000..915b81158 --- /dev/null +++ b/js/src/api/rpc/signer/signer.js @@ -0,0 +1,65 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { inData, inNumber16, inOptions } from '../../format/input'; +import { outSignerRequest } from '../../format/output'; + +export default class Signer { + constructor (transport) { + this._transport = transport; + } + + confirmRequest (requestId, options, password) { + return this._transport + .execute('signer_confirmRequest', inNumber16(requestId), inOptions(options), password); + } + + confirmRequestRaw (requestId, data) { + return this._transport + .execute('signer_confirmRequestRaw', inNumber16(requestId), inData(data)); + } + + confirmRequestWithToken (requestId, options, password) { + return this._transport + .execute('signer_confirmRequestWithToken', inNumber16(requestId), inOptions(options), password); + } + + generateAuthorizationToken () { + return this._transport + .execute('signer_generateAuthorizationToken'); + } + + generateWebProxyAccessToken (domain) { + return this._transport + .execute('signer_generateWebProxyAccessToken', domain); + } + + rejectRequest (requestId) { + return this._transport + .execute('signer_rejectRequest', inNumber16(requestId)); + } + + requestsToConfirm () { + return this._transport + .execute('signer_requestsToConfirm') + .then((requests) => (requests || []).map(outSignerRequest)); + } + + signerEnabled () { + return this._transport + .execute('signer_signerEnabled'); + } +} diff --git a/js/src/api/rpc/trace/index.js b/js/src/api/rpc/trace/index.js new file mode 100644 index 000000000..8d02aed45 --- /dev/null +++ b/js/src/api/rpc/trace/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './trace'; diff --git a/js/src/api/rpc/trace/trace.e2e.js b/js/src/api/rpc/trace/trace.e2e.js new file mode 100644 index 000000000..ffbef0ed6 --- /dev/null +++ b/js/src/api/rpc/trace/trace.e2e.js @@ -0,0 +1,45 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { createHttpApi } from '../../../../test/e2e/ethapi'; + +describe('ethapi.trace', () => { + const ethapi = createHttpApi(); + + describe('block', () => { + it('returns the latest block traces', () => { + return ethapi.trace.block().then((traces) => { + expect(traces).to.be.ok; + }); + }); + + it('returns traces for a specified block', () => { + return ethapi.trace.block('0x65432').then((traces) => { + expect(traces).to.be.ok; + }); + }); + }); + + describe('replayTransaction', () => { + it('returns traces for a specific transaction', () => { + return ethapi.eth.getBlockByNumber().then((latestBlock) => { + return ethapi.trace.replayTransaction(latestBlock.transactions[0]).then((traces) => { + expect(traces).to.be.ok; + }); + }); + }); + }); +}); diff --git a/js/src/api/rpc/trace/trace.js b/js/src/api/rpc/trace/trace.js new file mode 100644 index 000000000..26b19b378 --- /dev/null +++ b/js/src/api/rpc/trace/trace.js @@ -0,0 +1,66 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { inBlockNumber, inData, inHex, inNumber16, inOptions, inTraceFilter, inTraceType } from '../../format/input'; +import { outTraces, outTraceReplay } from '../../format/output'; + +export default class Trace { + constructor (transport) { + this._transport = transport; + } + + block (blockNumber = 'latest') { + return this._transport + .execute('trace_block', inBlockNumber(blockNumber)) + .then(outTraces); + } + + call (options, whatTrace = ['trace'], blockNumber = 'latest') { + return this._transport + .execute('trace_call', inOptions(options), inTraceType(whatTrace), inBlockNumber(blockNumber)) + .then(outTraceReplay); + } + + filter (filterObj) { + return this._transport + .execute('trace_filter', inTraceFilter(filterObj)) + .then(outTraces); + } + + get (txHash, position) { + return this._transport + .execute('trace_get', inHex(txHash), inNumber16(position)) + .then(outTraces); + } + + rawTransaction (data, whatTrace = ['trace']) { + return this._transport + .execute('trace_rawTransaction', inData(data), inTraceType(whatTrace)) + .then(outTraceReplay); + } + + replayTransaction (txHash, whatTrace = ['trace']) { + return this._transport + .execute('trace_replayTransaction', txHash, inTraceType(whatTrace)) + .then(outTraceReplay); + } + + transaction (txHash) { + return this._transport + .execute('trace_transaction', inHex(txHash)) + .then(outTraces); + } +} diff --git a/js/src/api/rpc/trace/trace.spec.js b/js/src/api/rpc/trace/trace.spec.js new file mode 100644 index 000000000..267d1240f --- /dev/null +++ b/js/src/api/rpc/trace/trace.spec.js @@ -0,0 +1,44 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; + +import Http from '../../transport/http'; +import Trace from './trace'; + +const instance = new Trace(new Http(TEST_HTTP_URL, -1)); + +describe('api/rpc/Trace', () => { + let scope; + + describe('block', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'trace_block', reply: { result: [] } }]); + }); + + it('assumes latest blockNumber when not specified', () => { + return instance.block().then(() => { + expect(scope.body.trace_block.params).to.deep.equal(['latest']); + }); + }); + + it('passed specified blockNumber', () => { + return instance.block(0x123).then(() => { + expect(scope.body.trace_block.params).to.deep.equal(['0x123']); + }); + }); + }); +}); diff --git a/js/src/api/rpc/web3/index.js b/js/src/api/rpc/web3/index.js new file mode 100644 index 000000000..c2590ec11 --- /dev/null +++ b/js/src/api/rpc/web3/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './web3'; diff --git a/js/src/api/rpc/web3/web3.e2e.js b/js/src/api/rpc/web3/web3.e2e.js new file mode 100644 index 000000000..2c8243a4f --- /dev/null +++ b/js/src/api/rpc/web3/web3.e2e.js @@ -0,0 +1,44 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { createHttpApi } from '../../../../test/e2e/ethapi'; +import { isHexNumber } from '../../../../test/types'; + +describe('ethapi.web3', () => { + const ethapi = createHttpApi(); + + describe('clientVersion', () => { + it('returns the client version', () => { + return ethapi.web3.clientVersion().then((version) => { + const [client] = version.split('/'); + + expect(client === 'Parity' || client === 'Geth').to.be.ok; + }); + }); + }); + + describe('sha3', () => { + it('returns a keccak256 sha', () => { + const sha = '0xa7916fac4f538170f7cd12c148552e2cba9fcd72329a2dd5b07a6fa906488ddf'; + const hexStr = 'baz()'.split('').map((char) => char.charCodeAt(0).toString(16)).join(''); + + return ethapi.web3.sha3(`0x${hexStr}`).then((hash) => { + expect(isHexNumber(hash)).to.be.true; + expect(hash).to.equal(sha); + }); + }); + }); +}); diff --git a/js/src/api/rpc/web3/web3.js b/js/src/api/rpc/web3/web3.js new file mode 100644 index 000000000..21b2d77f1 --- /dev/null +++ b/js/src/api/rpc/web3/web3.js @@ -0,0 +1,33 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { inHex } from '../../format/input'; + +export default class Web3 { + constructor (transport) { + this._transport = transport; + } + + clientVersion () { + return this._transport + .execute('web3_clientVersion'); + } + + sha3 (hexStr) { + return this._transport + .execute('web3_sha3', inHex(hexStr)); + } +} diff --git a/js/src/api/rpc/web3/web3.spec.js b/js/src/api/rpc/web3/web3.spec.js new file mode 100644 index 000000000..b46679b82 --- /dev/null +++ b/js/src/api/rpc/web3/web3.spec.js @@ -0,0 +1,38 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; + +import Http from '../../transport/http'; +import Web3 from './web3'; + +const instance = new Web3(new Http(TEST_HTTP_URL, -1)); + +describe('api/rpc/Web3', () => { + let scope; + + describe('sha3', () => { + beforeEach(() => { + scope = mockHttp([{ method: 'web3_sha3', reply: { result: [] } }]); + }); + + it('formats the inputs correctly', () => { + return instance.sha3('1234').then(() => { + expect(scope.body.web3_sha3.params).to.deep.equal(['0x1234']); + }); + }); + }); +}); diff --git a/js/src/api/subscriptions/eth.js b/js/src/api/subscriptions/eth.js new file mode 100644 index 000000000..bbab95672 --- /dev/null +++ b/js/src/api/subscriptions/eth.js @@ -0,0 +1,95 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; + +export default class Eth { + constructor (updateSubscriptions, api) { + this._api = api; + this._updateSubscriptions = updateSubscriptions; + this._started = false; + + this._lastBlock = new BigNumber(-1); + this._pollTimerId = null; + + // Try to restart subscription if transport is closed + this._api.transport.on('close', () => { + if (this.isStarted) { + this.start(); + } + }); + } + + get isStarted () { + return this._started; + } + + start () { + this._started = true; + + if (this._api.isPubSub) { + return Promise.all([ + this._pollBlockNumber(false), + this._api.pubsub + .subscribeAndGetResult( + callback => this._api.pubsub.eth.newHeads(callback), + () => { + return this._api.eth + .blockNumber() + .then(blockNumber => { + this.updateBlock(blockNumber); + return blockNumber; + }); + } + ) + ]); + } + + // fallback to polling + return this._pollBlockNumber(true); + } + + _pollBlockNumber = (doTimeout) => { + const nextTimeout = (timeout = 1000, forceTimeout = doTimeout) => { + if (forceTimeout) { + this._pollTimerId = setTimeout(() => { + this._pollBlockNumber(doTimeout); + }, timeout); + } + }; + + if (!this._api.transport.isConnected) { + nextTimeout(500, true); + return; + } + + return this._api.eth + .blockNumber() + .then((blockNumber) => { + this.updateBlock(blockNumber); + + nextTimeout(); + }) + .catch(() => nextTimeout()); + } + + updateBlock (blockNumber) { + if (!blockNumber.eq(this._lastBlock)) { + this._lastBlock = blockNumber; + this._updateSubscriptions('eth_blockNumber', null, blockNumber); + } + } +} diff --git a/js/src/api/subscriptions/eth.spec.js b/js/src/api/subscriptions/eth.spec.js new file mode 100644 index 000000000..2893a14dc --- /dev/null +++ b/js/src/api/subscriptions/eth.spec.js @@ -0,0 +1,102 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import sinon from 'sinon'; + +import Eth from './eth'; + +const START_BLOCK = 5000; + +function stubApi (blockNumber) { + const _calls = { + blockNumber: [] + }; + + return { + _calls, + transport: { + isConnected: true, + on: () => {} + }, + eth: { + blockNumber: () => { + const stub = sinon.stub().resolves(new BigNumber(blockNumber || START_BLOCK))(); + + _calls.blockNumber.push(stub); + return stub; + } + } + }; +} + +describe('api/subscriptions/eth', () => { + let api; + let eth; + let cb; + + beforeEach(() => { + api = stubApi(); + cb = sinon.stub(); + eth = new Eth(cb, api); + }); + + describe('constructor', () => { + it('starts the instance in a stopped state', () => { + expect(eth.isStarted).to.be.false; + }); + }); + + describe('start', () => { + describe('blockNumber available', () => { + beforeEach(() => { + return eth.start(); + }); + + it('sets the started status', () => { + expect(eth.isStarted).to.be.true; + }); + + it('calls eth_blockNumber', () => { + expect(api._calls.blockNumber.length).to.be.ok; + }); + + it('updates subscribers', () => { + expect(cb).to.have.been.calledWith('eth_blockNumber', null, new BigNumber(START_BLOCK)); + }); + }); + + describe('blockNumber not available', () => { + beforeEach(() => { + api = stubApi(-1); + eth = new Eth(cb, api); + return eth.start(); + }); + + it('sets the started status', () => { + expect(eth.isStarted).to.be.true; + }); + + it('calls eth_blockNumber', () => { + expect(api._calls.blockNumber.length).to.be.ok; + }); + + it('does not update subscribers', () => { + expect(cb).not.to.been.called; + }); + }); + }); +}); diff --git a/js/src/api/subscriptions/index.js b/js/src/api/subscriptions/index.js new file mode 100644 index 000000000..07856faef --- /dev/null +++ b/js/src/api/subscriptions/index.js @@ -0,0 +1,19 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export Logging from './logging'; + +export default from './manager'; diff --git a/js/src/api/subscriptions/logging.js b/js/src/api/subscriptions/logging.js new file mode 100644 index 000000000..545742dff --- /dev/null +++ b/js/src/api/subscriptions/logging.js @@ -0,0 +1,44 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +let instance = null; + +export default class Logging { + constructor (updateSubscriptions) { + this._updateSubscriptions = updateSubscriptions; + + instance = this; + } + + get isStarted () { + return true; + } + + start () { + } + + static send (method, params, json) { + if (!instance) { + return; + } + + return instance._updateSubscriptions('logging', null, { + method, + params, + json + }); + } +} diff --git a/js/src/api/subscriptions/logging.spec.js b/js/src/api/subscriptions/logging.spec.js new file mode 100644 index 000000000..f155696b7 --- /dev/null +++ b/js/src/api/subscriptions/logging.spec.js @@ -0,0 +1,49 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import sinon from 'sinon'; + +import Logging from './logging'; + +describe('api/subscriptions/logging', () => { + let cb; + let logging; + + beforeEach(() => { + cb = sinon.stub(); + logging = new Logging(cb); + }); + + describe('constructor', () => { + it('starts the instance in a started state', () => { + expect(logging.isStarted).to.be.true; + }); + }); + + describe('send', () => { + const method = 'method'; + const params = 'params'; + const json = 'json'; + + beforeEach(() => { + Logging.send(method, params, json); + }); + + it('calls the subscription update', () => { + expect(cb).to.have.been.calledWith('logging', null, { method, params, json }); + }); + }); +}); diff --git a/js/src/api/subscriptions/manager.js b/js/src/api/subscriptions/manager.js new file mode 100644 index 000000000..6ca2f4015 --- /dev/null +++ b/js/src/api/subscriptions/manager.js @@ -0,0 +1,137 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { isError } from '../util/types'; + +import Eth from './eth'; +import Logging from './logging'; +import Personal from './personal'; +import Signer from './signer'; + +const events = { + 'logging': { module: 'logging' }, + 'eth_blockNumber': { module: 'eth' }, + 'parity_accountsInfo': { module: 'personal' }, + 'parity_allAccountsInfo': { module: 'personal' }, + 'parity_defaultAccount': { module: 'personal' }, + 'parity_postTransaction': { module: 'signer' }, + 'eth_accounts': { module: 'personal' }, + 'signer_requestsToConfirm': { module: 'signer' } +}; + +export default class Manager { + constructor (api) { + this._api = api; + + this.subscriptions = []; + this.values = {}; + + Object.keys(events).forEach((subscriptionName) => { + this.values[subscriptionName] = { + error: null, + data: null + }; + }); + + this._logging = new Logging(this._updateSubscriptions); + this._eth = new Eth(this._updateSubscriptions, api); + this._personal = new Personal(this._updateSubscriptions, api, this); + this._signer = new Signer(this._updateSubscriptions, api, this); + } + + _validateType (subscriptionName) { + const subscription = events[subscriptionName]; + + if (!subscription) { + return new Error(`${subscriptionName} is not a valid interface, subscribe using one of ${Object.keys(events).join(', ')}`); + } + + return subscription; + } + + subscribe (subscriptionName, callback, autoRemove = false) { + return new Promise((resolve, reject) => { + const subscription = this._validateType(subscriptionName); + + if (isError(subscription)) { + reject(subscription); + return; + } + + const subscriptionId = this.subscriptions.length; + const { error, data } = this.values[subscriptionName]; + const engine = this[`_${subscription.module}`]; + + this.subscriptions[subscriptionId] = { + name: subscriptionName, + id: subscriptionId, + autoRemove, + callback + }; + + if (!engine.isStarted) { + engine.start(); + } else if (error !== null || data !== null) { + this._sendData(subscriptionId, error, data); + } + + resolve(subscriptionId); + }); + } + + unsubscribe (subscriptionId) { + return new Promise((resolve, reject) => { + if (!this.subscriptions[subscriptionId]) { + reject(new Error(`Cannot find subscription ${subscriptionId}`)); + return; + } + + delete this.subscriptions[subscriptionId]; + resolve(); + }); + } + + _sendData (subscriptionId, error, data) { + const { autoRemove, callback } = this.subscriptions[subscriptionId]; + let result = true; + + try { + result = callback(error, data); + } catch (error) { + console.error(`Unable to update callback for subscriptionId ${subscriptionId}`, error); + } + + if (autoRemove && result && typeof result === 'boolean') { + this.unsubscribe(subscriptionId); + } + } + + _updateSubscriptions = (subscriptionName, error, data) => { + const subscriptions = this.subscriptions + .filter(subscription => subscription.name === subscriptionName); + + this.values[subscriptionName] = { error, data }; + + subscriptions + .forEach((subscription) => { + this._sendData(subscription.id, error, data); + }); + } +} + +export { + events +}; diff --git a/js/src/api/subscriptions/manager.spec.js b/js/src/api/subscriptions/manager.spec.js new file mode 100644 index 000000000..df708a36d --- /dev/null +++ b/js/src/api/subscriptions/manager.spec.js @@ -0,0 +1,134 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import sinon from 'sinon'; + +import Manager, { events } from './manager'; + +function newStub () { + const start = () => manager._updateSubscriptions(manager.__test, null, 'test'); + + const manager = new Manager({ + transport: { + isConnected: true + } + }); + + manager._eth = { + isStarted: false, + start + }; + + manager._personal = { + isStarted: false, + start + }; + + manager._signer = { + isStarted: false, + start + }; + + return manager; +} + +describe('api/subscriptions/manager', () => { + let manager; + + beforeEach(() => { + manager = newStub(); + }); + + describe('constructor', () => { + it('sets up the subscription types & defaults', () => { + expect(manager.subscriptions).to.be.an.array; + expect(Object.keys(manager.values)).to.deep.equal(Object.keys(events)); + }); + }); + + describe('subscriptions', () => { + Object + .keys(events) + .filter((eventName) => eventName.indexOf('_') !== -1) + .forEach((eventName) => { + const { module } = events[eventName]; + let engine; + let cb; + let subscriptionId; + + describe(eventName, () => { + beforeEach(() => { + engine = manager[`_${module}`]; + manager.__test = eventName; + cb = sinon.stub(); + sinon.spy(engine, 'start'); + + return manager + .subscribe(eventName, cb) + .then((_subscriptionId) => { + subscriptionId = _subscriptionId; + }); + }); + + it(`puts the ${module} engine in a started state`, () => { + expect(engine.start).to.have.been.called; + }); + + it('returns a subscriptionId', () => { + expect(subscriptionId).to.be.a.number; + }); + + it('calls the subscription callback with updated values', () => { + expect(cb).to.have.been.calledWith(null, 'test'); + }); + }); + }); + }); + + describe('unsubscriptions', () => { + Object + .keys(events) + .filter((eventName) => eventName.indexOf('_') !== -1) + .forEach((eventName) => { + const { module } = events[eventName]; + let engine; + let cb; + + describe(eventName, () => { + beforeEach(() => { + engine = manager[`_${module}`]; + manager.__test = eventName; + cb = sinon.stub(); + sinon.spy(engine, 'start'); + + return manager + .subscribe(eventName, cb) + .then((_subscriptionId) => { + manager.unsubscribe(_subscriptionId); + }) + .then(() => { + manager._updateSubscriptions(manager.__test, null, 'test2'); + }); + }); + + it('does not call the callback after unsubscription', () => { + expect(cb).to.have.been.calledWith(null, 'test'); + expect(cb).to.not.have.been.calledWith(null, 'test2'); + }); + }); + }); + }); +}); diff --git a/js/src/api/subscriptions/personal.js b/js/src/api/subscriptions/personal.js new file mode 100644 index 000000000..8b2b826d0 --- /dev/null +++ b/js/src/api/subscriptions/personal.js @@ -0,0 +1,160 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class Personal { + constructor (updateSubscriptions, api, subscriber) { + this._subscriber = subscriber; + this._api = api; + this._updateSubscriptions = updateSubscriptions; + this._started = false; + + this._lastDefaultAccount = '0x0'; + this._pollTimerId = null; + + // Try to restart subscription if transport is closed + this._api.transport.on('close', () => { + if (this.isStarted) { + this.start(); + } + }); + } + + get isStarted () { + return this._started; + } + + start () { + this._started = true; + + let defaultAccount = null; + + if (this._api.isPubSub) { + defaultAccount = this._api.pubsub + .subscribeAndGetResult( + callback => this._api.pubsub.parity.defaultAccount(callback), + (defaultAccount) => { + this.updateDefaultAccount(defaultAccount); + return defaultAccount; + } + ); + } else { + defaultAccount = this._defaultAccount(); + } + + return Promise.all([ + defaultAccount, + this._listAccounts(), + this._accountsInfo(), + this._loggingSubscribe() + ]); + } + + updateDefaultAccount (defaultAccount) { + if (this._lastDefaultAccount !== defaultAccount) { + this._lastDefaultAccount = defaultAccount; + this._updateSubscriptions('parity_defaultAccount', null, defaultAccount); + } + } + + // FIXME: Because of the different API instances, the "wait for valid changes" approach + // doesn't work. Since the defaultAccount is critical to operation, we poll in exactly + // same way we do in ../eth (ala eth_blockNumber) and update. This should be moved + // to pub-sub as it becomes available + _defaultAccount = (timerDisabled = false) => { + const nextTimeout = (timeout = 3000) => { + if (!timerDisabled) { + this._pollTimerId = setTimeout(() => { + this._defaultAccount(); + }, timeout); + } + }; + + if (!this._api.transport.isConnected) { + nextTimeout(500); + return; + } + + return this._api.parity + .defaultAccount() + .then((defaultAccount) => { + this.updateDefaultAccount(defaultAccount); + nextTimeout(); + }) + .catch(() => nextTimeout()); + } + + _listAccounts = () => { + return this._api.eth + .accounts() + .then((accounts) => { + this._updateSubscriptions('eth_accounts', null, accounts); + }); + } + + _accountsInfo = () => { + return this._api.parity + .accountsInfo() + .then((info) => { + this._updateSubscriptions('parity_accountsInfo', null, info); + + return this._api.parity + .allAccountsInfo() + .catch(() => { + // NOTE: This fails on non-secure APIs, swallow error + return {}; + }) + .then((allInfo) => { + this._updateSubscriptions('parity_allAccountsInfo', null, allInfo); + }); + }); + } + + _loggingSubscribe () { + return this._subscriber.subscribe('logging', (error, data) => { + if (error || !data) { + return; + } + + switch (data.method) { + case 'parity_closeVault': + case 'parity_openVault': + case 'parity_killAccount': + case 'parity_importGethAccounts': + case 'parity_newAccountFromPhrase': + case 'parity_newAccountFromWallet': + case 'personal_newAccount': + this._defaultAccount(true); + this._listAccounts(); + this._accountsInfo(); + return; + + case 'parity_removeAddress': + case 'parity_setAccountName': + case 'parity_setAccountMeta': + this._accountsInfo(); + return; + + case 'parity_setDappAddresses': + case 'parity_setDappDefaultAddress': + case 'parity_setNewDappsAddresses': + case 'parity_setNewDappsDefaultAddress': + this._defaultAccount(true); + this._listAccounts(); + return; + } + }); + } +} diff --git a/js/src/api/subscriptions/personal.spec.js b/js/src/api/subscriptions/personal.spec.js new file mode 100644 index 000000000..ac046d250 --- /dev/null +++ b/js/src/api/subscriptions/personal.spec.js @@ -0,0 +1,156 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import sinon from 'sinon'; + +import Personal from './personal'; + +const TEST_DEFAULT = '0xfa64203C044691aA57251aF95f4b48d85eC00Dd5'; +const TEST_INFO = { + [TEST_DEFAULT]: { + name: 'test' + } +}; +const TEST_LIST = [TEST_DEFAULT]; + +function stubApi (accounts, info) { + const _calls = { + accountsInfo: [], + allAccountsInfo: [], + listAccounts: [], + defaultAccount: [] + }; + + return { + _calls, + transport: { + isConnected: true + }, + parity: { + accountsInfo: () => { + const stub = sinon.stub().resolves(info || TEST_INFO)(); + + _calls.accountsInfo.push(stub); + return stub; + }, + allAccountsInfo: () => { + const stub = sinon.stub().resolves(info || TEST_INFO)(); + + _calls.allAccountsInfo.push(stub); + return stub; + }, + defaultAccount: () => { + const stub = sinon.stub().resolves(Object.keys(info || TEST_INFO)[0])(); + + _calls.defaultAccount.push(stub); + return stub; + } + }, + eth: { + accounts: () => { + const stub = sinon.stub().resolves(accounts || TEST_LIST)(); + + _calls.listAccounts.push(stub); + return stub; + } + } + }; +} + +function stubLogging () { + return { + subscribe: sinon.stub() + }; +} + +describe('api/subscriptions/personal', () => { + let api; + let cb; + let logging; + let personal; + + beforeEach(() => { + api = stubApi(); + cb = sinon.stub(); + logging = stubLogging(); + personal = new Personal(cb, api, logging); + }); + + describe('constructor', () => { + it('starts the instance in a stopped state', () => { + expect(personal.isStarted).to.be.false; + }); + }); + + describe('start', () => { + describe('info available', () => { + beforeEach(() => { + return personal.start(); + }); + + it('sets the started status', () => { + expect(personal.isStarted).to.be.true; + }); + + it('calls parity_accountsInfo', () => { + expect(api._calls.accountsInfo.length).to.be.ok; + }); + + it('calls parity_allAccountsInfo', () => { + expect(api._calls.allAccountsInfo.length).to.be.ok; + }); + + it('calls eth_accounts', () => { + expect(api._calls.listAccounts.length).to.be.ok; + }); + + it('updates subscribers', () => { + expect(cb).to.have.been.calledWith('parity_defaultAccount', null, TEST_DEFAULT); + expect(cb).to.have.been.calledWith('eth_accounts', null, TEST_LIST); + expect(cb).to.have.been.calledWith('parity_accountsInfo', null, TEST_INFO); + expect(cb).to.have.been.calledWith('parity_allAccountsInfo', null, TEST_INFO); + }); + }); + + describe('info not available', () => { + beforeEach(() => { + api = stubApi([], {}); + personal = new Personal(cb, api, logging); + return personal.start(); + }); + + it('sets the started status', () => { + expect(personal.isStarted).to.be.true; + }); + + it('calls parity_defaultAccount', () => { + expect(api._calls.defaultAccount.length).to.be.ok; + }); + + it('calls personal_accountsInfo', () => { + expect(api._calls.accountsInfo.length).to.be.ok; + }); + + it('calls personal_allAccountsInfo', () => { + expect(api._calls.allAccountsInfo.length).to.be.ok; + }); + + it('calls personal_listAccounts', () => { + expect(api._calls.listAccounts.length).to.be.ok; + }); + }); + }); +}); diff --git a/js/src/api/subscriptions/signer.js b/js/src/api/subscriptions/signer.js new file mode 100644 index 000000000..a0c202c1b --- /dev/null +++ b/js/src/api/subscriptions/signer.js @@ -0,0 +1,118 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { outTransaction } from '../format/output'; + +export default class Signer { + constructor (updateSubscriptions, api, subscriber) { + this._subscriber = subscriber; + this._api = api; + this._updateSubscriptions = updateSubscriptions; + this._started = false; + + // Try to restart subscription if transport is closed + this._api.transport.on('close', () => { + if (this.isStarted) { + this.start(); + } + }); + } + + get isStarted () { + return this._started; + } + + start () { + this._started = true; + + if (this._api.isPubSub) { + const subscription = this._api.pubsub + .subscribeAndGetResult( + callback => this._api.pubsub.signer.pendingRequests(callback), + requests => { + this.updateSubscriptions(requests); + return requests; + } + ); + + return Promise.all([ + this._listRequests(false), + subscription + ]); + } + + return Promise.all([ + this._listRequests(true), + this._loggingSubscribe() + ]); + } + + updateSubscriptions (requests) { + return this._updateSubscriptions('signer_requestsToConfirm', null, requests); + } + + _listRequests = (doTimeout) => { + const nextTimeout = (timeout = 1000, forceTimeout = doTimeout) => { + if (forceTimeout) { + setTimeout(() => { + this._listRequests(doTimeout); + }, timeout); + } + }; + + if (!this._api.transport.isConnected) { + nextTimeout(500, true); + return; + } + + return this._api.signer + .requestsToConfirm() + .then((requests) => { + this.updateSubscriptions(requests); + nextTimeout(); + }) + .catch(() => nextTimeout()); + } + + _postTransaction (data) { + const request = { + transaction: outTransaction(data.params[0]), + requestId: data.json.result.result + }; + + this._updateSubscriptions('parity_postTransaction', null, request); + } + + _loggingSubscribe () { + return this._subscriber.subscribe('logging', (error, data) => { + if (error || !data) { + return; + } + + switch (data.method) { + case 'eth_sendTransaction': + case 'eth_sendRawTransaction': + this._listRequests(false); + return; + + case 'parity_postTransaction': + this._postTransaction(data); + this._listRequests(false); + return; + } + }); + } +} diff --git a/js/src/api/transport/error.js b/js/src/api/transport/error.js new file mode 100644 index 000000000..9049705fa --- /dev/null +++ b/js/src/api/transport/error.js @@ -0,0 +1,61 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import ExtendableError from 'es6-error'; + +export const ERROR_CODES = { + UNSUPPORTED_REQUEST: -32000, + NO_WORK: -32001, + NO_AUTHOR: -32002, + NO_NEW_WORK: -32003, + NO_WORK_REQUIRED: -32004, + NOT_ENOUGH_DATA: -32006, + UNKNOWN_ERROR: -32009, + TRANSACTION_ERROR: -32010, + EXECUTION_ERROR: -32015, + EXCEPTION_ERROR: -32016, + ACCOUNT_LOCKED: -32020, + PASSWORD_INVALID: -32021, + ACCOUNT_ERROR: -32023, + SIGNER_DISABLED: -32030, + DAPPS_DISABLED: -32031, + NETWORK_DISABLED: -32035, + REQUEST_REJECTED: -32040, + REQUEST_REJECTED_LIMIT: -32041, + REQUEST_NOT_FOUND: -32042, + COMPILATION_ERROR: -32050, + ENCRYPTION_ERROR: -32055, + FETCH_ERROR: -32060, + INVALID_PARAMS: -32602 +}; + +export default class TransportError extends ExtendableError { + static requestRejected (method = null) { + return new TransportError(method, ERROR_CODES.REQUEST_REJECTED, 'Request has been rejected.'); + } + + constructor (method, code, message) { + const m = `${method}: ${code}: ${message}`; + + super(m); + + this.code = code; + this.type = Object.keys(ERROR_CODES).find((k) => ERROR_CODES[k] === code) || ''; + + this.method = method; + this.text = message; + } +} diff --git a/js/src/api/transport/http/http.e2e.js b/js/src/api/transport/http/http.e2e.js new file mode 100644 index 000000000..af2fb1fbb --- /dev/null +++ b/js/src/api/transport/http/http.e2e.js @@ -0,0 +1,29 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Http from './http'; + +const http = new Http('http://localhost:8545'); + +describe('transport/Http', () => { + it('connects and makes a call to web3_clientVersion', () => { + return http.execute('web3_clientVersion').then((version) => { + const [client] = version.split('/'); + + expect(client === 'Geth' || client === 'Parity').to.be.ok; + }); + }); +}); diff --git a/js/src/api/transport/http/http.js b/js/src/api/transport/http/http.js new file mode 100644 index 000000000..66ef2dec7 --- /dev/null +++ b/js/src/api/transport/http/http.js @@ -0,0 +1,103 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { Logging } from '../../subscriptions'; +import JsonRpcBase from '../jsonRpcBase'; +import TransportError from '../error'; + +/* global fetch */ +export default class Http extends JsonRpcBase { + constructor (url, connectTimeout = 1000) { + super(); + + this._connected = true; + this._url = url; + this._connectTimeout = connectTimeout; + + this._pollConnection(); + } + + _encodeOptions (method, params) { + const json = this.encode(method, params); + + this.log(json); + + return { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Content-Length': json.length + }, + body: json + }; + } + + _execute (method, params) { + const request = this._encodeOptions(method, params); + + return fetch(this._url, request) + .catch((error) => { + this._setDisconnected(); + throw error; + }) + .then((response) => { + this._setConnected(); + + if (response.status !== 200) { + this._setDisconnected(); + this.error(JSON.stringify({ status: response.status, statusText: response.statusText })); + console.error(`${method}(${JSON.stringify(params)}): ${response.status}: ${response.statusText}`); + + throw new Error(`${response.status}: ${response.statusText}`); + } + + return response.json(); + }) + .then((response) => { + Logging.send(method, params, { request, response }); + + if (response.error) { + this.error(JSON.stringify(response)); + console.error(`${method}(${JSON.stringify(params)}): ${response.error.code}: ${response.error.message}`); + + const error = new TransportError(method, response.error.code, response.error.message); + + throw error; + } + + this.log(JSON.stringify(response)); + return response.result; + }); + } + + _pollConnection = () => { + if (this._connectTimeout <= 0) { + return; + } + + const nextTimeout = () => setTimeout(this._pollConnection, this._connectTimeout); + + this + .execute('net_listening') + .then(() => nextTimeout()) + .catch(() => nextTimeout()); + } + + set url (url) { + this._url = url; + } +} diff --git a/js/src/api/transport/http/http.spec.js b/js/src/api/transport/http/http.spec.js new file mode 100644 index 000000000..3d08e17a4 --- /dev/null +++ b/js/src/api/transport/http/http.spec.js @@ -0,0 +1,142 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { TEST_HTTP_URL, mockHttp } from '../../../../test/mockRpc'; +import Http from './http'; + +const transport = new Http(TEST_HTTP_URL, -1); + +describe('api/transport/Http', () => { + describe('instance', () => { + it('encodes the options correctly', () => { + const opt = transport._encodeOptions('someMethod', ['param']); + const enc = { + method: 'POST', + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/json', + 'Content-Length': 65 + }, + body: `{"jsonrpc":"2.0","method":"someMethod","params":["param"],"id":${transport._id - 1}}` + }; + + expect(opt).to.deep.equal(enc); + }); + }); + + describe('transport emitter', () => { + it('emits close event', (done) => { + transport.once('close', () => { + done(); + }); + + transport.execute('eth_call'); + }); + + it('emits open event', (done) => { + mockHttp([{ method: 'eth_call', reply: { result: '' } }]); + + transport.once('open', () => { + done(); + }); + + transport.execute('eth_call'); + }); + }); + + describe('transport', () => { + const RESULT = ['this is some result']; + + let scope; + let result; + + beforeEach(() => { + scope = mockHttp([{ method: 'eth_call', reply: { result: RESULT } }]); + + return transport + .execute('eth_call', 1, 2, 3, 'test') + .then((_result) => { + result = _result; + }); + }); + + it('makes POST', () => { + expect(scope.isDone()).to.be.true; + }); + + it('sets jsonrpc', () => { + expect(scope.body.eth_call.jsonrpc).to.equal('2.0'); + }); + + it('sets the method', () => { + expect(scope.body.eth_call.method).to.equal('eth_call'); + }); + + it('passes the params', () => { + expect(scope.body.eth_call.params).to.deep.equal([1, 2, 3, 'test']); + }); + + it('increments the id', () => { + expect(scope.body.eth_call.id).not.to.equal(0); + }); + + it('passes the actual result back', () => { + expect(result).to.deep.equal(RESULT); + }); + }); + + describe('HTTP errors', () => { + let scope; + let error; + + beforeEach(() => { + scope = mockHttp([{ method: 'eth_call', reply: {}, code: 500 }]); + + return transport + .execute('eth_call') + .catch((_error) => { + error = _error; + }); + }); + + it('returns HTTP errors as throws', () => { + expect(scope.isDone()).to.be.true; + expect(error.message).to.match(/Internal Server Error/); + }); + }); + + describe('RPC errors', () => { + const ERROR = { code: -1, message: 'ERROR: RPC failure' }; + + let scope; + let error; + + beforeEach(() => { + scope = mockHttp([{ method: 'eth_call', reply: { error: ERROR } }]); + + return transport + .execute('eth_call') + .catch((_error) => { + error = _error; + }); + }); + + it('returns RPC errors as throws', () => { + expect(scope.isDone()).to.be.true; + expect(error.message).to.match(/RPC failure/); + }); + }); +}); diff --git a/js/src/api/transport/http/index.js b/js/src/api/transport/http/index.js new file mode 100644 index 000000000..dfd172165 --- /dev/null +++ b/js/src/api/transport/http/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './http'; diff --git a/js/src/api/transport/index.js b/js/src/api/transport/index.js new file mode 100644 index 000000000..fdd3861a8 --- /dev/null +++ b/js/src/api/transport/index.js @@ -0,0 +1,20 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export Http from './http'; +export Ws from './ws'; +export TransportError from './error'; +export Middleware from './middleware'; diff --git a/js/src/api/transport/jsonRpcBase.js b/js/src/api/transport/jsonRpcBase.js new file mode 100644 index 000000000..1b96347d3 --- /dev/null +++ b/js/src/api/transport/jsonRpcBase.js @@ -0,0 +1,168 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import EventEmitter from 'eventemitter3'; + +import { Logging } from '../subscriptions'; +import logger from './logger'; + +const LOGGER_ENABLED = process.env.NODE_ENV !== 'production'; + +export default class JsonRpcBase extends EventEmitter { + constructor () { + super(); + + this._id = 1; + this._debug = false; + this._connected = false; + this._middlewareList = Promise.resolve([]); + } + + encode (method, params) { + const json = JSON.stringify({ + jsonrpc: '2.0', + method: method, + params: params, + id: this._id++ + }); + + return json; + } + + addMiddleware (Middleware) { + this._middlewareList = Promise + .all([ + Middleware, + this._middlewareList + ]) + .then(([Middleware, middlewareList]) => { + // Do nothing if `handlerPromise` resolves to a null-y value. + if (Middleware == null) { + return middlewareList; + } + + // don't mutate the original array + return middlewareList.concat([new Middleware(this)]); + }); + } + + _wrapSuccessResult (result) { + return { + id: this._id, + jsonrpc: '2.0', + result + }; + } + + _wrapErrorResult (error) { + return { + id: this._id, + jsonrpc: '2.0', + error: { + code: error.code, + message: error.text + } + }; + } + + execute (method, ...params) { + let start; + let logId; + + if (LOGGER_ENABLED) { + start = Date.now(); + logId = logger.log({ method, params }); + } + + return this._middlewareList.then((middlewareList) => { + for (const middleware of middlewareList) { + const res = middleware.handle(method, params); + + if (res != null) { + return Promise + .resolve(res) + .then((res) => { + const result = this._wrapSuccessResult(res); + const json = this.encode(method, params); + + Logging.send(method, params, { json, result }); + + return res; + }); + } + } + + const result = this._execute(method, params); + + if (!LOGGER_ENABLED) { + return result; + } + + return result + .then((result) => { + logger.set(logId, { result, time: Date.now() - start }); + + return result; + }); + }); + } + + _execute () { + throw new Error('Missing implementation of JsonRpcBase#_execute'); + } + + _setConnected () { + if (!this._connected) { + this._connected = true; + this.emit('open'); + } + } + + _setDisconnected () { + if (this._connected) { + this._connected = false; + this.emit('close'); + } + } + + get id () { + return this._id; + } + + get isDebug () { + return this._debug; + } + + get isConnected () { + return this._connected; + } + + setDebug (flag) { + this._debug = flag; + } + + error (error) { + if (this.isDebug) { + console.error(error); + } + } + + log (log) { + if (this.isDebug) { + console.log(log); + } + } +} diff --git a/js/src/api/transport/jsonRpcBase.spec.js b/js/src/api/transport/jsonRpcBase.spec.js new file mode 100644 index 000000000..6c3b95564 --- /dev/null +++ b/js/src/api/transport/jsonRpcBase.spec.js @@ -0,0 +1,88 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import sinon from 'sinon'; + +import JsonRpcBase from './jsonRpcBase'; + +const base = new JsonRpcBase(); + +describe('api/transport/JsonRpcBase', () => { + describe('encode', () => { + it('encodes the body correctly, incrementing id', () => { + const id = base.id; + const bdy = base.encode('someMethod', ['param1', 'param2']); + const enc = `{"jsonrpc":"2.0","method":"someMethod","params":["param1","param2"],"id":${id}}`; + + expect(bdy).to.equal(enc); + expect(base.id - id).to.equal(1); + }); + }); + + describe('setDebug', () => { + it('starts with disabled flag', () => { + expect(base.isDebug).to.be.false; + }); + + it('true flag switches on', () => { + base.setDebug(true); + expect(base.isDebug).to.be.true; + }); + + it('false flag switches off', () => { + base.setDebug(true); + expect(base.isDebug).to.be.true; + base.setDebug(false); + expect(base.isDebug).to.be.false; + }); + + describe('logging', () => { + beforeEach(() => { + sinon.spy(console, 'log'); + sinon.spy(console, 'error'); + }); + + afterEach(() => { + console.log.restore(); + console.error.restore(); + }); + + it('does not log errors with flag off', () => { + base.setDebug(false); + base.log('error'); + expect(console.log).to.not.be.called; + }); + + it('does not log errors with flag off', () => { + base.setDebug(false); + base.error('error'); + expect(console.error).to.not.be.called; + }); + + it('does log errors with flag on', () => { + base.setDebug(true); + base.log('error'); + expect(console.log).to.be.called; + }); + + it('does log errors with flag on', () => { + base.setDebug(true); + base.error('error'); + expect(console.error).to.be.called; + }); + }); + }); +}); diff --git a/js/src/api/transport/logger.js b/js/src/api/transport/logger.js new file mode 100644 index 000000000..930c4a34e --- /dev/null +++ b/js/src/api/transport/logger.js @@ -0,0 +1,150 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import MethodDecodingStore from '~/ui/MethodDecoding/methodDecodingStore'; + +const LOGGER_ENABLED = process.env.NODE_ENV !== 'production'; + +let logger; + +if (LOGGER_ENABLED) { + class Logger { + _logs = {}; + _id = 0; + + log ({ method, params }) { + const logId = this._id++; + + this._logs[logId] = { method, params, date: Date.now() }; + return logId; + } + + set (logId, data) { + this._logs[logId] = { + ...this._logs[logId], + ...data + }; + } + + static sorter (logA, logB) { + return logA.date - logB.date; + } + + get calls () { + const calls = this.methods['eth_call'] || []; + const decoding = MethodDecodingStore.get(window.secureApi); + const contracts = {}; + + const progress = Math.round(calls.length / 20); + + return calls + .reduce((promise, call, index) => { + const { data, to } = call.params[0]; + + contracts[to] = contracts[to] || []; + + return promise + .then(() => decoding.lookup(null, { data, to })) + .then((lookup) => { + if (!lookup.name) { + contracts[to].push(data); + return; + } + + const inputs = lookup.inputs.map((input) => { + if (/bytes/.test(input.type)) { + return '0x' + input.value.map((v) => v.toString(16).padStart(2, 0)).join(''); + } + + return input.value; + }); + + const called = `${lookup.name}(${inputs.join(', ')})`; + + contracts[to].push(called); + + if (index % progress === 0) { + console.warn(`progress: ${Math.round(100 * index / calls.length)}%`); + } + }); + }, Promise.resolve()) + .then(() => { + return Object.keys(contracts) + .map((address) => { + const count = contracts[address].length; + + return { + count, + calls: contracts[address], + to: address + }; + }) + .sort((cA, cB) => cB.count - cA.count); + }); + } + + get logs () { + return Object.values(this._logs).sort(Logger.sorter); + } + + get methods () { + return this.logs.reduce((methods, log) => { + methods[log.method] = methods[log.method] || []; + methods[log.method].push(log); + return methods; + }, {}); + } + + get stats () { + const logs = this.logs; + const methods = this.methods; + + const start = logs[0].date; + const end = logs[logs.length - 1].date; + + // Duration in seconds + const duration = (end - start) / 1000; + const speed = logs.length / duration; + + const sortedMethods = Object.keys(methods) + .map((method) => { + const methodLogs = methods[method].sort(Logger.sorter); + const methodSpeed = methodLogs.length / duration; + + return { + speed: methodSpeed, + count: methodLogs.length, + logs: methodLogs, + method + }; + }) + .sort((mA, mB) => mB.count - mA.count); + + return { + methods: sortedMethods, + speed + }; + } + } + + logger = new Logger(); + + if (window) { + window._logger = logger; + } +} + +export default logger; diff --git a/js/src/api/transport/middleware.js b/js/src/api/transport/middleware.js new file mode 100644 index 000000000..ef029b1cb --- /dev/null +++ b/js/src/api/transport/middleware.js @@ -0,0 +1,44 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class Middleware { + constructor (transport) { + this._transport = transport; + this._handlers = {}; + } + + register (method, handler) { + if (method in this._handlers) { + throw new Error(`${method} is already defined in the middleware!`); + } + + this._handlers[method] = handler; + } + + handle (method, params) { + const handler = this._handlers[method]; + + if (handler != null) { + return handler(params); + } + + return null; + } + + rpcRequest (method, params) { + return this._transport._execute(method, params); + } +} diff --git a/js/src/api/transport/middleware.spec.js b/js/src/api/transport/middleware.spec.js new file mode 100644 index 000000000..4ae894135 --- /dev/null +++ b/js/src/api/transport/middleware.spec.js @@ -0,0 +1,62 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Middleware from './middleware'; +import JsonRpcBase from './jsonRpcBase'; + +const MOCKED = 'mocked!'; + +class MockTransport extends JsonRpcBase { + _execute () { + return Promise.resolve(MOCKED); + } +} + +class MockMiddleware extends Middleware { + constructor (transport) { + super(transport); + + this.register('mock_rpc', ([num]) => num); + this.register('mock_null', () => null); + } +} + +describe('api/transport/Middleware', () => { + let transport; + + beforeEach(() => { + transport = new MockTransport(); + transport.addMiddleware(MockMiddleware); + }); + + it('Routes requests to middleware', () => { + return transport.execute('mock_rpc', 100).then((num) => { + expect(num).to.be.equal(100); + }); + }); + + it('Passes non-mocked requests through', () => { + return transport.execute('not_moced', 200).then((result) => { + expect(result).to.be.equal(MOCKED); + }); + }); + + it('Passes mocked requests through, if middleware returns null', () => { + return transport.execute('mock_null', 300).then((result) => { + expect(result).to.be.equal(MOCKED); + }); + }); +}); diff --git a/js/src/api/transport/ws/index.js b/js/src/api/transport/ws/index.js new file mode 100644 index 000000000..7ab0be131 --- /dev/null +++ b/js/src/api/transport/ws/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './ws'; diff --git a/js/src/api/transport/ws/ws.e2e.js b/js/src/api/transport/ws/ws.e2e.js new file mode 100644 index 000000000..42e47451c --- /dev/null +++ b/js/src/api/transport/ws/ws.e2e.js @@ -0,0 +1,29 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Ws from './ws'; + +const ws = new Ws('ws://localhost:8546/'); + +describe('transport/Ws', () => { + it('connects and makes a call to web3_clientVersion', () => { + return ws.execute('web3_clientVersion').then((version) => { + const [client] = version.split('/'); + + expect(client === 'Geth' || client === 'Parity').to.be.ok; + }); + }); +}); diff --git a/js/src/api/transport/ws/ws.js b/js/src/api/transport/ws/ws.js new file mode 100644 index 000000000..63abecb83 --- /dev/null +++ b/js/src/api/transport/ws/ws.js @@ -0,0 +1,398 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { keccak_256 } from 'js-sha3'; // eslint-disable-line camelcase + +import { Logging } from '../../subscriptions'; +import JsonRpcBase from '../jsonRpcBase'; +import TransportError from '../error'; + +/* global WebSocket */ +export default class Ws extends JsonRpcBase { + // token is optional (secure API) + constructor (url, token = null, autoconnect = true) { + super(); + + this._url = url; + this._token = token; + this._messages = {}; + this._subscriptions = {}; + this._sessionHash = null; + + this._connecting = false; + this._connected = false; + this._lastError = null; + this._autoConnect = autoconnect; + this._retries = 0; + this._reconnectTimeoutId = null; + + this._connectPromise = null; + this._connectPromiseFunctions = {}; + + if (autoconnect) { + this.connect(); + } + } + + updateToken (token, connect = true) { + this._token = token; + // this._autoConnect = true; + + if (connect) { + this.connect(); + } + } + + connect () { + if (this._connected) { + return Promise.resolve(); + } + + if (this._connecting) { + return this._connectPromise || Promise.resolve(); + } + + if (this._reconnectTimeoutId) { + window.clearTimeout(this._reconnectTimeoutId); + this._reconnectTimeoutId = null; + } + + if (this._ws) { + this._ws.onerror = null; + this._ws.onopen = null; + this._ws.onclose = null; + this._ws.onmessage = null; + this._ws.close(); + this._ws = null; + this._sessionHash = null; + } + this._connecting = true; + this._connected = false; + this._lastError = null; + + // rpc secure API + if (this._token) { + const time = parseInt(new Date().getTime() / 1000, 10); + const sha3 = keccak_256(`${this._token}:${time}`); + const hash = `${sha3}_${time}`; + + this._sessionHash = sha3; + this._ws = new WebSocket(this._url, hash); + // non-secure API + } else { + this._ws = new WebSocket(this._url); + } + + this._ws.onerror = this._onError; + this._ws.onopen = this._onOpen; + this._ws.onclose = this._onClose; + this._ws.onmessage = this._onMessage; + + // Get counts in dev mode only + if (process.env.NODE_ENV === 'development') { + this._count = 0; + this._lastCount = { + timestamp: Date.now(), + count: 0 + }; + + window.setInterval(() => { + const n = this._count - this._lastCount.count; + const t = (Date.now() - this._lastCount.timestamp) / 1000; + const s = Math.round(1000 * n / t) / 1000; + + if (this._debug) { + console.log('::parityWS', `speed: ${s} req/s`, `count: ${this._count}`, `(+${n})`); + } + + this._lastCount = { + timestamp: Date.now(), + count: this._count + }; + }, 5000); + + window._parityWS = this; + } + + this._connectPromise = new Promise((resolve, reject) => { + this._connectPromiseFunctions = { resolve, reject }; + }); + + return this._connectPromise; + } + + _onOpen = (event) => { + this._setConnected(); + this._connecting = false; + this._retries = 0; + + Object.keys(this._messages) + .filter((id) => this._messages[id].queued) + .forEach(this._send); + + this._connectPromiseFunctions.resolve(); + + this._connectPromise = null; + this._connectPromiseFunctions = {}; + } + + _onClose = (event) => { + this._setDisconnected(); + this._connecting = false; + + event.timestamp = Date.now(); + this._lastError = event; + + if (this._autoConnect) { + const timeout = this.retryTimeout; + + const time = timeout < 1000 + ? Math.round(timeout) + 'ms' + : (Math.round(timeout / 10) / 100) + 's'; + + console.log('ws:onClose', `trying again in ${time}...`); + + this._reconnectTimeoutId = setTimeout(() => { + this.connect(); + }, timeout); + + return; + } + + if (this._connectPromise) { + this._connectPromiseFunctions.reject(event); + + this._connectPromise = null; + this._connectPromiseFunctions = {}; + } + + console.log('ws:onClose'); + } + + _onError = (event) => { + // Only print error if the WS is connected + // ie. don't print if error == closed + window.setTimeout(() => { + if (this._connected) { + console.error('ws:onError'); + + event.timestamp = Date.now(); + this._lastError = event; + + if (this._connectPromise) { + this._connectPromiseFunctions.reject(event); + + this._connectPromise = null; + this._connectPromiseFunctions = {}; + } + } + }, 50); + } + + _extract = (result) => { + const { result: res, id, method, params } = result; + const msg = this._messages[id]; + + // initial pubsub ACK + if (id && msg.subscription) { + // save subscription to map subId -> messageId + this._subscriptions[msg.subscription] = this._subscriptions[msg.subscription] || {}; + this._subscriptions[msg.subscription][res] = id; + // resolve promise with messageId because subId's can collide (eth/parity) + msg.resolve(id); + // save subId for unsubscribing later + msg.subId = res; + return msg; + } + + // normal message + if (id) { + return msg; + } + + // pubsub format + if (this._subscriptions[method]) { + const messageId = this._messages[this._subscriptions[method][params.subscription]]; + + if (messageId) { + return messageId; + } else { + throw Error(`Received Subscription which is already unsubscribed ${JSON.stringify(result)}`); + } + } + + throw Error(`Unknown message format: No ID or subscription ${JSON.stringify(result)}`); + } + + _onMessage = (event) => { + try { + const result = JSON.parse(event.data); + const { method, params, json, resolve, reject, callback, subscription } = this._extract(result); + + Logging.send(method, params, { json, result }); + + result.error = (result.params && result.params.error) || result.error; + if (result.error) { + this.error(event.data); + + // Don't print error if request rejected or not is not yet up... + if (!/(rejected|not yet up)/.test(result.error.message)) { + console.error(`${method}(${JSON.stringify(params)}): ${result.error.code}: ${result.error.message}`); + } + + const error = new TransportError(method, result.error.code, result.error.message); + + if (result.id) { + reject(error); + } else { + callback(error); + } + + delete this._messages[result.id]; + return; + } + + // if not initial subscription message resolve & delete + if (result.id && !subscription) { + resolve(result.result); + delete this._messages[result.id]; + } else if (result.params) { + callback(null, result.params.result); + } + } catch (e) { + console.error('ws::_onMessage', event.data, e); + } + } + + _send = (id) => { + const message = this._messages[id]; + + if (this._connected) { + if (process.env.NODE_ENV === 'development') { + this._count++; + } + + return this._ws.send(message.json); + } + + message.queued = !this._connected; + message.timestamp = Date.now(); + } + + _execute (method, params) { + return new Promise((resolve, reject) => { + const id = this.id; + const json = this.encode(method, params); + + this._messages[id] = { id, method, params, json, resolve, reject }; + this._send(id); + }); + } + + _methodsFromApi (api) { + if (api.subscription) { + const { subscribe, unsubscribe, subscription } = api; + + return { + method: subscribe, + uMethod: unsubscribe, + subscription + }; + } + + const method = `${api}_subscribe`; + const uMethod = `${api}_unsubscribe`; + const subscription = `${api}_subscription`; + + return { method, uMethod, subscription }; + } + + subscribe (api, callback, params) { + return new Promise((resolve, reject) => { + const id = this.id; + const { method, uMethod, subscription } = this._methodsFromApi(api); + const json = this.encode(method, params); + + this._messages[id] = { id, method, uMethod, params, json, resolve, reject, callback, subscription }; + + this._send(id); + }); + } + + unsubscribe (messageId) { + return new Promise((resolve, reject) => { + const id = this.id; + const { subId, uMethod, subscription } = this._messages[messageId]; + const params = [subId]; + const json = this.encode(uMethod, params); + const uResolve = (v) => { + delete this._messages[messageId]; + delete this._subscriptions[subscription][subId]; + resolve(v); + }; + + this._messages[id] = { id, method: uMethod, params, json, resolve: uResolve, reject }; + this._send(id); + }); + } + + set url (url) { + this._url = url; + } + + get token () { + return this._token; + } + + get sessionHash () { + return this._sessionHash; + } + + get isAutoConnect () { + return this._autoConnect; + } + + get isConnecting () { + return this._connecting; + } + + get lastError () { + return this._lastError; + } + + /** + * Exponential Timeout for Retries + * + * @see http://dthain.blogspot.de/2009/02/exponential-backoff-in-distributed.html + */ + get retryTimeout () { + // R between 1 and 2 + const R = Math.random() + 1; + // Initial timeout (100ms) + const T = 100; + // Exponential Factor + const F = 2; + // Max timeout (4s) + const M = 4000; + // Current number of retries + const N = this._retries; + + // Increase retries number + this._retries++; + + return Math.min(R * T * Math.pow(F, N), M); + } +} diff --git a/js/src/api/transport/ws/ws.spec.js b/js/src/api/transport/ws/ws.spec.js new file mode 100644 index 000000000..0d3c9836f --- /dev/null +++ b/js/src/api/transport/ws/ws.spec.js @@ -0,0 +1,116 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { TEST_WS_URL, mockWs } from '../../../../test/mockRpc'; +import Ws from './ws'; + +describe('api/transport/Ws', () => { + let transport; + let scope; + + describe('transport emitter', () => { + const connect = () => { + const scope = mockWs(); + const transport = new Ws(TEST_WS_URL); + + return { transport, scope }; + }; + + it('emits open event', (done) => { + const { transport, scope } = connect(); + + transport.once('open', () => { + done(); + }); + + scope.stop(); + }); + + it('emits close event', (done) => { + const { transport, scope } = connect(); + + transport.once('open', () => { + scope.server.close(); + }); + + transport.once('close', () => { + done(); + }); + }); + }); + + describe('transport', () => { + let result; + + beforeEach(() => { + scope = mockWs([{ method: 'test_anyCall', reply: 'TestResult' }]); + transport = new Ws(TEST_WS_URL); + + return transport + .execute('test_anyCall', 1, 2, 3) + .then((_result) => { + result = _result; + }); + }); + + afterEach(() => { + scope.stop(); + }); + + it('makes call', () => { + expect(scope.isDone()).to.be.true; + }); + + it('sets jsonrpc', () => { + expect(scope.body.test_anyCall.jsonrpc).to.equal('2.0'); + }); + + it('sets the method', () => { + expect(scope.body.test_anyCall.method).to.equal('test_anyCall'); + }); + + it('passes the params', () => { + expect(scope.body.test_anyCall.params).to.deep.equal([1, 2, 3]); + }); + + it('increments the id', () => { + expect(scope.body.test_anyCall.id).not.to.equal(0); + }); + + it('passes the actual result back', () => { + expect(result).to.equal('TestResult'); + }); + }); + + describe('errors', () => { + beforeEach(() => { + scope = mockWs([{ method: 'test_anyCall', reply: { error: { code: 1, message: 'TestError' } } }]); + transport = new Ws(TEST_WS_URL); + }); + + afterEach(() => { + scope.stop(); + }); + + it('returns RPC errors when encountered', () => { + return transport + .execute('test_anyCall') + .catch((error) => { + expect(error).to.match(/TestError/); + }); + }); + }); +}); diff --git a/js/src/api/util/decode.js b/js/src/api/util/decode.js new file mode 100644 index 000000000..926a5a8a1 --- /dev/null +++ b/js/src/api/util/decode.js @@ -0,0 +1,95 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { isHex } from './types'; + +import Func from '../../abi/spec/function'; +import { fromParamType, toParamType } from '../../abi/spec/paramType/format'; + +export function decodeCallData (data) { + if (!isHex(data)) { + throw new Error('Input to decodeCallData should be a hex value'); + } + + if (data.substr(0, 2) === '0x') { + return decodeCallData(data.slice(2)); + } + + if (data.length < 8) { + throw new Error('Input to decodeCallData should be method signature + data'); + } + + const signature = data.substr(0, 8); + const paramdata = data.substr(8); + + return { + signature: `0x${signature}`, + paramdata: `0x${paramdata}` + }; +} + +export function decodeMethodInput (methodAbi, paramdata) { + if (!methodAbi) { + throw new Error('decodeMethodInput should receive valid method-specific ABI'); + } + + if (paramdata && paramdata.length) { + if (!isHex(paramdata)) { + throw new Error('Input to decodeMethodInput should be a hex value'); + } + + if (paramdata.substr(0, 2) === '0x') { + return decodeMethodInput(methodAbi, paramdata.slice(2)); + } + } + + return new Func(methodAbi).decodeInput(paramdata).map((decoded) => decoded.value); +} + +// takes a method in form name(...,types) and returns the inferred abi definition +export function methodToAbi (method) { + const length = method.length; + const typesStart = method.indexOf('('); + const typesEnd = method.indexOf(')'); + + if (typesStart === -1) { + throw new Error(`Missing start ( in call to decodeMethod with ${method}`); + } else if (typesEnd === -1) { + throw new Error(`Missing end ) in call to decodeMethod with ${method}`); + } else if (typesEnd < typesStart) { + throw new Error(`End ) is before start ( in call to decodeMethod with ${method}`); + } else if (typesEnd !== length - 1) { + throw new Error(`Extra characters after end ) in call to decodeMethod with ${method}`); + } + + const name = method.substr(0, typesStart); + const types = method.substr(typesStart + 1, length - (typesStart + 1) - 1).split(','); + const inputs = types.filter((_type) => _type.length).map((_type) => { + const type = fromParamType(toParamType(_type)); + + return { type }; + }); + + return { type: 'function', name, inputs }; +} + +export function abiDecode (inputTypes, data) { + return decodeMethodInput({ + inputs: inputTypes.map((type) => { + return { type }; + }) + }, data); +} diff --git a/js/src/api/util/decode.spec.js b/js/src/api/util/decode.spec.js new file mode 100644 index 000000000..006c6a863 --- /dev/null +++ b/js/src/api/util/decode.spec.js @@ -0,0 +1,105 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; +import { abiDecode, decodeCallData, decodeMethodInput, methodToAbi } from './decode'; + +describe('api/util/decode', () => { + const METH = '0x70a08231'; + const ENCO = '0x70a082310000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; + const DATA = '0x0000000000000000000000005A5eFF38DA95b0D58b6C616f2699168B480953C9'; + + describe('decodeCallData', () => { + it('throws on non-hex inputs', () => { + expect(() => decodeCallData('invalid')).to.throw(/should be a hex value/); + }); + + it('throws when invalid signature length', () => { + expect(() => decodeCallData(METH.slice(-6))).to.throw(/should be method signature/); + }); + + it('splits valid inputs properly', () => { + expect(decodeCallData(ENCO)).to.deep.equal({ + signature: METH, + paramdata: DATA + }); + }); + }); + + describe('decodeMethodInput', () => { + it('expects a valid ABI', () => { + expect(() => decodeMethodInput(null, null)).to.throw(/should receive valid method/); + }); + + it('expect valid hex parameter data', () => { + expect(() => decodeMethodInput({}, 'invalid')).to.throw(/should be a hex value/); + }); + + it('correctly decodes valid inputs', () => { + expect( + decodeMethodInput({ + type: 'function', + inputs: [ + { type: 'uint' } + ] + }, DATA) + ).to.deep.equal( + [ new BigNumber('0x5a5eff38da95b0d58b6c616f2699168b480953c9') ] + ); + }); + }); + + describe('methodToAbi', () => { + it('throws when no start ( specified', () => { + expect(() => methodToAbi('invalid,uint,bool)')).to.throw(/Missing start \(/); + }); + + it('throws when no end ) specified', () => { + expect(() => methodToAbi('invalid(uint,bool')).to.throw(/Missing end \)/); + }); + + it('throws when end ) is not in the last position', () => { + expect(() => methodToAbi('invalid(uint,bool)2')).to.throw(/Extra characters after end \)/); + }); + + it('throws when start ( is after end )', () => { + expect(() => methodToAbi('invalid)uint,bool(')).to.throw(/End \) is before start \(/); + }); + + it('throws when invalid types are present', () => { + expect(() => methodToAbi('method(invalidType,bool,uint)')).to.throw(/Cannot convert invalidType/); + }); + + it('returns a valid methodabi for a valid method', () => { + expect(methodToAbi('valid(uint,bool)')).to.deep.equals({ + type: 'function', + name: 'valid', + inputs: [ + { type: 'uint256' }, + { type: 'bool' } + ] + }); + }); + }); + + describe('abiDecode', () => { + it('correctly decodes valid inputs', () => { + expect(abiDecode(['uint'], DATA)).to.deep.equal( + [ new BigNumber('0x5a5eff38da95b0d58b6c616f2699168b480953c9') ] + ); + }); + }); +}); diff --git a/js/src/api/util/encode.js b/js/src/api/util/encode.js new file mode 100644 index 000000000..f18fbbe2b --- /dev/null +++ b/js/src/api/util/encode.js @@ -0,0 +1,69 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import Abi from '~/abi'; +import Func from '~/abi/spec/function'; + +import { abiDecode } from './decode'; +import { cleanupValue } from './format'; +import { sha3 } from './sha3'; + +export function encodeMethodCallAbi (methodAbi = {}, values = []) { + const func = new Func(methodAbi); + const tokens = Abi.encodeTokens(func.inputParamTypes(), values); + const call = func.encodeCall(tokens); + + return `0x${call}`; +} + +export function abiEncode (methodName, inputTypes, data) { + const result = encodeMethodCallAbi({ + name: methodName || '', + type: 'function', + inputs: inputTypes.map((type) => { + return { type }; + }) + }, data); + + return result; +} + +export function abiUnencode (abi, data) { + const callsig = data.substr(2, 8); + const op = abi.find((field) => { + return field.type === 'function' && + abiSignature(field.name, field.inputs.map((input) => input.type)).substr(2, 8) === callsig; + }); + + if (!op) { + console.warn(`Unknown function ID: ${callsig}`); + return null; + } + + let argsByIndex = abiDecode(op.inputs.map((field) => field.type), '0x' + data.substr(10)) + .map((value, index) => cleanupValue(value, op.inputs[index].type)); + const argsByName = op.inputs.reduce((result, field, index) => { + result[field.name] = argsByIndex[index]; + + return result; + }, {}); + + return [op.name, argsByName, argsByIndex]; +} + +export function abiSignature (name, inputs) { + return sha3(`${name}(${inputs.join()})`); +} diff --git a/js/src/api/util/encode.spec.js b/js/src/api/util/encode.spec.js new file mode 100644 index 000000000..7847f06ec --- /dev/null +++ b/js/src/api/util/encode.spec.js @@ -0,0 +1,90 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { abiEncode, abiUnencode, abiSignature, encodeMethodCallAbi } from './encode'; + +const ABI = { + type: 'function', + name: 'valid', + inputs: [ + { type: 'uint256' }, + { type: 'bool' } + ] +}; + +const RESULT = [ + 'f87fa141', + '0000000000000000000000000000000000000000000000000000000000000123', + '0000000000000000000000000000000000000000000000000000000000000001' +].join(''); +const VARIABLE = [ + '5a6fbce0', + 'c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', + '0000000000000000000000000000000000000000000000000000000000000040', + '000000000000000000000000000000000000000000000000000000000000000f', + '687474703a2f2f666f6f2e6261722f0000000000000000000000000000000000' +].join(''); + +describe('api/util/encode', () => { + describe('encodeMethodCallAbi', () => { + it('encodes calls with the correct result', () => { + expect(encodeMethodCallAbi(ABI, [0x123, true])).to.equal(`0x${RESULT}`); + }); + }); + + describe('abiEncode', () => { + it('encodes calls with the correct result', () => { + expect(abiEncode('valid', ['uint256', 'bool'], [0x123, true])).to.equal(`0x${RESULT}`); + }); + + it('encodes variable values', () => { + expect( + abiEncode( + 'hintUrl', ['bytes32', 'string'], ['0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470', 'http://foo.bar/'] + ) + ).to.equal(`0x${VARIABLE}`); + }); + + it('encodes only the data with null name', () => { + expect( + abiEncode(null, ['uint256', 'bool'], [0x123, true]) + ).to.equal(`0x${RESULT.substr(8)}`); + }); + }); + + describe('abiUnencode', () => { + it('decodes data correctly from abi', () => { + expect( + abiUnencode([{ + name: 'test', + type: 'function', + inputs: [ + { type: 'uint', name: 'arga' } + ] + }], '0x1acb6f7700000000000000000000000000000038') + ).to.deep.equal(['test', { arga: 56 }, [56]]); + }); + }); + + // Same example as in abi/util/signature.spec.js + describe('abiSignature', () => { + it('encodes baz(uint32,bool) correctly', () => { + expect( + abiSignature('baz', ['uint32', 'bool']) + ).to.equal('0xcdcd77c0992ec5bbfc459984220f8c45084cc24d9b6efed1fae540db8de801d2'); + }); + }); +}); diff --git a/js/src/api/util/format.js b/js/src/api/util/format.js new file mode 100644 index 000000000..6a4a81d40 --- /dev/null +++ b/js/src/api/util/format.js @@ -0,0 +1,106 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { range } from 'lodash'; + +export function bytesToHex (bytes) { + return '0x' + Buffer.from(bytes).toString('hex'); +} + +export function cleanupValue (value, type) { + // TODO: make work with arbitrary depth arrays + if (value instanceof Array && type.match(/bytes[0-9]+/)) { + // figure out if it's an ASCII string hiding in there: + let ascii = ''; + + for (let index = 0, ended = false; index < value.length && ascii !== null; ++index) { + const val = value[index]; + + if (val === 0) { + ended = true; + } else { + ascii += String.fromCharCode(val); + } + + if ((ended && val !== 0) || (!ended && (val < 32 || val >= 128))) { + ascii = null; + } + } + + value = ascii === null + ? bytesToHex(value) + : ascii; + } + + if (type.substr(0, 4) === 'uint' && +type.substr(4) <= 48) { + value = +value; + } + + return value; +} + +export function hexToBytes (hex) { + const raw = toHex(hex).slice(2); + const bytes = []; + + for (let i = 0; i < raw.length; i += 2) { + bytes.push(parseInt(raw.substr(i, 2), 16)); + } + + return bytes; +} + +export function hexToAscii (hex) { + const bytes = hexToBytes(hex); + const str = bytes.map((byte) => String.fromCharCode(byte)).join(''); + + return str; +} + +export function bytesToAscii (bytes) { + return bytes.map((b) => String.fromCharCode(b % 512)).join(''); +} + +export function asciiToHex (string) { + return '0x' + string.split('') + .map(s => s.charCodeAt(0)) + .map(s => s < 0x10 ? '0' + s.toString(16) : s.toString(16)) + .join(''); +} + +export function padRight (input, length) { + const value = toHex(input).substr(2, length * 2); + + return '0x' + value + range(length * 2 - value.length).map(() => '0').join(''); +} + +export function padLeft (input, length) { + const value = toHex(input).substr(2, length * 2); + + return '0x' + range(length * 2 - value.length).map(() => '0').join('') + value; +} + +export function toHex (str) { + if (str && str.toString) { + str = str.toString(16); + } + + if (str && str.substr(0, 2) === '0x') { + return str.toLowerCase(); + } + + return `0x${(str || '').toLowerCase()}`; +} diff --git a/js/src/api/util/format.spec.js b/js/src/api/util/format.spec.js new file mode 100644 index 000000000..ba7a3994e --- /dev/null +++ b/js/src/api/util/format.spec.js @@ -0,0 +1,94 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { bytesToHex, cleanupValue, hexToBytes, hexToAscii, bytesToAscii, asciiToHex } from './format'; + +describe('api/util/format', () => { + describe('bytesToHex', () => { + it('correctly converts an empty array', () => { + expect(bytesToHex([])).to.equal('0x'); + }); + + it('correctly converts a non-empty array', () => { + expect(bytesToHex([0, 15, 16])).to.equal('0x000f10'); + }); + }); + + describe('cleanupValue', () => { + it('returns unknown values as the original', () => { + expect(cleanupValue('original', 'unknown')).to.equal('original'); + }); + + it('returns ascii arrays as ascii', () => { + expect(cleanupValue([97, 115, 99, 105, 105, 0], 'bytes32')).to.equal('ascii'); + }); + + it('returns non-ascii arrays as hex strings', () => { + expect(cleanupValue([97, 200, 0, 0], 'bytes4')).to.equal('0x61c80000'); + }); + + it('returns uint (>48) as the original', () => { + expect(cleanupValue('original', 'uint49')).to.equal('original'); + }); + + it('returns uint (<=48) as the number value', () => { + expect(cleanupValue('12345', 'uint48')).to.equal(12345); + }); + }); + + describe('hexToBytes', () => { + it('correctly converts an empty string', () => { + expect(hexToBytes('')).to.deep.equal([]); + expect(hexToBytes('0x')).to.deep.equal([]); + }); + + it('correctly converts a non-empty string', () => { + expect(hexToBytes('0x000f10')).to.deep.equal([0, 15, 16]); + }); + }); + + describe('asciiToHex', () => { + it('correctly converts an empty string', () => { + expect(asciiToHex('')).to.equal('0x'); + }); + + it('correctly converts a non-empty string', () => { + expect(asciiToHex('abc')).to.equal('0x616263'); + expect(asciiToHex('a\nb')).to.equal('0x610a62'); + }); + }); + + describe('hexToAscii', () => { + it('correctly converts an empty string', () => { + expect(hexToAscii('')).to.equal(''); + expect(hexToAscii('0x')).to.equal(''); + }); + + it('correctly converts a non-empty string', () => { + expect(hexToAscii('0x616263')).to.equal('abc'); + }); + }); + + describe('bytesToAscii', () => { + it('correctly converts an empty string', () => { + expect(bytesToAscii([])).to.equal(''); + }); + + it('correctly converts a non-empty string', () => { + expect(bytesToAscii([97, 98, 99])).to.equal('abc'); + }); + }); +}); diff --git a/js/src/api/util/identity.js b/js/src/api/util/identity.js new file mode 100644 index 000000000..4df7ab9bb --- /dev/null +++ b/js/src/api/util/identity.js @@ -0,0 +1,30 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import blockies from 'blockies'; + +// jsdom doesn't have all the browser features, blockies fail +const TEST_ENV = process.env.NODE_ENV === 'test'; + +export function createIdentityImg (address, scale = 8) { + return TEST_ENV + ? 'test-createIdentityImg' + : blockies({ + seed: (address || '').toLowerCase(), + size: 8, + scale + }).toDataURL(); +} diff --git a/js/src/api/util/index.js b/js/src/api/util/index.js new file mode 100644 index 000000000..30328856b --- /dev/null +++ b/js/src/api/util/index.js @@ -0,0 +1,51 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { isAddress as isAddressValid, toChecksumAddress } from '../../abi/util/address'; +import { abiDecode, decodeCallData, decodeMethodInput, methodToAbi } from './decode'; +import { abiEncode, abiUnencode, abiSignature, encodeMethodCallAbi } from './encode'; +import { bytesToHex, hexToAscii, hexToBytes, asciiToHex, cleanupValue } from './format'; +import { fromWei, toWei } from './wei'; +import { sha3 } from './sha3'; +import { isArray, isFunction, isHex, isInstanceOf, isString } from './types'; +import { createIdentityImg } from './identity'; + +export default { + abiDecode, + abiEncode, + abiUnencode, + abiSignature, + cleanupValue, + isAddressValid, + isArray, + isFunction, + isHex, + isInstanceOf, + isString, + bytesToHex, + hexToAscii, + hexToBytes, + asciiToHex, + createIdentityImg, + decodeCallData, + decodeMethodInput, + encodeMethodCallAbi, + methodToAbi, + fromWei, + toChecksumAddress, + toWei, + sha3 +}; diff --git a/js/src/api/util/sha3.js b/js/src/api/util/sha3.js new file mode 100644 index 000000000..3ca49cc8e --- /dev/null +++ b/js/src/api/util/sha3.js @@ -0,0 +1,36 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { keccak_256 } from 'js-sha3'; // eslint-disable-line + +import { hexToBytes } from './format'; +import { isHex } from './types'; + +export function sha3 (value, options) { + const forceHex = options && options.encoding === 'hex'; + + if (forceHex || (!options && isHex(value))) { + const bytes = hexToBytes(value); + + return sha3(bytes); + } + + const hash = keccak_256(value); + + return `0x${hash}`; +} + +sha3.text = (val) => sha3(val, { encoding: 'raw' }); diff --git a/js/src/api/util/sha3.spec.js b/js/src/api/util/sha3.spec.js new file mode 100644 index 000000000..a5c93d940 --- /dev/null +++ b/js/src/api/util/sha3.spec.js @@ -0,0 +1,46 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { sha3 } from './sha3'; + +describe('api/util/sha3', () => { + describe('sha3', () => { + it('constructs a correct sha3 value', () => { + expect(sha3('jacogr')).to.equal('0x2f4ff4b5a87abbd2edfed699db48a97744e028c7f7ce36444d40d29d792aa4dc'); + }); + + it('constructs a correct sha3 encoded as hex', () => { + const key = '000000000000000000000000391694e7e0b0cce554cb130d723a9d27458f9298' + '0000000000000000000000000000000000000000000000000000000000000001'; + + expect(sha3(key, { encoding: 'hex' })).to.equal('0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9'); + expect(sha3(`0x${key}`, { encoding: 'hex' })).to.equal('0x6661e9d6d8b923d5bbaab1b96e1dd51ff6ea2a93520fdc9eb75d059238b8c5e9'); + }); + + it('constructs a correct sha3 from Uint8Array', () => { + expect(sha3('01020304', { encoding: 'hex' })).to.equal('0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b'); + expect(sha3(Uint8Array.from([1, 2, 3, 4]))).to.equal('0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b'); + }); + + it('should interpret as bytes by default', () => { + expect(sha3('0x01020304')).to.equal('0xa6885b3731702da62e8e4a8f584ac46a7f6822f4e2ba50fba902f67b1588d23b'); + }); + + it('should force text if option is passed', () => { + expect(sha3('0x01020304', { encoding: 'raw' })).to.equal('0x16bff43de576d28857dcba65a56fc17c5e93c09bd6a709268eff8e62025ae869'); + expect(sha3.text('0x01020304')).to.equal('0x16bff43de576d28857dcba65a56fc17c5e93c09bd6a709268eff8e62025ae869'); + }); + }); +}); diff --git a/js/src/api/util/types.js b/js/src/api/util/types.js new file mode 100644 index 000000000..f4278cb51 --- /dev/null +++ b/js/src/api/util/types.js @@ -0,0 +1,60 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const HEXDIGITS = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']; + +export function isArray (test) { + return Object.prototype.toString.call(test) === '[object Array]'; +} + +export function isError (test) { + return Object.prototype.toString.call(test) === '[object Error]'; +} + +export function isFunction (test) { + return Object.prototype.toString.call(test) === '[object Function]'; +} + +export function isHex (_test) { + if (!isString(_test)) { + return false; + } + + if (_test.substr(0, 2) === '0x') { + return isHex(_test.slice(2)); + } + + const test = _test.toLowerCase(); + let hex = true; + + for (let idx = 0; hex && idx < test.length; idx++) { + hex = HEXDIGITS.includes(test[idx]); + } + + return hex; +} + +export function isObject (test) { + return Object.prototype.toString.call(test) === '[object Object]'; +} + +export function isString (test) { + return Object.prototype.toString.call(test) === '[object String]'; +} + +export function isInstanceOf (test, clazz) { + return test instanceof clazz; +} diff --git a/js/src/api/util/types.spec.js b/js/src/api/util/types.spec.js new file mode 100644 index 000000000..c8672f888 --- /dev/null +++ b/js/src/api/util/types.spec.js @@ -0,0 +1,118 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import sinon from 'sinon'; + +import { isArray, isError, isFunction, isHex, isInstanceOf, isObject, isString } from './types'; +import Eth from '../rpc/eth'; + +describe('api/util/types', () => { + describe('isArray', () => { + it('correctly identifies null as false', () => { + expect(isArray(null)).to.be.false; + }); + + it('correctly identifies empty array as true', () => { + expect(isArray([])).to.be.true; + }); + + it('correctly identifies array as true', () => { + expect(isArray([1, 2, 3])).to.be.true; + }); + }); + + describe('isError', () => { + it('correctly identifies null as false', () => { + expect(isError(null)).to.be.false; + }); + + it('correctly identifies Error as true', () => { + expect(isError(new Error('an error'))).to.be.true; + }); + }); + + describe('isFunction', () => { + it('correctly identifies null as false', () => { + expect(isFunction(null)).to.be.false; + }); + + it('correctly identifies function as true', () => { + expect(isFunction(sinon.stub())).to.be.true; + }); + }); + + describe('isHex', () => { + it('correctly identifies hex by leading 0x', () => { + expect(isHex('0x123')).to.be.true; + }); + + it('correctly identifies hex without leading 0x', () => { + expect(isHex('123')).to.be.true; + }); + + it('correctly identifies non-hex values', () => { + expect(isHex('123j')).to.be.false; + }); + + it('correctly indentifies non-string values', () => { + expect(isHex(false)).to.be.false; + expect(isHex()).to.be.false; + expect(isHex([1, 2, 3])).to.be.false; + }); + }); + + describe('isInstanceOf', () => { + it('correctly identifies build-in instanceof', () => { + expect(isInstanceOf(new String('123'), String)).to.be.true; // eslint-disable-line no-new-wrappers + }); + + it('correctly identifies own instanceof', () => { + expect(isInstanceOf(new Eth({}), Eth)).to.be.true; + }); + + it('correctly reports false for own', () => { + expect(isInstanceOf({}, Eth)).to.be.false; + }); + }); + + describe('isObject', () => { + it('correctly identifies empty object as object', () => { + expect(isObject({})).to.be.true; + }); + + it('correctly identifies non-empty object as object', () => { + expect(isObject({ data: '123' })).to.be.true; + }); + + it('correctly identifies Arrays as non-objects', () => { + expect(isObject([1, 2, 3])).to.be.false; + }); + + it('correctly identifies Strings as non-objects', () => { + expect(isObject('123')).to.be.false; + }); + }); + + describe('isString', () => { + it('correctly identifies empty string as string', () => { + expect(isString('')).to.be.true; + }); + + it('correctly identifies string as string', () => { + expect(isString('123')).to.be.true; + }); + }); +}); diff --git a/js/src/api/util/wei.js b/js/src/api/util/wei.js new file mode 100644 index 000000000..d17df6958 --- /dev/null +++ b/js/src/api/util/wei.js @@ -0,0 +1,37 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; + +const UNITS = ['wei', 'ada', 'babbage', 'shannon', 'szabo', 'finney', 'ether', 'kether', 'mether', 'gether', 'tether']; + +export function _getUnitMultiplier (unit) { + const position = UNITS.indexOf(unit.toLowerCase()); + + if (position === -1) { + throw new Error(`Unknown unit ${unit} passed to wei formatter`); + } + + return 10 ** (position * 3); +} + +export function fromWei (value, unit = 'ether') { + return new BigNumber(value).div(_getUnitMultiplier(unit)); +} + +export function toWei (value, unit = 'ether') { + return new BigNumber(value).mul(_getUnitMultiplier(unit)); +} diff --git a/js/src/api/util/wei.spec.js b/js/src/api/util/wei.spec.js new file mode 100644 index 000000000..4476a4db6 --- /dev/null +++ b/js/src/api/util/wei.spec.js @@ -0,0 +1,57 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { _getUnitMultiplier, fromWei, toWei } from './wei'; + +describe('api/util/wei', () => { + describe('_getUnitMultiplier', () => { + it('returns 10^0 for wei', () => { + expect(_getUnitMultiplier('wei')).to.equal(10 ** 0); + }); + + it('returns 10^15 for finney', () => { + expect(_getUnitMultiplier('finney')).to.equal(10 ** 15); + }); + + it('returns 10^18 for ether', () => { + expect(_getUnitMultiplier('ether')).to.equal(10 ** 18); + }); + + it('throws an error on invalid units', () => { + expect(() => _getUnitMultiplier('invalid')).to.throw(/passed to wei formatter/); + }); + }); + + describe('fromWei', () => { + it('formats into ether when nothing specified', () => { + expect(fromWei('1230000000000000000').toString()).to.equal('1.23'); + }); + + it('formats into finney when specified', () => { + expect(fromWei('1230000000000000000', 'finney').toString()).to.equal('1230'); + }); + }); + + describe('toWei', () => { + it('formats from ether when nothing specified', () => { + expect(toWei(1.23).toString()).to.equal('1230000000000000000'); + }); + + it('formats from finney when specified', () => { + expect(toWei(1230, 'finney').toString()).to.equal('1230000000000000000'); + }); + }); +}); diff --git a/js/src/config.js b/js/src/config.js new file mode 100644 index 000000000..5113e9399 --- /dev/null +++ b/js/src/config.js @@ -0,0 +1,40 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import LogLevel from 'loglevel'; + +export const LOG_KEYS = { + Balances: { + key: 'balances', + desc: 'Balances fetching' + }, + CertificationsMiddleware: { + key: 'certifications.middleware', + desc: 'Certifications Middleware' + }, + TransferModalStore: { + key: 'modalsTransferStore', + desc: 'Transfer modal MobX store' + }, + Signer: { + key: 'secureApi', + desc: 'The Signer and the Secure API' + } +}; + +export const getLogger = (LOG_KEY) => { + return LogLevel.getLogger(LOG_KEY.key); +}; diff --git a/js/src/contracts/abi/badgereg.json b/js/src/contracts/abi/badgereg.json new file mode 100644 index 000000000..6ae56393b --- /dev/null +++ b/js/src/contracts/abi/badgereg.json @@ -0,0 +1 @@ +[{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_name","type":"bytes32"}],"name":"register","outputs":[{"name":"","type":"bool"}],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"fromName","outputs":[{"name":"id","type":"uint256"},{"name":"addr","type":"address"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"badgeCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"},{"name":"_key","type":"bytes32"}],"name":"meta","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"}],"name":"unregister","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_newAddr","type":"address"}],"name":"setAddress","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"fromAddress","outputs":[{"name":"id","type":"uint256"},{"name":"name","type":"bytes32"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"badge","outputs":[{"name":"addr","type":"address"},{"name":"name","type":"bytes32"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_key","type":"bytes32"},{"name":"_value","type":"bytes32"}],"name":"setMeta","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_name","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"registerAs","outputs":[{"name":"","type":"bool"}],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"id","type":"uint256"},{"indexed":false,"name":"addr","type":"address"}],"name":"Registered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"id","type":"uint256"}],"name":"Unregistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":true,"name":"key","type":"bytes32"},{"indexed":false,"name":"value","type":"bytes32"}],"name":"MetaChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":false,"name":"addr","type":"address"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/contracts/abi/basiccoin.json b/js/src/contracts/abi/basiccoin.json new file mode 100644 index 000000000..0bdc66666 --- /dev/null +++ b/js/src/contracts/abi/basiccoin.json @@ -0,0 +1 @@ +[{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"base","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"_totalSupply","type":"uint256"},{"name":"_owner","type":"address"}],"type":"constructor"},{"payable":false,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/contracts/abi/basiccoinmanager.json b/js/src/contracts/abi/basiccoinmanager.json new file mode 100644 index 000000000..cafe09735 --- /dev/null +++ b/js/src/contracts/abi/basiccoinmanager.json @@ -0,0 +1 @@ +[{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"countByOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"count","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"base","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"get","outputs":[{"name":"coin","type":"address"},{"name":"owner","type":"address"},{"name":"tokenreg","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_totalSupply","type":"uint256"},{"name":"_tla","type":"string"},{"name":"_name","type":"string"},{"name":"_tokenreg","type":"address"}],"name":"deploy","outputs":[{"name":"","type":"bool"}],"payable":true,"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"getByOwner","outputs":[{"name":"coin","type":"address"},{"name":"owner","type":"address"},{"name":"tokenreg","type":"address"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"tokenreg","type":"address"},{"indexed":true,"name":"coin","type":"address"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/contracts/abi/certifier.json b/js/src/contracts/abi/certifier.json new file mode 100644 index 000000000..905ddde6c --- /dev/null +++ b/js/src/contracts/abi/certifier.json @@ -0,0 +1 @@ +[{"constant":true,"inputs":[{"name":"_who","type":"address"},{"name":"_field","type":"string"}],"name":"getAddress","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"},{"name":"_field","type":"string"}],"name":"getUint","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"}],"name":"certified","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"},{"name":"_field","type":"string"}],"name":"get","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"}],"name":"Confirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"}],"name":"Revoked","type":"event"}] \ No newline at end of file diff --git a/js/src/contracts/abi/consensys-multisig-wallet.json b/js/src/contracts/abi/consensys-multisig-wallet.json new file mode 100644 index 000000000..79623637d --- /dev/null +++ b/js/src/contracts/abi/consensys-multisig-wallet.json @@ -0,0 +1,510 @@ +[ + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "owners", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "owner", + "type": "address" + } + ], + "name": "removeOwner", + "outputs": [], + "payable": false, + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "transactionId", + "type": "uint256" + } + ], + "name": "revokeConfirmation", + "outputs": [], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + }, + { + "name": "", + "type": "address" + } + ], + "name": "confirmations", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "pending", + "type": "bool" + }, + { + "name": "executed", + "type": "bool" + } + ], + "name": "getTransactionCount", + "outputs": [ + { + "name": "count", + "type": "uint256" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "owner", + "type": "address" + } + ], + "name": "addOwner", + "outputs": [], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "transactionId", + "type": "uint256" + } + ], + "name": "isConfirmed", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "transactionId", + "type": "uint256" + } + ], + "name": "getConfirmationCount", + "outputs": [ + { + "name": "count", + "type": "uint256" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "transactions", + "outputs": [ + { + "name": "destination", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + }, + { + "name": "data", + "type": "bytes" + }, + { + "name": "executed", + "type": "bool" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getOwners", + "outputs": [ + { + "name": "", + "type": "address[]" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "from", + "type": "uint256" + }, + { + "name": "to", + "type": "uint256" + }, + { + "name": "pending", + "type": "bool" + }, + { + "name": "executed", + "type": "bool" + } + ], + "name": "getTransactionIds", + "outputs": [ + { + "name": "_transactionIds", + "type": "uint256[]" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "transactionId", + "type": "uint256" + } + ], + "name": "getConfirmations", + "outputs": [ + { + "name": "_confirmations", + "type": "address[]" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "transactionCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_required", + "type": "uint256" + } + ], + "name": "changeRequirement", + "outputs": [], + "payable": false, + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "transactionId", + "type": "uint256" + } + ], + "name": "confirmTransaction", + "outputs": [], + "payable": false, + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "destination", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + }, + { + "name": "data", + "type": "bytes" + } + ], + "name": "submitTransaction", + "outputs": [ + { + "name": "transactionId", + "type": "uint256" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "MAX_OWNER_COUNT", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "required", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "newOwner", + "type": "address" + } + ], + "name": "replaceOwner", + "outputs": [], + "payable": false, + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "transactionId", + "type": "uint256" + } + ], + "name": "executeTransaction", + "outputs": [], + "payable": false, + "type": "function" + }, + { + "inputs": [ + { + "name": "_owners", + "type": "address[]" + }, + { + "name": "_required", + "type": "uint256" + } + ], + "payable": false, + "type": "constructor" + }, + { + "payable": true, + "type": "fallback" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "name": "transactionId", + "type": "uint256" + } + ], + "name": "Confirmation", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "sender", + "type": "address" + }, + { + "indexed": true, + "name": "transactionId", + "type": "uint256" + } + ], + "name": "Revocation", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "transactionId", + "type": "uint256" + } + ], + "name": "Submission", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "transactionId", + "type": "uint256" + } + ], + "name": "Execution", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "transactionId", + "type": "uint256" + } + ], + "name": "ExecutionFailure", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "sender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + } + ], + "name": "OwnerAddition", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + } + ], + "name": "OwnerRemoval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "required", + "type": "uint256" + } + ], + "name": "RequirementChange", + "type": "event" + } +] diff --git a/js/src/contracts/abi/dappreg.json b/js/src/contracts/abi/dappreg.json new file mode 100644 index 000000000..f6bec35af --- /dev/null +++ b/js/src/contracts/abi/dappreg.json @@ -0,0 +1 @@ +[{"constant":true,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_key","type":"bytes32"}],"name":"meta","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"count","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"}],"name":"unregister","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"bytes32"}],"name":"get","outputs":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_key","type":"bytes32"},{"name":"_value","type":"bytes32"}],"name":"setMeta","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"setDappOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"at","outputs":[{"name":"id","type":"bytes32"},{"name":"owner","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"bytes32"}],"name":"register","outputs":[],"payable":true,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"key","type":"bytes32"},{"indexed":false,"name":"value","type":"bytes32"}],"name":"MetaChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"Registered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"bytes32"}],"name":"Unregistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/contracts/abi/eip20.json b/js/src/contracts/abi/eip20.json new file mode 100644 index 000000000..6937e28c8 --- /dev/null +++ b/js/src/contracts/abi/eip20.json @@ -0,0 +1,163 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "total", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "success", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "remaining", + "type": "uint256" + } + ], + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + } +] diff --git a/js/src/contracts/abi/email-verification.json b/js/src/contracts/abi/email-verification.json new file mode 100644 index 000000000..3bb0fe650 --- /dev/null +++ b/js/src/contracts/abi/email-verification.json @@ -0,0 +1 @@ +[{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"reverse","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_who","type":"address"},{"name":"_puzzle","type":"bytes32"},{"name":"_emailHash","type":"bytes32"}],"name":"puzzle","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"},{"name":"_field","type":"string"}],"name":"getAddress","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_emailHash","type":"bytes32"}],"name":"request","outputs":[],"payable":true,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_code","type":"bytes32"}],"name":"confirm","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"},{"name":"_field","type":"string"}],"name":"getUint","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"}],"name":"certified","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"},{"name":"_field","type":"string"}],"name":"get","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"},{"indexed":true,"name":"emailHash","type":"bytes32"}],"name":"Requested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"},{"indexed":true,"name":"emailHash","type":"bytes32"},{"indexed":false,"name":"puzzle","type":"bytes32"}],"name":"Puzzled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"}],"name":"Confirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"}],"name":"Revoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] \ No newline at end of file diff --git a/js/src/contracts/abi/foundation-multisig-wallet.json b/js/src/contracts/abi/foundation-multisig-wallet.json new file mode 100644 index 000000000..752407e62 --- /dev/null +++ b/js/src/contracts/abi/foundation-multisig-wallet.json @@ -0,0 +1,476 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "removeOwner", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_addr", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "m_numOwners", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "m_lastDay", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "resetSpentToday", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "m_spentToday", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "addOwner", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "m_required", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_h", + "type": "bytes32" + } + ], + "name": "confirm", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_newLimit", + "type": "uint256" + } + ], + "name": "setDailyLimit", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_data", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [ + { + "name": "_r", + "type": "bytes32" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_operation", + "type": "bytes32" + } + ], + "name": "revoke", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_newRequired", + "type": "uint256" + } + ], + "name": "changeRequirement", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_operation", + "type": "bytes32" + }, + { + "name": "_owner", + "type": "address" + } + ], + "name": "hasConfirmed", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "ownerIndex", + "type": "uint256" + } + ], + "name": "getOwner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + } + ], + "name": "kill", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + } + ], + "name": "changeOwner", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "m_dailyLimit", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "inputs": [ + { + "name": "_owners", + "type": "address[]" + }, + { + "name": "_required", + "type": "uint256" + }, + { + "name": "_daylimit", + "type": "uint256" + } + ], + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "name": "operation", + "type": "bytes32" + } + ], + "name": "Confirmation", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "name": "operation", + "type": "bytes32" + } + ], + "name": "Revoke", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "oldOwner", + "type": "address" + }, + { + "indexed": false, + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnerChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "oldOwner", + "type": "address" + } + ], + "name": "OwnerRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "newRequirement", + "type": "uint256" + } + ], + "name": "RequirementChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_from", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "name": "created", + "type": "address" + } + ], + "name": "SingleTransact", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "name": "operation", + "type": "bytes32" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "data", + "type": "bytes" + }, + { + "indexed": false, + "name": "created", + "type": "address" + } + ], + "name": "MultiTransact", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "operation", + "type": "bytes32" + }, + { + "indexed": false, + "name": "initiator", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "data", + "type": "bytes" + } + ], + "name": "ConfirmationNeeded", + "type": "event" + } +] diff --git a/js/src/contracts/abi/gavcoin.json b/js/src/contracts/abi/gavcoin.json new file mode 100644 index 000000000..5170326f5 --- /dev/null +++ b/js/src/contracts/abi/gavcoin.json @@ -0,0 +1 @@ +[{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_who","type":"address"},{"name":"_maxPrice","type":"uint256"}],"name":"buyin","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"remaining","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_price","type":"uint256"},{"name":"_units","type":"uint256"}],"name":"refund","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"},{"indexed":true,"name":"price","type":"uint256"},{"indexed":true,"name":"amount","type":"uint256"}],"name":"Buyin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"buyer","type":"address"},{"indexed":true,"name":"price","type":"uint256"},{"indexed":true,"name":"amount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"price","type":"uint256"}],"name":"NewTranch","type":"event"}] diff --git a/js/src/contracts/abi/githubhint.json b/js/src/contracts/abi/githubhint.json new file mode 100644 index 000000000..bdbc162e4 --- /dev/null +++ b/js/src/contracts/abi/githubhint.json @@ -0,0 +1,81 @@ +[ + { + "constant":false, + "inputs":[ + { + "name":"_content", + "type":"bytes32" + }, + { + "name":"_url", + "type":"string" + } + ], + "name":"hintURL", + "outputs":[ + + ], + "type":"function" + }, + { + "constant":false, + "inputs":[ + { + "name":"_content", + "type":"bytes32" + }, + { + "name":"_accountSlashRepo", + "type":"string" + }, + { + "name":"_commit", + "type":"bytes20" + } + ], + "name":"hint", + "outputs":[ + + ], + "type":"function" + }, + { + "constant":true, + "inputs":[ + { + "name":"", + "type":"bytes32" + } + ], + "name":"entries", + "outputs":[ + { + "name":"accountSlashRepo", + "type":"string" + }, + { + "name":"commit", + "type":"bytes20" + }, + { + "name":"owner", + "type":"address" + } + ], + "type":"function" + }, + { + "constant":false, + "inputs":[ + { + "name":"_content", + "type":"bytes32" + } + ], + "name":"unhint", + "outputs":[ + + ], + "type":"function" + } +] diff --git a/js/src/contracts/abi/index.js b/js/src/contracts/abi/index.js new file mode 100644 index 000000000..f475cce07 --- /dev/null +++ b/js/src/contracts/abi/index.js @@ -0,0 +1,31 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export badgereg from './badgereg.json'; +export basiccoin from './basiccoin.json'; +export basiccoinmanager from './basiccoinmanager.json'; +export dappreg from './dappreg.json'; +export eip20 from './eip20.json'; +export emailverification from './email-verification.json'; +export gavcoin from './gavcoin.json'; +export githubhint from './githubhint.json'; +export owned from './owned.json'; +export registry from './registry.json'; +export registry2 from './registry2.json'; +export signaturereg from './signaturereg.json'; +export smsverification from './sms-verification.json'; +export tokenreg from './tokenreg.json'; +export foundationWallet from './foundation-multisig-wallet.json'; diff --git a/js/src/contracts/abi/old-wallet.json b/js/src/contracts/abi/old-wallet.json new file mode 100644 index 000000000..930069742 --- /dev/null +++ b/js/src/contracts/abi/old-wallet.json @@ -0,0 +1,466 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "removeOwner", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_addr", + "type": "address" + } + ], + "name": "isOwner", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "m_numOwners", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "m_lastDay", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "resetSpentToday", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "m_spentToday", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "addOwner", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "m_required", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_h", + "type": "bytes32" + } + ], + "name": "confirm", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_newLimit", + "type": "uint256" + } + ], + "name": "setDailyLimit", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_data", + "type": "bytes" + } + ], + "name": "execute", + "outputs": [ + { + "name": "_r", + "type": "bytes32" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_operation", + "type": "bytes32" + } + ], + "name": "revoke", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_newRequired", + "type": "uint256" + } + ], + "name": "changeRequirement", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_operation", + "type": "bytes32" + }, + { + "name": "_owner", + "type": "address" + } + ], + "name": "hasConfirmed", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "ownerIndex", + "type": "uint256" + } + ], + "name": "getOwner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + } + ], + "name": "kill", + "outputs": [], + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + } + ], + "name": "changeOwner", + "outputs": [], + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "m_dailyLimit", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "type": "function" + }, + { + "inputs": [ + { + "name": "_owners", + "type": "address[]" + }, + { + "name": "_required", + "type": "uint256" + }, + { + "name": "_daylimit", + "type": "uint256" + } + ], + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "name": "operation", + "type": "bytes32" + } + ], + "name": "Confirmation", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "name": "operation", + "type": "bytes32" + } + ], + "name": "Revoke", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "oldOwner", + "type": "address" + }, + { + "indexed": false, + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnerChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnerAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "oldOwner", + "type": "address" + } + ], + "name": "OwnerRemoved", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "newRequirement", + "type": "uint256" + } + ], + "name": "RequirementChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "_from", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Deposit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "data", + "type": "bytes" + } + ], + "name": "SingleTransact", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "owner", + "type": "address" + }, + { + "indexed": false, + "name": "operation", + "type": "bytes32" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "data", + "type": "bytes" + } + ], + "name": "MultiTransact", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "operation", + "type": "bytes32" + }, + { + "indexed": false, + "name": "initiator", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + }, + { + "indexed": false, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "data", + "type": "bytes" + } + ], + "name": "ConfirmationNeeded", + "type": "event" + } +] diff --git a/js/src/contracts/abi/owned.json b/js/src/contracts/abi/owned.json new file mode 100644 index 000000000..ccfeed85d --- /dev/null +++ b/js/src/contracts/abi/owned.json @@ -0,0 +1 @@ +[{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/contracts/abi/registry.json b/js/src/contracts/abi/registry.json new file mode 100644 index 000000000..f97dc20c7 --- /dev/null +++ b/js/src/contracts/abi/registry.json @@ -0,0 +1 @@ +[{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"}],"name":"confirmReverse","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"reserve","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"},{"name":"_value","type":"bytes32"}],"name":"set","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"drop","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"}],"name":"getAddress","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"setFee","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_to","type":"address"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"reserved","outputs":[{"name":"reserved","type":"bool"}],"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_who","type":"address"}],"name":"proposeReverse","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"}],"name":"getUint","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"}],"name":"get","outputs":[{"name":"","type":"bytes32"}],"type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"reverse","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"},{"name":"_value","type":"uint256"}],"name":"setUint","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":false,"inputs":[],"name":"removeReverse","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"},{"name":"_value","type":"address"}],"name":"setAddress","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Drained","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"FeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"Reserved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"oldOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"Transferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"Dropped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"key","type":"string"},{"indexed":false,"name":"plainKey","type":"string"}],"name":"DataChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"string"},{"indexed":true,"name":"reverse","type":"address"}],"name":"ReverseProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"string"},{"indexed":true,"name":"reverse","type":"address"}],"name":"ReverseConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"string"},{"indexed":true,"name":"reverse","type":"address"}],"name":"ReverseRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/contracts/abi/registry2.json b/js/src/contracts/abi/registry2.json new file mode 100644 index 000000000..922b9b7e2 --- /dev/null +++ b/js/src/contracts/abi/registry2.json @@ -0,0 +1 @@ +[{"constant":true,"inputs":[{"name":"_data","type":"address"}],"name":"canReverse","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"},{"name":"_value","type":"bytes32"}],"name":"setData","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"}],"name":"confirmReverse","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"reserve","outputs":[{"name":"success","type":"bool"}],"payable":true,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"}],"name":"drop","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"}],"name":"getAddress","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"setFee","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_to","type":"address"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"}],"name":"getData","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"reserved","outputs":[{"name":"reserved","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_who","type":"address"}],"name":"proposeReverse","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"hasReverse","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"}],"name":"getUint","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_name","type":"bytes32"}],"name":"getReverse","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_data","type":"address"}],"name":"reverse","outputs":[{"name":"","type":"string"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"},{"name":"_value","type":"uint256"}],"name":"setUint","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_who","type":"address"}],"name":"confirmReverseAs","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"removeReverse","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"bytes32"},{"name":"_key","type":"string"},{"name":"_value","type":"address"}],"name":"setAddress","outputs":[{"name":"success","type":"bool"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Drained","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"FeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"string"},{"indexed":true,"name":"reverse","type":"address"}],"name":"ReverseProposed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"string"},{"indexed":true,"name":"reverse","type":"address"}],"name":"ReverseConfirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"string"},{"indexed":true,"name":"reverse","type":"address"}],"name":"ReverseRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"Reserved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"oldOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"Transferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"}],"name":"Dropped","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"name","type":"bytes32"},{"indexed":true,"name":"key","type":"string"},{"indexed":false,"name":"plainKey","type":"string"}],"name":"DataChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/contracts/abi/signaturereg.json b/js/src/contracts/abi/signaturereg.json new file mode 100644 index 000000000..a9b109ecd --- /dev/null +++ b/js/src/contracts/abi/signaturereg.json @@ -0,0 +1,128 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_new", + "type": "address" + } + ], + "name": "setOwner", + "outputs": [], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSignatures", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "drain", + "outputs": [], + "payable": false, + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "bytes4" + } + ], + "name": "entries", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_method", + "type": "string" + } + ], + "name": "register", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "type": "function" + }, + { + "inputs": [], + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "creator", + "type": "address" + }, + { + "indexed": true, + "name": "signature", + "type": "bytes4" + }, + { + "indexed": false, + "name": "method", + "type": "string" + } + ], + "name": "Registered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "old", + "type": "address" + }, + { + "indexed": true, + "name": "current", + "type": "address" + } + ], + "name": "NewOwner", + "type": "event" + } +] diff --git a/js/src/contracts/abi/sms-verification.json b/js/src/contracts/abi/sms-verification.json new file mode 100644 index 000000000..3eb5492a4 --- /dev/null +++ b/js/src/contracts/abi/sms-verification.json @@ -0,0 +1 @@ +[{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_who","type":"address"}],"name":"certify","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"request","outputs":[],"payable":true,"type":"function"},{"constant":false,"inputs":[{"name":"_who","type":"address"},{"name":"_puzzle","type":"bytes32"}],"name":"puzzle","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"},{"name":"_field","type":"string"}],"name":"getAddress","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_who","type":"address"}],"name":"revoke","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_code","type":"bytes32"}],"name":"confirm","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"delegate","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"},{"name":"_field","type":"string"}],"name":"getUint","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setDelegate","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"}],"name":"certified","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_who","type":"address"},{"name":"_field","type":"string"}],"name":"get","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"}],"name":"Requested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"},{"indexed":false,"name":"puzzle","type":"bytes32"}],"name":"Puzzled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"}],"name":"Confirmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"who","type":"address"}],"name":"Revoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] \ No newline at end of file diff --git a/js/src/contracts/abi/tokenreg.json b/js/src/contracts/abi/tokenreg.json new file mode 100644 index 000000000..e56a13eec --- /dev/null +++ b/js/src/contracts/abi/tokenreg.json @@ -0,0 +1 @@ +[{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"token","outputs":[{"name":"addr","type":"address"},{"name":"tla","type":"string"},{"name":"base","type":"uint256"},{"name":"name","type":"string"},{"name":"owner","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_new","type":"address"}],"name":"setOwner","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_tla","type":"string"},{"name":"_base","type":"uint256"},{"name":"_name","type":"string"}],"name":"register","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"},{"name":"_key","type":"bytes32"}],"name":"meta","outputs":[{"name":"","type":"bytes32"}],"type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_tla","type":"string"},{"name":"_base","type":"uint256"},{"name":"_name","type":"string"},{"name":"_owner","type":"address"}],"name":"registerAs","outputs":[{"name":"","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"_tla","type":"string"}],"name":"fromTLA","outputs":[{"name":"id","type":"uint256"},{"name":"addr","type":"address"},{"name":"base","type":"uint256"},{"name":"name","type":"string"},{"name":"owner","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"tokenCount","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"}],"name":"unregister","outputs":[],"type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"fromAddress","outputs":[{"name":"id","type":"uint256"},{"name":"tla","type":"string"},{"name":"base","type":"uint256"},{"name":"name","type":"string"},{"name":"owner","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"_id","type":"uint256"},{"name":"_key","type":"bytes32"},{"name":"_value","type":"bytes32"}],"name":"setMeta","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tla","type":"string"},{"indexed":true,"name":"id","type":"uint256"},{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"name","type":"string"}],"name":"Registered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tla","type":"string"},{"indexed":true,"name":"id","type":"uint256"}],"name":"Unregistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"id","type":"uint256"},{"indexed":true,"name":"key","type":"bytes32"},{"indexed":false,"name":"value","type":"bytes32"}],"name":"MetaChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/contracts/badgereg.js b/js/src/contracts/badgereg.js new file mode 100644 index 000000000..a1782cb30 --- /dev/null +++ b/js/src/contracts/badgereg.js @@ -0,0 +1,128 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { bytesToHex, hexToAscii } from '~/api/util/format'; + +import ABI from './abi/certifier.json'; + +const ZERO20 = '0x0000000000000000000000000000000000000000'; +const ZERO32 = '0x0000000000000000000000000000000000000000000000000000000000000000'; + +export default class BadgeReg { + constructor (api, registry) { + this._api = api; + this._registry = registry; + + registry.getContract('badgereg'); + this.certifiers = []; // by id + this.contracts = {}; // by name + } + + getContract () { + return this._registry.getContract('badgereg'); + } + + certifierCount () { + return this + .getContract() + .then((badgeReg) => { + return badgeReg.instance.badgeCount.call({}, []) + .then((count) => count.valueOf()); + }); + } + + fetchCertifier (id) { + if (this.certifiers[id]) { + return Promise.resolve(this.certifiers[id]); + } + + return this + .getContract() + .then((badgeReg) => { + return badgeReg.instance.badge.call({}, [ id ]); + }) + .then(([ address, name ]) => { + if (address === ZERO20) { + throw new Error(`Certifier ${id} does not exist.`); + } + + name = bytesToHex(name); + name = name === ZERO32 + ? null + : hexToAscii(name); + + return this.fetchMeta(id) + .then(({ title, icon }) => { + const data = { address, id, name, title, icon }; + + this.certifiers[id] = data; + return data; + }); + }); + } + + fetchCertifierByName (name) { + return this + .getContract() + .then((badgeReg) => { + return badgeReg.instance.fromName.call({}, [ name ]); + }) + .then(([ id, address, owner ]) => { + if (address === ZERO20) { + throw new Error(`Certifier ${name} does not exist.`); + } + + return this.fetchMeta(id) + .then(({ title, icon }) => { + const data = { address, id, name, title, icon }; + + this.certifiers[id] = data; + return data; + }); + }); + } + + fetchMeta (id) { + return this + .getContract() + .then((badgeReg) => { + return Promise.all([ + badgeReg.instance.meta.call({}, [id, 'TITLE']), + badgeReg.instance.meta.call({}, [id, 'IMG']) + ]); + }) + .then(([ title, icon ]) => { + title = bytesToHex(title); + title = title === ZERO32 ? null : hexToAscii(title); + + if (bytesToHex(icon) === ZERO32) { + icon = null; + } + + return { title, icon }; + }); + } + + checkIfCertified (certifier, address) { + if (!this.contracts[certifier]) { + this.contracts[certifier] = this._api.newContract(ABI, certifier); + } + + const contract = this.contracts[certifier]; + + return contract.instance.certified.call({}, [address]); + } +} diff --git a/js/src/contracts/code/index.js b/js/src/contracts/code/index.js new file mode 100644 index 000000000..1081c9afa --- /dev/null +++ b/js/src/contracts/code/index.js @@ -0,0 +1,21 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { wallet } from './wallet'; + +export { + wallet +}; diff --git a/js/src/contracts/code/wallet.js b/js/src/contracts/code/wallet.js new file mode 100644 index 000000000..ab60bfc98 --- /dev/null +++ b/js/src/contracts/code/wallet.js @@ -0,0 +1,32 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +/** + * @version Solidity v0.4.10 - Optimized + * @from https://github.com/paritytech/parity/blob/6b0e4f9098be6b841353e7c4f116aa86b7c2e3d6/js/src/contracts/snippets/enhanced-wallet.sol + * @date 20-Jul-2017 @ 16h00 UTC + */ +export const walletCompiler = 'v0.4.10+commit.f0d539ae'; +export const walletSource = 'https://github.com/paritytech/parity/blob/c4196a5de31e0b97ec42d5263d9db404cea4a776/js/src/contracts/snippets/enhanced-wallet.sol'; +export const wallet = '0x6060604052341561000c57fe5b60405161048538038061048583398101604090815281516020830151918301519201915b604080517f696e697457616c6c657428616464726573735b5d2c75696e743235362c75696e81527f7432353629000000000000000000000000000000000000000000000000000000602080830191909152915190819003602501902084516000829052909173_____________WalletLibrary______________91600281019160049182010290819038829003903960006000600483016000866127105a03f45b505050505050505b61039d806100e86000396000f300606060405236156100725763ffffffff60e060020a6000350416632f54bf6e811461012d5780634123cb6b1461015d578063523750931461017f578063659010e7146101a1578063746c9171146101c3578063c2cf7326146101e5578063c41a360a14610218578063f1736d8614610247575b61012b5b60003411156100c75760408051600160a060020a033316815234602082015281517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c929181900390910190a1610127565b60003611156101275773_____________WalletLibrary______________600160a060020a0316600036600060405160200152604051808383808284378201915050925050506020604051808303818560325a03f4151561012457fe5b50505b5b5b565b005b341561013557fe5b610149600160a060020a0360043516610269565b604080519115158252519081900360200190f35b341561016557fe5b61016d6102cd565b60408051918252519081900360200190f35b341561018757fe5b61016d6102d3565b60408051918252519081900360200190f35b34156101a957fe5b61016d6102d9565b60408051918252519081900360200190f35b34156101cb57fe5b61016d6102df565b60408051918252519081900360200190f35b34156101ed57fe5b610149600435600160a060020a03602435166102e5565b604080519115158252519081900360200190f35b341561022057fe5b61022b60043561034a565b60408051600160a060020a039092168252519081900360200190f35b341561024f57fe5b61016d61036b565b60408051918252519081900360200190f35b600073_____________WalletLibrary______________600160a060020a0316600036600060405160200152604051808383808284378201915050925050506020604051808303818560325a03f415156102bf57fe5b50506040515190505b919050565b60015481565b60045481565b60035481565b60005481565b600073_____________WalletLibrary______________600160a060020a0316600036600060405160200152604051808383808284378201915050925050506020604051808303818560325a03f4151561033b57fe5b50506040515190505b92915050565b6000600560018301610100811061035d57fe5b0160005b505490505b919050565b600254815600a165627a7a72305820c20a8475c42598c198f6629bada37e1b234da85ac2c0cbac3d96089030b180400029'; +export const walletLibrary = '0x6060604052341561000c57fe5b5b61170f8061001c6000396000f300606060405236156101015763ffffffff60e060020a600035041663173825d981146101575780632f54bf6e146101755780634123cb6b146101a557806352375093146101c75780635c52c2f5146101e9578063659010e7146101fb5780637065cb481461021d578063746c91711461023b578063797af6271461025d5780639da5e0eb14610284578063b20d30a914610299578063b61d27f6146102ae578063b75c7dc6146102ec578063ba51a6df14610301578063c2cf732614610316578063c41a360a14610349578063c57c5f6014610378578063cbf0b0c0146103cf578063e46dcfeb146103ed578063f00d4b5d14610449578063f1736d861461046d575b6101555b60003411156101525760408051600160a060020a033316815234602082015281517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c929181900390910190a15b5b565b005b341561015f57fe5b610155600160a060020a036004351661048f565b005b341561017d57fe5b610191600160a060020a036004351661057d565b604080519115158252519081900360200190f35b34156101ad57fe5b6101b561059e565b60408051918252519081900360200190f35b34156101cf57fe5b6101b56105a4565b60408051918252519081900360200190f35b34156101f157fe5b6101556105aa565b005b341561020357fe5b6101b56105e1565b60408051918252519081900360200190f35b341561022557fe5b610155600160a060020a03600435166105e7565b005b341561024357fe5b6101b56106d7565b60408051918252519081900360200190f35b341561026557fe5b6101916004356106dd565b604080519115158252519081900360200190f35b341561028c57fe5b610155600435610a30565b005b34156102a157fe5b610155600435610a56565b005b34156102b657fe5b6101b560048035600160a060020a0316906024803591604435918201910135610a8e565b60408051918252519081900360200190f35b34156102f457fe5b610155600435610d71565b005b341561030957fe5b610155600435610e1c565b005b341561031e57fe5b610191600435600160a060020a0360243516610e9e565b604080519115158252519081900360200190f35b341561035157fe5b61035c600435610ef3565b60408051600160a060020a039092168252519081900360200190f35b341561038057fe5b6101556004808035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496505093359350610f1492505050565b005b34156103d757fe5b610155600160a060020a0360043516610ff9565b005b34156103f557fe5b6101556004808035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437509496505084359460200135935061103792505050565b005b341561045157fe5b610155600160a060020a0360043581169060243516611062565b005b341561047557fe5b6101b561115c565b60408051918252519081900360200190f35b60006000366040518083838082843782019150509250505060405180910390206104b881611162565b1561057657600160a060020a0383166000908152610105602052604090205491508115156104e557610576565b60016001540360005411156104f957610576565b6000600583610100811061050957fe5b0160005b5055600160a060020a038316600090815261010560205260408120556105316112cd565b6105396113bd565b60408051600160a060020a038516815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a15b5b5b505050565b600160a060020a03811660009081526101056020526040812054115b919050565b60015481565b60045481565b6000366040518083838082843782019150509250505060405180910390206105d181611162565b156105dc5760006003555b5b5b50565b60035481565b60003660405180838380828437820191505092505050604051809103902061060e81611162565b156106d15761061c8261057d565b15610626576106d1565b61062e6112cd565b60015460fa9010610641576106416113bd565b5b60015460fa9010610652576106d1565b60018054810190819055600160a060020a03831690600590610100811061067557fe5b0160005b5055600154600160a060020a03831660008181526101056020908152604091829020939093558051918252517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c3929181900390910190a15b5b5b5050565b60005481565b60006000826106eb81611162565b15610a265760008481526101086020526040902054600160a060020a031615158061072757506000848152610108602052604090206001015415155b80610754575060008481526101086020526040902060029081015461010060018216150260001901160415155b15610a265760008481526101086020526040902054600160a060020a0316151561082c57600084815261010860209081526040918290206001808201546002928301805486516000199482161561010002949094011693909304601f810185900485028301850190955284825261082594909391929183018282801561081b5780601f106107f05761010080835404028352916020019161081b565b820191906000526020600020905b8154815290600101906020018083116107fe57829003601f168201915b50505050506114f9565b91506108e4565b60008481526101086020526040908190208054600180830154935160029384018054600160a060020a0390941695949093919283928592918116156101000260001901160480156108be5780601f10610893576101008083540402835291602001916108be565b820191906000526020600020905b8154815290600101906020018083116108a157829003601f168201915b505091505060006040518083038185876185025a03f19250505015156108e45760006000fd5b5b6000848152610108602090815260409182902060018082015482548551600160a060020a033381811683529682018c90529681018390529086166060820181905295881660a082015260c06080820181815260029586018054958616156101000260001901909516959095049082018190527fe3a3a4111a84df27d76b68dc721e65c7711605ea5eee4afd3a9c58195217365c968b959394909390928a9290919060e0830190859080156109da5780601f106109af576101008083540402835291602001916109da565b820191906000526020600020905b8154815290600101906020018083116109bd57829003601f168201915b505097505050505050505060405180910390a16000848152610108602052604081208054600160a060020a03191681556001810182905590610a1f600283018261158e565b5050600192505b5b5b5b5050919050565b60006001541115610a415760006000fd5b6002819055610a4e611513565b6004555b5b50565b600036604051808383808284378201915050925050506040518091039020610a7d81611162565b156106d15760028290555b5b5b5050565b60006000610a9b3361057d565b15610d645782158015610ab25750610ab285611522565b5b80610ac057506000546001145b15610c0357600160a060020a0386161515610b1657610b0f8585858080601f016020809104026020016040519081016040528093929190818152602001838380828437506114f9945050505050565b9050610b57565b85600160a060020a03168585856040518083838082843782019150509250505060006040518083038185876185025a03f1925050501515610b575760006000fd5b5b7f9738cd1a8777c86b011f7b01d87d484217dc6ab5154a9d41eda5d14af8caf2923386888787866040518087600160a060020a0316600160a060020a0316815260200186815260200185600160a060020a0316600160a060020a031681526020018060200183600160a060020a0316600160a060020a0316815260200182810382528585828181526020019250808284376040519201829003995090975050505050505050a1610d64565b600036436040518084848082843791909101928352505060408051602092819003830190206000818152610108909352912054909450600160a060020a0316159150508015610c62575060008281526101086020526040902060010154155b8015610c8f5750600082815261010860205260409020600290810154610100600182161502600019011604155b15610cd3576000828152610108602052604090208054600160a060020a031916600160a060020a03881617815560018101869055610cd19060020185856115d6565b505b610cdc826106dd565b1515610d645760408051838152600160a060020a033381811660208401529282018890528816606082015260a0608082018181529082018690527f1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32928592909189918b918a918a9160c082018484808284376040519201829003995090975050505050505050a15b5b5b5b5b50949350505050565b600160a060020a033316600090815261010560205260408120549080821515610d9957610e15565b50506000828152610106602052604081206001810154600284900a929083161115610e155780546001908101825581018054839003905560408051600160a060020a03331681526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a15b5b50505050565b600036604051808383808284378201915050925050506040518091039020610e4381611162565b156106d157600154821115610e57576106d1565b6000829055610e646112cd565b6040805183815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a15b5b5b5050565b600082815261010660209081526040808320600160a060020a038516845261010590925282205482811515610ed65760009350610eea565b8160020a9050808360010154166000141593505b50505092915050565b60006005600183016101008110610f0657fe5b0160005b505490505b919050565b600060006001541115610f275760006000fd5b825160019081018155600160a060020a033316906005905b0160005b505550600160a060020a033316600090815261010560205260408120600190555b8251811015610fed578281815181101515610f7b57fe5b60209081029091010151600160a060020a03166005600283016101008110610f9f57fe5b0160005b50819055508060020161010560008584815181101515610fbf57fe5b90602001906020020151600160a060020a03168152602001908152602001600020819055505b600101610f64565b60008290555b5b505050565b60003660405180838380828437820191505092505050604051809103902061102081611162565b156106d15781600160a060020a0316ff5b5b5b5050565b600060015411156110485760006000fd5b61105181610a30565b6105768383610f14565b5b5b505050565b600060003660405180838380828437820191505092505050604051809103902061108b81611162565b15610e15576110998361057d565b156110a357610e15565b600160a060020a0384166000908152610105602052604090205491508115156110cb57610e15565b6110d36112cd565b600160a060020a03831660058361010081106110eb57fe5b0160005b5055600160a060020a0380851660008181526101056020908152604080832083905593871680835291849020869055835192835282015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a15b5b5b50505050565b60025481565b600160a060020a03331660009081526101056020526040812054818082151561118a576112c3565b600085815261010660205260409020805490925015156111ed576000805483556001808401919091556101078054916111c591908301611655565b60028301819055610107805487929081106111dc57fe5b906000526020600020900160005b50555b8260020a905080826001015416600014156112c35760408051600160a060020a03331681526020810187905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a18154600190116112b057600085815261010660205260409020600201546101078054909190811061127357fe5b906000526020600020900160005b5060009081905585815261010660205260408120818155600180820183905560029091019190915593506112c3565b8154600019018255600182018054821790555b5b5b505050919050565b6101075460005b818110156113ab576101086000610107838154811015156112f157fe5b906000526020600020900160005b50548152602081019190915260400160009081208054600160a060020a03191681556001810182905590611336600283018261158e565b505061010780548290811061134757fe5b906000526020600020900160005b5054156113a25761010660006101078381548110151561137157fe5b906000526020600020900160005b505481526020810191909152604001600090812081815560018101829055600201555b5b6001016112d4565b6106d1610107600061167f565b5b5050565b60015b6001548110156105dc575b600154811080156113ee575060058161010081106113e557fe5b0160005b505415155b156113fb576001016113cb565b5b60016001541180156114225750600154600590610100811061141a57fe5b0160005b5054155b1561143657600180546000190190556113fb565b6001548110801561145c5750600154600590610100811061145357fe5b0160005b505415155b80156114795750600581610100811061147157fe5b0160005b5054155b156114f057600154600590610100811061148f57fe5b0160005b505460058261010081106114a357fe5b0160005b505580610105600060058361010081106114bd57fe5b0160005b505481526020019081526020016000208190555060006005600154610100811015156114e957fe5b0160005b50555b6113c0565b5b50565b600081516020830184f09050803b15610000575b92915050565b600062015180425b0490505b90565b600061152d3361057d565b156105995760045461153d611513565b1115611554576000600355611550611513565b6004555b6003548281011080159061156e5750600254826003540111155b15611583575060038054820190556001610599565b5060005b5b5b919050565b50805460018160011615610100020316600290046000825580601f106115b457506105dc565b601f0160209004906000526020600020908101906105dc91906116a1565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106116175782800160ff19823516178555611644565b82800160010185558215611644579182015b82811115611644578235825591602001919060010190611629565b5b506116519291506116a1565b5090565b815481835581811511610576576000838152602090206105769181019083016116a1565b5b505050565b50805460008255906000526020600020908101906105dc91906116a1565b5b50565b61151f91905b8082111561165157600081556001016116a7565b5090565b90565b61151f91905b8082111561165157600081556001016116a7565b5090565b905600a165627a7a723058209a3af51063f944081cd5ee8601e4e655f25cf7bc219a7983cda60f163f1709a70029'; +export const walletLibraryABI = '[{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"removeOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_numOwners","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_lastDay","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"resetSpentToday","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_spentToday","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_required","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_h","type":"bytes32"}],"name":"confirm","outputs":[{"name":"o_success","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_limit","type":"uint256"}],"name":"initDaylimit","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newLimit","type":"uint256"}],"name":"setDailyLimit","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"execute","outputs":[{"name":"o_hash","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_operation","type":"bytes32"}],"name":"revoke","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newRequired","type":"uint256"}],"name":"changeRequirement","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_operation","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"hasConfirmed","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"ownerIndex","type":"uint256"}],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_owners","type":"address[]"},{"name":"_required","type":"uint256"}],"name":"initMultiowned","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"}],"name":"kill","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_owners","type":"address[]"},{"name":"_required","type":"uint256"},{"name":"_daylimit","type":"uint256"}],"name":"initWallet","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"m_dailyLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"payable":true,"type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"}],"name":"OwnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRequirement","type":"uint256"}],"name":"RequirementChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"created","type":"address"}],"name":"SingleTransact","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"},{"indexed":false,"name":"created","type":"address"}],"name":"MultiTransact","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"operation","type":"bytes32"},{"indexed":false,"name":"initiator","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"data","type":"bytes"}],"name":"ConfirmationNeeded","type":"event"}]'; +export const walletSourceURL = 'https://github.com/paritytech/parity/blob/6b0e4f9098be6b841353e7c4f116aa86b7c2e3d6/js/src/contracts/snippets/enhanced-wallet.sol'; +export const walletLibraryRegKey = 'walletLibrary.v.2'; + +// Used if no Wallet Library found in registry... +// Compiled from `wallet.sol` using Solidity v0.4.9 - Optimized +export const fullWalletCode = '0x6060604052341561000c57fe5b60405161166d38038061166d83398101604090815281516020830151918301519201915b805b83835b815160019081018155600090600160a060020a033316906002905b0160005b505550600160a060020a033316600090815261010260205260408120600190555b82518110156100fd57828181518110151561008c57fe5b60209081029091010151600160a060020a0316600282810161010081106100af57fe5b0160005b508190555080600201610102600085848151811015156100cf57fe5b90602001906020020151600160a060020a03168152602001908152602001600020819055505b600101610075565b60008290555b50505061010581905561012164010000000061138f61013082021704565b610107555b505b50505061013f565b600062015180425b0490505b90565b61151f8061014e6000396000f300606060405236156100e05763ffffffff60e060020a600035041663173825d981146101365780632f54bf6e146101545780634123cb6b1461018457806352375093146101a65780635c52c2f5146101c8578063659010e7146101da5780637065cb48146101fc578063746c91711461021a578063797af6271461023c578063b20d30a914610263578063b61d27f614610278578063b75c7dc6146102b6578063ba51a6df146102cb578063c2cf7326146102e0578063c41a360a14610313578063cbf0b0c014610342578063f00d4b5d14610360578063f1736d8614610384575b6101345b60003411156101315760408051600160a060020a033316815234602082015281517fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c929181900390910190a15b5b565b005b341561013e57fe5b610134600160a060020a03600435166103a6565b005b341561015c57fe5b610170600160a060020a0360043516610494565b604080519115158252519081900360200190f35b341561018c57fe5b6101946104b5565b60408051918252519081900360200190f35b34156101ae57fe5b6101946104bb565b60408051918252519081900360200190f35b34156101d057fe5b6101346104c2565b005b34156101e257fe5b6101946104fa565b60408051918252519081900360200190f35b341561020457fe5b610134600160a060020a0360043516610501565b005b341561022257fe5b6101946105f1565b60408051918252519081900360200190f35b341561024457fe5b6101706004356105f7565b604080519115158252519081900360200190f35b341561026b57fe5b610134600435610949565b005b341561028057fe5b61019460048035600160a060020a0316906024803591604435918201910135610982565b60408051918252519081900360200190f35b34156102be57fe5b610134600435610c64565b005b34156102d357fe5b610134600435610d0f565b005b34156102e857fe5b610170600435600160a060020a0360243516610d91565b604080519115158252519081900360200190f35b341561031b57fe5b610326600435610de6565b60408051600160a060020a039092168252519081900360200190f35b341561034a57fe5b610134600160a060020a0360043516610e07565b005b341561036857fe5b610134600160a060020a0360043581169060243516610e45565b005b341561038c57fe5b610194610f3f565b60408051918252519081900360200190f35b60006000366040518083838082843782019150509250505060405180910390206103cf81610f46565b1561048d57600160a060020a0383166000908152610102602052604090205491508115156103fc5761048d565b60016001540360005411156104105761048d565b6000600283610100811061042057fe5b0160005b5055600160a060020a038316600090815261010260205260408120556104486110b1565b610450611132565b60408051600160a060020a038516815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a15b5b5b505050565b600160a060020a03811660009081526101026020526040812054115b919050565b60015481565b6101075481565b6000366040518083838082843782019150509250505060405180910390206104e981610f46565b156104f5576000610106555b5b5b50565b6101065481565b60003660405180838380828437820191505092505050604051809103902061052881610f46565b156105eb5761053682610494565b15610540576105eb565b6105486110b1565b60015460fa901061055b5761055b611132565b5b60015460fa901061056c576105eb565b60018054810190819055600160a060020a03831690600290610100811061058f57fe5b0160005b5055600154600160a060020a03831660008181526101026020908152604091829020939093558051918252517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c3929181900390910190a15b5b5b5050565b60005481565b600060008261060581610f46565b1561093f5760008481526101086020526040902054600160a060020a031615158061064157506000848152610108602052604090206001015415155b8061066e575060008481526101086020526040902060029081015461010060018216150260001901160415155b1561093f5760008481526101086020526040902054600160a060020a0316151561074657600084815261010860209081526040918290206001808201546002928301805486516000199482161561010002949094011693909304601f810185900485028301850190955284825261073f9490939192918301828280156107355780601f1061070a57610100808354040283529160200191610735565b820191906000526020600020905b81548152906001019060200180831161071857829003601f168201915b505050505061126e565b91506107fd565b60008481526101086020526040908190208054600180830154935160029384018054600160a060020a0390941695949093919283928592918116156101000260001901160480156107d85780601f106107ad576101008083540402835291602001916107d8565b820191906000526020600020905b8154815290600101906020018083116107bb57829003601f168201915b505091505060006040518083038185876185025a03f19250505015156107fd57610000565b5b6000848152610108602090815260409182902060018082015482548551600160a060020a033381811683529682018c90529681018390529086166060820181905295881660a082015260c06080820181815260029586018054958616156101000260001901909516959095049082018190527fe3a3a4111a84df27d76b68dc721e65c7711605ea5eee4afd3a9c58195217365c968b959394909390928a9290919060e0830190859080156108f35780601f106108c8576101008083540402835291602001916108f3565b820191906000526020600020905b8154815290600101906020018083116108d657829003601f168201915b505097505050505050505060405180910390a16000848152610108602052604081208054600160a060020a03191681556001810182905590610938600283018261139e565b5050600192505b5b5b5b5050919050565b60003660405180838380828437820191505092505050604051809103902061097081610f46565b156105eb576101058290555b5b5b5050565b6000600061098f33610494565b15610c5757821580156109a657506109a685611288565b5b806109b457506000546001145b15610af657600160a060020a0386161515610a0a57610a038585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375061126e945050505050565b9050610a4a565b85600160a060020a03168585856040518083838082843782019150509250505060006040518083038185876185025a03f1925050501515610a4a57610000565b5b7f9738cd1a8777c86b011f7b01d87d484217dc6ab5154a9d41eda5d14af8caf2923386888787866040518087600160a060020a0316600160a060020a0316815260200186815260200185600160a060020a0316600160a060020a031681526020018060200183600160a060020a0316600160a060020a0316815260200182810382528585828181526020019250808284376040519201829003995090975050505050505050a1610c57565b600036436040518084848082843791909101928352505060408051602092819003830190206000818152610108909352912054909450600160a060020a0316159150508015610b55575060008281526101086020526040902060010154155b8015610b825750600082815261010860205260409020600290810154610100600182161502600019011604155b15610bc6576000828152610108602052604090208054600160a060020a031916600160a060020a03881617815560018101869055610bc49060020185856113e6565b505b610bcf826105f7565b1515610c575760408051838152600160a060020a033381811660208401529282018890528816606082015260a0608082018181529082018690527f1733cbb53659d713b79580f79f3f9ff215f78a7c7aa45890f3b89fc5cddfbf32928592909189918b918a918a9160c082018484808284376040519201829003995090975050505050505050a15b5b5b5b5b50949350505050565b600160a060020a033316600090815261010260205260408120549080821515610c8c57610d08565b50506000828152610103602052604081206001810154600284900a929083161115610d085780546001908101825581018054839003905560408051600160a060020a03331681526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a15b5b50505050565b600036604051808383808284378201915050925050506040518091039020610d3681610f46565b156105eb57600154821115610d4a576105eb565b6000829055610d576110b1565b6040805183815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a15b5b5b5050565b600082815261010360209081526040808320600160a060020a038516845261010290925282205482811515610dc95760009350610ddd565b8160020a9050808360010154166000141593505b50505092915050565b60006002600183016101008110610df957fe5b0160005b505490505b919050565b600036604051808383808284378201915050925050506040518091039020610e2e81610f46565b156105eb5781600160a060020a0316ff5b5b5b5050565b6000600036604051808383808284378201915050925050506040518091039020610e6e81610f46565b15610d0857610e7c83610494565b15610e8657610d08565b600160a060020a038416600090815261010260205260409020549150811515610eae57610d08565b610eb66110b1565b600160a060020a0383166002836101008110610ece57fe5b0160005b5055600160a060020a0380851660008181526101026020908152604080832083905593871680835291849020869055835192835282015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a15b5b5b50505050565b6101055481565b600160a060020a033316600090815261010260205260408120548180821515610f6e576110a7565b60008581526101036020526040902080549092501515610fd157600080548355600180840191909155610104805491610fa991908301611465565b6002830181905561010480548792908110610fc057fe5b906000526020600020900160005b50555b8260020a905080826001015416600014156110a75760408051600160a060020a03331681526020810187905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a181546001901161109457600085815261010360205260409020600201546101048054909190811061105757fe5b906000526020600020900160005b5060009081905585815261010360205260408120818155600180820183905560029091019190915593506110a7565b8154600019018255600182018054821790555b5b5b505050919050565b6101045460005b81811015611125576101086000610104838154811015156110d557fe5b906000526020600020900160005b50548152602081019190915260400160009081208054600160a060020a0319168155600181018290559061111a600283018261139e565b50505b6001016110b8565b6105eb6112fb565b5b5050565b60015b6001548110156104f5575b600154811080156111635750600281610100811061115a57fe5b0160005b505415155b1561117057600101611140565b5b60016001541180156111975750600154600290610100811061118f57fe5b0160005b5054155b156111ab5760018054600019019055611170565b600154811080156111d1575060015460029061010081106111c857fe5b0160005b505415155b80156111ee575060028161010081106111e657fe5b0160005b5054155b1561126557600154600290610100811061120457fe5b0160005b5054600282610100811061121857fe5b0160005b5055806101026000600283610100811061123257fe5b0160005b5054815260200190815260200160002081905550600060026001546101008110151561125e57fe5b0160005b50555b611135565b5b50565b600081516020830184f09050803b15610000575b92915050565b600061129333610494565b156104b057610107546112a461138f565b11156112bd576000610106556112b861138f565b610107555b61010654828101108015906112da57506101055482610106540111155b156112f0575061010680548201905560016104b0565b5060005b5b5b919050565b6101045460005b8181101561137d5761010480548290811061131957fe5b906000526020600020900160005b5054156113745761010360006101048381548110151561134357fe5b906000526020600020900160005b505481526020810191909152604001600090812081815560018101829055600201555b5b600101611302565b6105eb610104600061148f565b5b5050565b600062015180425b0490505b90565b50805460018160011615610100020316600290046000825580601f106113c457506104f5565b601f0160209004906000526020600020908101906104f591906114b1565b5b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106114275782800160ff19823516178555611454565b82800160010185558215611454579182015b82811115611454578235825591602001919060010190611439565b5b506114619291506114b1565b5090565b81548183558181151161048d5760008381526020902061048d9181019083016114b1565b5b505050565b50805460008255906000526020600020908101906104f591906114b1565b5b50565b61139b91905b8082111561146157600081556001016114b7565b5090565b90565b61139b91905b8082111561146157600081556001016114b7565b5090565b905600a165627a7a723058203a7ac7072dc640002704b704af82b742650362cd55debf72fca105c2b916e01d0029'; diff --git a/js/src/contracts/contracts.js b/js/src/contracts/contracts.js new file mode 100644 index 000000000..59b3bccfc --- /dev/null +++ b/js/src/contracts/contracts.js @@ -0,0 +1,83 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import DappReg from './dappreg'; +import Registry from './registry'; +import SignatureReg from './signaturereg'; +import TokenReg from './tokenreg'; +import GithubHint from './githubhint'; +import * as verification from './verification'; +import BadgeReg from './badgereg'; + +let instance = null; + +export default class Contracts { + constructor (api) { + instance = this; + + this._api = api; + this._registry = new Registry(api); + this._dappreg = new DappReg(api, this._registry); + this._signaturereg = new SignatureReg(api, this._registry); + this._tokenreg = new TokenReg(api, this._registry); + this._githubhint = new GithubHint(api, this._registry); + this._badgeReg = new BadgeReg(api, this._registry); + } + + get registry () { + return this._registry; + } + + get badgeReg () { + return this._badgeReg; + } + + get dappReg () { + return this._dappreg; + } + + get signatureReg () { + return this._signaturereg; + } + + get tokenReg () { + return this._tokenreg; + } + + get githubHint () { + return this._githubhint; + } + + get smsVerification () { + return verification; + } + + get emailVerification () { + return verification; + } + + static create (api) { + if (instance) { + return instance; + } + + return new Contracts(api); + } + + static get () { + return instance; + } +} diff --git a/js/src/contracts/dappreg.js b/js/src/contracts/dappreg.js new file mode 100644 index 000000000..18af9c163 --- /dev/null +++ b/js/src/contracts/dappreg.js @@ -0,0 +1,68 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class DappReg { + constructor (api, registry) { + this._api = api; + this._registry = registry; + + this.getInstance(); + } + + getContract () { + return this._registry.getContract('dappreg'); + } + + getInstance () { + return this.getContract().then((contract) => contract.instance); + } + + count () { + return this.getInstance().then((instance) => { + return instance.count.call(); + }); + } + + at (index) { + return this.getInstance().then((instance) => { + return instance.at.call({}, [index]); + }); + } + + get (id) { + return this.getInstance().then((instance) => { + return instance.get.call({}, [id]); + }); + } + + meta (id, key) { + return this.getInstance().then((instance) => { + return instance.meta.call({}, [id, key]); + }); + } + + getImage (id) { + return this.meta(id, 'IMG'); + } + + getContent (id) { + return this.meta(id, 'CONTENT'); + } + + getManifest (id) { + return this.meta(id, 'MANIFEST'); + } +} diff --git a/js/src/contracts/githubhint.js b/js/src/contracts/githubhint.js new file mode 100644 index 000000000..dfc3d5fb7 --- /dev/null +++ b/js/src/contracts/githubhint.js @@ -0,0 +1,46 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class GithubHint { + constructor (api, registry) { + this._api = api; + this._registry = registry; + this._instance = null; + + this.getInstance(); + } + + getContract () { + return this._registry.getContract('githubhint'); + } + + getInstance () { + if (this._instance) { + return Promise.resolve(this._instance); + } + + return this.getContract().then((contract) => { + this._instance = contract.instance; + return this._instance; + }); + } + + getEntry (entryId) { + return this.getInstance().then((instance) => { + return instance.entries.call({}, [entryId]); + }); + } +} diff --git a/js/src/contracts/githubhint.spec.js b/js/src/contracts/githubhint.spec.js new file mode 100644 index 000000000..f33850782 --- /dev/null +++ b/js/src/contracts/githubhint.spec.js @@ -0,0 +1,66 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import sinon from 'sinon'; + +import GithubHint from './githubhint'; + +let githubHint; +let instance; +let registry; + +function create () { + instance = { + __id: 'testInstance', + entries: { + call: sinon.stub().resolves('testValue') + } + }; + registry = { + getContract: sinon.stub().resolves({ instance }) + }; + githubHint = new GithubHint({}, registry); + + return githubHint; +} + +describe('contracts/GithubHint', () => { + beforeEach(() => { + create(); + + return githubHint.getInstance(); + }); + + it('instantiates successfully', () => { + expect(githubHint).to.be.ok; + }); + + it('attaches the instance on create', () => { + expect(githubHint._instance.__id).to.equal('testInstance'); + }); + + describe('interface', () => { + describe('getEntry', () => { + beforeEach(() => { + return githubHint.getEntry('testId'); + }); + + it('calls entries on the instance', () => { + expect(instance.entries.call).to.have.been.calledWith({}, ['testId']); + }); + }); + }); +}); diff --git a/js/src/contracts/index.js b/js/src/contracts/index.js new file mode 100644 index 000000000..8714ff544 --- /dev/null +++ b/js/src/contracts/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './contracts'; diff --git a/js/src/contracts/registry.js b/js/src/contracts/registry.js new file mode 100644 index 000000000..cef31785e --- /dev/null +++ b/js/src/contracts/registry.js @@ -0,0 +1,165 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import * as abis from './abi'; + +const REGISTRY_V1_HASHES = [ + '0x34f7c51bbb1b1902fbdabfdf04811100f5c9f998f26dd535d2f6f977492c748e', // ropsten + '0x64c3ee34851517a9faecd995c102b339f03e564ad6772dc43a26f993238b20ec' // homestead +]; + +export default class Registry { + _registryContract = null; + + constructor (api) { + this._api = api; + + this._contracts = {}; + this._pendingContracts = {}; + + this._instance = null; + this._fetching = false; + this._queue = []; + + this.getInstance(); + } + + getInstance () { + if (this._instance) { + return Promise.resolve(this._instance); + } + + if (this._fetching) { + return new Promise((resolve) => { + this._queue.push({ resolve }); + }); + } + + this._fetching = true; + + return this.fetchContract() + .then((contract) => { + this._fetching = false; + this._instance = contract.instance; + + this._queue.forEach((queued) => { + queued.resolve(this._instance); + }); + + this._queue = []; + + return this._instance; + }); + } + + getContract (_name) { + const name = _name.toLowerCase(); + + if (this._contracts[name]) { + return Promise.resolve(this._contracts[name]); + } + + if (this._pendingContracts[name]) { + return this._pendingContracts[name]; + } + + const promise = this + .lookupAddress(name) + .then((address) => { + this._contracts[name] = this._api.newContract(abis[name], address); + delete this._pendingContracts[name]; + return this._contracts[name]; + }); + + this._pendingContracts[name] = promise; + + return promise; + } + + getContractInstance (_name) { + return this + .getContract(_name) + .then((contract) => contract.instance); + } + + fetchContract () { + if (this._registryContract) { + return Promise.resolve(this._registryContract); + } + + return this._api.parity + .registryAddress() + .then((address) => Promise.all([ address, this._api.eth.getCode(address) ])) + .then(([ address, code ]) => { + const codeHash = this._api.util.sha3(code); + const version = REGISTRY_V1_HASHES.includes(codeHash) + ? 1 + : 2; + const abi = version === 1 + ? abis.registry + : abis.registry2; + const contract = this._api.newContract(abi, address); + + // Add support for previous `set` and `get` methods + if (!contract.instance.get && contract.instance.getData) { + contract.instance.get = contract.instance.getData; + } + + if (contract.instance.get && !contract.instance.getData) { + contract.instance.getData = contract.instance.get; + } + + if (!contract.instance.set && contract.instance.setData) { + contract.instance.set = contract.instance.setData; + } + + if (contract.instance.set && !contract.instance.setData) { + contract.instance.setData = contract.instance.set; + } + + console.log(`registry at ${address}, code ${codeHash}, version ${version}`); + this._registryContract = contract; + return this._registryContract; + }); + } + + _createGetParams (_name, key) { + const name = _name.toLowerCase(); + const sha3 = this._api.util.sha3.text(name); + + return [sha3, key]; + } + + lookupAddress (name) { + return this + .getInstance() + .then((instance) => { + return instance.getAddress.call({}, this._createGetParams(name, 'A')); + }) + .then((address) => { + console.log('[lookupAddress]', `${name}: ${address}`); + return address; + }); + } + + lookupMeta (name, key) { + return this + .getInstance() + .then((instance) => { + return instance.get.call({}, this._createGetParams(name, key)); + }); + } +} diff --git a/js/src/contracts/registry.spec.js b/js/src/contracts/registry.spec.js new file mode 100644 index 000000000..cf81a2b72 --- /dev/null +++ b/js/src/contracts/registry.spec.js @@ -0,0 +1,86 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import sinon from 'sinon'; + +import apiutil from '~/api/util'; + +import Registry from './registry'; + +const GHH_NAME = 'githubhint'; +const GHH_SHA3 = '0x058740ee9a5a3fb9f1cfa10752baec87e09cc45cd7027fd54708271aca300c75'; + +let api; +let instance; +let registry; + +function create () { + instance = { + __id: 'testInstance', + get: { + call: sinon.stub().resolves('testGet') + } + }; + api = { + eth: { + getCode: sinon.stub().resolves('0x123456') + }, + parity: { + registryAddress: sinon.stub().resolves('testRegistryAddress') + }, + util: apiutil, + newContract: sinon.stub().returns({ instance }) + }; + registry = new Registry(api); + + return registry; +} + +describe('contracts/Registry', () => { + beforeEach(() => { + create(); + + return registry.getInstance(); + }); + + it('instantiates successfully', () => { + expect(registry).to.be.ok; + }); + + it('retrieves the registry on create', () => { + expect(api.parity.registryAddress).to.have.been.called; + }); + + it('attaches the instance on create', () => { + expect(registry._instance.__id).to.equal('testInstance'); + }); + + describe('interface', () => { + describe('lookupMeta', () => { + it('calls get on the contract', () => { + return registry.lookupMeta(GHH_NAME, 'key').then(() => { + expect(instance.get.call).to.have.been.calledWith({}, [GHH_SHA3, 'key']); + }); + }); + + it('converts names to lowercase', () => { + return registry.lookupMeta(GHH_NAME.toUpperCase(), 'key').then(() => { + expect(instance.get.call).to.have.been.calledWith({}, [GHH_SHA3, 'key']); + }); + }); + }); + }); +}); diff --git a/js/src/contracts/signaturereg.js b/js/src/contracts/signaturereg.js new file mode 100644 index 000000000..9fa3eab06 --- /dev/null +++ b/js/src/contracts/signaturereg.js @@ -0,0 +1,34 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class SignatureReg { + constructor (api, registry) { + this._api = api; + this._registry = registry; + + this.getInstance(); + } + + getInstance () { + return this._registry.getContractInstance('signaturereg'); + } + + lookup (signature) { + return this.getInstance().then((instance) => { + return instance.entries.call({}, [signature]); + }); + } +} diff --git a/js/src/contracts/snippets/enhanced-wallet.sol b/js/src/contracts/snippets/enhanced-wallet.sol new file mode 100644 index 000000000..90a15c070 --- /dev/null +++ b/js/src/contracts/snippets/enhanced-wallet.sol @@ -0,0 +1,464 @@ +//sol Wallet +// Multi-sig, daily-limited account proxy/wallet. +// @authors: +// Gav Wood +// inheritable "property" contract that enables methods to be protected by requiring the acquiescence of either a +// single, or, crucially, each of a number of, designated owners. +// usage: +// use modifiers onlyowner (just own owned) or onlymanyowners(hash), whereby the same hash must be provided by +// some number (specified in constructor) of the set of owners (specified in the constructor, modifiable) before the +// interior is executed. + +pragma solidity ^0.4.9; + +contract WalletEvents { + // EVENTS + + // this contract only has six types of events: it can accept a confirmation, in which case + // we record owner and operation (hash) alongside it. + event Confirmation(address owner, bytes32 operation); + event Revoke(address owner, bytes32 operation); + + // some others are in the case of an owner changing. + event OwnerChanged(address oldOwner, address newOwner); + event OwnerAdded(address newOwner); + event OwnerRemoved(address oldOwner); + + // the last one is emitted if the required signatures change + event RequirementChanged(uint newRequirement); + + // Funds has arrived into the wallet (record how much). + event Deposit(address _from, uint value); + // Single transaction going out of the wallet (record who signed for it, how much, and to whom it's going). + event SingleTransact(address owner, uint value, address to, bytes data, address created); + // Multi-sig transaction going out of the wallet (record who signed for it last, the operation hash, how much, and to whom it's going). + event MultiTransact(address owner, bytes32 operation, uint value, address to, bytes data, address created); + // Confirmation still needed for a transaction. + event ConfirmationNeeded(bytes32 operation, address initiator, uint value, address to, bytes data); +} + +contract WalletAbi { + // Revokes a prior confirmation of the given operation + function revoke(bytes32 _operation) external; + + // Replaces an owner `_from` with another `_to`. + function changeOwner(address _from, address _to) external; + + function addOwner(address _owner) external; + + function removeOwner(address _owner) external; + + function changeRequirement(uint _newRequired) external; + + function isOwner(address _addr) constant returns (bool); + + function hasConfirmed(bytes32 _operation, address _owner) external constant returns (bool); + + // (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today. + function setDailyLimit(uint _newLimit) external; + + function execute(address _to, uint _value, bytes _data) external returns (bytes32 o_hash); + function confirm(bytes32 _h) returns (bool o_success); +} + +contract WalletLibrary is WalletEvents { + // TYPES + + // struct for the status of a pending operation. + struct PendingState { + uint yetNeeded; + uint ownersDone; + uint index; + } + + // Transaction structure to remember details of transaction lest it need be saved for a later call. + struct Transaction { + address to; + uint value; + bytes data; + } + + // MODIFIERS + + // simple single-sig function modifier. + modifier onlyowner { + if (isOwner(msg.sender)) + _; + } + // multi-sig function modifier: the operation must have an intrinsic hash in order + // that later attempts can be realised as the same underlying operation and + // thus count as confirmations. + modifier onlymanyowners(bytes32 _operation) { + if (confirmAndCheck(_operation)) + _; + } + + // METHODS + + // gets called when no other function matches + function() payable { + // just being sent some cash? + if (msg.value > 0) + Deposit(msg.sender, msg.value); + } + + // constructor is given number of sigs required to do protected "onlymanyowners" transactions + // as well as the selection of addresses capable of confirming them. + function initMultiowned(address[] _owners, uint _required) only_uninitialized { + m_numOwners = _owners.length + 1; + m_owners[1] = uint(msg.sender); + m_ownerIndex[uint(msg.sender)] = 1; + for (uint i = 0; i < _owners.length; ++i) + { + m_owners[2 + i] = uint(_owners[i]); + m_ownerIndex[uint(_owners[i])] = 2 + i; + } + m_required = _required; + } + + // Revokes a prior confirmation of the given operation + function revoke(bytes32 _operation) external { + uint ownerIndex = m_ownerIndex[uint(msg.sender)]; + // make sure they're an owner + if (ownerIndex == 0) return; + uint ownerIndexBit = 2**ownerIndex; + var pending = m_pending[_operation]; + if (pending.ownersDone & ownerIndexBit > 0) { + pending.yetNeeded++; + pending.ownersDone -= ownerIndexBit; + Revoke(msg.sender, _operation); + } + } + + // Replaces an owner `_from` with another `_to`. + function changeOwner(address _from, address _to) onlymanyowners(sha3(msg.data)) external { + if (isOwner(_to)) return; + uint ownerIndex = m_ownerIndex[uint(_from)]; + if (ownerIndex == 0) return; + + clearPending(); + m_owners[ownerIndex] = uint(_to); + m_ownerIndex[uint(_from)] = 0; + m_ownerIndex[uint(_to)] = ownerIndex; + OwnerChanged(_from, _to); + } + + function addOwner(address _owner) onlymanyowners(sha3(msg.data)) external { + if (isOwner(_owner)) return; + + clearPending(); + if (m_numOwners >= c_maxOwners) + reorganizeOwners(); + if (m_numOwners >= c_maxOwners) + return; + m_numOwners++; + m_owners[m_numOwners] = uint(_owner); + m_ownerIndex[uint(_owner)] = m_numOwners; + OwnerAdded(_owner); + } + + function removeOwner(address _owner) onlymanyowners(sha3(msg.data)) external { + uint ownerIndex = m_ownerIndex[uint(_owner)]; + if (ownerIndex == 0) return; + if (m_required > m_numOwners - 1) return; + + m_owners[ownerIndex] = 0; + m_ownerIndex[uint(_owner)] = 0; + clearPending(); + reorganizeOwners(); //make sure m_numOwner is equal to the number of owners and always points to the optimal free slot + OwnerRemoved(_owner); + } + + function changeRequirement(uint _newRequired) onlymanyowners(sha3(msg.data)) external { + if (_newRequired > m_numOwners) return; + m_required = _newRequired; + clearPending(); + RequirementChanged(_newRequired); + } + + // Gets an owner by 0-indexed position (using numOwners as the count) + function getOwner(uint ownerIndex) external constant returns (address) { + return address(m_owners[ownerIndex + 1]); + } + + function isOwner(address _addr) constant returns (bool) { + return m_ownerIndex[uint(_addr)] > 0; + } + + function hasConfirmed(bytes32 _operation, address _owner) external constant returns (bool) { + var pending = m_pending[_operation]; + uint ownerIndex = m_ownerIndex[uint(_owner)]; + + // make sure they're an owner + if (ownerIndex == 0) return false; + + // determine the bit to set for this owner. + uint ownerIndexBit = 2**ownerIndex; + return !(pending.ownersDone & ownerIndexBit == 0); + } + + // constructor - stores initial daily limit and records the present day's index. + function initDaylimit(uint _limit) only_uninitialized { + m_dailyLimit = _limit; + m_lastDay = today(); + } + // (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today. + function setDailyLimit(uint _newLimit) onlymanyowners(sha3(msg.data)) external { + m_dailyLimit = _newLimit; + } + // resets the amount already spent today. needs many of the owners to confirm. + function resetSpentToday() onlymanyowners(sha3(msg.data)) external { + m_spentToday = 0; + } + + // throw unless the contract is not yet initialized. + modifier only_uninitialized { if (m_numOwners > 0) throw; _; } + + // constructor - just pass on the owner array to the multiowned and + // the limit to daylimit + function initWallet(address[] _owners, uint _required, uint _daylimit) only_uninitialized { + initDaylimit(_daylimit); + initMultiowned(_owners, _required); + } + + // kills the contract sending everything to `_to`. + function kill(address _to) onlymanyowners(sha3(msg.data)) external { + suicide(_to); + } + + // Outside-visible transact entry point. Executes transaction immediately if below daily spend limit. + // If not, goes into multisig process. We provide a hash on return to allow the sender to provide + // shortcuts for the other confirmations (allowing them to avoid replicating the _to, _value + // and _data arguments). They still get the option of using them if they want, anyways. + function execute(address _to, uint _value, bytes _data) external onlyowner returns (bytes32 o_hash) { + // first, take the opportunity to check that we're under the daily limit. + if ((_data.length == 0 && underLimit(_value)) || m_required == 1) { + // yes - just execute the call. + address created; + if (_to == 0) { + created = create(_value, _data); + } else { + if (!_to.call.value(_value)(_data)) + throw; + } + SingleTransact(msg.sender, _value, _to, _data, created); + } else { + // determine our operation hash. + o_hash = sha3(msg.data, block.number); + // store if it's new + if (m_txs[o_hash].to == 0 && m_txs[o_hash].value == 0 && m_txs[o_hash].data.length == 0) { + m_txs[o_hash].to = _to; + m_txs[o_hash].value = _value; + m_txs[o_hash].data = _data; + } + if (!confirm(o_hash)) { + ConfirmationNeeded(o_hash, msg.sender, _value, _to, _data); + } + } + } + + function create(uint _value, bytes _code) internal returns (address o_addr) { + assembly { + o_addr := create(_value, add(_code, 0x20), mload(_code)) + jumpi(invalidJumpLabel, iszero(extcodesize(o_addr))) + } + } + + // confirm a transaction through just the hash. we use the previous transactions map, m_txs, in order + // to determine the body of the transaction from the hash provided. + function confirm(bytes32 _h) onlymanyowners(_h) returns (bool o_success) { + if (m_txs[_h].to != 0 || m_txs[_h].value != 0 || m_txs[_h].data.length != 0) { + address created; + if (m_txs[_h].to == 0) { + created = create(m_txs[_h].value, m_txs[_h].data); + } else { + if (!m_txs[_h].to.call.value(m_txs[_h].value)(m_txs[_h].data)) + throw; + } + + MultiTransact(msg.sender, _h, m_txs[_h].value, m_txs[_h].to, m_txs[_h].data, created); + delete m_txs[_h]; + return true; + } + } + + // INTERNAL METHODS + + function confirmAndCheck(bytes32 _operation) internal returns (bool) { + // determine what index the present sender is: + uint ownerIndex = m_ownerIndex[uint(msg.sender)]; + // make sure they're an owner + if (ownerIndex == 0) return; + + var pending = m_pending[_operation]; + // if we're not yet working on this operation, switch over and reset the confirmation status. + if (pending.yetNeeded == 0) { + // reset count of confirmations needed. + pending.yetNeeded = m_required; + // reset which owners have confirmed (none) - set our bitmap to 0. + pending.ownersDone = 0; + pending.index = m_pendingIndex.length++; + m_pendingIndex[pending.index] = _operation; + } + // determine the bit to set for this owner. + uint ownerIndexBit = 2**ownerIndex; + // make sure we (the message sender) haven't confirmed this operation previously. + if (pending.ownersDone & ownerIndexBit == 0) { + Confirmation(msg.sender, _operation); + // ok - check if count is enough to go ahead. + if (pending.yetNeeded <= 1) { + // enough confirmations: reset and run interior. + delete m_pendingIndex[m_pending[_operation].index]; + delete m_pending[_operation]; + return true; + } + else + { + // not enough: record that this owner in particular confirmed. + pending.yetNeeded--; + pending.ownersDone |= ownerIndexBit; + } + } + } + + function reorganizeOwners() private { + uint free = 1; + while (free < m_numOwners) + { + while (free < m_numOwners && m_owners[free] != 0) free++; + while (m_numOwners > 1 && m_owners[m_numOwners] == 0) m_numOwners--; + if (free < m_numOwners && m_owners[m_numOwners] != 0 && m_owners[free] == 0) + { + m_owners[free] = m_owners[m_numOwners]; + m_ownerIndex[m_owners[free]] = free; + m_owners[m_numOwners] = 0; + } + } + } + + // checks to see if there is at least `_value` left from the daily limit today. if there is, subtracts it and + // returns true. otherwise just returns false. + function underLimit(uint _value) internal onlyowner returns (bool) { + // reset the spend limit if we're on a different day to last time. + if (today() > m_lastDay) { + m_spentToday = 0; + m_lastDay = today(); + } + // check to see if there's enough left - if so, subtract and return true. + // overflow protection // dailyLimit check + if (m_spentToday + _value >= m_spentToday && m_spentToday + _value <= m_dailyLimit) { + m_spentToday += _value; + return true; + } + return false; + } + + // determines today's index. + function today() private constant returns (uint) { return now / 1 days; } + + function clearPending() internal { + uint length = m_pendingIndex.length; + + for (uint i = 0; i < length; ++i) { + delete m_txs[m_pendingIndex[i]]; + + if (m_pendingIndex[i] != 0) + delete m_pending[m_pendingIndex[i]]; + } + + delete m_pendingIndex; + } + + // FIELDS + address constant _walletLibrary = 0xcafecafecafecafecafecafecafecafecafecafe; + + // the number of owners that must confirm the same operation before it is run. + uint public m_required; + // pointer used to find a free slot in m_owners + uint public m_numOwners; + + uint public m_dailyLimit; + uint public m_spentToday; + uint public m_lastDay; + + // list of owners + uint[256] m_owners; + + uint constant c_maxOwners = 250; + // index on the list of owners to allow reverse lookup + mapping(uint => uint) m_ownerIndex; + // the ongoing operations. + mapping(bytes32 => PendingState) m_pending; + bytes32[] m_pendingIndex; + + // pending transactions we have at present. + mapping (bytes32 => Transaction) m_txs; +} + +contract Wallet is WalletEvents { + + // WALLET CONSTRUCTOR + // calls the `initWallet` method of the Library in this context + function Wallet(address[] _owners, uint _required, uint _daylimit) { + // Signature of the Wallet Library's init function + bytes4 sig = bytes4(sha3("initWallet(address[],uint256,uint256)")); + address target = _walletLibrary; + + // Compute the size of the call data : arrays has 2 + // 32bytes for offset and length, plus 32bytes per element ; + // plus 2 32bytes for each uint + uint argarraysize = (2 + _owners.length); + uint argsize = (2 + argarraysize) * 32; + + assembly { + // Add the signature first to memory + mstore(0x0, sig) + // Add the call data, which is at the end of the + // code + codecopy(0x4, sub(codesize, argsize), argsize) + // Delegate call to the library + delegatecall(sub(gas, 10000), target, 0x0, add(argsize, 0x4), 0x0, 0x0) + } + } + + // METHODS + + // gets called when no other function matches + function() payable { + // just being sent some cash? + if (msg.value > 0) + Deposit(msg.sender, msg.value); + else if (msg.data.length > 0) + _walletLibrary.delegatecall(msg.data); + } + + // Gets an owner by 0-indexed position (using numOwners as the count) + function getOwner(uint ownerIndex) constant returns (address) { + return address(m_owners[ownerIndex + 1]); + } + + // As return statement unavailable in fallback, explicit the method here + + function hasConfirmed(bytes32 _operation, address _owner) external constant returns (bool) { + return _walletLibrary.delegatecall(msg.data); + } + + function isOwner(address _addr) constant returns (bool) { + return _walletLibrary.delegatecall(msg.data); + } + + // FIELDS + address constant _walletLibrary = 0xcafecafecafecafecafecafecafecafecafecafe; + + // the number of owners that must confirm the same operation before it is run. + uint public m_required; + // pointer used to find a free slot in m_owners + uint public m_numOwners; + + uint public m_dailyLimit; + uint public m_spentToday; + uint public m_lastDay; + + // list of owners + uint[256] m_owners; +} diff --git a/js/src/contracts/snippets/human-standard-token.sol b/js/src/contracts/snippets/human-standard-token.sol new file mode 100644 index 000000000..db05bbc7d --- /dev/null +++ b/js/src/contracts/snippets/human-standard-token.sol @@ -0,0 +1,60 @@ +/* +This Token Contract implements the standard token functionality (https://github.com/ethereum/EIPs/issues/20) as well as the following OPTIONAL extras intended for use by humans. + +In other words. This is intended for deployment in something like a Token Factory or Mist wallet, and then used by humans. +Imagine coins, currencies, shares, voting weight, etc. +Machine-based, rapid creation of many tokens would not necessarily need these extra features or will be minted in other manners. + +1) Initial Finite Supply (upon creation one specifies how much is minted). +2) In the absence of a token registry: Optional Decimal, Symbol & Name. +3) Optional approveAndCall() functionality to notify a contract if an approval() has occurred. + +.*/ + +import "StandardToken.sol"; + +contract HumanStandardToken is StandardToken { + + function () { + //if ether is sent to this address, send it back. + throw; + } + + /* Public variables of the token */ + + /* + NOTE: + The following variables are OPTIONAL vanities. One does not have to include them. + They allow one to customise the token contract & in no way influences the core functionality. + Some wallets/interfaces might not even bother to look at this information. + */ + string public name; //fancy name: eg Simon Bucks + uint8 public decimals; //How many decimals to show. ie. There could 1000 base units with 3 decimals. Meaning 0.980 SBX = 980 base units. It's like comparing 1 wei to 1 ether. + string public symbol; //An identifier: eg SBX + string public version = 'H0.1'; //human 0.1 standard. Just an arbitrary versioning scheme. + + function HumanStandardToken( + uint256 _initialAmount, + string _tokenName, + uint8 _decimalUnits, + string _tokenSymbol + ) { + balances[msg.sender] = _initialAmount; // Give the creator all initial tokens + totalSupply = _initialAmount; // Update total supply + name = _tokenName; // Set the name for display purposes + decimals = _decimalUnits; // Amount of decimals for display purposes + symbol = _tokenSymbol; // Set the symbol for display purposes + } + + /* Approves and then calls the receiving contract */ + function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success) { + allowed[msg.sender][_spender] = _value; + Approval(msg.sender, _spender, _value); + + //call the receiveApproval function on the contract you want to be notified. This crafts the function signature manually so one doesn't have to include a contract in here just for this. + //receiveApproval(address _from, uint256 _value, address _tokenContract, bytes _extraData) + //it is assumed that when does this that the call *should* succeed, otherwise one would use vanilla approve instead. + if(!_spender.call(bytes4(bytes32(sha3("receiveApproval(address,uint256,address,bytes)"))), msg.sender, _value, this, _extraData)) { throw; } + return true; + } +} diff --git a/js/src/contracts/snippets/standard-token.sol b/js/src/contracts/snippets/standard-token.sol new file mode 100644 index 000000000..3d91e5510 --- /dev/null +++ b/js/src/contracts/snippets/standard-token.sol @@ -0,0 +1,55 @@ +/* +You should inherit from StandardToken or, for a token like you would want to +deploy in something like Mist, see HumanStandardToken.sol. +(This implements ONLY the standard functions and NOTHING else. +If you deploy this, you won't have anything useful.) + +Implements ERC 20 Token standard: https://github.com/ethereum/EIPs/issues/20 +.*/ + +import "Token.sol"; + +contract StandardToken is Token { + + function transfer(address _to, uint256 _value) returns (bool success) { + //Default assumes totalSupply can't be over max (2^256 - 1). + //If your token leaves out totalSupply and can issue more tokens as time goes on, you need to check if it doesn't wrap. + //Replace the if with this one instead. + //if (balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]) { + if (balances[msg.sender] >= _value && _value > 0) { + balances[msg.sender] -= _value; + balances[_to] += _value; + Transfer(msg.sender, _to, _value); + return true; + } else { return false; } + } + + function transferFrom(address _from, address _to, uint256 _value) returns (bool success) { + //same as above. Replace this line with the following if you want to protect against wrapping uints. + //if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value > balances[_to]) { + if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0) { + balances[_to] += _value; + balances[_from] -= _value; + allowed[_from][msg.sender] -= _value; + Transfer(_from, _to, _value); + return true; + } else { return false; } + } + + function balanceOf(address _owner) constant returns (uint256 balance) { + return balances[_owner]; + } + + function approve(address _spender, uint256 _value) returns (bool success) { + allowed[msg.sender][_spender] = _value; + Approval(msg.sender, _spender, _value); + return true; + } + + function allowance(address _owner, address _spender) constant returns (uint256 remaining) { + return allowed[_owner][_spender]; + } + + mapping (address => uint256) balances; + mapping (address => mapping (address => uint256)) allowed; +} diff --git a/js/src/contracts/snippets/token.sol b/js/src/contracts/snippets/token.sol new file mode 100644 index 000000000..d54c5c424 --- /dev/null +++ b/js/src/contracts/snippets/token.sol @@ -0,0 +1,47 @@ +// Abstract contract for the full ERC 20 Token standard +// https://github.com/ethereum/EIPs/issues/20 + +contract Token { + /* This is a slight change to the ERC20 base standard. + function totalSupply() constant returns (uint256 supply); + is replaced with: + uint256 public totalSupply; + This automatically creates a getter function for the totalSupply. + This is moved to the base contract since public getter functions are not + currently recognised as an implementation of the matching abstract + function by the compiler. + */ + /// total amount of tokens + uint256 public totalSupply; + + /// @param _owner The address from which the balance will be retrieved + /// @return The balance + function balanceOf(address _owner) constant returns (uint256 balance); + + /// @notice send `_value` token to `_to` from `msg.sender` + /// @param _to The address of the recipient + /// @param _value The amount of token to be transferred + /// @return Whether the transfer was successful or not + function transfer(address _to, uint256 _value) returns (bool success); + + /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from` + /// @param _from The address of the sender + /// @param _to The address of the recipient + /// @param _value The amount of token to be transferred + /// @return Whether the transfer was successful or not + function transferFrom(address _from, address _to, uint256 _value) returns (bool success); + + /// @notice `msg.sender` approves `_addr` to spend `_value` tokens + /// @param _spender The address of the account able to transfer the tokens + /// @param _value The amount of wei to be approved for transfer + /// @return Whether the approval was successful or not + function approve(address _spender, uint256 _value) returns (bool success); + + /// @param _owner The address of the account owning tokens + /// @param _spender The address of the account able to transfer the tokens + /// @return Amount of remaining tokens allowed to spent + function allowance(address _owner, address _spender) constant returns (uint256 remaining); + + event Transfer(address indexed _from, address indexed _to, uint256 _value); + event Approval(address indexed _owner, address indexed _spender, uint256 _value); +} diff --git a/js/src/contracts/snippets/wallet.sol b/js/src/contracts/snippets/wallet.sol new file mode 100644 index 000000000..a8f1ba938 --- /dev/null +++ b/js/src/contracts/snippets/wallet.sol @@ -0,0 +1,403 @@ +//sol Wallet +// Multi-sig, daily-limited account proxy/wallet. +// @authors: +// Gav Wood +// inheritable "property" contract that enables methods to be protected by requiring the acquiescence of either a +// single, or, crucially, each of a number of, designated owners. +// usage: +// use modifiers onlyowner (just own owned) or onlymanyowners(hash), whereby the same hash must be provided by +// some number (specified in constructor) of the set of owners (specified in the constructor, modifiable) before the +// interior is executed. + +pragma solidity ^0.4.9; + +contract multiowned { + + // TYPES + + // struct for the status of a pending operation. + struct PendingState { + uint yetNeeded; + uint ownersDone; + uint index; + } + + // EVENTS + + // this contract only has six types of events: it can accept a confirmation, in which case + // we record owner and operation (hash) alongside it. + event Confirmation(address owner, bytes32 operation); + event Revoke(address owner, bytes32 operation); + // some others are in the case of an owner changing. + event OwnerChanged(address oldOwner, address newOwner); + event OwnerAdded(address newOwner); + event OwnerRemoved(address oldOwner); + // the last one is emitted if the required signatures change + event RequirementChanged(uint newRequirement); + + // MODIFIERS + + // simple single-sig function modifier. + modifier onlyowner { + if (isOwner(msg.sender)) + _; + } + // multi-sig function modifier: the operation must have an intrinsic hash in order + // that later attempts can be realised as the same underlying operation and + // thus count as confirmations. + modifier onlymanyowners(bytes32 _operation) { + if (confirmAndCheck(_operation)) + _; + } + + // METHODS + + // constructor is given number of sigs required to do protected "onlymanyowners" transactions + // as well as the selection of addresses capable of confirming them. + function multiowned(address[] _owners, uint _required) { + m_numOwners = _owners.length + 1; + m_owners[1] = uint(msg.sender); + m_ownerIndex[uint(msg.sender)] = 1; + for (uint i = 0; i < _owners.length; ++i) + { + m_owners[2 + i] = uint(_owners[i]); + m_ownerIndex[uint(_owners[i])] = 2 + i; + } + m_required = _required; + } + + // Revokes a prior confirmation of the given operation + function revoke(bytes32 _operation) external { + uint ownerIndex = m_ownerIndex[uint(msg.sender)]; + // make sure they're an owner + if (ownerIndex == 0) return; + uint ownerIndexBit = 2**ownerIndex; + var pending = m_pending[_operation]; + if (pending.ownersDone & ownerIndexBit > 0) { + pending.yetNeeded++; + pending.ownersDone -= ownerIndexBit; + Revoke(msg.sender, _operation); + } + } + + // Replaces an owner `_from` with another `_to`. + function changeOwner(address _from, address _to) onlymanyowners(sha3(msg.data)) external { + if (isOwner(_to)) return; + uint ownerIndex = m_ownerIndex[uint(_from)]; + if (ownerIndex == 0) return; + + clearPending(); + m_owners[ownerIndex] = uint(_to); + m_ownerIndex[uint(_from)] = 0; + m_ownerIndex[uint(_to)] = ownerIndex; + OwnerChanged(_from, _to); + } + + function addOwner(address _owner) onlymanyowners(sha3(msg.data)) external { + if (isOwner(_owner)) return; + + clearPending(); + if (m_numOwners >= c_maxOwners) + reorganizeOwners(); + if (m_numOwners >= c_maxOwners) + return; + m_numOwners++; + m_owners[m_numOwners] = uint(_owner); + m_ownerIndex[uint(_owner)] = m_numOwners; + OwnerAdded(_owner); + } + + function removeOwner(address _owner) onlymanyowners(sha3(msg.data)) external { + uint ownerIndex = m_ownerIndex[uint(_owner)]; + if (ownerIndex == 0) return; + if (m_required > m_numOwners - 1) return; + + m_owners[ownerIndex] = 0; + m_ownerIndex[uint(_owner)] = 0; + clearPending(); + reorganizeOwners(); //make sure m_numOwner is equal to the number of owners and always points to the optimal free slot + OwnerRemoved(_owner); + } + + function changeRequirement(uint _newRequired) onlymanyowners(sha3(msg.data)) external { + if (_newRequired > m_numOwners) return; + m_required = _newRequired; + clearPending(); + RequirementChanged(_newRequired); + } + + // Gets an owner by 0-indexed position (using numOwners as the count) + function getOwner(uint ownerIndex) external constant returns (address) { + return address(m_owners[ownerIndex + 1]); + } + + function isOwner(address _addr) constant returns (bool) { + return m_ownerIndex[uint(_addr)] > 0; + } + + function hasConfirmed(bytes32 _operation, address _owner) constant returns (bool) { + var pending = m_pending[_operation]; + uint ownerIndex = m_ownerIndex[uint(_owner)]; + + // make sure they're an owner + if (ownerIndex == 0) return false; + + // determine the bit to set for this owner. + uint ownerIndexBit = 2**ownerIndex; + return !(pending.ownersDone & ownerIndexBit == 0); + } + + // INTERNAL METHODS + + function confirmAndCheck(bytes32 _operation) internal returns (bool) { + // determine what index the present sender is: + uint ownerIndex = m_ownerIndex[uint(msg.sender)]; + // make sure they're an owner + if (ownerIndex == 0) return; + + var pending = m_pending[_operation]; + // if we're not yet working on this operation, switch over and reset the confirmation status. + if (pending.yetNeeded == 0) { + // reset count of confirmations needed. + pending.yetNeeded = m_required; + // reset which owners have confirmed (none) - set our bitmap to 0. + pending.ownersDone = 0; + pending.index = m_pendingIndex.length++; + m_pendingIndex[pending.index] = _operation; + } + // determine the bit to set for this owner. + uint ownerIndexBit = 2**ownerIndex; + // make sure we (the message sender) haven't confirmed this operation previously. + if (pending.ownersDone & ownerIndexBit == 0) { + Confirmation(msg.sender, _operation); + // ok - check if count is enough to go ahead. + if (pending.yetNeeded <= 1) { + // enough confirmations: reset and run interior. + delete m_pendingIndex[m_pending[_operation].index]; + delete m_pending[_operation]; + return true; + } + else + { + // not enough: record that this owner in particular confirmed. + pending.yetNeeded--; + pending.ownersDone |= ownerIndexBit; + } + } + } + + function reorganizeOwners() private { + uint free = 1; + while (free < m_numOwners) + { + while (free < m_numOwners && m_owners[free] != 0) free++; + while (m_numOwners > 1 && m_owners[m_numOwners] == 0) m_numOwners--; + if (free < m_numOwners && m_owners[m_numOwners] != 0 && m_owners[free] == 0) + { + m_owners[free] = m_owners[m_numOwners]; + m_ownerIndex[m_owners[free]] = free; + m_owners[m_numOwners] = 0; + } + } + } + + function clearPending() internal { + uint length = m_pendingIndex.length; + for (uint i = 0; i < length; ++i) + if (m_pendingIndex[i] != 0) + delete m_pending[m_pendingIndex[i]]; + delete m_pendingIndex; + } + + // FIELDS + + // the number of owners that must confirm the same operation before it is run. + uint public m_required; + // pointer used to find a free slot in m_owners + uint public m_numOwners; + + // list of owners + uint[256] m_owners; + uint constant c_maxOwners = 250; + // index on the list of owners to allow reverse lookup + mapping(uint => uint) m_ownerIndex; + // the ongoing operations. + mapping(bytes32 => PendingState) m_pending; + bytes32[] m_pendingIndex; +} + +// inheritable "property" contract that enables methods to be protected by placing a linear limit (specifiable) +// on a particular resource per calendar day. is multiowned to allow the limit to be altered. resource that method +// uses is specified in the modifier. +contract daylimit is multiowned { + + // METHODS + + // constructor - stores initial daily limit and records the present day's index. + function daylimit(uint _limit) { + m_dailyLimit = _limit; + m_lastDay = today(); + } + // (re)sets the daily limit. needs many of the owners to confirm. doesn't alter the amount already spent today. + function setDailyLimit(uint _newLimit) onlymanyowners(sha3(msg.data)) external { + m_dailyLimit = _newLimit; + } + // resets the amount already spent today. needs many of the owners to confirm. + function resetSpentToday() onlymanyowners(sha3(msg.data)) external { + m_spentToday = 0; + } + + // INTERNAL METHODS + + // checks to see if there is at least `_value` left from the daily limit today. if there is, subtracts it and + // returns true. otherwise just returns false. + function underLimit(uint _value) internal onlyowner returns (bool) { + // reset the spend limit if we're on a different day to last time. + if (today() > m_lastDay) { + m_spentToday = 0; + m_lastDay = today(); + } + // check to see if there's enough left - if so, subtract and return true. + // overflow protection // dailyLimit check + if (m_spentToday + _value >= m_spentToday && m_spentToday + _value <= m_dailyLimit) { + m_spentToday += _value; + return true; + } + return false; + } + // determines today's index. + function today() private constant returns (uint) { return now / 1 days; } + + // FIELDS + + uint public m_dailyLimit; + uint public m_spentToday; + uint public m_lastDay; +} + +// interface contract for multisig proxy contracts; see below for docs. +contract multisig { + + // EVENTS + + // logged events: + // Funds has arrived into the wallet (record how much). + event Deposit(address _from, uint value); + // Single transaction going out of the wallet (record who signed for it, how much, and to whom it's going). + event SingleTransact(address owner, uint value, address to, bytes data, address created); + // Multi-sig transaction going out of the wallet (record who signed for it last, the operation hash, how much, and to whom it's going). + event MultiTransact(address owner, bytes32 operation, uint value, address to, bytes data, address created); + // Confirmation still needed for a transaction. + event ConfirmationNeeded(bytes32 operation, address initiator, uint value, address to, bytes data); + + // FUNCTIONS + + // TODO: document + function execute(address _to, uint _value, bytes _data) external returns (bytes32 o_hash); + function confirm(bytes32 _h) returns (bool o_success); +} + +// usage: +// bytes32 h = Wallet(w).from(oneOwner).execute(to, value, data); +// Wallet(w).from(anotherOwner).confirm(h); +contract Wallet is multisig, multiowned, daylimit { + + // TYPES + + // Transaction structure to remember details of transaction lest it need be saved for a later call. + struct Transaction { + address to; + uint value; + bytes data; + } + + // METHODS + + // constructor - just pass on the owner array to the multiowned and + // the limit to daylimit + function Wallet(address[] _owners, uint _required, uint _daylimit) + multiowned(_owners, _required) daylimit(_daylimit) { + } + + // kills the contract sending everything to `_to`. + function kill(address _to) onlymanyowners(sha3(msg.data)) external { + suicide(_to); + } + + // gets called when no other function matches + function() payable { + // just being sent some cash? + if (msg.value > 0) + Deposit(msg.sender, msg.value); + } + + // Outside-visible transact entry point. Executes transaction immediately if below daily spend limit. + // If not, goes into multisig process. We provide a hash on return to allow the sender to provide + // shortcuts for the other confirmations (allowing them to avoid replicating the _to, _value + // and _data arguments). They still get the option of using them if they want, anyways. + function execute(address _to, uint _value, bytes _data) external onlyowner returns (bytes32 o_hash) { + // first, take the opportunity to check that we're under the daily limit. + if ((_data.length == 0 && underLimit(_value)) || m_required == 1) { + // yes - just execute the call. + address created; + if (_to == 0) { + created = create(_value, _data); + } else { + if (!_to.call.value(_value)(_data)) + throw; + } + SingleTransact(msg.sender, _value, _to, _data, created); + } else { + // determine our operation hash. + o_hash = sha3(msg.data, block.number); + // store if it's new + if (m_txs[o_hash].to == 0 && m_txs[o_hash].value == 0 && m_txs[o_hash].data.length == 0) { + m_txs[o_hash].to = _to; + m_txs[o_hash].value = _value; + m_txs[o_hash].data = _data; + } + if (!confirm(o_hash)) { + ConfirmationNeeded(o_hash, msg.sender, _value, _to, _data); + } + } + } + + function create(uint _value, bytes _code) internal returns (address o_addr) { + assembly { + o_addr := create(_value, add(_code, 0x20), mload(_code)) + jumpi(invalidJumpLabel, iszero(extcodesize(o_addr))) + } + } + + // confirm a transaction through just the hash. we use the previous transactions map, m_txs, in order + // to determine the body of the transaction from the hash provided. + function confirm(bytes32 _h) onlymanyowners(_h) returns (bool o_success) { + if (m_txs[_h].to != 0 || m_txs[_h].value != 0 || m_txs[_h].data.length != 0) { + address created; + if (m_txs[_h].to == 0) { + created = create(m_txs[_h].value, m_txs[_h].data); + } else { + if (!m_txs[_h].to.call.value(m_txs[_h].value)(m_txs[_h].data)) + throw; + } + + MultiTransact(msg.sender, _h, m_txs[_h].value, m_txs[_h].to, m_txs[_h].data, created); + delete m_txs[_h]; + return true; + } + } + + // INTERNAL METHODS + + function clearPending() internal { + uint length = m_pendingIndex.length; + for (uint i = 0; i < length; ++i) + delete m_txs[m_pendingIndex[i]]; + super.clearPending(); + } + + // FIELDS + + // pending transactions we have at present. + mapping (bytes32 => Transaction) m_txs; +} diff --git a/js/src/contracts/tokenreg.js b/js/src/contracts/tokenreg.js new file mode 100644 index 000000000..2bbf639bf --- /dev/null +++ b/js/src/contracts/tokenreg.js @@ -0,0 +1,44 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default class TokenReg { + constructor (api, registry) { + this._api = api; + this._registry = registry; + + this.getInstance(); + } + + getContract () { + return this._registry.getContract('tokenreg'); + } + + getInstance () { + return this.getContract().then((contract) => contract.instance); + } + + tokenCount () { + return this.getInstance().then((instance) => { + return instance.tokenCount.call(); + }); + } + + token (index) { + return this.getInstance().then((instance) => { + return instance.token.call({}, [index]); + }); + } +} diff --git a/js/src/contracts/verification.js b/js/src/contracts/verification.js new file mode 100644 index 000000000..8101565db --- /dev/null +++ b/js/src/contracts/verification.js @@ -0,0 +1,88 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import subscribeToEvents from '../util/subscribe-to-events'; + +export const checkIfVerified = (contract, account) => { + return contract.instance.certified.call({}, [account]); +}; + +export const findLastRequested = (contract, account) => { + let subId = null; + let resolved = false; + + return new Promise((resolve, reject) => { + contract + .subscribe('Requested', { + fromBlock: 0, + toBlock: 'pending', + limit: 1, + topics: [account] + }, (err, logs) => { + if (err) { + return reject(err); + } + + resolve(logs[0] || null); + resolved = true; + + if (subId) { + contract.unsubscribe(subId); + } + }) + .then((_subId) => { + subId = _subId; + + if (resolved) { + contract.unsubscribe(subId); + } + }); + }); +}; + +const blockNumber = (api) => { + return new Promise((resolve, reject) => { + api.subscribe('eth_blockNumber', (err, block) => { + if (err) { + return reject(err); + } + resolve(block); + }) + .then((subscription) => { + api.unsubscribe(subscription); + }) + .catch(reject); + }); +}; + +export const awaitPuzzle = (api, contract, account) => { + return blockNumber(api) + .then((block) => { + return new Promise((resolve, reject) => { + const subscription = subscribeToEvents(contract, ['Puzzled'], { + from: block.toNumber(), + filter: (log) => log.params.who.value === account + }); + + subscription.once('error', reject); + subscription.once('log', subscription.unsubscribe); + subscription.once('log', resolve); + subscription.once('timeout', () => { + reject(new Error('Timed out waiting for the puzzle.')); + }); + }); + }); +}; diff --git a/js/src/dapps/chaindeploy.js b/js/src/dapps/chaindeploy.js new file mode 100644 index 000000000..c3dd42008 --- /dev/null +++ b/js/src/dapps/chaindeploy.js @@ -0,0 +1,29 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import ReactDOM from 'react-dom'; +import React from 'react'; + +import Application from './chaindeploy/Application'; + +import '../../assets/fonts/Roboto/font.css'; +import '../../assets/fonts/RobotoMono/font.css'; +import './style.css'; + +ReactDOM.render( + , + document.querySelector('#container') +); diff --git a/js/src/dapps/chaindeploy/Application/application.css b/js/src/dapps/chaindeploy/Application/application.css new file mode 100644 index 000000000..f6db5da29 --- /dev/null +++ b/js/src/dapps/chaindeploy/Application/application.css @@ -0,0 +1,78 @@ +/* Copyright 2015-2017 Parity Technologies (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.body { + font-size: 0.8em; + + .buttons { + position: fixed; + right: 0.5em; + top: 0.5em; + z-index: 100; + + button { + background: rgb(0, 200, 255); + border: 2px solid rgba(0, 200, 255, 0.5); + border-radius: 0.25em; + color: white; + cursor: pointer; + font-size: 1em; + margin: 0 0 0 0.5em; + outline: none; + padding: 0.75em 1.5em; + white-space: nowrap; + + &:disabled { + background: rgb(230, 230, 230); + border: 2px solid rgba(230, 230, 230, 0.5); + cursor: default; + } + + .icon { + fill: white !important; + margin-right: 0.5em; + } + + .text { + display: inline-block; + line-height: 24px; + vertical-align: top; + } + } + } + + .section { + margin: 0 1em 3em 1em; + + h3 { + background: rgba(0, 0, 0, 0.025); + border-radius: 0.25em; + padding: 0.75em 1em; + margin-bottom: 0.5em; + + small { + vertical-align: middle; + } + } + + .list { + display: flex; + flex-direction: row; + flex-wrap: wrap; + } + } +} diff --git a/js/src/dapps/chaindeploy/Application/application.js b/js/src/dapps/chaindeploy/Application/application.js new file mode 100644 index 000000000..9e6fa588f --- /dev/null +++ b/js/src/dapps/chaindeploy/Application/application.js @@ -0,0 +1,178 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { observer } from 'mobx-react'; +import React, { Component } from 'react'; + +import Contract from '../Contract'; +import Dapp from '../Dapp'; +import Store from '../store'; + +import styles from './application.css'; + +@observer +export default class Application extends Component { + store = new Store(); + + render () { + return ( +
    + { this.renderContracts(false) } + { this.renderContracts(true) } + { this.renderApps() } + { this.renderContracts(false, true) } + { this.renderApps(true) } + { this.renderButtons() } +
    + ); + } + + renderButton (text, clickHandler, disabled) { + const onClick = (event) => { + if (!disabled) { + clickHandler(event); + } + }; + + return ( + + ); + } + + renderButtons () { + const { contractBadgereg, contractDappreg, isBadgeDeploying, isContractDeploying, isDappDeploying, haveAllBadges, haveAllContracts, haveAllDapps, registry } = this.store; + const disableRegistry = registry.address || registry.isDeploying; + const disableContracts = !registry.address || isContractDeploying || haveAllContracts; + const disableDapps = !contractDappreg.address || isDappDeploying || haveAllDapps; + const disableBadges = !registry.address || !contractBadgereg.address || isBadgeDeploying || haveAllBadges; + + return ( +
    + { this.renderButton('registry', this.deployRegistry, disableRegistry) } + { this.renderButton('contracts', this.deployContracts, disableContracts) } + { this.renderButton('badges', this.deployBadges, disableBadges) } + { this.renderButton('apps', this.deployApps, disableDapps) } +
    + ); + } + + renderContracts (isBadges, isExternal) { + const { badges, contracts, contractBadgereg, registry } = this.store; + const regaddress = isBadges + ? contractBadgereg.address + : registry.address; + + return ( +
    +

    + { + isExternal + ? 'External ' + : '' + }{ + isBadges + ? 'Badges ' + : 'Contracts ' + }(registry { regaddress || 'unknown' }) +

    +
    + { + isExternal || isBadges + ? null + : ( + + ) + } + { + (isBadges ? badges : contracts) + .filter((contract) => contract.isExternal === isExternal) + .map((contract) => { + return ( + + ); + }) + } +
    +
    + ); + } + + renderApps (isExternal) { + const { apps, contractDappreg, contractGithubhint } = this.store; + const isDisabled = !contractDappreg.isOnChain || !contractGithubhint.isOnChain; + + return ( +
    +

    + { + isExternal + ? 'External ' + : '' + }Applications (registry { + contractDappreg.address + ? contractDappreg.address + : 'unknown' + }) +

    +
    + { + apps + .filter((app) => app.isExternal === isExternal) + .map((app) => { + return ( + + ); + }) + } +
    +
    + ); + } + + deployApps = () => { + return this.store.deployApps(); + } + + deployBadges = () => { + return this.store.deployBadges(); + } + + deployContracts = () => { + return this.store.deployContracts(); + } + + deployRegistry = () => { + return this.store.deployRegistry(); + } +} diff --git a/js/src/dapps/chaindeploy/Application/index.js b/js/src/dapps/chaindeploy/Application/index.js new file mode 100644 index 000000000..3d8d1ca3b --- /dev/null +++ b/js/src/dapps/chaindeploy/Application/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './application'; diff --git a/js/src/dapps/chaindeploy/Contract/contract.js b/js/src/dapps/chaindeploy/Contract/contract.js new file mode 100644 index 000000000..1f0b158d2 --- /dev/null +++ b/js/src/dapps/chaindeploy/Contract/contract.js @@ -0,0 +1,132 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import ListItem, { Header, Row } from '../ListItem'; + +export default class Contract extends Component { + static propTypes = { + contract: PropTypes.object.isRequired, + disabled: PropTypes.bool + } + + render () { + const { contract, disabled } = this.props; + const location = contract.id === 'registry' + ? 'chain' + : 'registry'; + + return ( + +
    + { contract.id } was { + contract.address + ? 'deployed' + : 'not found' + } +
    + + { + contract.address + ? contract.address + : 'no address' + } + + + { + contract.hasLatestCode + ? 'has latest available code' + : 'does not have latest code' + } + + + { + contract.isOnChain + ? `registered on ${location}` + : `not registered on ${location}` + } + + { this.renderBadgeInfo() } +
    + ); + } + + renderBadgeInfo () { + const { contract } = this.props; + + if (!contract.isBadge) { + return null; + } + + return [ + + { + contract.isBadgeRegistered + ? 'found in badgereg' + : 'not found in badgereg' + } + , + + { + contract.badgeImageHash + ? `badge imageHash ${contract.badgeImageHash}` + : 'has not registered a badge imageHash' + } + , + + { + contract.badgeImageMatch + ? 'has latest badge imageHash' + : 'does not have latest badge imageHash' + } + + ]; + } +} diff --git a/js/src/dapps/chaindeploy/Contract/index.js b/js/src/dapps/chaindeploy/Contract/index.js new file mode 100644 index 000000000..74c58e942 --- /dev/null +++ b/js/src/dapps/chaindeploy/Contract/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './contract'; diff --git a/js/src/dapps/chaindeploy/Dapp/dapp.js b/js/src/dapps/chaindeploy/Dapp/dapp.js new file mode 100644 index 000000000..5a997c295 --- /dev/null +++ b/js/src/dapps/chaindeploy/Dapp/dapp.js @@ -0,0 +1,98 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import ListItem, { Header, Row } from '../ListItem'; + +export default class Dapp extends Component { + static propTypes = { + dapp: PropTypes.object.isRequired, + disabled: PropTypes.bool + } + + render () { + const { dapp, disabled } = this.props; + + return ( + +
    + { dapp.name } +
    + + { + dapp.isOnChain + ? 'found in dappreg' + : 'not found in dappreg' + } + + { this.renderHash(dapp, 'image') } + { this.renderHash(dapp, 'manifest') } + { this.renderHash(dapp, 'content') } +
    + ); + } + + renderHash (dapp, type) { + if (!dapp.source[`${type}Hash`]) { + return null; + } + + const isMatch = dapp[`${type}Match`]; + const hash = dapp[`${type}Hash`]; + + return [ + + { + hash + ? `${type}Hash ${hash}` + : `has not registered an ${type}Hash` + } + , + + { + isMatch + ? `has latest ${type}Hash` + : `does not have latest ${type}Hash` + } + + ]; + } +} diff --git a/js/src/dapps/chaindeploy/Dapp/index.js b/js/src/dapps/chaindeploy/Dapp/index.js new file mode 100644 index 000000000..3d3281389 --- /dev/null +++ b/js/src/dapps/chaindeploy/Dapp/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './dapp'; diff --git a/js/src/dapps/chaindeploy/ListItem/Header/header.js b/js/src/dapps/chaindeploy/ListItem/Header/header.js new file mode 100644 index 000000000..e9be01eea --- /dev/null +++ b/js/src/dapps/chaindeploy/ListItem/Header/header.js @@ -0,0 +1,45 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import Icon from '../Icon'; + +import styles from '../listItem.css'; + +export default class Header extends Component { + static propTypes = { + children: PropTypes.node.isRequired, + isBusy: PropTypes.bool, + isOk: PropTypes.bool + } + + render () { + const { children, isBusy, isOk } = this.props; + + return ( +
    + +
    + { children } +
    +
    + ); + } +} diff --git a/js/src/dapps/chaindeploy/ListItem/Header/index.js b/js/src/dapps/chaindeploy/ListItem/Header/index.js new file mode 100644 index 000000000..aef90266f --- /dev/null +++ b/js/src/dapps/chaindeploy/ListItem/Header/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './header'; diff --git a/js/src/dapps/chaindeploy/ListItem/Icon/icon.js b/js/src/dapps/chaindeploy/ListItem/Icon/icon.js new file mode 100644 index 000000000..1f32622e5 --- /dev/null +++ b/js/src/dapps/chaindeploy/ListItem/Icon/icon.js @@ -0,0 +1,53 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import styles from '../listItem.css'; + +export default class Icon extends Component { + static propTypes = { + isBusy: PropTypes.bool, + isOk: PropTypes.bool + } + + render () { + const { isBusy, isOk } = this.props; + + return ( +
    + { + isOk + ? '\u2714' + : ( + isBusy + ? '\u29d6' + : '\u2716' + ) + } +
    + ); + } +} diff --git a/js/src/dapps/chaindeploy/ListItem/Icon/index.js b/js/src/dapps/chaindeploy/ListItem/Icon/index.js new file mode 100644 index 000000000..f43e02c49 --- /dev/null +++ b/js/src/dapps/chaindeploy/ListItem/Icon/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './icon'; diff --git a/js/src/dapps/chaindeploy/ListItem/Row/index.js b/js/src/dapps/chaindeploy/ListItem/Row/index.js new file mode 100644 index 000000000..5f2c62dee --- /dev/null +++ b/js/src/dapps/chaindeploy/ListItem/Row/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './row'; diff --git a/js/src/dapps/chaindeploy/ListItem/Row/row.js b/js/src/dapps/chaindeploy/ListItem/Row/row.js new file mode 100644 index 000000000..0982e0321 --- /dev/null +++ b/js/src/dapps/chaindeploy/ListItem/Row/row.js @@ -0,0 +1,54 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import Icon from '../Icon'; + +import styles from '../listItem.css'; + +export default class Row extends Component { + static propTypes = { + children: PropTypes.node.isRequired, + disabled: PropTypes.bool, + isBusy: PropTypes.bool, + isOk: PropTypes.bool + } + + render () { + const { children, disabled, isBusy, isOk } = this.props; + + return ( +
    + +
    + { children } +
    +
    + ); + } +} diff --git a/js/src/dapps/chaindeploy/ListItem/index.js b/js/src/dapps/chaindeploy/ListItem/index.js new file mode 100644 index 000000000..7c79e3241 --- /dev/null +++ b/js/src/dapps/chaindeploy/ListItem/index.js @@ -0,0 +1,20 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export Header from './Header'; +export Row from './Row'; + +export default from './listItem'; diff --git a/js/src/dapps/chaindeploy/ListItem/listItem.css b/js/src/dapps/chaindeploy/ListItem/listItem.css new file mode 100644 index 000000000..47d6d481d --- /dev/null +++ b/js/src/dapps/chaindeploy/ListItem/listItem.css @@ -0,0 +1,94 @@ +/* Copyright 2015-2017 Parity Technologies (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.listItem { + box-sizing: border-box; + flex: 0 1 33.33%; + max-width: 33.33%; + padding: 0.5em; + position: relative; + + .body { + background: rgba(0, 0, 0, 0.025); + border-radius: 0.25em; + box-sizing: border-box; + display: flex; + flex-direction: column; + flex-wrap: nowrap; + overflow: hidden; + padding: 0.75em; + } + + .status { + background: #f80; + border-radius: 0.25em; + color: white; + font-size: 0.75em; + line-height: 1em; + opacity: 0.9; + padding: 0.5em; + position: absolute; + right: 1em; + top: 1em; + } +} + +.header, +.details { + display: flex; + line-height: 1.5em; + padding: 0.125em 0; + position: relative; + white-space: nowrap; + + .title { + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + vertical-align: top; + } +} + +.details { + margin-left: 2em; +} + +.icon { + border-radius: 0.25em; + display: inline-block; + flex: 0 0 1.5em; + height: 1.5em; + margin-right: 0.5em; + opacity: 0.75; + text-align: center; + vertical-align: middle; + width: 1.5em; + + &.error { + box-shadow: inset 0 0 0 2px rgb(200, 0, 0); + color: rgb(200, 0, 0); + } + + &.ok { + box-shadow: inset 0 0 0 2px rgb(0, 200, 0); + color: rgb(0, 200, 0); + } +} + +.muted { + opacity: 0.25; +} diff --git a/js/src/dapps/chaindeploy/ListItem/listItem.js b/js/src/dapps/chaindeploy/ListItem/listItem.js new file mode 100644 index 000000000..c670123f9 --- /dev/null +++ b/js/src/dapps/chaindeploy/ListItem/listItem.js @@ -0,0 +1,63 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React, { Component, PropTypes } from 'react'; + +import styles from './listItem.css'; + +export default class ListItem extends Component { + static propTypes = { + children: PropTypes.node.isRequired, + disabled: PropTypes.bool, + status: PropTypes.string + } + + render () { + const { children, disabled } = this.props; + + return ( +
    +
    + { children } +
    + { this.renderStatus() } +
    + ); + } + + renderStatus () { + const { status } = this.props; + + if (!status) { + return null; + } + + return ( +
    + { status } +
    + ); + } +} diff --git a/js/src/dapps/chaindeploy/_dapps.js b/js/src/dapps/chaindeploy/_dapps.js new file mode 100644 index 000000000..4a8da242f --- /dev/null +++ b/js/src/dapps/chaindeploy/_dapps.js @@ -0,0 +1,43 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import builtinsJson from '~/views/Dapps/builtin.json'; + +const REGISTER_URLS = { + console: 'https://raw.githubusercontent.com/paritytech/console/3ea0dbfefded359ccdbea37bc4cf350c0aa16948/console.jpeg', + dappreg: 'https://raw.githubusercontent.com/paritytech/dapp-assets/cdd6ac4f1e2f11619bed72a53ae71217dffe19ad/dapps/legos-64x64.png', + githubhint: 'https://raw.githubusercontent.com/paritytech/dapp-assets/b88e983abaa1a6a6345b8d9448c15b117ddb540e/dapps/link-64x64.jpg', + localtx: 'https://raw.githubusercontent.com/paritytech/dapp-assets/cdd6ac4f1e2f11619bed72a53ae71217dffe19ad/dapps/stack-64x64.png', + registry: 'https://raw.githubusercontent.com/paritytech/dapp-assets/b88e983abaa1a6a6345b8d9448c15b117ddb540e/dapps/register-64x64.jpg', + signaturereg: 'https://raw.githubusercontent.com/paritytech/dapp-assets/b88e983abaa1a6a6345b8d9448c15b117ddb540e/dapps/hex-64x64.jpg', + tokendeploy: 'https://raw.githubusercontent.com/paritytech/dapp-assets/b88e983abaa1a6a6345b8d9448c15b117ddb540e/dapps/interlock-64x64.png', + tokenreg: 'https://raw.githubusercontent.com/paritytech/dapp-assets/b88e983abaa1a6a6345b8d9448c15b117ddb540e/dapps/coins-64x64.jpg', + web: 'https://raw.githubusercontent.com/paritytech/dapp-assets/ec6138115d0e1f45258969cd90b3b274e0ff2258/dapps/earth-64x64.jpg' +}; + +const builtins = builtinsJson + .filter((app) => app.id) + .map((app) => { + app.source = { + imageUrl: REGISTER_URLS[app.id] + }; + + return app; + }); + +export { + builtins +}; diff --git a/js/src/dapps/chaindeploy/contracts/abi/jg-voting.json b/js/src/dapps/chaindeploy/contracts/abi/jg-voting.json new file mode 100644 index 000000000..83a07ef7c --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/abi/jg-voting.json @@ -0,0 +1 @@ +[{"constant":true,"inputs":[],"name":"count","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalVotes","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"hasSenderVoted","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_index","type":"uint256"},{"name":"_answer","type":"uint256"}],"name":"newAnswer","outputs":[{"name":"","type":"bool"}],"payable":true,"type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setQuestionFee","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"questionFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"get","outputs":[{"name":"closed","type":"bool"},{"name":"owner","type":"address"},{"name":"question","type":"string"},{"name":"balanceNo","type":"uint256"},{"name":"balanceYes","type":"uint256"},{"name":"balanceMaybe","type":"uint256"},{"name":"votesNo","type":"uint256"},{"name":"votesYes","type":"uint256"},{"name":"votesMaybe","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"drain","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_question","type":"string"}],"name":"newQuestion","outputs":[{"name":"","type":"bool"}],"payable":true,"type":"function"},{"constant":true,"inputs":[],"name":"totalBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"answerFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_index","type":"uint256"}],"name":"closeQuestion","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"_fee","type":"uint256"}],"name":"setAnswerFee","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"index","type":"uint256"},{"indexed":false,"name":"question","type":"string"}],"name":"NewQuestion","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"index","type":"uint256"},{"indexed":true,"name":"answer","type":"uint256"},{"indexed":false,"name":"value","type":"uint256"}],"name":"NewAnswer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"old","type":"address"},{"indexed":true,"name":"current","type":"address"}],"name":"NewOwner","type":"event"}] diff --git a/js/src/dapps/chaindeploy/contracts/badgereg.js b/js/src/dapps/chaindeploy/contracts/badgereg.js new file mode 100644 index 000000000..ccd6b28c1 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/badgereg.js @@ -0,0 +1,30 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import abi from '~/contracts/abi/badgereg'; +import { compiler, source as sourceUrl, output as byteCode } from './code/badgereg'; + +const id = 'badgereg'; +const deployParams = []; + +export { + abi, + byteCode, + compiler, + deployParams, + id, + sourceUrl +}; diff --git a/js/src/dapps/chaindeploy/contracts/code/badgereg.json b/js/src/dapps/chaindeploy/contracts/code/badgereg.json new file mode 100644 index 000000000..e7801722a --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/code/badgereg.json @@ -0,0 +1,5 @@ +{ + "compiler": "v0.4.9+commit.364da425", + "source": "https://github.com/paritytech/contracts/blob/58842b92c00e3c45a84b6d0ac9b842f016dde50a/BadgeReg.sol", + "output": "0x606060405260008054600160a060020a03191633600160a060020a0316179055670de0b6b3a7640000600455341561003357fe5b5b610a6f806100436000396000f300606060405236156100bf5763ffffffff60e060020a60003504166313af403581146100c15780631e7a505f146100df5780632c0f5f591461010a5780635b8066451461014557806369fe0e2d146101675780637958533a1461017c5780638da5cb5b146101a45780639890220b146101d0578063a02b161e146101e2578063ac4ce2c6146101f7578063b72e717d14610218578063c0f6faed1461025b578063dd93890b14610299578063ddbcb5cb146102b4578063ddca3f43146102e6575bfe5b34156100c957fe5b6100dd600160a060020a0360043516610308565b005b6100f6600160a060020a036004351660243561037c565b604080519115158252519081900360200190f35b341561011257fe5b61011d600435610392565b60408051938452600160a060020a039283166020850152911682820152519081900360600190f35b341561014d57fe5b6101556103ef565b60408051918252519081900360200190f35b341561016f57fe5b6100dd6004356103f6565b005b341561018457fe5b61015560043560243561041b565b60408051918252519081900360200190f35b34156101ac57fe5b6101b461045a565b60408051600160a060020a039092168252519081900360200190f35b34156101d857fe5b6100dd610469565b005b34156101ea57fe5b6100dd6004356104bc565b005b34156101ff57fe5b6100dd600435600160a060020a03602435166105ee565b005b341561022057fe5b610234600160a060020a0360043516610721565b604080519384526020840192909252600160a060020a031682820152519081900360600190f35b341561026357fe5b61026e600435610789565b60408051600160a060020a039485168152602081019390935292168183015290519081900360600190f35b34156102a157fe5b6100dd6004356024356044356107dc565b005b6100f6600160a060020a036004358116906024359060443516610899565b604080519115158252519081900360200190f35b34156102ee57fe5b6101556109cc565b60408051918252519081900360200190f35b60005433600160a060020a0390811691161461032357610378565b60008054604051600160a060020a03808516939216917f70aea8d848e8a90fb7661b227dc522eb6395c3dac71b63cb59edd5c9899b236491a360008054600160a060020a031916600160a060020a0383161790555b5b50565b6000610389838333610899565b90505b92915050565b60008181526002602052604081205460038054600019909201929182918291859081106103bb57fe5b906000526020600020906004020160005b5080546002820154600160a060020a03918216955016925090505b509193909250565b6003545b90565b60005433600160a060020a0390811691161461041157610378565b60048190555b5b50565b600060038381548110151561042c57fe5b906000526020600020906004020160005b506000838152600391909101602052604090205490505b92915050565b600054600160a060020a031681565b60005433600160a060020a03908116911614610484576104b8565b604051600160a060020a0333811691309091163180156108fc02916000818181858888f1935050505015156104b857610000565b5b5b565b60005433600160a060020a039081169116146104d757610378565b806003828154811015156104e757fe5b906000526020600020906004020160005b50600101546040517f844e89a9d524dabb877007aa0e9c395e8938fcfee93ece70c2cd0353db79c8e590600090a36001600060038381548110151561053957fe5b906000526020600020906004020160005b5054600160a060020a03168152602081019190915260400160009081208190556003805460029291908490811061057d57fe5b906000526020600020906004020160005b50600101548152602081019190915260400160009081205560038054829081106105b457fe5b906000526020600020906004020160005b508054600160a060020a03199081168255600060018301556002909101805490911690555b5b50565b60008233600160a060020a031660038281548110151561060a57fe5b906000526020600020906004020160005b5060020154600160a060020a0316146106335761071b565b600160a060020a03831660009081526001602052604090205483901561065857610718565b600380548690811061066657fe5b906000526020600020906004020160005b505460038054600160a060020a03909216945085918790811061069657fe5b906000526020600020906004020160005b508054600160a060020a031916600160a060020a039283161790558381166000908152600160209081526040808320839055928716808352918390208890558251918252915187927fa5d871c0e725767cd5aefc99c53aeca35f09dcc268145cbb13b74a7e2f48f196928290030190a25b5b505b50505050565b600160a060020a038116600090815260016020526040812054600380546000199092019291829182918590811061075457fe5b906000526020600020906004020160005b5060018101546002820154909450600160a060020a0316925090505b509193909250565b60006000600060006003858154811015156107a057fe5b906000526020600020906004020160005b50805460018201546002830154600160a060020a03928316975090955016925090505b509193909250565b8233600160a060020a03166003828154811015156107f657fe5b906000526020600020906004020160005b5060020154600160a060020a03161461081f5761071b565b8160038581548110151561082f57fe5b906000526020600020906004020160005b50600085815260039190910160209081526040918290209290925580518481529051859287927f7991c63a749706fd298fc2387764d640be6e714307b6357b1d3c2ce35cba3b52929081900390910190a35b5b50505050565b60006004543410156108aa576109c5565b600160a060020a0384166000908152600160205260409020548490156108cf576109c3565b6000848152600260205260409020548490156108ea576109c0565b60038054600181016108fc83826109d2565b916000526020600020906004020160005b5060408051606081018252600160a060020a03808b1680835260208084018c9052918a169284018390528454600160a060020a03199081168217865560018087018d905560029687018054909216909417905560035460008281529383528484208190558b8452948252918390208490558251918252915160001993909301935088927febbfb6376bef000063e6e33494e4c543a6197091a04eb6a6f55013d85a1c5386929181900390910190a3600192505b5b505b505b9392505050565b60045481565b8154818355818115116109fe576004028160040283600052602060002091820191016109fe9190610a04565b5b505050565b6103f391905b80821115610a3c578054600160a060020a03199081168255600060018301556002820180549091169055600401610a0a565b5090565b905600a165627a7a72305820526fc95faec325cec5dd3e1bb67c165265282c5fc6db21e96197060b823aaa490029" +} diff --git a/js/src/dapps/chaindeploy/contracts/code/dappreg.json b/js/src/dapps/chaindeploy/contracts/code/dappreg.json new file mode 100644 index 000000000..48739a59d --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/code/dappreg.json @@ -0,0 +1,5 @@ +{ + "compiler": "v0.4.9+commit.364da425", + "source": "https://github.com/paritytech/contracts/blob/225bf022ddd967af2b9ea188e8f611489ca5d7fe/DappReg.sol", + "output": "0x606060405260008054600160a060020a03191633600160a060020a0316179055670de0b6b3a7640000600355341561003357fe5b5b6106ee806100436000396000f300606060405236156100a95763ffffffff60e060020a6000350416630257c48c81146100ab57806306661abd146100d357806313af4035146100f55780631a0919dc1461011357806369fe0e2d146101285780638da5cb5b1461013d5780638eaa6ac01461016957806391cd242d1461019d5780639890220b146101b8578063c52bd836146101ca578063ddca3f43146101eb578063e0886f901461020d578063e1fa8e8414610241575bfe5b34156100b357fe5b6100c160043560243561024e565b60408051918252519081900360200190f35b34156100db57fe5b6100c1610272565b60408051918252519081900360200190f35b34156100fd57fe5b610111600160a060020a0360043516610279565b005b341561011b57fe5b6101116004356102ed565b005b341561013057fe5b610111600435610388565b005b341561014557fe5b61014d6103ad565b60408051600160a060020a039092168252519081900360200190f35b341561017157fe5b61017c6004356103bc565b60408051928352600160a060020a0390911660208301528051918290030190f35b34156101a557fe5b6101116004356024356044356103e4565b005b34156101c057fe5b61011161046d565b005b34156101d257fe5b610111600435600160a060020a03602435166104c0565b005b34156101f357fe5b6100c161054e565b60408051918252519081900360200190f35b341561021557fe5b61017c600435610554565b60408051928352600160a060020a0390911660208301528051918290030190f35b6101116004356105ab565b005b60008281526001602090815260408083208484526002019091529020545b92915050565b6002545b90565b60005433600160a060020a0390811691161461029457610000565b60008054604051600160a060020a03808516939216917f70aea8d848e8a90fb7661b227dc522eb6395c3dac71b63cb59edd5c9899b236491a360008054600160a060020a031916600160a060020a0383161790555b5b50565b60008181526001602081905260409091200154819033600160a060020a0390811691161480159061032d575060005433600160a060020a03908116911614155b1561033757610000565b60008281526001602081905260408083208381559091018054600160a060020a03191690555183917fe17fec26316aebe957e188549d659a89f359c49766bcc0ae2fb7ded274ffe14691a25b5b5050565b60005433600160a060020a039081169116146103a357610000565b60038190555b5b50565b600054600160a060020a031681565b6000818152600160208190526040909120805491810154600160a060020a0316905b50915091565b60008381526001602081905260409091200154839033600160a060020a0390811691161461041157610000565b600084815260016020908152604080832086845260020182529182902084905581518481529151859287927f4dcd4fb147bb133a0da8fbf4e5fc3ddd64f04d4b3f6cbee584374b889d28c78d92918290030190a35b5b50505050565b60005433600160a060020a0390811691161461048857610000565b604051600160a060020a0333811691309091163180156108fc02916000818181858888f1935050505015156104bc57610000565b5b5b565b60008281526001602081905260409091200154829033600160a060020a039081169116146104ed57610000565b60008381526001602081905260408083209091018054600160a060020a031916600160a060020a0386169081179091559051909185917fd3d10d874a10020c2bce719499d1fd8756d880b128eb2945dd01b3830854e7169190a35b5b505050565b60035481565b6000600060006001600060028681548110151561056d57fe5b906000526020600020900160005b50548152602081019190915260400160002080546001820154909450600160a060020a0316925090505b50915091565b6003543410156105ba57610000565b6000818152600160205260409020548190156105d557610000565b60028054600181016105e78382610677565b916000526020600020900160005b508390555060408051808201825283815233600160a060020a0390811660208084018281526000888152600192839052868120955186559051949091018054600160a060020a0319169490931693909317909155915184917f7d917fcbc9a29a9705ff9936ffa599500e4fd902e4486bae317414fe967b307c91a35b5b505b50565b815481835581811511610548576000838152602090206105489181019083016106a1565b5b505050565b61027691905b808211156106bb57600081556001016106a7565b5090565b905600a165627a7a7230582011d8a45e381635e9de17e14cc4de97a1e17758cfac1fd25e8a5bc1d5f4d1da9d0029" +} diff --git a/js/src/dapps/chaindeploy/contracts/code/gavcoin.json b/js/src/dapps/chaindeploy/contracts/code/gavcoin.json new file mode 100644 index 000000000..f0ead4a35 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/code/gavcoin.json @@ -0,0 +1,5 @@ +{ + "compiler": "v0.4.9+commit.364da425", + "source": "https://github.com/paritytech/contracts/blob/58842b92c00e3c45a84b6d0ac9b842f016dde50a/GavCoin.sol", + "output": "0x606060405266038d7ea4c680006002556305f5e100600355341561001f57fe5b5b6108008061002f6000396000f300606060405236156100885763ffffffff60e060020a600035041663095ea7b3811461009f57806318160ddd146100d257806323b872dd146100f457806329cbdc861461012d57806355234ec0146101465780635af36e3e1461016857806370a0823114610192578063a035b1fe146101c0578063a9059cbb146101e2578063dd62ed3e14610215575b61009d5b61009a3360ff60020a610249565b5b565b005b34156100a757fe5b6100be600160a060020a0360043516602435610390565b604080519115158252519081900360200190f35b34156100da57fe5b6100e2610416565b60408051918252519081900360200190f35b34156100fc57fe5b6100be600160a060020a036004358116906024351660443561041c565b604080519115158252519081900360200190f35b61009d600160a060020a036004351660243561052a565b005b341561014e57fe5b6100e2610539565b60408051918252519081900360200190f35b341561017057fe5b6100be60043560243561053f565b604080519115158252519081900360200190f35b341561019a57fe5b6100e2600160a060020a03600435166106d0565b60408051918252519081900360200190f35b34156101c857fe5b6100e26106ef565b60408051918252519081900360200190f35b34156101ea57fe5b6100be600160a060020a03600435166024356106f5565b604080519115158252519081900360200190f35b341561021d57fe5b6100e2600160a060020a03600435811690602435166107a3565b60408051918252519081900360200190f35b34600080805b60008411801561026157508460025411155b1561038757600354600254620f424091025b0492508284116102835783610285565b825b9150600254620f4240830281151561029957fe5b33600160a060020a03166000818152600160208181526040808420805497909604968701865560028054855295830190915280832080548701905584548352808320909101805463ffffffff191662093a80420163ffffffff161790558154850182559254925193945084937f689dcb02b6a65e0e2f1d23ef47c1ec86604ffbed0bcb65f20150cfc7d5e5a9489190a4600380548290039081905593829003931515610382576002805466038d7ea4c6800001908190556305f5e1006003556040517f23c3dae768238f239632b5c4acb89485b440e0fa72481c4aad9f9b4f9b5a0a5f90600090a25b61024f565b5b505050505050565b600082600160a060020a031633600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a350600160a060020a0333811660009081526001602081815260408084209487168452600290940190529190208054830190555b92915050565b60005481565b600160a060020a038316600090815260016020526040812054849083908190101561044657610521565b600160a060020a0380871660009081526001602090815260408083203394851684526002019091529020548791908690819010156104835761051c565b87600160a060020a031689600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040518082815260200191505060405180910390a3600160a060020a03808a166000908152600160208181526040808420338616855260028101835281852080548e900390559183905281548c9003909155928b16825291902080548901905595505b5b5050505b50509392505050565b6105348282610249565b5b5050565b60035481565b600160a060020a0333166000908152600160208181526040808420868552909201905281205483908390819010806105a35750600160a060020a03331660009081526001602081815260408084208685528301909152909120015463ffffffff1642105b156105ad576106c8565b33600160a060020a0381166000908152600160205260409020548590819010156105d6576106c4565b60405186908890600160a060020a033316907f73f04af9dcc582a923ec15d3eea990fe34adabfff2879e28d44572e01a54abb690600090a433600160a060020a0316600090815260016020818152604080842080548b9003815584548b0185558b855290920190529020805487900390819055151561068457600160a060020a03331660009081526001602081815260408084208b85528301909152822091825501805463ffffffff191690555b600160a060020a0333166108fc620f4240888a025b604051919004801590920291906000818181858888f1935050505015156106bf57610000565b600194505b5b50505b505092915050565b600160a060020a0381166000908152600160205260409020545b919050565b60025481565b33600160a060020a038116600090815260016020526040812054909190839081901015610721576106c8565b84600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a3600160a060020a03338116600090815260016020526040808220805488900390559187168152208054850190555b5b505092915050565b600160a060020a03808316600090815260016020908152604080832093851683526002909301905220545b929150505600a165627a7a72305820ca533a37c92e41888bda66ae0e66415d21a61c60027b269bca633d85b727875c0029" +} diff --git a/js/src/dapps/chaindeploy/contracts/code/githubhint.json b/js/src/dapps/chaindeploy/contracts/code/githubhint.json new file mode 100644 index 000000000..3470ccef0 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/code/githubhint.json @@ -0,0 +1,5 @@ +{ + "compiler": "v0.4.9+commit.364da425", + "source": "https://github.com/paritytech/contracts/blob/58842b92c00e3c45a84b6d0ac9b842f016dde50a/GithubHint.sol", + "output": "0x6060604052341561000c57fe5b5b6105868061001c6000396000f300606060405263ffffffff60e060020a60003504166302f2008d81146100425780632196ae0d1461009b578063267b6922146101055780637c8c6643146101c9575bfe5b341561004a57fe5b60408051602060046024803582810135601f810185900485028601850190965285855261009995833595939460449493929092019181908401838280828437509496506101de95505050505050565b005b34156100a357fe5b60408051602060046024803582810135601f81018590048502860185019096528585526100999583359593946044949392909201918190840183828082843750949650505092356bffffffffffffffffffffffff191692506102be915050565b005b341561010d57fe5b6101186004356103b1565b604080516bffffffffffffffffffffffff1984166020820152600160a060020a03831691810191909152606080825284546002600019610100600184161502019091160490820181905281906080820190869080156101b85780601f1061018d576101008083540402835291602001916101b8565b820191906000526020600020905b81548152906001019060200180831161019b57829003601f168201915b505094505050505060405180910390f35b34156101d157fe5b6100996004356103de565b005b6000828152602081905260409020600201548290600160a060020a031615801590610227575060008181526020819052604090206002015433600160a060020a03908116911614155b15610231576102b8565b6040805160608101825283815260006020808301829052600160a060020a0333168385015286825281815292902081518051929391926102749284920190610472565b506020820151600182018054606060020a909204600160a060020a031992831617905560409092015160029091018054600160a060020a0392909216919092161790555b5b505050565b6000838152602081905260409020600201548390600160a060020a031615801590610307575060008181526020819052604090206002015433600160a060020a03908116911614155b15610311576103aa565b604080516060810182528481526bffffffffffffffffffffffff198416602080830191909152600160a060020a0333168284015260008781528082529290922081518051929391926103669284920190610472565b506020820151600182018054606060020a909204600160a060020a031992831617905560409092015160029091018054600160a060020a0392909216919092161790555b5b50505050565b600060208190529081526040902060018101546002820154606060020a90910290600160a060020a031683565b6000818152602081905260409020600201548190600160a060020a031615801590610427575060008181526020819052604090206002015433600160a060020a03908116911614155b156104315761046d565b60008281526020819052604081209061044a82826104f1565b50600181018054600160a060020a03199081169091556002909101805490911690555b5b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106104b357805160ff19168380011785556104e0565b828001600101855582156104e0579182015b828111156104e05782518255916020019190600101906104c5565b5b506104ed929150610539565b5090565b50805460018160011615610100020316600290046000825580601f106105175750610535565b601f0160209004906000526020600020908101906105359190610539565b5b50565b61055791905b808211156104ed576000815560010161053f565b5090565b905600a165627a7a72305820a83571409e7b0cc4fe48edd09087f315930ab4e017c62b6d100462285a8f4ae70029" +} diff --git a/js/src/dapps/chaindeploy/contracts/code/jg-voting.json b/js/src/dapps/chaindeploy/contracts/code/jg-voting.json new file mode 100644 index 000000000..08ec4d0ed --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/code/jg-voting.json @@ -0,0 +1,5 @@ +{ + "compiler": "v0.4.9+commit.364da425", + "source": "https://github.com/jacogr/dapp-voting/blob/9b20754b13b9a387704c0955d88b51d2e0e1896d/src/solidity/Voting.sol", + "output": "0x606060405260008054600160a060020a03191633600160a060020a0316178155600281905560038190556004556611c37937e0800060055534156200004057fe5b5b60408051808201909152600781527f48756e6772793f0000000000000000000000000000000000000000000000000060208201526200008e906401000000006200090a6200009682021704565b505b620003af565b60008054819033600160a060020a03908116911614801590620000ba575060055434105b15620000c65762000000565b82600481511080620000d9575060a08151115b15620000e55762000000565b60018054925082810190620000fb908262000244565b50336001838154811015156200010d57fe5b906000526020600020906005020160005b508054600160a060020a03929092166101000261010060a860020a031990921691909117905560018054859190849081106200015657fe5b906000526020600020906005020160005b5060010190805190602001906200018092919062000279565b508133600160a060020a03167f7793f929911ad07e07894a20378f1eccce0fb493486c569d74045731fb583b8e866040518080602001828103825283818151815260200191508051906020019080838360008314620001fc575b805182526020831115620001fc57601f199092019160209182019101620001da565b505050905090810190601f168015620002295780820380516001836020036101000a031916815260200191505b509250505060405180910390a3600192505b5b505b50919050565b8154818355818115116200027357600502816005028360005260206000209182019101620002739190620002ff565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002bc57805160ff1916838001178555620002ec565b82800160010185558215620002ec579182015b82811115620002ec578251825591602001919060010190620002cf565b5b50620002fb9291506200033f565b5090565b6200033c91905b80821115620002fb578054600160a860020a031916815560006200032e600183018262000363565b5060050162000306565b5090565b90565b6200033c91905b80821115620002fb576000815560010162000346565b5090565b90565b50805460018160011615610100020316600290046000825580601f106200038b5750620003ab565b601f016020900490600052602060002090810190620003ab91906200033f565b5b50565b610d2f80620003bf6000396000f300606060405236156100bf5763ffffffff60e060020a60003504166306661abd81146100c15780630d15fd77146100e357806313af40351461010557806331d3164714610123578063476c494c1461014a5780634df6ca2a1461016c5780638a55b54d146101935780638da5cb5b146101b55780639507d39a146101e15780639890220b146102c7578063a3f66b46146102eb578063ad7a672f1461034d578063bd12b4b51461036f578063c09f32e814610391578063f41c1c93146103b8575bfe5b34156100c957fe5b6100d16103df565b60408051918252519081900360200190f35b34156100eb57fe5b6100d16103e6565b60408051918252519081900360200190f35b341561010d57fe5b610121600160a060020a03600435166103ec565b005b341561012b57fe5b61013660043561046d565b604080519115158252519081900360200190f35b6101366004356024356104b8565b604080519115158252519081900360200190f35b341561017457fe5b6101366004356106c3565b604080519115158252519081900360200190f35b341561019b57fe5b6100d16106ee565b60408051918252519081900360200190f35b34156101bd57fe5b6101c56106f4565b60408051600160a060020a039092168252519081900360200190f35b34156101e957fe5b6101f4600435610703565b604051808a15151515815260200189600160a060020a0316600160a060020a0316815260200180602001888152602001878152602001868152602001858152602001848152602001838152602001828103825289818151815260200191508051906020019080838360008314610285575b80518252602083111561028557601f199092019160209182019101610265565b505050905090810190601f1680156102b15780820380516001836020036101000a031916815260200191505b509a505050505050505050505060405180910390f35b34156102cf57fe5b6101366108b2565b604080519115158252519081900360200190f35b610136600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284375094965061090a95505050505050565b604080519115158252519081900360200190f35b341561035557fe5b6100d1610ab5565b60408051918252519081900360200190f35b341561037757fe5b6100d1610abb565b60408051918252519081900360200190f35b341561039957fe5b610136600435610ac1565b604080519115158252519081900360200190f35b34156103c057fe5b610136600435610b63565b604080519115158252519081900360200190f35b6001545b90565b60035481565b60005433600160a060020a0390811691161461040757610000565b60008054604051600160a060020a03808516939216917f70aea8d848e8a90fb7661b227dc522eb6395c3dac71b63cb59edd5c9899b236491a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600060018281548110151561047e57fe5b906000526020600020906005020160005b50600160a060020a0333166000908152600491909101602052604090205460ff1690505b919050565b6000805433600160a060020a039081169116148015906104d9575060045434105b156104e357610000565b600154839081106104f357610000565b8360018181548110151561050357fe5b906000526020600020906005020160005b505460ff1615156001141561052857610000565b8460018181548110151561053857fe5b906000526020600020906005020160005b50600160a060020a0333166000908152600491909101602052604090205460ff1615156001141561057957610000565b84600281111561058857610000565b60038054600190810190915560028054600160a060020a0333163101905580548190899081106105b457fe5b906000526020600020906005020160005b5033600160a060020a031660008181526004929092016020526040909120805460ff191692151592909217909155600180549131918990811061060457fe5b906000526020600020906005020160005b50600088815260029190910160205260409020805490910190556001805481908990811061063f57fe5b906000526020600020906005020160005b506000888152600391909101602090815260409182902080549093019092558051600160a060020a033316318152905188928a927f8b8ed2ef61b90da02f78bd8647287f46833d5b11467db4451e5c4b165485bf46929081900390910190a3600194505b5b505b505b505b505b92915050565b6000805433600160a060020a039081169116146106df57610000565b50600581905560015b5b919050565b60055481565b600054600160a060020a031681565b6000600061070f610b8e565b600060006000600060006000600060018b81548110151561072c57fe5b906000526020600020906005020160005b5090508060000160009054906101000a900460ff1699508060000160019054906101000a9004600160a060020a03169850806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156108065780601f106107db57610100808354040283529160200191610806565b820191906000526020600020905b8154815290600101906020018083116107e957829003601f168201915b505050505097508060020160006000815260200190815260200160002054965080600201600060018152602001908152602001600020549550806002016000600281526020019081526020016000205494508060030160006000815260200190815260200160002054935080600301600060018152602001908152602001600020549250806003016000600281526020019081526020016000205491505b509193959799909294969850565b6000805433600160a060020a039081169116146108ce57610000565b604051600160a060020a0333811691309091163180156108fc02916000818181858888f19350505050151561090257610000565b5060015b5b90565b60008054819033600160a060020a0390811691161480159061092d575060055434105b1561093757610000565b82600481511080610949575060a08151115b1561095357610000565b600180549250828101906109679082610ba0565b503360018381548110151561097857fe5b906000526020600020906005020160005b508054600160a060020a03929092166101000274ffffffffffffffffffffffffffffffffffffffff001990921691909117905560018054859190849081106109cd57fe5b906000526020600020906005020160005b5060010190805190602001906109f5929190610bd2565b508133600160a060020a03167f7793f929911ad07e07894a20378f1eccce0fb493486c569d74045731fb583b8e866040518080602001828103825283818151815260200191508051906020019080838360008314610a6e575b805182526020831115610a6e57601f199092019160209182019101610a4e565b505050905090810190601f168015610a9a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a3600192505b5b505b50919050565b60025481565b60045481565b60008133600160a060020a0316600182815481101515610add57fe5b906000526020600020906005020160005b50546101009004600160a060020a031614801590610b1b575060005433600160a060020a03908116911614155b15610b2557610000565b6001600184815481101515610b3657fe5b906000526020600020906005020160005b50805460ff1916911515919091179055600191505b5b50919050565b6000805433600160a060020a03908116911614610b7f57610000565b50600481905560015b5b919050565b60408051602081019091526000815290565b815481835581811511610bcc57600502816005028360005260206000209182019101610bcc9190610c51565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610c1357805160ff1916838001178555610c40565b82800160010185558215610c40579182015b82811115610c40578251825591602001919060010190610c25565b5b50610c4d929150610c9a565b5090565b6103e391905b80821115610c4d57805474ffffffffffffffffffffffffffffffffffffffffff191681556000610c8a6001830182610cbb565b50600501610c57565b5090565b90565b6103e391905b80821115610c4d5760008155600101610ca0565b5090565b90565b50805460018160011615610100020316600290046000825580601f10610ce15750610469565b601f0160209004906000526020600020908101906104699190610c9a565b5b505600a165627a7a72305820b084dcce4e3d78f8a86c925f6c3f2ed689e3674655482541076a1a22f6cdedad0029" +} diff --git a/js/src/dapps/chaindeploy/contracts/code/registry.json b/js/src/dapps/chaindeploy/contracts/code/registry.json new file mode 100644 index 000000000..809e7bcfb --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/code/registry.json @@ -0,0 +1,5 @@ +{ + "compiler": "v0.4.9+commit.364da425", + "source": "https://github.com/paritytech/contracts/blob/b1e0348144793e4ce6f7d6d2c4c7d0bb4ae9765e/SimpleRegistry.sol", + "output": "0x606060405260008054600160a060020a03191633600160a060020a0316179055670de0b6b3a7640000600355341561003357fe5b5b611b2f806100436000396000f300606060405236156101225763ffffffff60e060020a60003504166306b2ff47811461012457806313af40351461015457806319362a28146101725780633f3935d1146101df578063432ced04146102495780634f39ca59146102685780636795dbcd1461028f57806369fe0e2d1461030257806379ce9fac146103295780638da5cb5b1461035c57806390b97fc11461038857806392698814146103f15780639890220b14610418578063ac4e73f91461043c578063ac72c120146104b1578063c3a3582514610388578063ddca3f4314610541578063deb931a214610563578063df57b74214610592578063e30bd740146105c1578063eadf976014610172578063ef5454d6146106ca578063f25eb5c11461073f578063f6d339e414610751575bfe5b341561012c57fe5b610140600160a060020a03600435166107c7565b604080519115158252519081900360200190f35b341561015c57fe5b610170600160a060020a03600435166107fa565b005b341561017a57fe5b60408051602060046024803582810135601f81018590048502860185019096528585526101409583359593946044949392909201918190840183828082843750949650509335935061086e92505050565b604080519115158252519081900360200190f35b34156101e757fe5b610140600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843750949650610a1495505050505050565b604080519115158252519081900360200190f35b610140600435610b6e565b604080519115158252519081900360200190f35b341561027057fe5b610140600435610c03565b604080519115158252519081900360200190f35b341561029757fe5b60408051602060046024803582810135601f81018590048502860185019096528585526102e69583359593946044949392909201918190840183828082843750949650610cc495505050505050565b60408051600160a060020a039092168252519081900360200190f35b341561030a57fe5b610140600435610d40565b604080519115158252519081900360200190f35b341561033157fe5b610140600435600160a060020a0360243516610d9e565b604080519115158252519081900360200190f35b341561036457fe5b6102e6610e2e565b60408051600160a060020a039092168252519081900360200190f35b341561039057fe5b60408051602060046024803582810135601f81018590048502860185019096528585526103df9583359593946044949392909201918190840183828082843750949650610cc495505050505050565b60408051918252519081900360200190f35b34156103f957fe5b610140600435610eb9565b604080519115158252519081900360200190f35b341561042057fe5b610140610ed9565b604080519115158252519081900360200190f35b341561044457fe5b610140600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284375094965050509235600160a060020a03169250610f6e915050565b604080519115158252519081900360200190f35b34156104b957fe5b6101406004356112ac565b604080519115158252519081900360200190f35b341561039057fe5b60408051602060046024803582810135601f81018590048502860185019096528585526103df9583359593946044949392909201918190840183828082843750949650610cc495505050505050565b60408051918252519081900360200190f35b341561054957fe5b6103df61134c565b60408051918252519081900360200190f35b341561056b57fe5b6102e6600435611352565b60408051600160a060020a039092168252519081900360200190f35b341561059a57fe5b6102e6600435611370565b60408051600160a060020a039092168252519081900360200190f35b34156105c957fe5b6105dd600160a060020a0360043516611392565b604080516020808252835181830152835191928392908301918501908083838215610623575b80518252602083111561062357601f199092019160209182019101610603565b505050905090810190601f16801561064f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561017a57fe5b60408051602060046024803582810135601f81018590048502860185019096528585526101409583359593946044949392909201918190840183828082843750949650509335935061086e92505050565b604080519115158252519081900360200190f35b34156106d257fe5b610140600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284375094965050509235600160a060020a031692506115e8915050565b604080519115158252519081900360200190f35b341561074757fe5b6101706116c6565b005b341561075957fe5b60408051602060046024803582810135601f8101859004850286018501909652858552610140958335959394604494939290920191819084018382808284375094965050509235600160a060020a0316925061185a915050565b604080519115158252519081900360200190f35b600160a060020a03811660009081526002602081905260409091205460001961010060018316150201160415155b919050565b60005433600160a060020a039081169116146108155761086a565b60008054604051600160a060020a03808516939216917f70aea8d848e8a90fb7661b227dc522eb6395c3dac71b63cb59edd5c9899b236491a360008054600160a060020a031916600160a060020a0383161790555b5b50565b600083815260016020526040812054849033600160a060020a0390811691161461089757610a0b565b6000858152600160209081526040918290209151865186936002019288929182918401908083835b602083106108de5780518252601f1990920191602091820191016108bf565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420949094555050855186928291908401908083835b6020831061093c5780518252601f19909201916020918201910161091d565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208183528a51838301528a519096508b95507fb829c3e412537bbe794c048ccb9e4605bb4aaaa8e4d4c15c1a6e0c2adc1716ea948b94508392908301919085019080838382156109cd575b8051825260208311156109cd57601f1990920191602091820191016109ad565b505050905090810190601f1680156109f95780820380516001836020036101000a031916815260200191505b509250505060405180910390a3600191505b5b509392505050565b60008133600160a060020a031660016000836040518082805190602001908083835b60208310610a555780518252601f199092019160209182019101610a36565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086528501959095529290920160002060010154600160a060020a0316939093149250610aab91505057610b67565b600160a060020a03331660009081526002602090815260409091208451610ad492860190611a09565b5033600160a060020a0316836040518082805190602001908083835b60208310610b0f5780518252601f199092019160209182019101610af0565b5181516020939093036101000a60001901801990911692169190911790526040519201829003822093507f098ae8581bb8bd9af1beaf7f2e9f51f31a8e5a8bfada4e303a645d71d9c9192092506000919050a3600191505b5b50919050565b6000818152600160205260408120548290600160a060020a031615610b9257610b67565b600354341015610ba157610b67565b6000838152600160205260408082208054600160a060020a03191633600160a060020a03169081179091559051909185917f4963513eca575aba66fdcd25f267aae85958fe6fb97e75fa25d783f1a091a2219190a3600191505b5b5b50919050565b600081815260016020526040812054829033600160a060020a03908116911614610c2c57610b67565b600083815260016020818152604080842090920154600160a060020a03168352600290528120610c5b91611a88565b60008381526001602081905260408083208054600160a060020a03199081168255920180549092169091555133600160a060020a03169185917fef1961b4d2909dc23643b309bfe5c3e5646842d98c3a58517037ef3871185af39190a3600191505b5b50919050565b600082815260016020908152604080832090518451600290920192859282918401908083835b60208310610d095780518252601f199092019160209182019101610cea565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054925050505b92915050565b6000805433600160a060020a03908116911614610d5c576107f5565b60038290556040805183815290517f6bbc57480a46553fa4d156ce702beef5f3ad66303b0ed1a5d4cb44966c6584c39181900360200190a15060015b5b919050565b600082815260016020526040812054839033600160a060020a03908116911614610dc757610e26565b6000848152600160205260408082208054600160a060020a031916600160a060020a0387811691821790925591519192339091169187917f7b97c62130aa09acbbcbf7482630e756592496f1759eaf702f469cf64dfb779491a4600191505b5b5092915050565b600054600160a060020a031681565b600082815260016020908152604080832090518451600290920192859282918401908083835b60208310610d095780518252601f199092019160209182019101610cea565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054925050505b92915050565b600081815260016020526040902054600160a060020a031615155b919050565b6000805433600160a060020a03908116911614610ef557610f6a565b60408051600160a060020a03301631815290517fdef931299fe61d176f949118058530c1f3f539dcb6950b4e372c9b835c33ca079181900360200190a1604051600160a060020a0333811691309091163180156108fc02916000818181858888f193505050501515610f6657610000565b5060015b5b90565b60006000836040518082805190602001908083835b60208310610fa25780518252601f199092019160209182019101610f83565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912060008181526001909252929020549193505033600160a060020a039081169116149050610ff6576112a3565b846040518082805190602001908083835b602083106110265780518252601f199092019160209182019101611007565b51815160209384036101000a60001901801990921691161790526040805192909401829003909120600081815260019283905293909320015491955050600160a060020a03161580159250905061111257506000828152600160208181526040808420830154600160a060020a031684526002918290529283902092518354869493919283928592908116156101000260001901160480156110ff5780601f106110dd5761010080835404028352918201916110ff565b820191906000526020600020905b8154815290600101906020018083116110eb575b5050915050604051809103902060001916145b156111eb57600082815260016020818152604080842090920154600160a060020a0316835260029052812061114691611a88565b6000828152600160208181526040928390209091015491518751600160a060020a039093169288928291908401908083835b602083106111975780518252601f199092019160209182019101611178565b5181516020939093036101000a60001901801990911692169190911790526040519201829003822093507f12491ad95fd945e444d88a894ffad3c21959880a4dcd8af99d4ae4ffc71d4abd92506000919050a35b6000828152600160208181526040928390209091018054600160a060020a031916600160a060020a0388169081179091559151875188928291908401908083835b6020831061124b5780518252601f19909201916020918201910161122c565b5181516020939093036101000a60001901801990911692169190911790526040519201829003822093507f728435a0031f6a04538fcdd24922a7e06bc7bc945db03e83d22122d1bc5f28df92506000919050a3600192505b5b505092915050565b60008181526001602081905260409091200154600160a060020a031615155b919050565b600082815260016020908152604080832090518451600290920192859282918401908083835b60208310610d095780518252601f199092019160209182019101610cea565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054925050505b92915050565b60035481565b600081815260016020526040902054600160a060020a03165b919050565b60008181526001602081905260409091200154600160a060020a03165b919050565b61139a611ad0565b600160a060020a038216600090815260026020818152604092839020805484516001821615610100026000190190911693909304601f81018390048302840183019094528383529192908301828280156114355780601f1061140a57610100808354040283529160200191611435565b820191906000526020600020905b81548152906001019060200180831161141857829003601f168201915b505050505090505b919050565b600083815260016020526040812054849033600160a060020a0390811691161461089757610a0b565b6000858152600160209081526040918290209151865186936002019288929182918401908083835b602083106108de5780518252601f1990920191602091820191016108bf565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420949094555050855186928291908401908083835b6020831061093c5780518252601f19909201916020918201910161091d565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208183528a51838301528a519096508b95507fb829c3e412537bbe794c048ccb9e4605bb4aaaa8e4d4c15c1a6e0c2adc1716ea948b94508392908301919085019080838382156109cd575b8051825260208311156109cd57601f1990920191602091820191016109ad565b505050905090810190601f1680156109f95780820380516001836020036101000a031916815260200191505b509250505060405180910390a3600191505b5b509392505050565b6000805433600160a060020a0390811691161461160457610d3a565b600160a060020a0382166000908152600260209081526040909120845161162d92860190611a09565b5081600160a060020a0316836040518082805190602001908083835b602083106116685780518252601f199092019160209182019101611649565b5181516020939093036101000a60001901801990911692169190911790526040519201829003822093507f098ae8581bb8bd9af1beaf7f2e9f51f31a8e5a8bfada4e303a645d71d9c9192092506000919050a35060015b5b92915050565b33600160a060020a03166002600033600160a060020a0316600160a060020a0316815260200190815260200160002060405180828054600181600116156101000203166002900480156117505780601f1061172e576101008083540402835291820191611750565b820191906000526020600020905b81548152906001019060200180831161173c575b505060405190819003812092507f12491ad95fd945e444d88a894ffad3c21959880a4dcd8af99d4ae4ffc71d4abd9150600090a3600160006002600033600160a060020a0316600160a060020a0316815260200190815260200160002060405180828054600181600116156101000203166002900480156118085780601f106117e6576101008083540402835291820191611808565b820191906000526020600020905b8154815290600101906020018083116117f4575b50506040805191829003909120845260208085019590955292830160009081206001018054600160a060020a031916905533600160a060020a0316815260029094525050812061185791611a88565b5b565b600083815260016020526040812054849033600160a060020a0390811691161461188357610a0b565b60008581526001602090815260409182902091518651600160a060020a038716936002019288929182918401908083835b602083106108de5780518252601f1990920191602091820191016108bf565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420949094555050855186928291908401908083835b6020831061093c5780518252601f19909201916020918201910161091d565b51815160209384036101000a6000190180199092169116179052604080519290940182900382208183528a51838301528a519096508b95507fb829c3e412537bbe794c048ccb9e4605bb4aaaa8e4d4c15c1a6e0c2adc1716ea948b94508392908301919085019080838382156109cd575b8051825260208311156109cd57601f1990920191602091820191016109ad565b505050905090810190601f1680156109f95780820380516001836020036101000a031916815260200191505b509250505060405180910390a3600191505b5b509392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611a4a57805160ff1916838001178555611a77565b82800160010185558215611a77579182015b82811115611a77578251825591602001919060010190611a5c565b5b50611a84929150611ae2565b5090565b50805460018160011615610100020316600290046000825580601f10611aae575061086a565b601f01602090049060005260206000209081019061086a9190611ae2565b5b50565b60408051602081019091526000815290565b610f6a91905b80821115611a845760008155600101611ae8565b5090565b905600a165627a7a723058202a8f09bd2a20f43dfe4c6adb69bf4bfa211cda23787d972cd6e33eee989cafc50029" +} diff --git a/js/src/dapps/chaindeploy/contracts/code/signaturereg.json b/js/src/dapps/chaindeploy/contracts/code/signaturereg.json new file mode 100644 index 000000000..3dd4fe07d --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/code/signaturereg.json @@ -0,0 +1,5 @@ +{ + "compiler": "v0.4.9+commit.364da425", + "source": "https://github.com/paritytech/contracts/blob/58842b92c00e3c45a84b6d0ac9b842f016dde50a/SignatureReg.sol", + "output": "0x606060405260008054600160a060020a03191633600160a060020a0316178155600255341561002a57fe5b5b60408051808201909152601081527f726567697374657228737472696e67290000000000000000000000000000000060208201526100759064010000000061036661007c82021704565b505b61031c565b60006100f7826040518082805190602001908083835b602083106100b15780518252601f199092019160209182019101610092565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020836100ff640100000000026103d6176401000000009004565b90505b919050565b7fffffffff000000000000000000000000000000000000000000000000000000008216600090815260016020819052604082205484916002908216156101000260001901909116041561015157610274565b7fffffffff000000000000000000000000000000000000000000000000000000008416600090815260016020908152604090912084516101939286019061027c565b5060028054600101905560408051602080825285518183015285517fffffffff00000000000000000000000000000000000000000000000000000000881693600160a060020a033316937f50e01e16719d6c699e516c57f4c514e77f6bc21a978d33f23980acdddbcbd0b293899391928392908301918501908083838215610236575b80518252602083111561023657601f199092019160209182019101610216565b505050905090810190601f1680156102625780820380516001836020036101000a031916815260200191505b509250505060405180910390a3600191505b5b5092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106102bd57805160ff19168380011785556102ea565b828001600101855582156102ea579182015b828111156102ea5782518255916020019190600101906102cf565b5b506102f79291506102fb565b5090565b61031991905b808211156102f75760008155600101610301565b5090565b90565b6105d78061032b6000396000f3006060604052361561005c5763ffffffff60e060020a60003504166313af4035811461005e5780633015a5211461007c5780638da5cb5b1461009e5780639890220b146100ca578063b46bcdaa146100dc578063f2c298be14610179575bfe5b341561006657fe5b61007a600160a060020a03600435166101e3565b005b341561008457fe5b61008c610264565b60408051918252519081900360200190f35b34156100a657fe5b6100ae61026a565b60408051600160a060020a039092168252519081900360200190f35b34156100d257fe5b61007a610279565b005b34156100e457fe5b6100f9600160e060020a0319600435166102cc565b60408051602080825283518183015283519192839290830191850190808383821561013f575b80518252602083111561013f57601f19909201916020918201910161011f565b505050905090810190601f16801561016b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561018157fe5b6101cf600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284375094965061036695505050505050565b604080519115158252519081900360200190f35b60005433600160a060020a039081169116146101fe57610260565b60008054604051600160a060020a03808516939216917f70aea8d848e8a90fb7661b227dc522eb6395c3dac71b63cb59edd5c9899b236491a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b60025481565b600054600160a060020a031681565b60005433600160a060020a03908116911614610294576102c8565b604051600160a060020a0333811691309091163180156108fc02916000818181858888f1935050505015156102c857610000565b5b5b565b60016020818152600092835260409283902080548451600294821615610100026000190190911693909304601f810183900483028401830190945283835291929083018282801561035e5780601f106103335761010080835404028352916020019161035e565b820191906000526020600020905b81548152906001019060200180831161034157829003601f168201915b505050505081565b60006103ce826040518082805190602001908083835b6020831061039b5780518252601f19909201916020918201910161037c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020836103d6565b90505b919050565b600160e060020a03198216600090815260016020819052604082205484916002908216156101000260001901909116041561041057610503565b600160e060020a031984166000908152600160209081526040909120845161043a9286019061050b565b506002805460010190556040805160208082528551818301528551600160e060020a0319881693600160a060020a033316937f50e01e16719d6c699e516c57f4c514e77f6bc21a978d33f23980acdddbcbd0b2938993919283929083019185019080838382156104c5575b8051825260208311156104c557601f1990920191602091820191016104a5565b505050905090810190601f1680156104f15780820380516001836020036101000a031916815260200191505b509250505060405180910390a3600191505b5b5092915050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061054c57805160ff1916838001178555610579565b82800160010185558215610579579182015b8281111561057957825182559160200191906001019061055e565b5b5061058692915061058a565b5090565b6105a891905b808211156105865760008155600101610590565b5090565b905600a165627a7a723058206830357dde798fafa19dd78a4460c047f76cc132713db13442c5da7485fc0ff40029" +} diff --git a/js/src/dapps/chaindeploy/contracts/code/tokendeploy.json b/js/src/dapps/chaindeploy/contracts/code/tokendeploy.json new file mode 100644 index 000000000..7dd0391b1 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/code/tokendeploy.json @@ -0,0 +1,5 @@ +{ + "compiler": "v0.4.9+commit.364da425", + "source": "https://github.com/paritytech/contracts/blob/0ca02d60066202432305c8e9b1cbf33267478ab3/BasicCoin.sol", + "output": "0x606060405260008054600160a060020a03191633600160a060020a0316179055341561002757fe5b5b610f43806100376000396000f3006060604052361561007d5763ffffffff60e060020a600035041663061ea8cc811461007f57806306661abd146100ad57806313af4035146100cf5780635001f3b5146100ed5780638da5cb5b1461010f5780639507d39a1461013b5780639890220b14610179578063acfdfd1c1461018b578063c00ca38314610236575bfe5b341561008757fe5b61009b600160a060020a0360043516610280565b60408051918252519081900360200190f35b34156100b557fe5b61009b61029f565b60408051918252519081900360200190f35b34156100d757fe5b6100eb600160a060020a03600435166102a6565b005b34156100f557fe5b61009b610327565b60408051918252519081900360200190f35b341561011757fe5b61011f61032e565b60408051600160a060020a039092168252519081900360200190f35b341561014357fe5b61014e60043561033d565b60408051600160a060020a039485168152928416602084015292168183015290519081900360600190f35b341561018157fe5b6100eb610392565b005b60408051602060046024803582810135601f8101859004850286018501909652858552610222958335959394604494939290920191819084018382808284375050604080516020601f89358b0180359182018390048302840183019094528083529799988101979196509182019450925082915084018382808284375094965050509235600160a060020a031692506103e5915050565b604080519115158252519081900360200190f35b341561023e57fe5b61014e600160a060020a036004351660243561079b565b60408051600160a060020a039485168152928416602084015292168183015290519081900360600190f35b600160a060020a0381166000908152600260205260409020545b919050565b6001545b90565b60005433600160a060020a039081169116146102c157610000565b60008054604051600160a060020a03808516939216917f70aea8d848e8a90fb7661b227dc522eb6395c3dac71b63cb59edd5c9899b236491a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b620f424081565b600054600160a060020a031681565b600060006000600060018581548110151561035457fe5b906000526020600020906003020160005b50805460018201546002830154600160a060020a039283169750908216955016925090505b509193909250565b60005433600160a060020a039081169116146103ad57610000565b604051600160a060020a0333811691309091163180156108fc02916000818181858888f1935050505015156103e157610000565b5b5b565b60008181808088336103f56107eb565b918252600160a060020a03166020820152604080519182900301906000f080151561041c57fe5b925061042733610280565b915083600160a060020a031663ddca3f436000604051602001526040518163ffffffff1660e060020a028152600401809050602060405180830381600087803b151561046f57fe5b60325a03f1151561047c57fe5b50506040805151600160a060020a03331660009081526002602052919091209092506001840191506104ae90826107fb565b50600154600160a060020a03331660009081526002602052604090208054849081106104d657fe5b906000526020600020900160005b5055600180548082016104f78382610825565b916000526020600020906003020160005b60606040519081016040528087600160a060020a0316815260200133600160a060020a0316815260200188600160a060020a0316815250909190915060008201518160000160006101000a815481600160a060020a030219169083600160a060020a0316021790555060208201518160010160006101000a815481600160a060020a030219169083600160a060020a0316021790555060408201518160020160006101000a815481600160a060020a030219169083600160a060020a0316021790555050505083600160a060020a0316637b1a547c82858b620f42408c336000604051602001526040518763ffffffff1660e060020a0281526004018086600160a060020a0316600160a060020a03168152602001806020018581526020018060200184600160a060020a0316600160a060020a03168152602001838103835287818151815260200191508051906020019080838360008314610686575b80518252602083111561068657601f199092019160209182019101610666565b505050905090810190601f1680156106b25780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838382156106f1575b8051825260208311156106f157601f1990920191602091820191016106d1565b505050905090810190601f16801561071d5780820380516001836020036101000a031916815260200191505b509750505050505050506020604051808303818588803b151561073c57fe5b61235a5a03f1151561074a57fe5b5050604051600160a060020a03808716935087811692503316907f454b0172f64812df0cd504c2bd7df7aab8ff328a54d946b4bd0fa7c527adf9cc90600090a4600194505b50505050949350505050565b600160a060020a03821660009081526002602052604081208054829182916107dd9190869081106107c857fe5b906000526020600020900160005b505461033d565b9250925092505b9250925092565b604051610650806108c883390190565b81548183558181151161081f5760008381526020902061081f918101908301610857565b5b505050565b81548183558181151161081f5760030281600302836000526020600020918201910161081f9190610878565b5b505050565b6102a391905b80821115610871576000815560010161085d565b5090565b90565b6102a391905b8082111561087157805473ffffffffffffffffffffffffffffffffffffffff19908116825560018201805482169055600282018054909116905560030161087e565b5090565b905600606060405260008054600160a060020a03191633600160a060020a0316179055341561002757fe5b6040516040806106508339810160405280516020909101515b600034111561004e57610000565b8180151561005b57610000565b600183905560008054600160a060020a031916600160a060020a038416908117825581526002602052604090208390555b5b505b50505b6105af806100a16000396000f3006060604052361561007d5763ffffffff60e060020a600035041663095ea7b3811461009257806313af4035146100c557806318160ddd146100e357806323b872dd146101055780635001f3b51461013e57806370a08231146101605780638da5cb5b1461018e578063a9059cbb146101ba578063dd62ed3e146101ed575b341561008557fe5b6100905b610000565b565b005b341561009a57fe5b6100b1600160a060020a0360043516602435610221565b604080519115158252519081900360200190f35b34156100cd57fe5b610090600160a060020a03600435166102b6565b005b34156100eb57fe5b6100f3610337565b60408051918252519081900360200190f35b341561010d57fe5b6100b1600160a060020a036004358116906024351660443561033d565b604080519115158252519081900360200190f35b341561014657fe5b6100f361045d565b60408051918252519081900360200190f35b341561016857fe5b6100f3600160a060020a0360043516610464565b60408051918252519081900360200190f35b341561019657fe5b61019e610483565b60408051600160a060020a039092168252519081900360200190f35b34156101c257fe5b6100b1600160a060020a0360043516602435610492565b604080519115158252519081900360200190f35b34156101f557fe5b6100f3600160a060020a0360043581169060243516610552565b60408051918252519081900360200190f35b6000600034111561023157610000565b82600160a060020a031633600160a060020a03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a350600160a060020a0333811660009081526002602090815260408083209386168352600193840190915290208054830190555b5b92915050565b60005433600160a060020a039081169116146102d157610000565b60008054604051600160a060020a03808516939216917f70aea8d848e8a90fb7661b227dc522eb6395c3dac71b63cb59edd5c9899b236491a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b60015481565b6000600034111561034d57610000565b600160a060020a038416600090815260026020526040902054849083908190101561037757610000565b600160a060020a0380871660009081526002602090815260408083203394851684526001019091529020548791908690819010156103b457610000565b87600160a060020a031689600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef896040518082815260200191505060405180910390a3600160a060020a03808a16600090815260026020818152604080842033861685526001808201845282862080548f900390559390925281548c9003909155928b16825291902080548901905595505b5b5050505b50505b9392505050565b620f424081565b600160a060020a0381166000908152600260205260409020545b919050565b600054600160a060020a031681565b600060003411156104a257610000565b33600160a060020a0381166000908152600260205260409020548390819010156104cb57610000565b84600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a3600160a060020a0333811660009081526002602052604080822080548890039055918716815220805485019055600192505b5b50505b92915050565b600160a060020a03808316600090815260026020908152604080832093851683526001909301905220545b929150505600a165627a7a72305820b5bf89a0a85c15df1e9717e49be06fe1a4f9dcc1e0cebf5483dd1c0bcd14a0910029a165627a7a723058207f96b7ad40c02cfaeaf29e65c79456dd3fd9828c9d3fbaf801fb60010456c3880029" +} diff --git a/js/src/dapps/chaindeploy/contracts/code/tokenreg.json b/js/src/dapps/chaindeploy/contracts/code/tokenreg.json new file mode 100644 index 000000000..bcba34127 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/code/tokenreg.json @@ -0,0 +1,5 @@ +{ + "compiler": "v0.4.9+commit.364da425", + "source": "https://github.com/paritytech/contracts/blob/58842b92c00e3c45a84b6d0ac9b842f016dde50a/TokenReg.sol", + "output": "0x606060405260008054600160a060020a03191633600160a060020a0316179055670de0b6b3a7640000600455341561003357fe5b5b611473806100436000396000f300606060405236156100b45763ffffffff60e060020a600035041663044215c681146100b657806313af4035146101df57806366b42dcb146101fd57806369fe0e2d146102ab5780637958533a146102c05780637b1a547c146102e8578063891de9ed146103a15780638da5cb5b146104bc5780639890220b146104e85780639f181b5e146104fa578063a02b161e1461051c578063b72e717d14610531578063dd93890b1461066a578063ddca3f4314610685575bfe5b34156100be57fe5b6100c96004356106a7565b60408051600160a060020a038088168252918101859052908216608082015260a060208083018281528751928401929092528651606084019160c0850191908901908083838215610135575b80518252602083111561013557601f199092019160209182019101610115565b505050905090810190601f1680156101615780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838382156101a0575b8051825260208311156101a057601f199092019160209182019101610180565b505050905090810190601f1680156101cc5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b34156101e757fe5b6101fb600160a060020a036004351661083a565b005b60408051602060046024803582810135601f8101859004850286018501909652858552610297958335600160a060020a0316959394604494939290920191819084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989a8a359a9099940197509195509182019350915081908401838280828437509496506108ae95505050505050565b604080519115158252519081900360200190f35b34156102b357fe5b6101fb6004356108c8565b005b34156102c857fe5b6102d66004356024356108ed565b60408051918252519081900360200190f35b60408051602060046024803582810135601f8101859004850286018501909652858552610297958335600160a060020a0316959394604494939290920191819084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989a8a359a90999401975091955091820193509150819084018382808284375094965050509235600160a060020a0316925061092c915050565b604080519115158252519081900360200190f35b34156103a957fe5b6103f7600480803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843750949650610c6695505050505050565b6040518086815260200185600160a060020a0316600160a060020a031681526020018481526020018060200183600160a060020a0316600160a060020a0316815260200182810382528481815181526020019150805190602001908083836000831461047e575b80518252602083111561047e57601f19909201916020918201910161045e565b505050905090810190601f1680156104aa5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b34156104c457fe5b6104cc610dca565b60408051600160a060020a039092168252519081900360200190f35b34156104f057fe5b6101fb610dd9565b005b341561050257fe5b6102d6610e2c565b60408051918252519081900360200190f35b341561052457fe5b6101fb600435610e33565b005b341561053957fe5b61054d600160a060020a0360043516611047565b60405180868152602001806020018581526020018060200184600160a060020a0316600160a060020a03168152602001838103835287818151815260200191508051906020019080838360008314610135575b80518252602083111561013557601f199092019160209182019101610115565b505050905090810190601f1680156101615780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838382156101a0575b8051825260208311156101a057601f199092019160209182019101610180565b505050905090810190601f1680156101cc5780820380516001836020036101000a031916815260200191505b5097505050505050505060405180910390f35b341561067257fe5b6101fb6004356024356044356111f3565b005b341561068d57fe5b6102d66112b0565b60408051918252519081900360200190f35b60006106b16112b6565b60006106bb6112b6565b600060006003878154811015156106ce57fe5b906000526020600020906006020160005b50805460018083018054604080516020601f600260001997861615610100029790970190941695909504928301859004850281018501909152818152600160a060020a039094169a5093945091929083018282801561077f5780601f106107545761010080835404028352916020019161077f565b820191906000526020600020905b81548152906001019060200180831161076257829003601f168201915b505050600280850154600386018054604080516020601f6000196101006001871615020190941696909604928301869004860281018601909152818152969b50919950935091508301828280156108175780601f106107ec57610100808354040283529160200191610817565b820191906000526020600020905b8154815290600101906020018083116107fa57829003601f168201915b50505050600483015491945050600160a060020a031691505b5091939590929450565b60005433600160a060020a03908116911614610855576108aa565b60008054604051600160a060020a03808516939216917f70aea8d848e8a90fb7661b227dc522eb6395c3dac71b63cb59edd5c9899b236491a360008054600160a060020a031916600160a060020a0383161790555b5b50565b60006108bd858585853361092c565b90505b949350505050565b60005433600160a060020a039081169116146108e3576108aa565b60048190555b5b50565b60006003838154811015156108fe57fe5b906000526020600020906006020160005b506000838152600591909101602052604090205490505b92915050565b600060045434101561093d57610c5d565b600160a060020a03861660009081526001602052604090205486901561096257610c5b565b8551869060031461097257610c59565b866002816040518082805190602001908083835b602083106109a55780518252601f199092019160209182019101610986565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220541591506109df905057610c56565b60038054600181016109f183826112c8565b916000526020600020906006020160005b506040805160a081018252600160a060020a03808e1680835260208084018f90529383018d9052606083018c9052908a1660808301528354600160a060020a0319161783558b51909291610a5d9160018401918e01906112fa565b506040820151600282015560608201518051610a839160038401916020909101906112fa565b506080919091015160049091018054600160a060020a031916600160a060020a03928316179055600354908b1660009081526001602090815260409182902083905590518b519293506002928c928291908401908083835b60208310610afa5780518252601f199092019160209182019101610adb565b51815160001960209485036101000a81019182169119929092161790915293909101958652604051958690038101862096909655506003548d519101948d9493508392508401908083835b60208310610b645780518252601f199092019160209182019101610b45565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f25074d730da65a10e171fe5589d2182313ef00da38d23a9ae3b78923568bdf2d8b896040518083600160a060020a0316600160a060020a0316815260200180602001828103825283818151815260200191508051906020019080838360008314610c17575b805182526020831115610c1757601f199092019160209182019101610bf7565b505050905090810190601f168015610c435780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3600193505b5b505b505b505b95945050505050565b600060006000610c746112b6565b6000600060016002886040518082805190602001908083835b60208310610cac5780518252601f199092019160209182019101610c8d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902054039550600386815481101515610cf257fe5b906000526020600020906006020160005b5080546002808301546003840180546040805160206101006001851615026000190190931695909504601f8101839004830286018301909152808552600160a060020a039095169a50919850939450909291908301828280156108175780601f106107ec57610100808354040283529160200191610817565b820191906000526020600020905b8154815290600101906020018083116107fa57829003601f168201915b50505050600483015491945050600160a060020a031691505b5091939590929450565b600054600160a060020a031681565b60005433600160a060020a03908116911614610df457610e28565b604051600160a060020a0333811691309091163180156108fc02916000818181858888f193505050501515610e2857610000565b5b5b565b6003545b90565b60005433600160a060020a03908116911614610e4e576108aa565b80600382815481101515610e5e57fe5b906000526020600020906006020160005b506001016040518082805460018160011615610100020316600290048015610ece5780601f10610eac576101008083540402835291820191610ece565b820191906000526020600020905b815481529060010190602001808311610eba575b505060405190819003812092507f96e76fa77fea85d8abeb7533fdb8288c214bb1dcf1f867c8f36a95f1f509c1759150600090a360016000600383815481101515610f1557fe5b906000526020600020906006020160005b5054600160a060020a031681526020810191909152604001600090812055600380546002919083908110610f5657fe5b906000526020600020906006020160005b506001016040518082805460018160011615610100020316600290048015610fc65780601f10610fa4576101008083540402835291820191610fc6565b820191906000526020600020905b815481529060010190602001808311610fb2575b50509283525050604051908190036020019020600090556003805482908110610feb57fe5b906000526020600020906006020160005b8154600160a060020a0319168255611018600183016000611379565b60028201600090556003820160006110309190611379565b506004018054600160a060020a03191690555b5b50565b60006110516112b6565b600061105b6112b6565b600160a060020a03851660009081526001602052604081205460038054600019909201965082918790811061108c57fe5b906000526020600020906006020160005b509050806001018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561077f5780601f106107545761010080835404028352916020019161077f565b820191906000526020600020905b81548152906001019060200180831161076257829003601f168201915b505050600280850154600386018054604080516020601f6000196101006001871615020190941696909604928301869004860281018601909152818152969b50919950935091508301828280156108175780601f106107ec57610100808354040283529160200191610817565b820191906000526020600020905b8154815290600101906020018083116107fa57829003601f168201915b50505050600483015491945050600160a060020a031691505b5091939590929450565b8233600160a060020a031660038281548110151561120d57fe5b906000526020600020906006020160005b5060040154600160a060020a031614611236576112a9565b8160038581548110151561124657fe5b906000526020600020906006020160005b50600085815260059190910160209081526040918290209290925580518481529051859287927f7991c63a749706fd298fc2387764d640be6e714307b6357b1d3c2ce35cba3b52929081900390910190a35b5b50505050565b60045481565b60408051602081019091526000815290565b8154818355818115116112f4576006028160060283600052602060002091820191016112f491906113c1565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061133b57805160ff1916838001178555611368565b82800160010185558215611368579182015b8281111561136857825182559160200191906001019061134d565b5b50611375929150611426565b5090565b50805460018160011615610100020316600290046000825580601f1061139f57506108aa565b601f0160209004906000526020600020908101906108aa9190611426565b5b50565b610e3091905b80821115611375578054600160a060020a031916815560006113ec6001830182611379565b60028201600090556003820160006114049190611379565b50600481018054600160a060020a03191690556006016113c7565b5090565b90565b610e3091905b80821115611375576000815560010161142c565b5090565b905600a165627a7a72305820ab1d1a18270ba278cc2f74cd1b7b547cdcd6308a9df1dec1120fa9f6199b1f480029" +} diff --git a/js/src/dapps/chaindeploy/contracts/code/verifyEmail.json b/js/src/dapps/chaindeploy/contracts/code/verifyEmail.json new file mode 100644 index 000000000..a87fb0a22 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/code/verifyEmail.json @@ -0,0 +1,5 @@ +{ + "compiler": "v0.4.9+commit.364da425", + "source": "https://github.com/paritytech/contracts/blob/e5afdacc716ca743ceddf80978d4e6b2b465dbe9/ProofOfEmail.sol", + "output": "0x606060405260008054600160a060020a03191633600160a060020a0316178155600355341561002a57fe5b5b6108a48061003a6000396000f300606060405236156100ca5763ffffffff60e060020a60003504166306b2ff4781146100cc57806313af4035146100fc5780632650b9881461011a5780634b59e8801461018c57806359c87d70146101b05780636795dbcd146101bd57806369fe0e2d1461023057806370c4d5f214610245578063797af627146103255780638da5cb5b1461034c5780639890220b14610378578063ac72c1201461038a578063cc1d4c02146103b1578063ddca3f43146103e1578063df57b74214610403578063e30bd74014610432575bfe5b34156100d457fe5b6100e8600160a060020a03600435166104ce565b604080519115158252519081900360200190f35b341561010457fe5b610118600160a060020a03600435166104d6565b005b341561012257fe5b60408051602060046024803582810135601f810185900485028601850190965285855261017a958335600160a060020a0316959394604494939290920191819084018382808284375094965061055795505050505050565b60408051918252519081900360200190f35b341561019457fe5b610118600160a060020a0360043516602435604435610577565b005b6101186004356105eb565b005b34156101c557fe5b60408051602060046024803582810135601f8101859004850286018501909652858552610214958335959394604494939290920191819084018382808284375094965061063595505050505050565b60408051600160a060020a039092168252519081900360200190f35b341561023857fe5b610118600435610654565b005b341561024d57fe5b60408051602060046024803582810135601f81018590048502860185019096528585526102a5958335600160a060020a0316959394604494939290920191819084018382808284375094965061067995505050505050565b6040805160208082528351818301528351919283929083019185019080838382156102eb575b8051825260208311156102eb57601f1990920191602091820191016102cb565b505050905090810190601f1680156103175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561032d57fe5b6100e8600435610688565b604080519115158252519081900360200190f35b341561035457fe5b610214610791565b60408051600160a060020a039092168252519081900360200190f35b341561038057fe5b6101186107a0565b005b341561039257fe5b6100e86004356107f3565b604080519115158252519081900360200190f35b34156103b957fe5b6100e8600160a060020a0360043516610813565b604080519115158252519081900360200190f35b34156103e957fe5b61017a610834565b60408051918252519081900360200190f35b341561040b57fe5b61021460043561083a565b60408051600160a060020a039092168252519081900360200190f35b341561043a57fe5b6102a5600160a060020a0360043516610858565b6040805160208082528351818301528351919283929083019185019080838382156102eb575b8051825260208311156102eb57601f1990920191602091820191016102cb565b505050905090810190601f1680156103175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60005b919050565b60005433600160a060020a039081169116146104f157610553565b60008054604051600160a060020a03808516939216917f70aea8d848e8a90fb7661b227dc522eb6395c3dac71b63cb59edd5c9899b236491a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600160a060020a0382166000908152600260205260409020545b92915050565b60005433600160a060020a03908116911614610592576105e5565b600082815260046020908152604091829020839055815184815291518392600160a060020a038716927f76babef7e9f1065118be3f9d7094016a1cc06dd12811501c7712deb22144f37b92918290030190a35b5b505050565b6003543410156105fa57610553565b6040518190600160a060020a033316907f070669e6be82aa9b077a096b0f9617893a4dc5cb05897e27fd7a6112c8e6629e90600090a35b5b50565b600082815260016020526040902054600160a060020a03165b92915050565b60005433600160a060020a0390811691161461066f57610553565b60038190555b5b50565b610571610866565b5b92915050565b6040805182815281516020918190038201902060009081526004909152908120548015156106b55761078b565b6040805184815281516020918190038201902060009081526004825282812081905583815260019091522054600160a060020a031615158061070e5750600160a060020a03331660009081526002602052604090205415155b156107185761078b565b6000818152600160209081526040808320805473ffffffffffffffffffffffffffffffffffffffff191633600160a060020a031690811790915580845260029092528083208490555190917fd415b905d4dd806bfba99a7a0e6351bd0c9db3a9912add21c0e6bef4479f673f91a2600191505b50919050565b600054600160a060020a031681565b60005433600160a060020a039081169116146107bb576107ef565b604051600160a060020a0333811691309091163180156108fc02916000818181858888f1935050505015156107ef57610000565b5b5b565b600081815260016020526040902054600160a060020a031615155b919050565b600160a060020a03811660009081526002602052604090205415155b919050565b60035481565b600081815260016020526040902054600160a060020a03165b919050565b6104d1610866565b5b919050565b604080516020810190915260008152905600a165627a7a7230582081d03388dd06c78ee4098c4f1e23cd3c25e38d249d5da59962c6b28ec6e20ea70029" +} diff --git a/js/src/dapps/chaindeploy/contracts/code/verifySms.json b/js/src/dapps/chaindeploy/contracts/code/verifySms.json new file mode 100644 index 000000000..0cfc43f9d --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/code/verifySms.json @@ -0,0 +1,5 @@ +{ + "compiler": "v0.4.9+commit.364da425", + "source": "https://github.com/paritytech/contracts/blob/58842b92c00e3c45a84b6d0ac9b842f016dde50a/SMSVerification.sol", + "output": "0x606060405260008054600160a060020a033316600160a060020a03199182168117909255600280549091169091179055666a94d74f430000600455341561004257fe5b5b6109a0806100526000396000f300606060405236156100ca5763ffffffff60e060020a60003504166313af403581146100cc57806314253887146100ea578063338cdca1146101085780633da5c3ce146101125780635283f3391461013357806369fe0e2d146101af57806374a8f103146101c4578063797af627146101e25780638da5cb5b146102095780639890220b14610235578063c89e436114610247578063ca4cbf6714610273578063ca5eb5e1146102e5578063cc1d4c0214610303578063ddca3f4314610333578063fc2525ab14610273575bfe5b34156100d457fe5b6100e8600160a060020a03600435166103c7565b005b34156100f257fe5b6100e8600160a060020a0360043516610448565b005b6100e86104b4565b005b341561011a57fe5b6100e8600160a060020a0360043516602435610521565b005b341561013b57fe5b60408051602060046024803582810135601f8101859004850286018501909652858552610193958335600160a060020a0316959394604494939290920191819084018382808284375094965061059295505050505050565b60408051600160a060020a039092168252519081900360200190f35b34156101b757fe5b6100e8600435610623565b005b34156101cc57fe5b6100e8600160a060020a0360043516610648565b005b34156101ea57fe5b6101f56004356106d9565b604080519115158252519081900360200190f35b341561021157fe5b610193610771565b60408051600160a060020a039092168252519081900360200190f35b341561023d57fe5b6100e8610780565b005b341561024f57fe5b6101936107d3565b60408051600160a060020a039092168252519081900360200190f35b341561027b57fe5b60408051602060046024803582810135601f81018590048502860185019096528585526102d3958335600160a060020a0316959394604494939290920191819084018382808284375094965061059295505050505050565b60408051918252519081900360200190f35b34156102ed57fe5b6100e8600160a060020a0360043516610873565b005b341561030b57fe5b6101f5600160a060020a03600435166108bb565b604080519115158252519081900360200190f35b341561033b57fe5b6102d36108dd565b60408051918252519081900360200190f35b341561027b57fe5b60408051602060046024803582810135601f81018590048502860185019096528585526102d3958335600160a060020a0316959394604494939290920191819084018382808284375094965061059295505050505050565b60408051918252519081900360200190f35b60005433600160a060020a039081169116146103e257610444565b60008054604051600160a060020a03808516939216917f70aea8d848e8a90fb7661b227dc522eb6395c3dac71b63cb59edd5c9899b236491a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b60025433600160a060020a0390811691161461046357610444565b600160a060020a0381166000818152600160208190526040808320805460ff1916909217909155517fd415b905d4dd806bfba99a7a0e6351bd0c9db3a9912add21c0e6bef4479f673f9190a25b5b50565b6004543410156104c35761051e565b600160a060020a03331660009081526001602052604090205460ff16156104e95761051e565b604051600160a060020a033316907f039f711c9c18dd815b225b1424855e6118e746c6b5d688907f10c4dd29ebe92a90600090a25b5b565b60025433600160a060020a0390811691161461053c5761058d565b600160a060020a038216600081815260036020908152604091829020849055815184815291517fa9a343b39eac85ffb326e93ecd46785b814e72dc9f2b33bb0b4a315ba2859f439281900390910190a25b5b5050565b60006001600084600160a060020a0316600160a060020a03168152602001908152602001600020600101826040518082805190602001908083835b602083106105ec5780518252601f1990920191602091820191016105cd565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054925050505b92915050565b60005433600160a060020a0390811691161461063e57610444565b60048190555b5b50565b60025433600160a060020a0390811691161461066357610444565b600160a060020a038116600090815260016020526040902054819060ff16151561068c5761058d565b600160a060020a038216600081815260016020526040808220805460ff19169055517fb6fa8b8bd5eab60f292eca876e3ef90722275b785309d84b1de113ce0b8c4e749190a25b5b505b50565b6040805182815281516020918190038201902033600160a060020a031660009081526003909252918120549091146107105761076c565b600160a060020a0333166000818152600360209081526040808320839055600191829052808320805460ff1916909217909155517fd415b905d4dd806bfba99a7a0e6351bd0c9db3a9912add21c0e6bef4479f673f9190a25060015b919050565b600054600160a060020a031681565b60005433600160a060020a0390811691161461079b5761051e565b604051600160a060020a0333811691309091163180156108fc02916000818181858888f19350505050151561051e57610000565b5b5b565b600254600160a060020a031681565b60006001600084600160a060020a0316600160a060020a03168152602001908152602001600020600101826040518082805190602001908083835b602083106105ec5780518252601f1990920191602091820191016105cd565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054925050505b92915050565b60005433600160a060020a0390811691161461088e57610444565b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b5b50565b600160a060020a03811660009081526001602052604090205460ff165b919050565b60045481565b60006001600084600160a060020a0316600160a060020a03168152602001908152602001600020600101826040518082805190602001908083835b602083106105ec5780518252601f1990920191602091820191016105cd565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054925050505b929150505600a165627a7a72305820f6beb9c0ae3b45609ad6fc26c1b74600cbaa5f0088ca07be3e9c392a12b2c6150029" +} diff --git a/js/src/dapps/chaindeploy/contracts/dappreg.js b/js/src/dapps/chaindeploy/contracts/dappreg.js new file mode 100644 index 000000000..71379bf8b --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/dappreg.js @@ -0,0 +1,30 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import abi from '~/contracts/abi/dappreg'; +import { compiler, source as sourceUrl, output as byteCode } from './code/dappreg'; + +const id = 'dappreg'; // 7bbc4f1a27628781b96213e781a1b8eec6982c1db8fac739af6e4c5a55862c03 +const deployParams = []; + +export { + abi, + byteCode, + compiler, + deployParams, + id, + sourceUrl +}; diff --git a/js/src/dapps/chaindeploy/contracts/gavcoin.js b/js/src/dapps/chaindeploy/contracts/gavcoin.js new file mode 100644 index 000000000..f7518ef53 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/gavcoin.js @@ -0,0 +1,32 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import abi from '~/contracts/abi/gavcoin'; +import { compiler, source as sourceUrl, output as byteCode } from './code/gavcoin'; + +const isExternal = true; +const id = 'gavcoin'; +const deployParams = []; + +export { + abi, + byteCode, + compiler, + deployParams, + id, + isExternal, + sourceUrl +}; diff --git a/js/src/dapps/chaindeploy/contracts/githubhint.js b/js/src/dapps/chaindeploy/contracts/githubhint.js new file mode 100644 index 000000000..5198e38b5 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/githubhint.js @@ -0,0 +1,30 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import abi from '~/contracts/abi/githubhint'; +import { compiler, source as sourceUrl, output as byteCode } from './code/githubhint'; + +const id = 'githubhint'; +const deployParams = []; + +export { + abi, + byteCode, + compiler, + deployParams, + id, + sourceUrl +}; diff --git a/js/src/dapps/chaindeploy/contracts/index.js b/js/src/dapps/chaindeploy/contracts/index.js new file mode 100644 index 000000000..5e066f758 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/index.js @@ -0,0 +1,52 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import * as badgereg from './badgereg'; +import * as dappreg from './dappreg'; +import * as gavcoin from './gavcoin'; +import * as githubhint from './githubhint'; +import * as jgvoting from './jg-voting'; +import * as registry from './registry'; +import * as signaturereg from './signaturereg'; +import * as tokendeployMgr from './tokendeployMgr'; +import * as tokendeployReg from './tokendeployReg'; +import * as tokenreg from './tokenreg'; +import * as verifyEmail from './verifyEmail'; +import * as verifySms from './verifySms'; +import * as wallet from './wallet'; + +const contracts = [ + // builtin + githubhint, + badgereg, + dappreg, + signaturereg, + tokenreg, + tokendeployReg, + tokendeployMgr, + verifyEmail, + verifySms, + wallet, + + // external + gavcoin, + jgvoting +]; + +export { + contracts, + registry +}; diff --git a/js/src/dapps/chaindeploy/contracts/jg-voting.js b/js/src/dapps/chaindeploy/contracts/jg-voting.js new file mode 100644 index 000000000..8ffbed3c5 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/jg-voting.js @@ -0,0 +1,32 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import abi from './abi/jg-voting'; +import { compiler, source as sourceUrl, output as byteCode } from './code/jg-voting'; + +const isExternal = true; +const id = 'jg-voting'; +const deployParams = []; + +export { + abi, + byteCode, + compiler, + deployParams, + id, + isExternal, + sourceUrl +}; diff --git a/js/src/dapps/chaindeploy/contracts/registry.js b/js/src/dapps/chaindeploy/contracts/registry.js new file mode 100644 index 000000000..1b44f4245 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/registry.js @@ -0,0 +1,30 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import abi from '~/contracts/abi/registry2'; +import { compiler, source as sourceUrl, output as byteCode } from './code/registry'; + +const id = 'registry'; +const deployParams = []; + +export { + abi, + byteCode, + compiler, + deployParams, + id, + sourceUrl +}; diff --git a/js/src/dapps/chaindeploy/contracts/signaturereg.js b/js/src/dapps/chaindeploy/contracts/signaturereg.js new file mode 100644 index 000000000..6d9f9bf60 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/signaturereg.js @@ -0,0 +1,30 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import abi from '~/contracts/abi/signaturereg'; +import { compiler, source as sourceUrl, output as byteCode } from './code/signaturereg'; + +const id = 'signaturereg'; +const deployParams = []; + +export { + abi, + byteCode, + compiler, + deployParams, + id, + sourceUrl +}; diff --git a/js/src/dapps/chaindeploy/contracts/tokendeployMgr.js b/js/src/dapps/chaindeploy/contracts/tokendeployMgr.js new file mode 100644 index 000000000..d07435fdd --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/tokendeployMgr.js @@ -0,0 +1,30 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import abi from '~/contracts/abi/basiccoinmanager'; +import { compiler, source as sourceUrl, output as byteCode } from './code/tokendeploy'; + +const id = 'basiccoinmgr'; +const deployParams = []; + +export { + abi, + byteCode, + compiler, + deployParams, + id, + sourceUrl +}; diff --git a/js/src/dapps/chaindeploy/contracts/tokendeployReg.js b/js/src/dapps/chaindeploy/contracts/tokendeployReg.js new file mode 100644 index 000000000..1db07e91a --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/tokendeployReg.js @@ -0,0 +1,28 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { abi, sourceUrl, deployParams, compiler, byteCode } from './tokenreg'; + +const id = 'basiccoinreg'; + +export { + abi, + byteCode, + compiler, + deployParams, + id, + sourceUrl +}; diff --git a/js/src/dapps/chaindeploy/contracts/tokenreg.js b/js/src/dapps/chaindeploy/contracts/tokenreg.js new file mode 100644 index 000000000..11ee29fa1 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/tokenreg.js @@ -0,0 +1,30 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import abi from '~/contracts/abi/tokenreg'; +import { compiler, source as sourceUrl, output as byteCode } from './code/tokenreg'; + +const id = 'tokenreg'; +const deployParams = []; + +export { + abi, + byteCode, + compiler, + deployParams, + id, + sourceUrl +}; diff --git a/js/src/dapps/chaindeploy/contracts/verifyEmail.js b/js/src/dapps/chaindeploy/contracts/verifyEmail.js new file mode 100644 index 000000000..0176d5949 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/verifyEmail.js @@ -0,0 +1,37 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import abi from '~/contracts/abi/email-verification'; +import { compiler, source as sourceUrl, output as byteCode } from './code/verifyEmail'; + +const isBadge = true; +const id = 'emailverification'; +const deployParams = []; +const badgeSource = { + imageUrl: 'https://raw.githubusercontent.com/paritytech/dapp-assets/c4721a87cb95375da91f8699438d8d7907b3f5e9/certifications/email-verification.svg', + imageHash: '0x5617a14da2a0c210939da6eafb734e60906f64a504c3e107812668860a752dc6' +}; + +export { + abi, + badgeSource, + byteCode, + compiler, + deployParams, + id, + isBadge, + sourceUrl +}; diff --git a/js/src/dapps/chaindeploy/contracts/verifySms.js b/js/src/dapps/chaindeploy/contracts/verifySms.js new file mode 100644 index 000000000..d7ea50902 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/verifySms.js @@ -0,0 +1,37 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import abi from '~/contracts/abi/sms-verification'; +import { compiler, source as sourceUrl, output as byteCode } from './code/verifySms'; + +const isBadge = true; +const id = 'smsverification'; +const deployParams = []; +const badgeSource = { + imageUrl: 'https://raw.githubusercontent.com/paritytech/dapp-assets/1b1beb57ab1f4d3a93a12711b233b5cded791a2f/certifications/sms-verification.svg', + imageHash: '0x49fa653c35c0a9ce128579883babd673ad4cfc94bf9f1cfe96a2bbc30a7552c6' +}; + +export { + abi, + badgeSource, + byteCode, + compiler, + deployParams, + id, + isBadge, + sourceUrl +}; diff --git a/js/src/dapps/chaindeploy/contracts/wallet.js b/js/src/dapps/chaindeploy/contracts/wallet.js new file mode 100644 index 000000000..6639cba80 --- /dev/null +++ b/js/src/dapps/chaindeploy/contracts/wallet.js @@ -0,0 +1,29 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { walletCompiler as compiler, walletLibrary as byteCode, walletLibraryABI as abiJson, walletLibraryRegKey as id, walletSource as sourceUrl } from '~/contracts/code/wallet'; + +const abi = JSON.parse(abiJson); +const deployParams = []; + +export { + abi, + byteCode, + compiler, + deployParams, + id, + sourceUrl +}; diff --git a/js/src/dapps/chaindeploy/dapps/console.js b/js/src/dapps/chaindeploy/dapps/console.js new file mode 100644 index 000000000..4e599b2fa --- /dev/null +++ b/js/src/dapps/chaindeploy/dapps/console.js @@ -0,0 +1,33 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import builtins from '~/views/Dapps/builtin.json'; + +const id = 'console'; +const app = builtins.find((app) => app.url === id); +const hashId = app.id; +const source = { + imageUrl: 'https://raw.githubusercontent.com/paritytech/console/3ea0dbfefded359ccdbea37bc4cf350c0aa16948/console.jpeg', + imageHash: '0xc3962e2eab7afaeb9cd11522381723afbafdc41dc7ba31bee472e187c4459e81' +}; +const name = app.name; + +export { + hashId, + id, + name, + source +}; diff --git a/js/src/dapps/chaindeploy/dapps/dappreg.js b/js/src/dapps/chaindeploy/dapps/dappreg.js new file mode 100644 index 000000000..fec35ef76 --- /dev/null +++ b/js/src/dapps/chaindeploy/dapps/dappreg.js @@ -0,0 +1,33 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import builtins from '~/views/Dapps/builtin.json'; + +const id = 'dappreg'; +const app = builtins.find((app) => app.url === id); +const hashId = app.id; +const source = { + imageUrl: 'https://raw.githubusercontent.com/paritytech/dapp-assets/cdd6ac4f1e2f11619bed72a53ae71217dffe19ad/dapps/legos-64x64.png', + imageHash: '0xa8feea35c761cc6c2fe862fe336419f11ca5421f578757720a899b89fc1df154' +}; +const name = app.name; + +export { + hashId, + id, + name, + source +}; diff --git a/js/src/dapps/chaindeploy/dapps/gavcoin.js b/js/src/dapps/chaindeploy/dapps/gavcoin.js new file mode 100644 index 000000000..148c6fb8e --- /dev/null +++ b/js/src/dapps/chaindeploy/dapps/gavcoin.js @@ -0,0 +1,41 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { api } from '../parity'; + +const isExternal = true; +const id = 'gavcoin'; +const hashId = api.util.sha3(id); +const source = { + imageUrl: 'https://raw.githubusercontent.com/paritytech/dapp-assets/9e135f76fe9ba61e2d8ccbd72ed144c26c450780/tokens/gavcoin-64x64.png', + imageHash: '0xd40679a3a234d8421c678d64f4df3308859e8ad07ac95ce4a228aceb96955287', + manifestUrl: 'https://raw.githubusercontent.com/gavofyork/gavcoin/eb2f8dc4d3ad4dd5f4562690525b7cfedc9681ba/manifest.json', + manifestHash: '0xd582c572fbef8015837f2c1a8798f2c3149a1d9d655b4020edb1bbece725371d', + contentUrl: { + repo: 'gavofyork/gavcoin', + commit: '0xeb2f8dc4d3ad4dd5f4562690525b7cfedc9681ba' + }, + contentHash: '0x0b6c7b3fc8dad3edb39fd1465904ce9a11938ef18f08f8115f275047ba249530' +}; +const name = 'GavCoin'; + +export { + hashId, + id, + isExternal, + name, + source +}; diff --git a/js/src/dapps/chaindeploy/dapps/githubhint.js b/js/src/dapps/chaindeploy/dapps/githubhint.js new file mode 100644 index 000000000..49fb4be9c --- /dev/null +++ b/js/src/dapps/chaindeploy/dapps/githubhint.js @@ -0,0 +1,33 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import builtins from '~/views/Dapps/builtin.json'; + +const id = 'githubhint'; +const app = builtins.find((app) => app.url === id); +const hashId = app.id; +const source = { + imageUrl: 'https://raw.githubusercontent.com/paritytech/dapp-assets/b88e983abaa1a6a6345b8d9448c15b117ddb540e/dapps/link-64x64.jpg', + imageHash: '0x6568901e711886e2c61eef1bbc7e2d8d37a27b9eb3e9e270eda8548f2ec796e8' +}; +const name = app.name; + +export { + hashId, + id, + name, + source +}; diff --git a/js/src/dapps/chaindeploy/dapps/index.js b/js/src/dapps/chaindeploy/dapps/index.js new file mode 100644 index 000000000..e95bf5648 --- /dev/null +++ b/js/src/dapps/chaindeploy/dapps/index.js @@ -0,0 +1,50 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import * as consolejs from './console'; +import * as dappreg from './dappreg'; +import * as gavcoin from './gavcoin'; +import * as githubhint from './githubhint'; +import * as jgvoting from './jg-voting'; +import * as jgwhenblock from './jg-whenblock'; +import * as localtx from './localtx'; +import * as registry from './registry'; +import * as signaturereg from './signaturereg'; +import * as tokendeploy from './tokendeploy'; +import * as tokenreg from './tokenreg'; +import * as web from './web'; + +const apps = [ + // builtin + consolejs, + dappreg, + githubhint, + localtx, + registry, + signaturereg, + tokendeploy, + tokenreg, + web, + + // external + gavcoin, + jgvoting, + jgwhenblock +]; + +export { + apps +}; diff --git a/js/src/dapps/chaindeploy/dapps/jg-voting.js b/js/src/dapps/chaindeploy/dapps/jg-voting.js new file mode 100644 index 000000000..899e95894 --- /dev/null +++ b/js/src/dapps/chaindeploy/dapps/jg-voting.js @@ -0,0 +1,41 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { api } from '../parity'; + +const isExternal = true; +const id = 'jg-voting'; +const hashId = api.util.sha3(id); +const source = { + imageUrl: 'https://raw.githubusercontent.com/jacogr/dapp-voting/038ff4074544f2babc7aed9c4ac3dc070b85b804/assets/images/vote.jpg', + imageHash: '0x3620828e1a745d2714e9f37dc2d47cdab5ef9982190a845b5e7665b7a7767661', + manifestUrl: 'https://raw.githubusercontent.com/jacogr/dapp-voting/682f0fe4b86508a1a2487de6c7c61f7b100ba5b2/manifest.json', + manifestHash: '0x9b83e01f87d225e7bfdd305c51319504ff9b4cf8d517ca4b64f606762e72f59e', + contentUrl: { + repo: 'jacogr/dapp-voting', + commit: '0x7d941597e862a600a60b9d6ecd3a6f606d96cd7b' + }, + contentHash: '0x9fcc0910f6a8c4e45715d41aea2d287da31bf1d7321003fc66df6a012ce2d753' +}; +const name = 'Yes, No, Maybe'; + +export { + hashId, + id, + isExternal, + name, + source +}; diff --git a/js/src/dapps/chaindeploy/dapps/jg-whenblock.js b/js/src/dapps/chaindeploy/dapps/jg-whenblock.js new file mode 100644 index 000000000..0005ca454 --- /dev/null +++ b/js/src/dapps/chaindeploy/dapps/jg-whenblock.js @@ -0,0 +1,39 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const isExternal = true; +const id = 'whenarewethere'; +const hashId = '0xfef3bfded03695e38a9ff476a0999e1fa421e72d1fb3b55a87d6c2bdb6fc18ef'; +const source = { + imageUrl: 'https://raw.githubusercontent.com/jacogr/dapp-when-are-we-there/167aa4d904c5aa6246d0d6d6f41c4ed8a56889cd/assets/images/clock.jpg', + imageHash: '0x2534b44f685b6399bf63f86679128216c43e9a58be1dfb58533923f0bcffeba7', + manifestUrl: 'https://raw.githubusercontent.com/jacogr/dapp-when-are-we-there/bf72dc3033711a3ab41bec3c1249638f70bae768/manifest.json', + manifestHash: '0xfe26f6a19ea9393d69bc5d8c73c5072ccf126f51c10c135b42d6bf162d774fd9', + contentUrl: { + repo: 'jacogr/dapp-when-are-we-there', + commit: '0xbf72dc3033711a3ab41bec3c1249638f70bae768' + }, + contentHash: '0x3505cbbef5c2243eedba07d340d4abccfaa3cfb799f51827e33c9721a5254d13' +}; +const name = 'When are we there'; + +export { + hashId, + id, + isExternal, + name, + source +}; diff --git a/js/src/dapps/chaindeploy/dapps/localtx.js b/js/src/dapps/chaindeploy/dapps/localtx.js new file mode 100644 index 000000000..6fc275a13 --- /dev/null +++ b/js/src/dapps/chaindeploy/dapps/localtx.js @@ -0,0 +1,33 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import builtins from '~/views/Dapps/builtin.json'; + +const id = 'localtx'; +const app = builtins.find((app) => app.url === id); +const hashId = app.id; +const source = { + imageUrl: 'https://raw.githubusercontent.com/paritytech/dapp-assets/cdd6ac4f1e2f11619bed72a53ae71217dffe19ad/dapps/stack-64x64.png', + imageHash: '0x22b924801e1971659a51956dcdfc5a2d592d8bdd03780dd72d5bc4c84b595b4c' +}; +const name = app.name; + +export { + hashId, + id, + name, + source +}; diff --git a/js/src/dapps/chaindeploy/dapps/registry.js b/js/src/dapps/chaindeploy/dapps/registry.js new file mode 100644 index 000000000..49ff4757b --- /dev/null +++ b/js/src/dapps/chaindeploy/dapps/registry.js @@ -0,0 +1,33 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import builtins from '~/views/Dapps/builtin.json'; + +const id = 'registry'; +const app = builtins.find((app) => app.url === id); +const hashId = app.id; +const source = { + imageUrl: 'https://raw.githubusercontent.com/paritytech/dapp-assets/b88e983abaa1a6a6345b8d9448c15b117ddb540e/dapps/register-64x64.jpg', + imageHash: '0xf7100024052cd78b5e043287c05392b5db0bfce5caedd6d39555d40283ef0a1c' +}; +const name = app.name; + +export { + hashId, + id, + name, + source +}; diff --git a/js/src/dapps/chaindeploy/dapps/signaturereg.js b/js/src/dapps/chaindeploy/dapps/signaturereg.js new file mode 100644 index 000000000..12efcff36 --- /dev/null +++ b/js/src/dapps/chaindeploy/dapps/signaturereg.js @@ -0,0 +1,33 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import builtins from '~/views/Dapps/builtin.json'; + +const id = 'signaturereg'; +const app = builtins.find((app) => app.url === id); +const hashId = app.id; +const source = { + imageUrl: 'https://raw.githubusercontent.com/paritytech/dapp-assets/b88e983abaa1a6a6345b8d9448c15b117ddb540e/dapps/hex-64x64.jpg', + imageHash: '0x26f7f2415cd5cbbffa58e8119fdbdd7181cac79119dd7f6ba6ee99d7f4445640' +}; +const name = app.name; + +export { + hashId, + id, + name, + source +}; diff --git a/js/src/dapps/chaindeploy/dapps/tokendeploy.js b/js/src/dapps/chaindeploy/dapps/tokendeploy.js new file mode 100644 index 000000000..43ea8f22b --- /dev/null +++ b/js/src/dapps/chaindeploy/dapps/tokendeploy.js @@ -0,0 +1,33 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import builtins from '~/views/Dapps/builtin.json'; + +const id = 'tokendeploy'; +const app = builtins.find((app) => app.url === id); +const hashId = app.id; +const source = { + imageUrl: 'https://raw.githubusercontent.com/paritytech/dapp-assets/b88e983abaa1a6a6345b8d9448c15b117ddb540e/dapps/interlock-64x64.png', + imageHash: '0xde104baf02aec783e0bffc624514ee267dbcb455382375e3ffa715790c1c939f' +}; +const name = app.name; + +export { + hashId, + id, + name, + source +}; diff --git a/js/src/dapps/chaindeploy/dapps/tokenreg.js b/js/src/dapps/chaindeploy/dapps/tokenreg.js new file mode 100644 index 000000000..784febba0 --- /dev/null +++ b/js/src/dapps/chaindeploy/dapps/tokenreg.js @@ -0,0 +1,33 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import builtins from '~/views/Dapps/builtin.json'; + +const id = 'tokenreg'; +const app = builtins.find((app) => app.url === id); +const hashId = app.id; +const source = { + imageUrl: 'https://raw.githubusercontent.com/paritytech/dapp-assets/b88e983abaa1a6a6345b8d9448c15b117ddb540e/dapps/coins-64x64.jpg', + imageHash: '0xe23d429d15de98c7878d92bc90b79c7afabe1b04c2ad5e3e2c89adc8f439edc9' +}; +const name = app.name; + +export { + hashId, + id, + name, + source +}; diff --git a/js/src/dapps/chaindeploy/dapps/web.js b/js/src/dapps/chaindeploy/dapps/web.js new file mode 100644 index 000000000..0726e2bf7 --- /dev/null +++ b/js/src/dapps/chaindeploy/dapps/web.js @@ -0,0 +1,33 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import builtins from '~/views/Dapps/builtin.json'; + +const id = 'web'; +const app = builtins.find((app) => app.url === id); +const hashId = app.id; +const source = { + imageUrl: 'https://raw.githubusercontent.com/paritytech/dapp-assets/ec6138115d0e1f45258969cd90b3b274e0ff2258/dapps/earth-64x64.jpg', + imageHash: '0x0b9b62a9262f75461191d4e8bf686c56528cbc0fe885c1f5878052ca8b2f65bf' +}; +const name = app.name; + +export { + hashId, + id, + name, + source +}; diff --git a/js/src/dapps/chaindeploy/parity.js b/js/src/dapps/chaindeploy/parity.js new file mode 100644 index 000000000..1dea0d696 --- /dev/null +++ b/js/src/dapps/chaindeploy/parity.js @@ -0,0 +1,21 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const api = window.parity.api; + +export { + api +}; diff --git a/js/src/dapps/chaindeploy/store.js b/js/src/dapps/chaindeploy/store.js new file mode 100644 index 000000000..07b693135 --- /dev/null +++ b/js/src/dapps/chaindeploy/store.js @@ -0,0 +1,714 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { action, computed, observable } from 'mobx'; + +import { contracts as contractsInfo, registry as registryInfo } from './contracts'; +import { apps } from './dapps'; +import { api } from './parity'; +import { executeContract, isValidNumber, validateCode } from './utils'; + +export default class ContractsStore { + @observable apps = null; + @observable badges = null; + @observable contracts = null; + @observable error = null; + @observable registry = null; + + constructor () { + this.apps = apps; + this.badges = contractsInfo.filter((contract) => contract.isBadge); + this.contracts = contractsInfo.filter((contract) => !contract.isBadge); + this.registry = registryInfo; + + api.subscribe('eth_blockNumber', this.onNewBlockNumber); + } + + @computed get contractBadgereg () { + return this.contracts.find((contract) => contract.id === 'badgereg'); + } + + @computed get contractDappreg () { + return this.contracts.find((contract) => contract.id === 'dappreg'); + } + + @computed get contractGithubhint () { + return this.contracts.find((contract) => contract.id === 'githubhint'); + } + + @computed get contractTokenreg () { + return this.contracts.find((contract) => contract.id === 'tokenreg'); + } + + @computed get isBadgeDeploying () { + return this.badges + .filter((contract) => contract.isDeploying) + .length !== 0; + } + + @computed get isContractDeploying () { + return this.contracts + .filter((contract) => contract.isDeploying) + .length !== 0; + } + + @computed get isDappDeploying () { + return this.apps + .filter((app) => app.isDeploying) + .length !== 0; + } + + @computed get haveAllBadges () { + return this.badges + .filter((contract) => !contract.instance || !contract.hasLatestCode || !contract.badgeImageHash || !contract.badgeImageMatch || !contract.isBadgeRegistered) + .length === 0; + } + + @computed get haveAllContracts () { + return this.contracts + .filter((contract) => !contract.instance || !contract.hasLatestCode) + .length === 0; + } + + @computed get haveAllDapps () { + return this.apps + .filter((app) => { + return !app.isOnChain || + !app.imageHash || !app.imageMatch || + (app.source.contentHash && !app.contentMatch) || + (app.source.manifestHash && !app.manifestMatch); + }) + .length === 0; + } + + @action refreshApps = () => { + this.apps = [].concat(this.apps.peek()); + } + + @action refreshContracts = () => { + this.badges = [].concat(this.badges.peek()); + this.contracts = [].concat(this.contracts.peek()); + } + + @action setError = (error) => { + console.error(error); + + this.error = error.message + ? error.message + : error; + } + + @action setRegistryAddress = (address, isOnChain = false) => { + if (this.registry.address !== address || !this.registry.instance) { + console.log(`registry found at ${address}`); + + this.registry = Object.assign({}, this.registry, { + address, + instance: api.newContract(this.registry.abi, address).instance, + isOnChain + }); + } + } + + @action setRegistryCode (byteCode) { + this.registry.hasLatestCode = validateCode(this.registry.byteCode, byteCode); + } + + @action setRegistryDeploying = (isDeploying = false) => { + this.registry = Object.assign({}, this.registry, { + isDeploying, + status: isDeploying + ? 'Deploying contract' + : null + }); + } + + @action setBadgeId = (badge, badgeId) => { + badge.badgeId = badgeId; + badge.isBadgeRegistered = true; + + this.refreshContracts(); + } + + @action setBadgeImageHash = (badge, imageHash) => { + badge.badgeImageHash = imageHash; + badge.badgeImageMatch = badge.badgeSource.imageHash === imageHash; + + this.refreshContracts(); + } + + @action setContractAddress = (contract, address, isOnChain = false) => { + if (contract.address !== address || !contract.instance || contract.isOnChain !== isOnChain) { + console.log(`${contract.id} found at ${address}`); + + contract.address = address; + contract.instance = api.newContract(contract.abi, address).instance; + contract.isOnChain = isOnChain; + + this.refreshContracts(); + } + } + + @action setContractCode (contract, byteCode) { + contract.hasLatestCode = validateCode(contract.byteCode, byteCode); + + this.refreshContracts(); + } + + @action setContractDeploying = (contract, isDeploying = false) => { + contract.isDeploying = isDeploying; + contract.status = isDeploying + ? 'Deploying contract' + : null; + + this.refreshContracts(); + } + + @action setContractStatus = (contract, status) => { + contract.status = status; + + this.refreshContracts(); + } + + @action setAppDeploying = (app, isDeploying = false) => { + app.isDeploying = isDeploying; + app.status = isDeploying + ? 'Registering app' + : null; + + this.refreshApps(); + } + + @action setAppFound = (app, isOnChain = false) => { + if (app.isOnChain !== isOnChain) { + console.log(`${app.name} found on dappreg`); + + app.isOnChain = isOnChain; + + this.refreshApps(); + } + } + + @action setAppContentHash = (app, contentHash) => { + if (app.contentHash !== contentHash) { + console.log(`${app.name} has contentHash ${contentHash}`); + + app.contentHash = contentHash; + app.contentMatch = contentHash === app.source.contentHash; + + this.refreshApps(); + } + } + + @action setAppImageHash = (app, imageHash) => { + if (app.imageHash !== imageHash) { + console.log(`${app.name} has imageHash ${imageHash}`); + + app.imageHash = imageHash; + app.imageMatch = imageHash === app.source.imageHash; + + this.refreshApps(); + } + } + + @action setAppManifestHash = (app, manifestHash) => { + if (app.manifestHash !== manifestHash) { + console.log(`${app.name} has manifestHash ${manifestHash}`); + + app.manifestHash = manifestHash; + app.manifestMatch = manifestHash === app.source.manifestHash; + + this.refreshApps(); + } + } + + @action setAppStatus = (app, status) => { + console.log(app.id, status); + + app.status = status; + + this.refreshApps(); + } + + deployApp = (app) => { + console.log(`Registering application ${app.id}`); + + this.setAppDeploying(app, true); + + const options = {}; + const values = [app.hashId]; + + return api.parity + .defaultAccount() + .then((defaultAccount) => { + options.from = defaultAccount; + + if (app.isOnChain) { + return true; + } + + return this.contractDappreg.instance + .fee.call({}, []) + .then((fee) => { + options.value = fee; + + return executeContract(app.id, this.contractDappreg, 'register', options, values); + }); + }) + .then(() => { + if (app.imageHash && app.imageMatch) { + return true; + } + + this.setAppStatus(app, 'Registering image url'); + + return this + .registerHash(app.source.imageHash, app.source.imageUrl, options.from) + .then(() => this.setAppMeta(app, 'IMG', app.source.imageHash, options.from)); + }) + .then(() => { + if (!app.source.manifestHash || app.manifestMatch) { + return true; + } + + this.setAppStatus(app, 'Registering manifest url'); + + return this + .registerHash(app.source.manifestHash, app.source.manifestUrl, options.from) + .then(() => this.setAppMeta(app, 'MANIFEST', app.source.manifestHash, options.from)); + }) + .then(() => { + if (!app.source.contentHash || app.contentMatch) { + return true; + } + + this.setAppStatus(app, 'Registering content url'); + + return this + .registerRepo(app.source.contentHash, app.source.contentUrl, options.from) + .then(() => this.setAppMeta(app, 'CONTENT', app.source.contentHash, options.from)); + }) + .catch(() => { + return null; + }) + .then(() => { + this.setAppDeploying(app, false); + }); + } + + deployApps = () => { + this.apps + .filter((app) => { + return !app.isDeploying && + ( + !app.isOnChain || + (!app.imageHash || !app.imageMatch) || + (app.source.contentHash && !app.contentMatch) || + (app.source.manifestHash && !app.manifestMatch) + ); + }) + .forEach(this.deployApp); + } + + _deployContract = (contract) => { + console.log(`Deploying contract ${contract.id}`); + + const options = { + data: contract.byteCode + }; + + return api.parity + .defaultAccount() + .then((defaultAccount) => { + options.from = defaultAccount; + + return api + .newContract(contract.abi) + .deploy(options, contract.deployParams, (error, data) => { + if (error) { + console.error(contract.id, error); + } else { + console.log(contract.id, data); + } + }) + .then((contractAddress) => { + return [contractAddress, defaultAccount]; + }); + }); + } + + deployContract = (contract) => { + if (contract.hasLatestCode) { + return Promise.resolve(false); + } + + let defaultAccount = '0x0'; + + this.setContractDeploying(contract, true); + + return this + ._deployContract(contract) + .then(([address, _defaultAccount]) => { + const isOnChain = contract.isOnChain; + + defaultAccount = _defaultAccount; + + this.setContractAddress(contract, address); + + return isOnChain + ? true + : this.reserveAddress(contract, defaultAccount); + }) + .then(() => { + return this.registerAddress(contract, defaultAccount); + }) + .catch(() => { + return null; + }) + .then(() => { + this.setContractDeploying(contract, false); + }); + } + + deployBadge = (badge) => { + let defaultAccount; + + return this + .deployContract(badge) + .then(() => { + this.setContractDeploying(badge, true); + + return api.parity.defaultAccount(); + }) + .then((_defaultAccount) => { + defaultAccount = _defaultAccount; + + if (badge.isBadgeRegistered) { + return true; + } + + this.setContractStatus(badge, 'Registering with badgereg'); + + return this.registerBadge(badge, defaultAccount); + }) + .then(() => { + if (badge.badgeImageMatch) { + return true; + } + + this.setContractStatus(badge, 'Registering image url'); + + return this + .registerHash(badge.badgeSource.imageHash, badge.badgeSource.imageUrl, defaultAccount) + .then(() => this.registerBadgeImage(badge, badge.badgeSource.imageHash, defaultAccount)); + }) + .then(() => { + this.setContractDeploying(badge, false); + }); + } + + deployContracts = () => { + this.contracts + .filter((contract) => !contract.isDeploying && (!contract.instance || !contract.hasLatestCode)) + .forEach(this.deployContract); + } + + deployBadges = () => { + this.badges + .filter((contract) => !contract.isDeploying && (!contract.instance || !contract.hasLatestCode || !contract.badgeImageHash || !contract.badgeImageMatch || !contract.isBadgeRegistered)) + .forEach(this.deployBadge); + } + + deployRegistry = () => { + this.setRegistryDeploying(true); + + return this + ._deployContract(this.registry) + .then(([address]) => { + this.setRegistryDeploying(false); + this.setRegistryAddress(address); + }); + } + + registerBadge = (badge, fromAddress) => { + const options = { + from: fromAddress + }; + const values = [badge.address, api.util.sha3.text(badge.id.toLowerCase())]; + + return this.contractBadgereg.instance + .fee.call({}, []) + .then((fee) => { + options.value = fee; + + return executeContract(badge.id, this.contractBadgereg, 'register', options, values); + }); + } + + registerBadgeImage = (badge, hash, fromAddress) => { + const options = { + from: fromAddress + }; + const values = [badge.badgeId, 'IMG', hash]; + + this.setContractStatus(badge, 'Setting meta IMG'); + + return executeContract(badge.id, this.contractBadgereg, 'setMeta', options, values); + } + + setAppMeta = (app, key, meta, fromAddress) => { + const options = { + from: fromAddress + }; + const values = [app.hashId, key, meta]; + + this.setAppStatus(app, `Setting meta ${key}`); + + return executeContract(app.id, this.contractDappreg, 'setMeta', options, values); + } + + reserveAddress = (contract, fromAddress) => { + const options = { from: fromAddress }; + const values = [api.util.sha3.text(contract.id.toLowerCase())]; + + this.setContractStatus(contract, 'Reserving name'); + + return this.registry.instance + .fee.call({}, []) + .then((value) => { + options.value = value; + + return executeContract(contract.id, this.registry, 'reserve', options, values); + }); + } + + registerAddress = (contract, fromAddress) => { + const options = { from: fromAddress }; + const values = [api.util.sha3.text(contract.id.toLowerCase()), 'A', contract.address]; + + this.setContractStatus(contract, 'Setting lookup address'); + + return executeContract(contract.id, this.registry, 'setAddress', options, values); + } + + registerRepo = (hash, content, fromAddress) => { + const options = { + from: fromAddress + }; + const values = [hash, content.repo || content, content.commit || 0]; + + return this.contractGithubhint.instance + .entries.call({}, [hash]) + .then(([imageUrl, commit, owner]) => { + if (isValidNumber(owner)) { + return true; + } + + return executeContract(hash, this.contractGithubhint, 'hint', options, values); + }) + .catch(() => false); + } + + registerHash = (hash, url, fromAddress) => { + const options = { + from: fromAddress + }; + const values = [hash, url]; + + return this.contractGithubhint.instance + .entries.call({}, [hash]) + .then(([imageUrl, commit, owner]) => { + if (isValidNumber(owner)) { + return true; + } + + return executeContract(hash, this.contractGithubhint, 'hintURL', options, values); + }) + .catch(() => false); + } + + findRegistry = () => { + if (this.registry.address && this.registry.hasLatestCode) { + return Promise.resolve(this.registry); + } + + return api.parity + .registryAddress() + .then((address) => { + if (isValidNumber(address)) { + this.setRegistryAddress(address, true); + } + + return api.eth.getCode(address); + }) + .then((byteCode) => { + this.setRegistryCode(byteCode); + }); + } + + findApps = () => { + if (!this.contractDappreg.instance) { + return Promise.resolve(false); + } + + return Promise + .all( + this.apps.map((app) => { + return app.isOnChain + ? Promise.resolve([[0]]) + : this.contractDappreg.instance.get.call({}, [app.hashId]); + }) + ) + .then((apps) => { + apps.forEach(([_id, owner], index) => { + const id = api.util.bytesToHex(_id); + + if (isValidNumber(id)) { + this.setAppFound(this.apps[index], true); + } + }); + + return Promise.all( + this.apps.map((app) => { + return !app.isOnChain || (app.imageHash && app.imageMatch) + ? Promise.resolve([[0], [0], [0]]) + : Promise.all([ + this.contractDappreg.instance.meta.call({}, [app.hashId, 'CONTENT']), + this.contractDappreg.instance.meta.call({}, [app.hashId, 'IMG']), + this.contractDappreg.instance.meta.call({}, [app.hashId, 'MANIFEST']) + ]); + }) + ); + }) + .then((hashes) => { + hashes.forEach(([content, image, manifest], index) => { + const contentHash = api.util.bytesToHex(content); + const imageHash = api.util.bytesToHex(image); + const manifestHash = api.util.bytesToHex(manifest); + + if (isValidNumber(contentHash)) { + this.setAppContentHash(this.apps[index], contentHash); + } + + if (isValidNumber(imageHash)) { + this.setAppImageHash(this.apps[index], imageHash); + } + + if (isValidNumber(manifestHash)) { + this.setAppManifestHash(this.apps[index], manifestHash); + } + }); + }); + } + + findBadges = () => { + if (!this.contractBadgereg.instance) { + return Promise.resolve(false); + } + + return this + .findContracts(this.badges) + .then(() => { + return Promise.all( + this.badges.map((badge) => { + return badge.isBadgeRegistered + ? Promise.resolve([0, 0, 0]) + : this.contractBadgereg.instance.fromAddress.call({}, [badge.address]); + }) + ); + }) + .then((badgeInfos) => { + badgeInfos.forEach(([id, name, owner], index) => { + if (isValidNumber(owner)) { + this.setBadgeId(this.badges[index], id); + } + }); + + return Promise + .all( + this.badges.map((badge) => { + return !badge.isBadgeRegistered + ? Promise.resolve([0]) + : this.contractBadgereg.instance.meta.call({}, [badge.badgeId, 'IMG']); + }) + ); + }) + .then((images) => { + images.forEach((imageBytes, index) => { + const imageHash = api.util.bytesToHex(imageBytes); + + if (isValidNumber(imageHash)) { + this.setBadgeImageHash(this.badges[index], imageHash); + } + }); + }); + } + + findContracts = (contracts = this.contracts) => { + if (!this.registry.instance) { + return Promise.resolve(false); + } + + return Promise + .all( + contracts.map((contract) => { + const hashId = api.util.sha3.text(contract.id.toLowerCase()); + + return contract.isOnChain + ? Promise.resolve([0, 0]) + : Promise.all([ + this.registry.instance.getAddress.call({}, [hashId, 'A']), + this.registry.instance.getOwner.call({}, [hashId]) + ]); + }) + ) + .then((addresses) => { + addresses.forEach(([address, owner], index) => { + if (isValidNumber(owner) && isValidNumber(address)) { + this.setContractAddress(contracts[index], address, true); + } + }); + + return Promise.all( + contracts.map((contract) => { + return !contract.address || contract.hasLatestCode + ? Promise.resolve(null) + : api.eth.getCode(contract.address); + }) + ); + }) + .then((codes) => { + codes.forEach((byteCode, index) => { + if (byteCode) { + this.setContractCode(contracts[index], byteCode); + } + }); + }); + } + + onNewBlockNumber = (error, blockNumber) => { + if (error) { + return; + } + + return this + .findRegistry() + .then(this.findContracts) + .then(this.findApps) + .then(this.findBadges) + .catch(this.setError); + } +} diff --git a/js/src/dapps/chaindeploy/utils.js b/js/src/dapps/chaindeploy/utils.js new file mode 100644 index 000000000..87e7279e3 --- /dev/null +++ b/js/src/dapps/chaindeploy/utils.js @@ -0,0 +1,82 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import BigNumber from 'bignumber.js'; + +import { api } from './parity'; + +export function validateCode (source, retrieved) { + const original = source.substr(12); + const bytecode = retrieved.substr(12); + + const knownHash = api.util.sha3(original.slice(-1 * bytecode.length)); + const codeHash = api.util.sha3(bytecode); + + return knownHash === codeHash; +} + +export function isValidNumber (number) { + return number && !(new BigNumber(number)).isZero(); +} + +export function executeContract (logId, contract, funcName, options, values) { + const func = contract.instance[funcName]; + + return func + .estimateGas(options, values) + .then((gasEst) => { + options.gas = gasEst.mul(1.2); + + return trackRequest( + func.postTransaction(options, values), + (error, data) => { + if (error) { + console.error(logId, error); + } else { + console.log(logId, data); + } + } + ); + }); +} + +export function trackRequest (promise, callback) { + return promise + .then((requestId) => { + callback(null, { state: 'checkRequest', requestId }); + + return api.pollMethod('parity_checkRequest', requestId); + }) + .then((txHash) => { + callback(null, { state: 'getTransactionReceipt', txHash }); + + return api.pollMethod('eth_getTransactionReceipt', txHash, (receipt) => { + if (!receipt || !receipt.blockNumber || receipt.blockNumber.eq(0)) { + return false; + } + + return true; + }); + }) + .then((receipt) => { + callback(null, { state: 'hasReceipt', receipt }); + }) + .catch((error) => { + callback(error); + + throw error; + }); +} diff --git a/js/src/dapps/console.js b/js/src/dapps/console.js new file mode 100644 index 000000000..44b6dcb9c --- /dev/null +++ b/js/src/dapps/console.js @@ -0,0 +1,59 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React from 'react'; +import ReactDOM from 'react-dom'; +import { AppContainer } from 'react-hot-loader'; + +import 'codemirror/addon/dialog/dialog'; +import 'codemirror/addon/dialog/dialog.css'; +import 'codemirror/addon/hint/javascript-hint'; +import 'codemirror/addon/hint/show-hint'; +import 'codemirror/addon/hint/show-hint.css'; +import 'codemirror/addon/search/match-highlighter'; +import 'codemirror/addon/search/search'; +import 'codemirror/addon/search/searchcursor'; +import 'codemirror/keymap/sublime'; +import 'codemirror/lib/codemirror.css'; +import 'codemirror/mode/javascript/javascript'; +// Custom codemirror style +import './console/codemirror.css'; + +import Application from './console/Application'; + +import '../../assets/fonts/Roboto/font.css'; +import '../../assets/fonts/RobotoMono/font.css'; +import './style.css'; + +ReactDOM.render( + + + , + document.querySelector('#container') +); + +if (module.hot) { + module.hot.accept('./console/Application/index.js', () => { + require('./console/Application/index.js'); + + ReactDOM.render( + + + , + document.querySelector('#container') + ); + }); +} diff --git a/js/src/dapps/console/Application/application.css b/js/src/dapps/console/Application/application.css new file mode 100644 index 000000000..eea2c030d --- /dev/null +++ b/js/src/dapps/console/Application/application.css @@ -0,0 +1,65 @@ +/* Copyright 2015-2017 Parity Technologies (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.app { + display: flex; + flex-direction: column; + font-family: Arial, sans-serif; + font-size: 11px; + height: 100vh; + overflow: hidden; +} + +textarea, +input { + font-family: dejavu sans mono, monospace; + outline: none; +} + +code, +pre { + font-family: dejavu sans mono, monospace; + font-size: 11px; +} + +.header { + flex: 0 0 auto; +} + +.view { + display: flex; + flex: 1; + flex-direction: column; +} + +.eval { + flex: 0 1 auto; + font-family: dejavu sans mono, monospace; + overflow: auto; +} + +.input { + border-top: 1px solid #eee; + display: flex; + flex: 1 1 auto; + min-height: 50px; +} + +.status { + flex: 0 0 auto; + font-family: dejavu sans mono, monospace; +} diff --git a/js/src/dapps/console/Application/application.js b/js/src/dapps/console/Application/application.js new file mode 100644 index 000000000..5a591e710 --- /dev/null +++ b/js/src/dapps/console/Application/application.js @@ -0,0 +1,94 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { observer } from 'mobx-react'; +import React, { Component } from 'react'; + +import { api } from '../parity'; + +import Console from '../Console'; +import Header from '../Header'; +import Input from '../Input'; +import Settings from '../Settings'; +import Snippets from '../Snippets'; +import Watches from '../Watches'; + +import ApplicationStore from './application.store'; +import WatchesStore from '../Watches/watches.store'; + +import styles from './application.css'; + +@observer +export default class Application extends Component { + application = ApplicationStore.get(); + watches = WatchesStore.get(); + + componentWillMount () { + this.watches.add('time', () => new Date()); + this.watches.add('blockNumber', api.eth.blockNumber, api); + } + + render () { + return ( +
    +
    +
    +
    + + { this.renderView() } + +
    + +
    +
    + ); + } + + renderView () { + const { view } = this.application; + + if (view === 'console') { + return ( +
    +
    + +
    +
    + +
    +
    + ); + } + + if (view === 'settings') { + return ( +
    + +
    + ); + } + + if (view === 'snippets') { + return ( +
    + +
    + ); + } + + return null; + } +} diff --git a/js/src/dapps/console/Application/application.store.js b/js/src/dapps/console/Application/application.store.js new file mode 100644 index 000000000..c10be46c6 --- /dev/null +++ b/js/src/dapps/console/Application/application.store.js @@ -0,0 +1,42 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { action, observable } from 'mobx'; + +let instance; + +export default class ApplicationStore { + @observable view = this.views[0].id; + + views = [ + { label: 'Console', id: 'console' }, + { label: 'Snippets', id: 'snippets' }, + { label: 'Settings', id: 'settings' } + ]; + + static get () { + if (!instance) { + instance = new ApplicationStore(); + } + + return instance; + } + + @action + setView (view) { + this.view = view; + } +} diff --git a/js/src/dapps/console/Application/index.js b/js/src/dapps/console/Application/index.js new file mode 100644 index 000000000..3d8d1ca3b --- /dev/null +++ b/js/src/dapps/console/Application/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './application'; diff --git a/js/src/dapps/console/Autocomplete/autocomplete.css b/js/src/dapps/console/Autocomplete/autocomplete.css new file mode 100644 index 000000000..8d4585e7a --- /dev/null +++ b/js/src/dapps/console/Autocomplete/autocomplete.css @@ -0,0 +1,55 @@ +/* Copyright 2015-2017 Parity Technologies (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.container { + background: #f8f8f8; + box-shadow: 0 0.125em 0.25em rgba(0, 0, 0, 0.5); + font-family: dejavu sans mono, monospace; + left: 20px; + position: absolute; + max-height: 300px; + overflow: auto; +} + +.item { + background-color: white; + padding: 0.25em 0.25em 0.25em 0.35em; + display: flex; + justify-content: space-between; + + &.selected { + background-color: rgb(64, 115, 244); + + &, + .proto { + color: white; + } + } + + &:hover { + cursor: default; + } + + &:hover:not(.selected) { + background-color: rgb(230, 236, 255); + } + + .proto { + color: gray; + margin-left: 1em; + } +} diff --git a/js/src/dapps/console/Autocomplete/autocomplete.js b/js/src/dapps/console/Autocomplete/autocomplete.js new file mode 100644 index 000000000..e2938f23d --- /dev/null +++ b/js/src/dapps/console/Autocomplete/autocomplete.js @@ -0,0 +1,96 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { observer } from 'mobx-react'; +import React, { Component } from 'react'; +import ReactDOM from 'react-dom'; + +import AutocompleteStore from './autocomplete.store'; + +import styles from './autocomplete.css'; + +@observer +export default class Autocomplete extends Component { + autocompleteStore = AutocompleteStore.get(); + + render () { + if (!this.autocompleteStore.show) { + return null; + } + + return ( +
    + { this.renderAutocompletes() } +
    + ); + } + + renderAutocompletes () { + const { selected, values } = this.autocompleteStore; + const displayedProto = {}; + + return values.map((autocomplete, index) => { + const { name, prototypeName } = autocomplete; + const onClick = () => this.handleClick(index); + const setRef = (node) => this.setRef(index, node); + + const proto = !displayedProto[prototypeName] + ? ( + + { prototypeName } + + ) + : null; + + if (!displayedProto[prototypeName]) { + displayedProto[prototypeName] = true; + } + + const classes = [ styles.item ]; + + if (index === selected) { + classes.push(styles.selected); + } + + return ( +
    + + { name } + + { proto } +
    + ); + }); + } + + handleClick = (index) => { + this.autocompleteStore.select(index); + }; + + setRef = (index, node) => { + const element = ReactDOM.findDOMNode(node); + + this.autocompleteStore.setElement(index, element); + }; +} diff --git a/js/src/dapps/console/Autocomplete/autocomplete.store.js b/js/src/dapps/console/Autocomplete/autocomplete.store.js new file mode 100644 index 000000000..82ff2f24d --- /dev/null +++ b/js/src/dapps/console/Autocomplete/autocomplete.store.js @@ -0,0 +1,234 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { action, observable } from 'mobx'; + +import { evaluate } from '../utils'; + +let instance; + +export default class AutocompleteStore { + @observable values = []; + @observable position = {}; + @observable show = false; + @observable selected = null; + + elements = {}; + inputNode = null; + lastObject = null; + lastObjectPropertyNames = []; + + static get () { + if (!instance) { + instance = new AutocompleteStore(); + } + + return instance; + } + + get hasSelected () { + return this.selected !== null; + } + + clearCache () { + this.lastObject = null; + this.lastObjectPropertyNames = null; + } + + @action + focus (offset = 1) { + if (this.values.length === 0) { + this.selected = null; + return; + } + + this.selected = this.selected === null + ? ( + offset === 1 + ? 0 + : this.values.length - 1 + ) + : (this.values.length + this.selected + offset) % (this.values.length); + + if (this.isVisible(this.selected)) { + return; + } + + const element = this.elements[this.selected]; + + if (!element) { + return; + } + + element.scrollIntoView(offset === -1); + } + + focusOnInput () { + if (!this.inputNode) { + return; + } + + this.inputNode.focus(); + } + + @action + hide () { + this.show = false; + this.selected = null; + } + + isVisible (index) { + const element = this.elements[index]; + + if (!element) { + return false; + } + + const eBoundings = element.getBoundingClientRect(); + const pBoundings = element.parentElement.getBoundingClientRect(); + + if (eBoundings.top < pBoundings.top || eBoundings.bottom > pBoundings.bottom) { + return false; + } + + return true; + } + + select (inputStore, _index = this.selected) { + const index = _index === null + ? 0 + : _index; + + if (!this.values[index]) { + console.warn(`autocomplete::select has been called on AutocompleteStore with wrong value ${index}`); + return; + } + + const { name } = this.values[index]; + const { input } = inputStore; + const objects = input.split('.'); + + objects[objects.length - 1] = name; + const nextInput = objects.join('.'); + + this.hide(); + this.focusOnInput(); + return inputStore.updateInput(nextInput, false); + } + + setElement (index, element) { + this.elements[index] = element; + } + + setInputNode (node) { + this.inputNode = node; + } + + @action + setPosition () { + if (!this.inputNode) { + return; + } + + const inputBoundings = this.inputNode.getBoundingClientRect(); + const bodyBoundings = document.body.getBoundingClientRect(); + + // display on bottom of input + if (inputBoundings.top < bodyBoundings.height / 2) { + const nextPosition = { + top: 20 + }; + + this.position = nextPosition; + return; + } + + // display on top of input + const nextPosition = { + bottom: inputBoundings.height + }; + + this.position = nextPosition; + return; + } + + @action + setValues (values) { + this.values = values; + this.selected = null; + const show = values.length > 0; + + // Reveal autocomplete + if (!this.show && show) { + this.setPosition(); + } + + this.show = show; + } + + update (input) { + if (input.length === 0) { + return this.setValues([]); + } + + const objects = input.split('.'); + const suffix = objects.pop().toLowerCase(); + const prefix = objects.join('.'); + const object = prefix.length > 0 + ? prefix + : 'window'; + + if (object !== this.lastObject) { + const evalResult = evaluate(object); + + if (evalResult.error) { + this.lastObjectProperties = []; + } else { + this.lastObjectProperties = getAllProperties(evalResult.result); + } + + this.lastObject = object; + } + + const autocompletes = this.lastObjectProperties.filter((property) => { + return property.name.toLowerCase().includes(suffix); + }); + + return this.setValues(autocompletes); + } +} + +function getAllProperties (object) { + const propertyNames = {}; + + while (object) { + const prototypeName = object && object.constructor && object.constructor.name || ''; + + Object.getOwnPropertyNames(object) + .sort() + .forEach((name) => { + if (Object.prototype.hasOwnProperty.call(propertyNames, name)) { + return; + } + + propertyNames[name] = { name, prototypeName }; + }); + + object = Object.getPrototypeOf(object); + } + + return Object.values(propertyNames); +} diff --git a/js/src/dapps/console/Autocomplete/index.js b/js/src/dapps/console/Autocomplete/index.js new file mode 100644 index 000000000..5761be0e3 --- /dev/null +++ b/js/src/dapps/console/Autocomplete/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './autocomplete'; diff --git a/js/src/dapps/console/Console/console.css b/js/src/dapps/console/Console/console.css new file mode 100644 index 000000000..a0b3db4ff --- /dev/null +++ b/js/src/dapps/console/Console/console.css @@ -0,0 +1,58 @@ +/* Copyright 2015-2017 Parity Technologies (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.result { + border-top: 1px solid #eee; + display: flex; + font-family: dejavu sans mono, monospace; + padding: 0.35em 0.25em; + + &.error { + background-color: hsl(0, 100%, 97%); + + .text { + color: red; + } + } + + &.warn { + background-color: hsl(50, 100%, 95%); + } +} + +.type { + font-weight: bold !important; + font-size: 8pt; + padding: 0 0.5em 0 0.25em; +} + +.time { + color: gray; + padding: 0 1em 0 0.5em; +} + +.token { + white-space: pre-wrap; +} + +.text { + display: flex; +} + +.text .token:not(:first-child) { + margin-left: 0.5em; +} diff --git a/js/src/dapps/console/Console/console.js b/js/src/dapps/console/Console/console.js new file mode 100644 index 000000000..75f9713a6 --- /dev/null +++ b/js/src/dapps/console/Console/console.js @@ -0,0 +1,118 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { observer } from 'mobx-react'; +import React, { Component } from 'react'; +import ReactDOM from 'react-dom'; +import { ObjectInspector } from 'react-inspector'; + +import ConsoleStore from './console.store'; +import SettingsStore from '../Settings/settings.store'; + +import styles from './console.css'; + +const ICONS = { + debug: ' ', + error: '✖', + info: 'ℹ', + input: '>', + log: ' ', + result: '<', + warn: '⚠' +}; + +@observer +export default class Console extends Component { + consoleStore = ConsoleStore.get(); + settingsStore = SettingsStore.get(); + + render () { + return ( +
    + { this.renderResults() } +
    + ); + } + + renderResults () { + const { logs } = this.consoleStore; + + return logs.map((data, index) => { + const { type, timestamp } = data; + const values = this.consoleStore.logValues[index]; + const classes = [ styles.result, styles[type] ]; + + return ( +
    + + { this.renderTimestamp(timestamp) } + + { + values.map((value, valueIndex) => ( + + { this.toString(value) } + + )) + } + +
    + ); + }); + } + + renderTimestamp (timestamp) { + const { displayTimestamps } = this.settingsStore; + + if (!displayTimestamps) { + return null; + } + + return ( + + { new Date(timestamp).toISOString().slice(11, 23) } + + ); + } + + setRef = (node) => { + const element = ReactDOM.findDOMNode(node); + + this.consoleStore.setNode(element); + }; + + toString (value) { + if (typeof value === 'string') { + return value; + } + + if (value instanceof Error) { + return value.toString(); + } + + return ( + + ); + } +} diff --git a/js/src/dapps/console/Console/console.store.js b/js/src/dapps/console/Console/console.store.js new file mode 100644 index 000000000..dc2fc6db4 --- /dev/null +++ b/js/src/dapps/console/Console/console.store.js @@ -0,0 +1,126 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { action, observable } from 'mobx'; + +import AutocompleteStore from '../Autocomplete/autocomplete.store'; +import { evaluate } from '../utils'; + +let instance; + +export default class ConsoleStore { + @observable logs = []; + + autocompleteStore = AutocompleteStore.get(); + logValues = []; + node = null; + + constructor () { + this.attachConsole(); + } + + static get () { + if (!instance) { + instance = new ConsoleStore(); + } + + return instance; + } + + attachConsole () { + ['debug', 'error', 'info', 'log', 'warn'].forEach((level) => { + const old = window.console[level].bind(window.console); + + window.console[level] = (...args) => { + old(...args); + this.log({ type: level, values: args }); + }; + }); + } + + @action + clear () { + this.logs = []; + this.logValues = []; + } + + evaluate (input) { + this.log({ type: 'input', value: input }); + + setTimeout(() => { + const { result, error } = evaluate(input); + let value = error || result; + const type = error + ? 'error' + : 'result'; + + if (typeof value === 'string') { + value = `"${value}"`; + } + + if (value && typeof value === 'object' && typeof value.then === 'function') { + return value + .then((result) => { + this.log({ type: 'result', value: result }); + }) + .catch((error) => { + this.log({ type: 'error', value: error }); + }); + } + + this.log({ type, value }); + }); + } + + @action + log ({ type, value, values }) { + this.logs.push({ + type, + timestamp: Date.now() + }); + + if (values) { + this.logValues.push(values); + } else { + this.logValues.push([ value ]); + } + + this.autocompleteStore.setPosition(); + this.scroll(); + } + + setNode (node) { + this.node = node; + this.scroll(); + } + + scroll () { + if (!this.node) { + return; + } + + setTimeout(() => { + if (this.node.children.length === 0) { + return; + } + + // Scroll to the last child + this.node + .children[this.node.children.length - 1] + .scrollIntoView(false); + }, 50); + } +} diff --git a/js/src/dapps/console/Console/index.js b/js/src/dapps/console/Console/index.js new file mode 100644 index 000000000..2956b330f --- /dev/null +++ b/js/src/dapps/console/Console/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './console'; diff --git a/js/src/dapps/console/Header/header.css b/js/src/dapps/console/Header/header.css new file mode 100644 index 000000000..116de6b8c --- /dev/null +++ b/js/src/dapps/console/Header/header.css @@ -0,0 +1,51 @@ +/* Copyright 2015-2017 Parity Technologies (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.container { + background-color: #f3f3f3; + border-bottom: 1px solid #ccc; + font-size: 12px; + padding: 0 0.5em; +} + +.tabs { + display: flex; +} + +.tab { + align-items: center; + box-sizing: border-box; + border: 1px solid transparent; + color: #333; + cursor: default; + display: flex; + height: 24px; + line-height: 15px; + margin-top: 2px; + padding: 2px 6px 2px 4px; + + &:hover, + &.active:hover { + background-color: #e5e5e5; + } + + &.active { + background-color: white; + border: 1px solid #ccc; + border-bottom: none; + } +} diff --git a/js/src/dapps/console/Header/header.js b/js/src/dapps/console/Header/header.js new file mode 100644 index 000000000..c422b8256 --- /dev/null +++ b/js/src/dapps/console/Header/header.js @@ -0,0 +1,65 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { observer } from 'mobx-react'; +import React, { Component } from 'react'; + +import ApplicationStore from '../Application/application.store'; + +import styles from './header.css'; + +@observer +export default class Header extends Component { + application = ApplicationStore.get(); + + render () { + return ( +
    +
    + { this.renderTabs() } +
    +
    + ); + } + + renderTabs () { + const { view } = this.application; + + return this.application.views.map((tab) => { + const { label, id } = tab; + const classes = [ styles.tab ]; + const onClick = () => this.handleClickTab(id); + + if (id === view) { + classes.push(styles.active); + } + + return ( +
    + { label } +
    + ); + }); + } + + handleClickTab = (id) => { + this.application.setView(id); + }; +} diff --git a/js/src/dapps/console/Header/index.js b/js/src/dapps/console/Header/index.js new file mode 100644 index 000000000..aef90266f --- /dev/null +++ b/js/src/dapps/console/Header/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './header'; diff --git a/js/src/dapps/console/Input/index.js b/js/src/dapps/console/Input/index.js new file mode 100644 index 000000000..29e00f72b --- /dev/null +++ b/js/src/dapps/console/Input/index.js @@ -0,0 +1,17 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +export default from './input'; diff --git a/js/src/dapps/console/Input/input.css b/js/src/dapps/console/Input/input.css new file mode 100644 index 000000000..7b0c2306e --- /dev/null +++ b/js/src/dapps/console/Input/input.css @@ -0,0 +1,46 @@ +/* Copyright 2015-2017 Parity Technologies (UK) Ltd. +/* This file is part of Parity. +/* +/* Parity is free software: you can redistribute it and/or modify +/* it under the terms of the GNU General Public License as published by +/* the Free Software Foundation, either version 3 of the License, or +/* (at your option) any later version. +/* +/* Parity is distributed in the hope that it will be useful, +/* but WITHOUT ANY WARRANTY; without even the implied warranty of +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/* GNU General Public License for more details. +/* +/* You should have received a copy of the GNU General Public License +/* along with Parity. If not, see . +*/ + +.type { + color: #59f; + font-weight: bold !important; + font-size: 11px; + padding: 0 0.5em 0 0.25em; +} + +.inputContainer { + flex: 1; +} + +.input { + border: 0; + margin: 0; + padding: 0; + color: black; + height: 100%; + font-size: 11px; + resize: none; + width: 100%; +} + +.container { + border-top: 1px solid lightgray; + display: flex; + flex: 1; + padding: 0.25em; + position: relative; +} diff --git a/js/src/dapps/console/Input/input.js b/js/src/dapps/console/Input/input.js new file mode 100644 index 000000000..3263aff38 --- /dev/null +++ b/js/src/dapps/console/Input/input.js @@ -0,0 +1,145 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import keycode from 'keycode'; +import { observer } from 'mobx-react'; +import React, { Component } from 'react'; +import ReactDOM from 'react-dom'; + +import Autocomplete from '../Autocomplete'; + +import AutocompleteStore from '../Autocomplete/autocomplete.store'; +import ConsoleStore from '../Console/console.store'; +import InputStore from './input.store'; +import SettingsStore from '../Settings/settings.store'; + +import styles from './input.css'; + +@observer +export default class Input extends Component { + autocompleteStore = AutocompleteStore.get(); + consoleStore = ConsoleStore.get(); + inputStore = InputStore.get(); + settingsStore = SettingsStore.get(); + + render () { + const { input } = this.inputStore; + + return ( +
    + + > +
    +

    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%0Drq7Wa>^NahS0gIYJ-XegNw8;$7>Dy?*IL>SO! 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 literal 0 HcmV?d00001 diff --git a/js/assets/images/dapps/close.svg b/js/assets/images/dapps/close.svg new file mode 100644 index 000000000..d46acd872 --- /dev/null +++ b/js/assets/images/dapps/close.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/js/assets/images/dapps/plus.svg b/js/assets/images/dapps/plus.svg new file mode 100644 index 000000000..0fce86130 --- /dev/null +++ b/js/assets/images/dapps/plus.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/js/assets/images/dapps/signature.png b/js/assets/images/dapps/signature.png new file mode 100644 index 0000000000000000000000000000000000000000..36b341a036642764e48a0a958077b2440f370cbe GIT binary patch literal 2655 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 v+L(5?Lv+G|QXGXcnee}8^&fp50hyp2X`b5_ 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 literal 0 HcmV?d00001 diff --git a/js/assets/images/parity-logo-black-no-text.svg b/js/assets/images/parity-logo-black-no-text.svg new file mode 100644 index 000000000..a4f104838 --- /dev/null +++ b/js/assets/images/parity-logo-black-no-text.svg @@ -0,0 +1,65 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/js/assets/images/parity-logo-black.svg b/js/assets/images/parity-logo-black.svg new file mode 100644 index 000000000..f2b2fa726 --- /dev/null +++ b/js/assets/images/parity-logo-black.svg @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/js/assets/images/parity-logo-white-no-text.svg b/js/assets/images/parity-logo-white-no-text.svg new file mode 100644 index 000000000..213ab1db4 --- /dev/null +++ b/js/assets/images/parity-logo-white-no-text.svg @@ -0,0 +1,66 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/js/assets/images/parity-logo-white.svg b/js/assets/images/parity-logo-white.svg new file mode 100644 index 000000000..7360ef6a6 --- /dev/null +++ b/js/assets/images/parity-logo-white.svg @@ -0,0 +1,100 @@ + + + +image/svg+xml diff --git a/js/assets/images/paritybar.png b/js/assets/images/paritybar.png new file mode 100644 index 0000000000000000000000000000000000000000..f0b0e1457409c386690e52ab1091393de19aedc4 GIT binary patch literal 1971 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 literal 0 HcmV?d00001 diff --git a/js/assets/images/shapeshift-logo.png b/js/assets/images/shapeshift-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..586a01ef13a7ce480d46b88fe6dc457d3083c966 GIT binary patch literal 15127 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", + "maintainers": [ + "Jaco Greeff" + ], + "contributors": [], + "license": "GPL-3.0", + "repository": { + "type": "git", + "url": "git+https://github.com/paritytech/parity.git" + }, + "keywords": [ + "Ethereum", + "ABI", + "API", + "RPC", + "Parity", + "Promise" + ], + "scripts": { + }, + "devDependencies": { + "chai": "3.5.0", + "mocha": "3.2.0" + }, + "dependencies": { + "node-fetch": "~1.6.3" + } +} diff --git a/js/npm/jsonrpc/README.md b/js/npm/jsonrpc/README.md new file mode 100644 index 000000000..e9678864b --- /dev/null +++ b/js/npm/jsonrpc/README.md @@ -0,0 +1,5 @@ +# @parity/jsonrpc + +JSON and JS interface defintions for RPC calls. + +[https://github.com/paritytech/parity/tree/master/js/src/jsonrpc](https://github.com/paritytech/parity/tree/master/js/src/jsonrpc) diff --git a/js/npm/jsonrpc/package.json b/js/npm/jsonrpc/package.json new file mode 100644 index 000000000..90ebe1577 --- /dev/null +++ b/js/npm/jsonrpc/package.json @@ -0,0 +1,29 @@ +{ + "name": "@parity/jsonrpc", + "description": "JSON and JS interface defintions for RPC", + "version": "0.0.0", + "main": "library.js", + "author": "Parity Team ", + "maintainers": [ + "Jaco Greeff" + ], + "contributors": [], + "license": "GPL-3.0", + "repository": { + "type": "git", + "url": "git+https://github.com/paritytech/parity.git" + }, + "keywords": [ + "Ethereum", + "ABI", + "API", + "RPC", + "Parity" + ], + "scripts": { + }, + "devDependencies": { + }, + "dependencies": { + } +} diff --git a/js/npm/parity/README.md b/js/npm/parity/README.md new file mode 100644 index 000000000..2c5396e2d --- /dev/null +++ b/js/npm/parity/README.md @@ -0,0 +1,83 @@ +# @parity/parity.js + +Parity.js is a thin, fast, Promise-based wrapper around the Ethereum APIs. + +[https://github.com/paritytech/parity/tree/master/js/src/api](https://github.com/paritytech/parity/tree/master/js/src/api) + +## installation + +Install the package with `npm install --save @parity/parity.js` + +## usage + +### initialisation + +```javascript +// import the actual Api class +import { Api } from '@parity/parity.js'; + +// do the setup +const transport = new Api.Transport.Http('http://localhost:8545'); +const api = new Api(transport); +``` + +### making calls + +perform a call + +```javascript +api.eth + .coinbase() + .then((coinbase) => { + console.log(`The coinbase is ${coinbase}`); + }); +``` + +multiple promises + +```javascript +Promise + .all([ + api.eth.coinbase(), + api.net.listening() + ]) + .then(([coinbase, listening]) => { + // do stuff here + }); +``` + +chaining promises + +```javascript +api.eth + .newFilter({...}) + .then((filterId) => api.eth.getFilterChanges(filterId)) + .then((changes) => { + console.log(changes); + }); +``` + +### contracts + +attach contract + +```javascript +const abi = [{ name: 'callMe', inputs: [{ type: 'bool', ...}, { type: 'string', ...}]}, ...abi...]; +const address = '0x123456...9abc'; +const contract = new api.newContract(abi, address); +``` + +find & call a function + +```javascript +contract.instance + .callMe + .call({ gas: 21000 }, [true, 'someString']) // or estimateGas or postTransaction + .then((result) => { + console.log(`the result was ${result}`); + }); +``` + +## apis + +APIs implement the calls as exposed in the [Ethcore JSON Ethereum RPC](https://github.com/paritytech/ethereum-rpc-json/) definitions. Mapping follows the naming conventions of the originals, i.e. `eth_call` becomes `eth.call`, `personal_accounts` becomes `personal.accounts`, etc. diff --git a/js/npm/parity/package.json b/js/npm/parity/package.json new file mode 100644 index 000000000..c43da096d --- /dev/null +++ b/js/npm/parity/package.json @@ -0,0 +1,33 @@ +{ + "name": "@parity/parity.js", + "description": "The Parity Promise-based API & ABI library for interfacing with Ethereum over RPC", + "version": "0.0.0", + "main": "library.js", + "author": "Parity Team ", + "maintainers": [ + "Jaco Greeff" + ], + "contributors": [], + "license": "GPL-3.0", + "repository": { + "type": "git", + "url": "git+https://github.com/paritytech/parity.git" + }, + "keywords": [ + "Ethereum", + "ABI", + "API", + "RPC", + "Parity", + "Promise" + ], + "scripts": { + }, + "devDependencies": { + }, + "dependencies": { + "bignumber.js": "~2.3.0", + "js-sha3": "~0.5.2", + "node-fetch": "~1.6.3" + } +} diff --git a/js/npm/parity/test/smoke.spec.js b/js/npm/parity/test/smoke.spec.js new file mode 100644 index 000000000..fb1ae0d4d --- /dev/null +++ b/js/npm/parity/test/smoke.spec.js @@ -0,0 +1,26 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const parity = require('../'); + +describe('load the Parity library', function () { + it('should no throw any error', () => { + expect(parity).to.be.ok; + + expect(parity.Api).to.be.ok; + expect(parity.Abi).to.be.ok; + }); +}); diff --git a/js/npm/shapeshift/README.md b/js/npm/shapeshift/README.md new file mode 100644 index 000000000..0f9a190ab --- /dev/null +++ b/js/npm/shapeshift/README.md @@ -0,0 +1,34 @@ +# @parity/shapeshift + +A thin ES6 promise wrapper around the shapeshift.io APIs as documented at https://shapeshift.io/api + +[https://github.com/paritytech/parity/tree/master/js/src/3rdparty/shapeshift](https://github.com/paritytech/parity/tree/master/js/src/3rdparty/shapeshift) + +## usage + +installation - + +``` +npm install --save @parity/shapeshift +``` + +Usage - + +``` +const APIKEY = 'private affiliate key or undefined'; +const shapeshift = require('@parity/shapeshift')(APIKEY); + +// api calls goes here +``` + +## api + +queries - + +- `getCoins()` [https://shapeshift.io/api#api-104](https://shapeshift.io/api#api-104) +- `getMarketInfo(pair)` [https://shapeshift.io/api#api-103](https://shapeshift.io/api#api-103) +- `getStatus(depositAddress)` [https://shapeshift.io/api#api-5](https://shapeshift.io/api#api-5) + +transactions - + +- `shift(toAddress, returnAddress, pair)` [https://shapeshift.io/api#api-7](https://shapeshift.io/api#api-7) diff --git a/js/npm/shapeshift/package.json b/js/npm/shapeshift/package.json new file mode 100644 index 000000000..1aa2d38f3 --- /dev/null +++ b/js/npm/shapeshift/package.json @@ -0,0 +1,31 @@ +{ + "name": "@parity/shapeshift", + "description": "The Parity Promise-based library for interfacing with ShapeShift over HTTP", + "version": "0.0.0", + "main": "library.js", + "author": "Parity Team ", + "maintainers": [ + "Jaco Greeff" + ], + "contributors": [], + "license": "GPL-3.0", + "repository": { + "type": "git", + "url": "git+https://github.com/paritytech/parity.git" + }, + "keywords": [ + "Ethereum", + "ABI", + "API", + "RPC", + "Parity", + "Promise" + ], + "scripts": { + }, + "devDependencies": { + }, + "dependencies": { + "node-fetch": "~1.6.3" + } +} diff --git a/js/npm/test/mocha.config.js b/js/npm/test/mocha.config.js new file mode 100644 index 000000000..fc21631b0 --- /dev/null +++ b/js/npm/test/mocha.config.js @@ -0,0 +1,29 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +const chai = require('chai'); +// const chaiAsPromised from 'chai-as-promised'; +// const chaiEnzyme from 'chai-enzyme'; +// const sinonChai from 'sinon-chai'; + +// chai.use(chaiAsPromised); +// chai.use(chaiEnzyme()); +// chai.use(sinonChai); + +// expose expect to global so we won't have to manually import & define it in every test +global.expect = chai.expect; + +module.exports = {}; diff --git a/js/npm/test/mocha.opts b/js/npm/test/mocha.opts new file mode 100644 index 000000000..0ed8269b4 --- /dev/null +++ b/js/npm/test/mocha.opts @@ -0,0 +1 @@ +-r ./test/mocha.config diff --git a/js/scripts/build-rpc-json.js b/js/scripts/build-rpc-json.js new file mode 100644 index 000000000..740f96aa1 --- /dev/null +++ b/js/scripts/build-rpc-json.js @@ -0,0 +1,70 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import fs from 'fs'; +import path from 'path'; +import yargs from 'yargs'; + +import interfaces from '../src/jsonrpc'; + +const argv = yargs.default('output', 'release').argv; + +const INDEX_JSON = path.join(__dirname, `../${argv.output}/index.json`); +const methods = []; + +function formatDescription (obj) { + const optional = obj.optional ? '(optional) ' : ''; + const defaults = obj.default ? `(default: ${obj.default}) ` : ''; + + return `${obj.type.name} - ${optional}${defaults}${obj.desc}`; +} + +function formatType (obj) { + if (obj.type === Object && obj.details) { + const formatted = {}; + + Object.keys(obj.details).sort().forEach((key) => { + formatted[key] = formatType(obj.details[key]); + }); + + return { + desc: formatDescription(obj), + details: formatted + }; + } else if (obj.type && obj.type.name) { + return formatDescription(obj); + } + + return obj; +} + +Object.keys(interfaces).sort().forEach((group) => { + Object.keys(interfaces[group]).sort().forEach((name) => { + const method = interfaces[group][name]; + const deprecated = method.deprecated ? ' (Deprecated and not supported, to be removed in a future version)' : ''; + + methods.push({ + name: `${group}_${name}`, + desc: `${method.desc}${deprecated}`, + params: method.params.map(formatType), + returns: formatType(method.returns), + inputFormatters: method.params.map((param) => param.format || null), + outputFormatter: method.returns.format || null + }); + }); +}); + +fs.writeFileSync(INDEX_JSON, JSON.stringify({ methods: methods }, null, 2), 'utf8'); diff --git a/js/scripts/build-rpc-markdown.js b/js/scripts/build-rpc-markdown.js new file mode 100644 index 000000000..7a78e1ce9 --- /dev/null +++ b/js/scripts/build-rpc-markdown.js @@ -0,0 +1,328 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import fs from 'fs'; +import path from 'path'; +import { isPlainObject } from 'lodash'; + +import { info, warn, error } from './helpers/log'; +import { Dummy } from '../src/jsonrpc/helpers'; +import interfaces from '../src/jsonrpc'; +import rustMethods from './helpers/parsed-rpc-traits'; + +const ROOT_DIR = path.join(__dirname, '../docs'); + +if (!fs.existsSync(ROOT_DIR)) { + fs.mkdirSync(ROOT_DIR); +} + +Object.keys(rustMethods).forEach((group) => { + Object.keys(rustMethods[group]).forEach((method) => { + if (interfaces[group] == null || interfaces[group][method] == null) { + error(`${group}_${method} is defined in Rust traits, but not in js/src/jsonrpc/interfaces`); + } + }); +}); + +function printType (type, obj) { + if (!type) { + throw new Error(`Invalid type in ${JSON.stringify(obj)}`); + } + + return type.print || `\`${type.name}\``; +} + +function formatDescription (obj, prefix = '', indent = '') { + const optional = obj.optional ? '(optional) ' : ''; + const defaults = obj.default ? `(default: \`${obj.default}\`) ` : ''; + + return `${indent}${prefix}${printType(obj.type, obj)} - ${optional}${defaults}${obj.desc}`; +} + +function formatType (obj) { + if (obj == null || obj.type == null) { + return obj; + } + + const details = obj.details || obj.type.details; + + if (details) { + const sub = Object.keys(details).map((key) => { + return formatDescription(details[key], `\`${key}\`: `, ' - '); + }).join('\n'); + + return `${formatDescription(obj)}\n${sub}`; + } else if (obj.type && obj.type.name) { + return formatDescription(obj); + } + + return obj; +} + +const rpcReqTemplate = { + method: 'web3_clientVersion', + params: [], + id: 1, + jsonrpc: '2.0' +}; + +const { isDummy } = Dummy; +const { isArray } = Array; + +// Checks if a field definition has an example, +// or describes an object with fields that recursively have examples of their own, +// or is optional. +function hasExample ({ optional, example, details } = {}) { + if (optional || example !== undefined) { + return true; + } + + if (details !== undefined) { + const values = Object.keys(details).map((key) => details[key]); + + return values.every(hasExample); + } + + return false; +} + +// Remove all optional (trailing) params without examples from an array +function removeOptionalWithoutExamples (arr) { + return arr.filter(({ optional, example, details }) => { + return !optional || example !== undefined || details !== undefined; + }); +} + +// Grabs JSON compatible +function getExample (obj) { + if (isArray(obj)) { + return removeOptionalWithoutExamples(obj).map(getExample); + } + + const { example, details } = obj; + + if (example === undefined && details !== undefined) { + const nested = {}; + + Object.keys(details).forEach((key) => { + nested[key] = getExample(details[key]); + }); + + return nested; + } + + return example; +} + +function stringifyExample (example, dent = '') { + const indent = `${dent} `; + + if (isDummy(example)) { + return example.toString(); + } + + if (isArray(example)) { + const last = example.length - 1; + + // If all elements are dummies, print out a single line. + // Also covers empty arrays. + if (example.every(isDummy)) { + const dummies = example.map(d => d.toString()); + + return `[${dummies.join(', ')}]`; + } + + // For arrays containing just one object or string, don't unwind the array to multiline + if (last === 0 && (isPlainObject(example[0]) || typeof example[0] === 'string')) { + return `[${stringifyExample(example[0], dent)}]`; + } + + const elements = example.map((value, index) => { + const comma = index !== last ? ',' : ''; + const comment = value != null && value._comment ? ` // ${value._comment}` : ''; + + return `${stringifyExample(value, indent)}${comma}${comment}`; + }); + + return `[\n${indent}${elements.join(`\n${indent}`)}\n${dent}]`; + } + + if (isPlainObject(example)) { + const keys = Object.keys(example); + const last = keys.length - 1; + + // print out an empty object + if (last === -1) { + return '{}'; + } + + const elements = keys.map((key, index) => { + const value = example[key]; + const comma = index !== last ? ',' : ''; + const comment = value && value._comment ? ` // ${example[key]._comment}` : ''; + + return `${JSON.stringify(key)}: ${stringifyExample(value, indent)}${comma}${comment}`; + }); + + return `{\n${indent}${elements.join(`\n${indent}`)}\n${dent}}`; + } + + return JSON.stringify(example); +} + +function buildExample (name, method) { + // deprecated, don't care + if (method.deprecated) { + return ''; + } + + const logPostfix = method.subdoc ? ` (${method.subdoc})` : ''; + + const hasReqExample = method.params.every(hasExample); + const hasResExample = hasExample(method.returns); + + if (!hasReqExample && !hasResExample) { + error(`${name} has no examples${logPostfix}`); + + return ''; + } + + const examples = []; + + if (hasReqExample) { + const params = getExample(method.params); + const req = Dummy.stringifyJSON(Object.assign({}, rpcReqTemplate, { method: name, params })); + + examples.push(`Request\n\`\`\`bash\ncurl --data '${req}' -H "Content-Type: application/json" -X POST localhost:8545\n\`\`\``); + } else { + warn(`${name} has a response example but not a request example${logPostfix}`); + } + + if (hasResExample) { + const res = stringifyExample({ + id: 1, + jsonrpc: '2.0', + result: getExample(method.returns) + }); + + examples.push(`Response\n\`\`\`js\n${res}\n\`\`\``); + } else { + if (typeof method.returns === 'string') { + info(`${name} has a request example and only text description for response${logPostfix}`); + } else { + warn(`${name} has a request example but not a response example${logPostfix}`); + } + } + + return `\n\n#### Example\n\n${examples.join('\n\n')}`; +} + +function buildParameters (params) { + if (params.length === 0) { + return ''; + } + + let md = `0. ${params.map(formatType).join('\n0. ')}`; + + if (params.length > 0 && params.every(hasExample) && !isDummy(params[0].example)) { + const example = getExample(params); + + md = `${md}\n\n\`\`\`js\nparams: ${stringifyExample(example)}\n\`\`\``; + } + + return md; +} + +Object.keys(interfaces).sort().forEach((group) => { + const spec = interfaces[group]; + + for (const key in spec) { + const method = spec[key]; + + if (!method || !method.subdoc) { + continue; + } + + const subgroup = `${group}_${method.subdoc}`; + + interfaces[subgroup] = interfaces[subgroup] || {}; + + interfaces[subgroup][key] = method; + delete spec[key]; + } +}); + +Object.keys(interfaces).sort().forEach((group) => { + let preamble = `# The \`${group}\` Module`; + let markdown = `## JSON-RPC methods\n`; + + const spec = interfaces[group]; + + if (spec._preamble) { + preamble = `${preamble}\n\n${spec._preamble}`; + } + + const content = []; + const tocMain = []; + const tocSections = {}; + + // Comparator that will sort by sections first, names second + function methodComparator (a, b) { + const sectionA = spec[a].section || ''; + const sectionB = spec[b].section || ''; + + return sectionA.localeCompare(sectionB) || a.localeCompare(b); + } + + Object.keys(spec).sort(methodComparator).forEach((iname) => { + const method = spec[iname]; + const groupName = group.replace(/_.*$/, ''); + const name = `${groupName}_${iname}`; + + if (method.nodoc || method.deprecated) { + info(`Skipping ${name}: ${method.nodoc || 'Deprecated'}`); + + return; + } + + if (rustMethods[groupName] == null || rustMethods[groupName][iname] == null) { + error(`${name} is defined in js/src/jsonrpc/interfaces, but not in Rust traits`); + } + + const desc = method.desc; + const params = buildParameters(method.params); + const returns = `- ${formatType(method.returns)}`; + const example = buildExample(name, method); + + const { section } = method; + const toc = section ? tocSections[section] = tocSections[section] || [] : tocMain; + + toc.push(`- [${name}](#${name.toLowerCase()})`); + content.push(`### ${name}\n\n${desc}\n\n#### Parameters\n\n${params || 'None'}\n\n#### Returns\n\n${returns || 'None'}${example}`); + }); + + markdown = `${markdown}\n${tocMain.join('\n')}`; + + Object.keys(tocSections).sort().forEach((section) => { + markdown = `${markdown}\n\n#### ${section}\n${tocSections[section].join('\n')}`; + }); + + markdown = `${markdown}\n\n## JSON-RPC API Reference\n\n${content.join('\n\n***\n\n')}\n\n`; + + const mdFile = path.join(ROOT_DIR, `${group}.md`); + + fs.writeFileSync(mdFile, `${preamble}\n\n${markdown}`, 'utf8'); +}); diff --git a/js/scripts/helpers/log.js b/js/scripts/helpers/log.js new file mode 100644 index 000000000..dc4955649 --- /dev/null +++ b/js/scripts/helpers/log.js @@ -0,0 +1,32 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import chalk from 'chalk'; + +// INFO Logging helper +export function info (log) { + console.log(chalk.blue(`INFO:\t${log}`)); +} + +// WARN Logging helper +export function warn (log) { + console.warn(chalk.yellow(`WARN:\t${log}`)); +} + +// ERROR Logging helper +export function error (log) { + console.error(chalk.red(`ERROR:\t${log}`)); +} diff --git a/js/scripts/helpers/parsed-rpc-traits.js b/js/scripts/helpers/parsed-rpc-traits.js new file mode 100644 index 000000000..9f2d4ea8a --- /dev/null +++ b/js/scripts/helpers/parsed-rpc-traits.js @@ -0,0 +1,81 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import fs from 'fs'; +import path from 'path'; + +// ```js +// rustMethods['eth']['call'] === true +// ``` +const rustMethods = {}; + +export default rustMethods; + +// Get a list of JSON-RPC from Rust trait source code +function parseMethodsFromRust (source) { + // Matching the custom `rpc` attribute with it's doc comment + const attributePattern = /((?:\s*\/\/\/.*$)*)\s*#\[rpc\(([^)]+)\)]/gm; + const commentPattern = /\s*\/\/\/\s*/g; + const separatorPattern = /\s*,\s*/g; + const assignPattern = /([\S]+)\s*=\s*"([^"]*)"/; + const ignorePattern = /@(ignore|deprecated|unimplemented|alias)\b/i; + + const methods = []; + + source.toString().replace(attributePattern, (match, comment, props) => { + comment = comment.replace(commentPattern, '\n').trim(); + + // Skip deprecated methods + if (ignorePattern.test(comment)) { + return match; + } + + props.split(separatorPattern).forEach((prop) => { + const [, key, value] = prop.split(assignPattern) || []; + + if (key === 'name' && value != null) { + methods.push(value); + } + }); + + return match; + }); + + return methods; +} + +// Get a list of all JSON-RPC methods from all defined traits +function getMethodsFromRustTraits () { + const traitsDir = path.join(__dirname, '../../../rpc/src/v1/traits'); + + return fs.readdirSync(traitsDir) + .filter((name) => name !== 'mod.rs' && /\.rs$/.test(name)) + .map((name) => fs.readFileSync(path.join(traitsDir, name))) + .map(parseMethodsFromRust) + .reduce((a, b) => a.concat(b)); +} + +getMethodsFromRustTraits().sort().forEach((method) => { + const [group, name] = method.split('_'); + + // Skip methods with malformed names + if (group == null || name == null) { + return; + } + + rustMethods[group] = rustMethods[group] || {}; + rustMethods[group][name] = true; +}); diff --git a/js/src/3rdparty/email-verification/index.js b/js/src/3rdparty/email-verification/index.js new file mode 100644 index 000000000..9e79547ec --- /dev/null +++ b/js/src/3rdparty/email-verification/index.js @@ -0,0 +1,68 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import { stringify } from 'querystring'; + +export const isServerRunning = (isTestnet = false) => { + const port = isTestnet ? 28443 : 18443; + + return fetch(`https://email-verification.parity.io:${port}/health`, { + mode: 'cors', + cache: 'no-store' + }) + .then((res) => { + return res.ok; + }) + .catch(() => { + return false; + }); +}; + +export const hasReceivedCode = (email, address, isTestnet = false) => { + const port = isTestnet ? 28443 : 18443; + const query = stringify({ email, address }); + + return fetch(`https://email-verification.parity.io:${port}/?${query}`, { + mode: 'cors', + cache: 'no-store' + }) + .then((res) => { + return res.ok; + }) + .catch(() => { + return false; // todo: check for 404 + }); +}; + +export const postToServer = (query, isTestnet = false) => { + const port = isTestnet ? 28443 : 18443; + + query = stringify(query); + + return fetch(`https://email-verification.parity.io:${port}/?${query}`, { + method: 'POST', + mode: 'cors', + cache: 'no-store' + }) + .then((res) => { + return res.json().then((data) => { + if (res.ok) { + return data.message; + } + throw new Error(data.message || 'unknown error'); + }); + }); +}; diff --git a/js/src/3rdparty/email-verification/terms-of-service.js b/js/src/3rdparty/email-verification/terms-of-service.js new file mode 100644 index 000000000..8826be032 --- /dev/null +++ b/js/src/3rdparty/email-verification/terms-of-service.js @@ -0,0 +1,27 @@ +// Copyright 2015-2017 Parity Technologies (UK) Ltd. +// This file is part of Parity. + +// Parity is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Parity is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Parity. If not, see . + +import React from 'react'; + +export default ( +

    a@sg3#Gn>8y;_>oT*lOrhsN@pIDb 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/ttf/RobotoMono-ThinItalic.ttf b/js/assets/fonts/RobotoMono/ttf/RobotoMono-ThinItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..e1bb9121ec6568d6b8772d121eafeaa5da0db928 GIT binary patch literal 121456 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz-pRBTtN4E2_qSPBnw6AgMc.woff2 b/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz-pRBTtN4E2_qSPBnw6AgMc.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f1fdb93524e7a84934cc4f6d4b731006059705f1 GIT binary patch literal 3516 zcmV;t4MXyGPew8T0RR9101dnV3;+NC03LJz01avY0suh(00000000000000000000 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 qeFFdh000000000$2qA{P+qPgx>^#xc| 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 C6V#>v literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz2MSHb9EAJwuSzGfuRChQzQ.woff2 b/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz2MSHb9EAJwuSzGfuRChQzQ.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..54484b1e3edcbac1fc80f13cfa4a03cb29c84bf1 GIT binary patch literal 5264 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz9TIkQYohD4BpHvJ3NvbHoA.woff2 b/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59Fz9TIkQYohD4BpHvJ3NvbHoA.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..62b3a15f698a5e966f5f6b4a5b6d5081e340c654 GIT binary patch literal 11032 zcmV+zE9caAPew8T0RR9104o>(3;+NC083B+04l}+0suh(00000000000000000000 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 Scv!ceo=>Nzrn}1J^(g>##wLjX literal 0 HcmV?d00001 diff --git a/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59FzyJ0caWjaSBdV-xZbEgst_k.woff2 b/js/assets/fonts/RobotoMono/v4/N4duVc9C58uwPiY8_59FzyJ0caWjaSBdV-xZbEgst_k.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2d4fda538a22e1046718d4d158e7512eae086f69 GIT binary patch literal 740 zcmV z+RAd76BT?PY(kec3BTZPYG+|J-?aT)o_hM=)4(kF(kZQ8ikqvnj&)5YH8+`?#a&gl zxH+#yl-?<=S&E&DmW+2#BsDi@LzUNfE}?9Xz~EW@bt&T7T1j+KkvOKdHbv~OOPABn za(uJDUczIFiht*)=b9O4|4JGycV7+9UDs77jCcPfdUtw2xe8(n$jC_jZ-oew{p5vQ zP3_;>&n9le6JPK$ezPn(;ORpU1@P{?V%0++CqvtDb;ZxgK5JaPQ;c%kE|Og?h1qFJmamnK?=b!n7da(GL> z5rd-0C=H7yHmctsDV5E`>Cq~b%2%jLJ#->xtGv~*$(RA!RT+X1p~yf$B9O^djTIG) WfnL>UuS{>Y&@|G~*rJ320000!p+^V+ literal 0 HcmV?d00001 diff --git a/js/assets/images/certifications/unknown.svg b/js/assets/images/certifications/unknown.svg new file mode 100644 index 000000000..1554bcc25 --- /dev/null +++ b/js/assets/images/certifications/unknown.svg @@ -0,0 +1,4 @@ + + + + diff --git a/js/assets/images/contracts/ethereum-black-64x64.png b/js/assets/images/contracts/ethereum-black-64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..8e80e4ff134759b9cfbbc6f535791b93aac64a49 GIT binary patch literal 771 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+yeRz?dE26XLpf>9VZs?55@xeFKBN z`w#R_m9Q&+F3tO^Scx3shr6Bk!eRSgUZQdCruk&(&F&X$mnP*zs<@%5Eg zP|(uS2AZ&N$r7L;KojQ7n-4J`s4FTux~ite(#i^Gm!XkSLQ;~MxjE1xplOq*PF=Zr zjhDAK(5RHuw5FC;Yg-_&%gN1~w{YRcEn9qjeSyvZI@`|P-ow*VPhWrc-hJWW5zVcw zKzj=c3sTjba_`#@AR3oTwGnZ?bvB$ zW$o(bR$ft2Ti?*zKcT3&BqA~rXl!6`@QKrBW`&d}07IX#B*-tA!Qt7BG!Q4r+uens zgH_f8$l)yTh%9Dc;1&j9Muu5)B!GhKC7!;n><_rug@i;3s-3!kdIUXP977@wAH9B> zuSJ2U_2D|dOUqw$g+KXuyh55wV~g*Erz!vZeW!3={GGtnr*WVs;rxN=4DT8CG5=r@ zcv;SHpCN|f2U7y;fxGbxVa#_JBDf3K8`kSHtYQAactEQ`p3$O;_W)0aiuQt6xl3|q zu*{WraP;}E#PvhCc&`WZog*v?mstIhZgkr)v47<9Fb=Z4$1ssoLDfib*&cO?-_tfc z<4ruhQ*>6{7o{sMbNlZfd1d+K?)h3CuM5-X|CQl(dVcxy!T*-0cANWpP7jE?XR%t$ z{^qmNJeL2578GB<<;J0R{^r%=jIS8Z`3Cj9yL5*kw4r+SEWtau&tH_;GhN_yIcH;8 q^`eV$3-iXs*?nIN8$P|@x9{W+n#VuqXgV;w7(8A5T-G@yGywp%&m|iG literal 0 HcmV?d00001 diff --git a/js/assets/images/contracts/ethereum-black.png b/js/assets/images/contracts/ethereum-black.png new file mode 100644 index 0000000000000000000000000000000000000000..d7bdc4c904012b2224306216f1d36c78eb29122a GIT binary patch literal 147077 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 ^<8Tpf9A?3V!vp;Iw4({x>wwGt-<{c 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

  • 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 z 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 literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-LightItalic.ttf b/js/assets/fonts/Roboto/ttf/Roboto-LightItalic.ttf new file mode 100755 index 0000000000000000000000000000000000000000..04cc002302024c4e032d32319f0d40a32b54aada GIT binary patch literal 166492 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 O52#$t24}uzn*1+3HAyD` literal 0 HcmV?d00001 diff --git a/js/assets/fonts/Roboto/ttf/Roboto-Medium.ttf b/js/assets/fonts/Roboto/ttf/Roboto-Medium.ttf new file mode 100755 index 0000000000000000000000000000000000000000..39c63d7461796094c0b8889ee8fe2706d344a99a GIT binary patch literal 162588 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 cASb?` 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