1.0.1024 • Published 1 day ago

mol_wire_lib v1.0.1024

Weekly downloads
-
License
-
Repository
-
Last release
1 day ago

$mol_wire

A reactivity system. It gives ability to:

  • Make any state observable using only 1.5KB lib. $hyoo_crowd as example.
  • Automatic dynamic track runtime value dependencies and optimize task execution order.
  • Memoize calculations with automatic revalidation. Yes, it completely solves the first of hard problem in computer science.
  • Convert sync API to async and vice versa. Yes, it's a black magic of idempotence.
  • Manage resources automatically with predictable deconstruction moment. Yes, we don't rely on garbage collector.
  • Dramatically reduce source code size and increase reliability by implementing reactive architecture.

Articles about

High level API

Decorators

Proxies

Functions

Structures

Low level API

Debug

Pub/Sub

Reactivity

NPM Bundles

mol_wire_lib

Lib with all production ready $mol_wire modules.

npm install mol_wire_lib

7KB npm.io

TypeScript example:

import {
	$mol_wire_solo as solo,
	$mol_wire_plex as plex,
	$mol_wire_method as task,
} from 'mol_wire_lib'

class User {
	@solo age( next = 0 ) { return next }
	@plex finger_exists( id: string, next = true ) { return next }
	@task finger_cut( id: string ) { this.finger_exists( id, false ) }
}

JavaScript example:

const $ = require( 'mol_wire_lib' )

class User {
	age( next = 0 ) { return next }
	finger_exists( id: string, next = true ) { return next }
	finger_cut( id: string ) { this.finger_exists( id, false ) }
}

$.$mol_wire_solo( User.prototype, 'age' )
$.$mol_wire_plex( User.prototype, 'finger_exists' )
$.$mol_wire_task( User.prototype, 'finger_cut' )

mol_wire_pub

Tiny lib to making any state observabe for other $mol_wire based libs.

npm install mol_wire_pub

1.5KB npm.io

import { $mol_wire_pub as Publisher } from 'mol_wire_pub'

let counter = 0
const pub = new Publisher

export function state() {
	pub.promote()
	return counter
}

export function increase() {
	++ counter
	pub.emit()
}

export function decrease() {
	-- counter
	pub.emit()
}

mol_wire_dom

Lib to make real DOM reactive.

npm install mol_wire_domm

7.5KB npm.io

import { $mol_wire_dom as reactivate } from 'mol_wire_dom'

reactivate( document.body )

Close alternatives

Architectural comparison

Core concepts

In $mol_wire we build reactive systems using classes that have reactive properties. We represent a reactive property using a class method with an appropriate decorator.

Channels

We define properties in accordance to the pattern of channels. A channel behaves like a getter when called without arguments and as a getter-setter otherwise. This approach proves to be more flexible than others.

Here's an example of a simple channel:

let _title = ''
const title = ( text = _title )=> _title = text

title()                  // getter, returns ''
title( 'Buy some milk' ) // getter-setter, sets and returns 'Buy some milk'
title()                  // getter, returns 'Buy some milk'

You can notice that this is similar to some JQuery methods.

Instead of a plain function and a variable $mol_wire uses class methods with an appropriate decorator:

import { $mol_wire_solo as solo } from 'mol_wire_lib'

class Store {
	@solo title( text = '' ) { return text }
}

const store = new Store()

store.title()                  // getter, returns ''
store.title( 'Buy some milk' ) // getter-setter, sets and returns 'Buy some milk'
store.title()                  // getter, returns 'Buy some milk'

The decorator memoizes what's been returned from the method so when someone uses it as a getter the method itself is not called and instead the memoized value is returned.

Properties either:

  • store values
  • or compute new values based on other properties.

The computed properties will only recompute when one of their dependencies change.

import { $mol_wire_solo as solo } from 'mol_wire_lib'

class User {
	// stores a value
	@solo name_first( next = 'Thomas' ) {
		return next
	}

	// stores a value
	@solo name_last( next = 'Anderson' ) {
		return next
	}

	// computes a value based on other channels
	@solo name() {
		console.log('compute name')
		return `${this.name_first()} ${this.name_last()}`
	}
}

const user = new User()

console.log(user.name()) // logs: 'compute name', 'Thomas Anderson'
console.log(user.name()) // logs: 'Thomas Anderson'

// setter, marks 'name' as a subject to recomputation,
// but doesn't recompute immediately
user.name_last('William')

console.log(user.name()) // logs: 'compute name', 'Thomas William'
console.log(user.name()) // logs: 'Thomas William'

Memoization

Channels marked with a @solo or @plex decorator are memoized until a new value is set to them or one of their dependencies change.

We can use memoization to guarantee that a reference to an object will stay the same:

import { $mol_wire_solo as solo } from 'mol_wire_lib'

class Task {
	@solo timestamp( value = 0 ) {
		return value
	}

	// won't create new instances until `timestamp` is changed
	@solo moment() {
		return new Moment(this.timestamp())
	}
}

Or with memoization we can cache expensive computations:

import { $mol_wire_solo as solo } from 'mol_wire_lib'

class Task {
	@solo title( title = '' ) {
		return title
	}

	// won't recompute
	@solo segmenter() {
		return new Intl.Segmenter()
	}

	// won't recompute until `title` is changed
	@solo mirrored_title() {
		const segmenter = this.segmenter()
		const segments = [ ... segmenter.segment( this.title() ) ]
		return segments.map( s => s.segment ).reverse().join('')
	}
}

With $mol_wire_plex (as in multiplexing) we can store multiple values:

import { $mol_wire_plex as plex } from 'mol_wire_lib'

class Project {
	@plex task( id: number ) {
		return new Task( id )
	}
}

const project = new Project()
const task1 = project.task(1)
const task2 = project.task(2)

Hacking

Another piece of flexibility that channels give is what's called hacking. It allows us to impose custom rules on how channels are read or set:

import {
	$mol_wire_solo as solo,
	$mol_wire_plex as plex,
} from 'mol_wire_lib'

class Task {
	// task has a duration
	@solo duration( dur?: number ) {
		return dur
	}
}

class Project_limited {
	// project has many tasks
	@plex task( id: number ) {
		const task = new Task()

		// the "hacking" technique:
		// when someone tries to get or set the duration for a task
		// we proxy this through our own method imposing a limitation for maximum duration
		task.duration = ( duration ) => this.task_duration( id, duration )

		return task
	}

	@plex task_duration( id: number, duration = 1 ) {
		// clamp the duration to the maximum value
		return Math.min( duration, this.duration_max() )
	}

	duration_max() {
		return 10
	}
}

const project_limited = new Project_limited()

const task_limited = project_limited.task(1)
task_limited.duration(20) // try to set 20 for the duration

console.log(task_limited.duration()) // logs: 10

Destructors

We can take the use of memoization even further by leveraging destructors.

$mol_wire will call a special method named destructor on an object that is no longer needed:

import { $mol_wire_solo as solo } from 'mol_wire_lib'

class ExampleAPI {
	socket: WebSocket

	constructor (
		public api_key : string ,
	) {
		this.socket = new WebSocket(`wss://example.com?api_key=${api_key}`)
	}

	// the special method
	destructor() {
		this.socket.close()
	}
}

class App {
	@solo api_key( value = '' ) {
		return value
	}

	@solo api() {
		return new ExampleAPI( this.api_key() )
	}
}

const app = new App()

// set an api key
app.api_key('testkey1')

// create an instance of WebSocket, establish a connection
app.api()

// change the api key
// this will trigger creation of a new web socket
// and the old one will get destructured
app.api_key('testkey2')

Asynchronous computed values

Unlike many other reactivity systems, $mol_wire allows you to have computeds that depend on asynchronous values.

$mol_wire makes it possible by using an implementaion of Suspense API where an asynchronous task throws an exception to pause the computation until the task resolves. You can read more about it here.

import {
	$mol_wire_solo as solo,
	$mol_wire_sync,
	$mol_wire_async,
} from 'mol_wire_lib'

// produce a value with 1 second delay
function value_async(): Promise<number> {
	return new Promise((resolve) => {
		const value = 25
		setTimeout(() => resolve(value), 1000)
	})
}

class App {
	@solo value() {
		// convert asynchronous function to a synchronous one
		// NOTE closures won't work here,
		// NOTE only use references to pre-defined functions or object methods
		const value_sync = $mol_wire_sync(value_async)

		// treat the value as it is already there
		return value_sync() * 2
	}

	run() {
		console.log(this.value())
	}
}

const app = new App()

// run the application in a Suspense environment
$mol_wire_async(app).run()

// logs: 50

Side effects in asynchronous computations

In $mol_wire we treat values that are computed asynchronously as they're already there. This is thanks to Suspense API: when an asynchronous task starts in a method it throws an exception and when it finishes the method is called again. A more detailed description is here.

Because of that we have to be a little careful about how we make side effects inside our methods.

The @$mol_wire_method decorator (which is usually aliased to @action) prevents methods from being called multiple times:

import {
	$mol_wire_method as action,
	$mol_wire_sync,
} from 'mol_wire_lib'

class App {
	// Auto wrap method to task
	@action main() {
		// Convert async api to sync
		const syncFetch = $mol_wire_sync( fetch )

		this.log( 'Request' ) // 3 calls, 1 log
		const response = syncFetch( 'https://example.org' ) // Sync but non-blocking
		const syncResponse = $mol_wire_sync( response )

		this.log( 'Parse' ) // 2 calls, 1 log
		const response = syncResponse.json() // Sync but non-blocking

		this.log( 'Done' ) // 1 call, 1 log
	}

	// Auto wrap method to sub-task
	@action log( ... args: any[] ) {
		console.log( ... args )
		// No restarts within a portion of a task
	}
}

Cancelling asynchronous tasks

We can cancel asynchronous tasks when we no longer need them by using destructors again.

Here's an example of a cancelable fetch:

import { $mol_wire_sync } from 'mol_wire_lib'

const fetchJSON = $mol_wire_sync( function fetch_abortable(
	input: RequestInfo,
	init: RequestInit = {}
) {
	const controller = new AbortController
	init.signal ||= controller.signal

	const promise = fetch( input, init )
		.then( response => response.json() )

	// assign a destructor to cancel the request
	const destructor = ()=> controller.abort()
	return Object.assign( promise, { destructor } )
} )

Then, we can use it in our computeds:

import { $mol_wire_plex as plex } from 'mol_wire_lib'

class GitHub {
	@plex static issue( id: number ) {
		return fetchJSON( `https://api.github.com/repos/nin-jin/HabHub/issues/${id}` )
	}
}

or a more interesting use case could look like this:

import { $mol_wire_async } from 'mol_wire_lib'

button.onclick = $mol_wire_async( function() {
	const { profile } = fetchJSON( 'https://example.org/input' )
	console.log( profile )
} )

In the above example clicking the button will trigger an HTTP request. If it doesn't resolve until the user clicks again, a new request will be sent and the previous one will get cancelled.

And this is how easy it is to add debounce to this function:

button.onclick = $mol_wire_async( function() {
+	// schedule a timer
+	// the execution won't go past this point until it resolves
+	// if onclick is called again the timer gets rescheduled
+	$mol_wait_timeout( 1000 )
	const { profile } = fetchJSON( 'https://example.org/input' )
	console.log( profile )
} )
1.0.1024

1 day ago

1.0.1023

2 days ago

1.0.1022

3 days ago

1.0.1021

4 days ago

1.0.1020

5 days ago

1.0.1019

6 days ago

1.0.1018

7 days ago

1.0.1017

8 days ago

1.0.1016

9 days ago

1.0.1015

9 days ago

1.0.1014

10 days ago

1.0.1013

11 days ago

1.0.1012

12 days ago

1.0.1011

13 days ago

1.0.1010

14 days ago

1.0.1009

15 days ago

1.0.1008

16 days ago

1.0.1007

17 days ago

1.0.1006

18 days ago

1.0.1005

19 days ago

1.0.1004

20 days ago

1.0.1003

21 days ago

1.0.1002

22 days ago

1.0.1001

23 days ago

1.0.1000

24 days ago

1.0.999

25 days ago

1.0.998

26 days ago

1.0.997

27 days ago

1.0.996

28 days ago

1.0.994

1 month ago

1.0.995

29 days ago

1.0.993

1 month ago

1.0.992

1 month ago

1.0.991

1 month ago

1.0.990

1 month ago

1.0.989

1 month ago

1.0.988

1 month ago

1.0.987

1 month ago

1.0.986

1 month ago

1.0.985

1 month ago

1.0.984

1 month ago

1.0.983

1 month ago

1.0.982

1 month ago

1.0.981

1 month ago

1.0.980

1 month ago

1.0.979

2 months ago

1.0.976

2 months ago

1.0.978

2 months ago

1.0.977

2 months ago

1.0.975

2 months ago

1.0.972

2 months ago

1.0.974

2 months ago

1.0.973

2 months ago

1.0.971

2 months ago

1.0.970

2 months ago

1.0.969

2 months ago

1.0.968

2 months ago

1.0.967

2 months ago

1.0.966

2 months ago

1.0.965

2 months ago

1.0.964

2 months ago

1.0.961

2 months ago

1.0.963

2 months ago

1.0.962

2 months ago

1.0.960

2 months ago

1.0.959

2 months ago

1.0.958

2 months ago

1.0.957

2 months ago

1.0.956

2 months ago

1.0.955

2 months ago

1.0.954

2 months ago

1.0.953

2 months ago

1.0.952

2 months ago

1.0.951

2 months ago

1.0.950

2 months ago

1.0.949

2 months ago

1.0.948

2 months ago

1.0.947

2 months ago

1.0.945

2 months ago

1.0.944

2 months ago

1.0.946

2 months ago

1.0.943

2 months ago

1.0.942

2 months ago

1.0.941

2 months ago

1.0.940

2 months ago

1.0.939

2 months ago

1.0.936

3 months ago

1.0.935

3 months ago

1.0.938

3 months ago

1.0.937

3 months ago

1.0.934

3 months ago

1.0.933

3 months ago

1.0.932

3 months ago

1.0.931

3 months ago

1.0.930

3 months ago

1.0.929

3 months ago

1.0.928

3 months ago

1.0.927

3 months ago

1.0.926

3 months ago

1.0.925

3 months ago

1.0.924

3 months ago

1.0.921

3 months ago

1.0.920

3 months ago

1.0.923

3 months ago

1.0.922

3 months ago

1.0.919

3 months ago

1.0.918

3 months ago

1.0.917

3 months ago

1.0.916

3 months ago

1.0.915

3 months ago

1.0.914

3 months ago

1.0.913

3 months ago

1.0.912

3 months ago

1.0.910

3 months ago

1.0.911

3 months ago

1.0.907

3 months ago

1.0.906

3 months ago

1.0.909

3 months ago

1.0.908

3 months ago

1.0.903

3 months ago

1.0.902

3 months ago

1.0.905

3 months ago

1.0.904

3 months ago

1.0.901

3 months ago

1.0.900

3 months ago

1.0.899

3 months ago

1.0.898

3 months ago

1.0.895

3 months ago

1.0.894

3 months ago

1.0.897

3 months ago

1.0.896

3 months ago

1.0.893

3 months ago

1.0.891

4 months ago

1.0.892

4 months ago

1.0.890

4 months ago

1.0.889

4 months ago

1.0.888

4 months ago

1.0.887

4 months ago

1.0.886

4 months ago

1.0.882

4 months ago

1.0.881

4 months ago

1.0.884

4 months ago

1.0.883

4 months ago

1.0.885

4 months ago

1.0.880

4 months ago

1.0.879

4 months ago

1.0.877

4 months ago

1.0.876

4 months ago

1.0.878

4 months ago

1.0.875

4 months ago

1.0.874

4 months ago

1.0.873

4 months ago

1.0.872

4 months ago

1.0.871

4 months ago

1.0.870

4 months ago

1.0.869

4 months ago

1.0.866

4 months ago

1.0.865

4 months ago

1.0.868

4 months ago

1.0.867

4 months ago

1.0.864

4 months ago

1.0.863

4 months ago

1.0.860

4 months ago

1.0.862

4 months ago

1.0.861

4 months ago

1.0.859

4 months ago

1.0.858

4 months ago

1.0.857

4 months ago

1.0.855

4 months ago

1.0.856

4 months ago

1.0.854

4 months ago

1.0.853

4 months ago

1.0.852

4 months ago

1.0.851

5 months ago

1.0.850

5 months ago

1.0.848

5 months ago

1.0.847

5 months ago

1.0.849

5 months ago

1.0.846

5 months ago

1.0.844

5 months ago

1.0.845

5 months ago

1.0.843

5 months ago

1.0.840

5 months ago

1.0.842

5 months ago

1.0.841

5 months ago

1.0.839

5 months ago

1.0.838

5 months ago

1.0.837

5 months ago

1.0.836

5 months ago

1.0.835

5 months ago

1.0.834

5 months ago

1.0.833

5 months ago

1.0.832

5 months ago

1.0.831

5 months ago

1.0.830

5 months ago

1.0.829

5 months ago

1.0.828

5 months ago

1.0.827

5 months ago

1.0.822

5 months ago

1.0.821

5 months ago

1.0.824

5 months ago

1.0.823

5 months ago

1.0.820

5 months ago

1.0.819

5 months ago

1.0.818

5 months ago

1.0.815

6 months ago

1.0.814

6 months ago

1.0.817

5 months ago

1.0.816

6 months ago

1.0.811

6 months ago

1.0.810

6 months ago

1.0.813

6 months ago

1.0.812

6 months ago

1.0.808

6 months ago

1.0.807

6 months ago

1.0.809

6 months ago

1.0.804

6 months ago

1.0.803

6 months ago

1.0.806

6 months ago

1.0.805

6 months ago

1.0.826

5 months ago

1.0.825

5 months ago

1.0.800

6 months ago

1.0.802

6 months ago

1.0.801

6 months ago

1.0.781

7 months ago

1.0.780

7 months ago

1.0.783

7 months ago

1.0.782

7 months ago

1.0.789

6 months ago

1.0.788

6 months ago

1.0.785

6 months ago

1.0.784

6 months ago

1.0.787

6 months ago

1.0.786

6 months ago

1.0.770

7 months ago

1.0.772

7 months ago

1.0.771

7 months ago

1.0.778

7 months ago

1.0.777

7 months ago

1.0.779

7 months ago

1.0.774

7 months ago

1.0.773

7 months ago

1.0.776

7 months ago

1.0.775

7 months ago

1.0.792

6 months ago

1.0.791

6 months ago

1.0.794

6 months ago

1.0.793

6 months ago

1.0.790

6 months ago

1.0.799

6 months ago

1.0.796

6 months ago

1.0.795

6 months ago

1.0.798

6 months ago

1.0.797

6 months ago

1.0.745

8 months ago

1.0.744

8 months ago

1.0.747

8 months ago

1.0.746

8 months ago

1.0.741

8 months ago

1.0.740

8 months ago

1.0.743

8 months ago

1.0.742

8 months ago

1.0.738

8 months ago

1.0.737

8 months ago

1.0.739

8 months ago

1.0.761

7 months ago

1.0.760

7 months ago

1.0.767

7 months ago

1.0.766

7 months ago

1.0.769

7 months ago

1.0.768

7 months ago

1.0.763

7 months ago

1.0.762

7 months ago

1.0.765

7 months ago

1.0.764

7 months ago

1.0.759

7 months ago

1.0.750

8 months ago

1.0.756

7 months ago

1.0.755

7 months ago

1.0.758

7 months ago

1.0.757

7 months ago

1.0.752

7 months ago

1.0.751

7 months ago

1.0.754

7 months ago

1.0.753

7 months ago

1.0.749

8 months ago

1.0.748

8 months ago

1.0.734

8 months ago

1.0.733

8 months ago

1.0.736

8 months ago

1.0.735

8 months ago

1.0.730

8 months ago

1.0.732

8 months ago

1.0.731

8 months ago

1.0.727

8 months ago

1.0.726

8 months ago

1.0.729

8 months ago

1.0.728

8 months ago

1.0.723

8 months ago

1.0.722

8 months ago

1.0.725

8 months ago

1.0.724

8 months ago

1.0.721

8 months ago

1.0.720

8 months ago

1.0.719

8 months ago

1.0.716

8 months ago

1.0.715

9 months ago

1.0.718

8 months ago

1.0.717

8 months ago

1.0.660

10 months ago

1.0.662

10 months ago

1.0.661

10 months ago

1.0.668

10 months ago

1.0.667

10 months ago

1.0.669

10 months ago

1.0.664

10 months ago

1.0.663

10 months ago

1.0.666

10 months ago

1.0.665

10 months ago

1.0.651

10 months ago

1.0.650

10 months ago

1.0.657

10 months ago

1.0.656

10 months ago

1.0.659

10 months ago

1.0.658

10 months ago

1.0.653

10 months ago

1.0.652

10 months ago

1.0.655

10 months ago

1.0.654

10 months ago

1.0.649

11 months ago

1.0.682

10 months ago

1.0.681

10 months ago

1.0.684

10 months ago

1.0.683

10 months ago

1.0.680

10 months ago

1.0.689

9 months ago

1.0.686

9 months ago

1.0.685

10 months ago

1.0.688

9 months ago

1.0.687

9 months ago

1.0.671

10 months ago

1.0.670

10 months ago

1.0.673

10 months ago

1.0.672

10 months ago

1.0.679

10 months ago

1.0.678

10 months ago

1.0.675

10 months ago

1.0.674

10 months ago

1.0.677

10 months ago

1.0.676

10 months ago

1.0.624

11 months ago

1.0.623

11 months ago

1.0.626

11 months ago

1.0.625

11 months ago

1.0.620

11 months ago

1.0.622

11 months ago

1.0.621

11 months ago

1.0.617

11 months ago

1.0.616

11 months ago

1.0.619

11 months ago

1.0.618

11 months ago

1.0.613

12 months ago

1.0.612

12 months ago

1.0.615

11 months ago

1.0.614

12 months ago

1.0.611

12 months ago

1.0.610

12 months ago

1.0.609

12 months ago

1.0.606

12 months ago

1.0.605

12 months ago

1.0.608

12 months ago

1.0.607

12 months ago

1.0.640

11 months ago

1.0.646

11 months ago

1.0.645

11 months ago

1.0.648

11 months ago

1.0.647

11 months ago

1.0.642

11 months ago

1.0.641

11 months ago

1.0.644

11 months ago

1.0.643

11 months ago

1.0.639

11 months ago

1.0.638

11 months ago

1.0.635

11 months ago

1.0.634

11 months ago

1.0.637

11 months ago

1.0.636

11 months ago

1.0.631

11 months ago

1.0.630

11 months ago

1.0.633

11 months ago

1.0.632

11 months ago

1.0.628

11 months ago

1.0.627

11 months ago

1.0.629

11 months ago

1.0.693

9 months ago

1.0.692

9 months ago

1.0.695

9 months ago

1.0.694

9 months ago

1.0.691

9 months ago

1.0.690

9 months ago

1.0.697

9 months ago

1.0.696

9 months ago

1.0.699

9 months ago

1.0.698

9 months ago

1.0.596

12 months ago

1.0.595

12 months ago

1.0.598

12 months ago

1.0.597

12 months ago

1.0.599

12 months ago

1.0.701

9 months ago

1.0.700

9 months ago

1.0.703

9 months ago

1.0.702

9 months ago

1.0.602

12 months ago

1.0.601

12 months ago

1.0.604

12 months ago

1.0.603

12 months ago

1.0.600

12 months ago

1.0.712

9 months ago

1.0.711

9 months ago

1.0.714

9 months ago

1.0.713

9 months ago

1.0.710

9 months ago

1.0.709

9 months ago

1.0.708

9 months ago

1.0.705

9 months ago

1.0.704

9 months ago

1.0.707

9 months ago

1.0.706

9 months ago

1.0.549

1 year ago

1.0.561

1 year ago

1.0.560

1 year ago

1.0.563

1 year ago

1.0.562

1 year ago

1.0.569

1 year ago

1.0.568

1 year ago

1.0.565

1 year ago

1.0.564

1 year ago

1.0.567

1 year ago

1.0.566

1 year ago

1.0.550

1 year ago

1.0.552

1 year ago

1.0.551

1 year ago

1.0.558

1 year ago

1.0.557

1 year ago

1.0.559

1 year ago

1.0.554

1 year ago

1.0.553

1 year ago

1.0.556

1 year ago

1.0.555

1 year ago

1.0.583

1 year ago

1.0.582

1 year ago

1.0.585

1 year ago

1.0.584

1 year ago

1.0.581

1 year ago

1.0.580

1 year ago

1.0.587

1 year ago

1.0.586

1 year ago

1.0.589

12 months ago

1.0.588

1 year ago

1.0.572

1 year ago

1.0.571

1 year ago

1.0.574

1 year ago

1.0.573

1 year ago

1.0.570

1 year ago

1.0.579

1 year ago

1.0.576

1 year ago

1.0.575

1 year ago

1.0.578

1 year ago

1.0.577

1 year ago

1.0.594

12 months ago

1.0.593

12 months ago

1.0.590

12 months ago

1.0.592

12 months ago

1.0.591

12 months ago

1.0.541

1 year ago

1.0.540

1 year ago

1.0.547

1 year ago

1.0.546

1 year ago

1.0.548

1 year ago

1.0.543

1 year ago

1.0.542

1 year ago

1.0.545

1 year ago

1.0.544

1 year ago

1.0.539

1 year ago

1.0.530

1 year ago

1.0.536

1 year ago

1.0.535

1 year ago

1.0.538

1 year ago

1.0.537

1 year ago

1.0.532

1 year ago

1.0.531

1 year ago

1.0.534

1 year ago

1.0.533

1 year ago

1.0.529

1 year ago

1.0.528

1 year ago

1.0.440

1 year ago

1.0.442

1 year ago

1.0.441

1 year ago

1.0.448

1 year ago

1.0.447

1 year ago

1.0.449

1 year ago

1.0.444

1 year ago

1.0.443

1 year ago

1.0.446

1 year ago

1.0.445

1 year ago

1.0.437

1 year ago

1.0.436

1 year ago

1.0.439

1 year ago

1.0.438

1 year ago

1.0.503

1 year ago

1.0.502

1 year ago

1.0.505

1 year ago

1.0.504

1 year ago

1.0.501

1 year ago

1.0.500

1 year ago

1.0.525

1 year ago

1.0.524

1 year ago

1.0.527

1 year ago

1.0.526

1 year ago

1.0.521

1 year ago

1.0.520

1 year ago

1.0.523

1 year ago

1.0.522

1 year ago

1.0.518

1 year ago

1.0.517

1 year ago

1.0.519

1 year ago

1.0.514

1 year ago

1.0.513

1 year ago

1.0.516

1 year ago

1.0.515

1 year ago

1.0.510

1 year ago

1.0.512

1 year ago

1.0.511

1 year ago

1.0.507

1 year ago

1.0.506

1 year ago

1.0.509

1 year ago

1.0.508

1 year ago

1.0.495

1 year ago

1.0.494

1 year ago

1.0.497

1 year ago

1.0.496

1 year ago

1.0.491

1 year ago

1.0.490

1 year ago

1.0.493

1 year ago

1.0.492

1 year ago

1.0.499

1 year ago

1.0.498

1 year ago

1.0.462

1 year ago

1.0.461

1 year ago

1.0.464

1 year ago

1.0.463

1 year ago

1.0.460

1 year ago

1.0.469

1 year ago

1.0.466

1 year ago

1.0.465

1 year ago

1.0.468

1 year ago

1.0.467

1 year ago

1.0.451

1 year ago

1.0.450

1 year ago

1.0.453

1 year ago

1.0.452

1 year ago

1.0.459

1 year ago

1.0.458

1 year ago

1.0.455

1 year ago

1.0.454

1 year ago

1.0.457

1 year ago

1.0.456

1 year ago

1.0.484

1 year ago

1.0.483

1 year ago

1.0.486

1 year ago

1.0.485

1 year ago

1.0.480

1 year ago

1.0.482

1 year ago

1.0.481

1 year ago

1.0.488

1 year ago

1.0.487

1 year ago

1.0.489

1 year ago

1.0.473

1 year ago

1.0.472

1 year ago

1.0.475

1 year ago

1.0.474

1 year ago

1.0.471

1 year ago

1.0.470

1 year ago

1.0.477

1 year ago

1.0.476

1 year ago

1.0.479

1 year ago

1.0.478

1 year ago

1.0.420

1 year ago

1.0.426

1 year ago

1.0.425

1 year ago

1.0.428

1 year ago

1.0.427

1 year ago

1.0.422

1 year ago

1.0.421

1 year ago

1.0.424

1 year ago

1.0.423

1 year ago

1.0.419

1 year ago

1.0.418

1 year ago

1.0.415

1 year ago

1.0.414

1 year ago

1.0.417

1 year ago

1.0.416

1 year ago

1.0.411

1 year ago

1.0.410

1 year ago

1.0.413

1 year ago

1.0.412

1 year ago

1.0.408

1 year ago

1.0.407

1 year ago

1.0.409

1 year ago

1.0.431

1 year ago

1.0.430

1 year ago

1.0.433

1 year ago

1.0.432

1 year ago

1.0.435

1 year ago

1.0.434

1 year ago

1.0.429

1 year ago

1.0.404

1 year ago

1.0.403

1 year ago

1.0.406

1 year ago

1.0.405

1 year ago

1.0.400

1 year ago

1.0.402

1 year ago

1.0.401

1 year ago

1.0.385

1 year ago

1.0.384

1 year ago

1.0.387

1 year ago

1.0.386

1 year ago

1.0.381

1 year ago

1.0.380

1 year ago

1.0.383

1 year ago

1.0.382

1 year ago

1.0.389

1 year ago

1.0.388

1 year ago

1.0.374

1 year ago

1.0.373

1 year ago

1.0.376

1 year ago

1.0.375

1 year ago

1.0.370

1 year ago

1.0.372

1 year ago

1.0.371

1 year ago

1.0.378

1 year ago

1.0.377

1 year ago

1.0.379

1 year ago

1.0.396

1 year ago

1.0.395

1 year ago

1.0.398

1 year ago

1.0.397

1 year ago

1.0.392

1 year ago

1.0.391

1 year ago

1.0.394

1 year ago

1.0.393

1 year ago

1.0.399

1 year ago

1.0.390

1 year ago

1.0.341

2 years ago

1.0.340

2 years ago

1.0.343

2 years ago

1.0.342

2 years ago

1.0.349

2 years ago

1.0.348

2 years ago

1.0.345

2 years ago

1.0.344

2 years ago

1.0.347

2 years ago

1.0.346

2 years ago

1.0.332

2 years ago

1.0.331

2 years ago

1.0.338

2 years ago

1.0.337

2 years ago

1.0.339

2 years ago

1.0.334

2 years ago

1.0.333

2 years ago

1.0.336

2 years ago

1.0.335

2 years ago

1.0.363

2 years ago

1.0.362

2 years ago

1.0.365

1 year ago

1.0.364

2 years ago

1.0.361

2 years ago

1.0.360

2 years ago

1.0.367

1 year ago

1.0.366

1 year ago

1.0.369

1 year ago

1.0.368

1 year ago

1.0.352

2 years ago

1.0.351

2 years ago

1.0.354

2 years ago

1.0.353

2 years ago

1.0.350

2 years ago

1.0.359

2 years ago

1.0.356

2 years ago

1.0.355

2 years ago

1.0.358

2 years ago

1.0.357

2 years ago

1.0.305

2 years ago

1.0.304

2 years ago

1.0.307

2 years ago

1.0.306

2 years ago

1.0.301

2 years ago

1.0.300

2 years ago

1.0.303

2 years ago

1.0.302

2 years ago

1.0.321

2 years ago

1.0.320

2 years ago

1.0.327

2 years ago

1.0.326

2 years ago

1.0.329

2 years ago

1.0.328

2 years ago

1.0.323

2 years ago

1.0.322

2 years ago

1.0.325

2 years ago

1.0.324

2 years ago

1.0.319

2 years ago

1.0.310

2 years ago

1.0.316

2 years ago

1.0.315

2 years ago

1.0.318

2 years ago

1.0.317

2 years ago

1.0.312

2 years ago

1.0.311

2 years ago

1.0.314

2 years ago

1.0.313

2 years ago

1.0.309

2 years ago

1.0.308

2 years ago

1.0.297

2 years ago

1.0.296

2 years ago

1.0.299

2 years ago

1.0.298

2 years ago

1.0.293

2 years ago

1.0.292

2 years ago

1.0.295

2 years ago

1.0.294

2 years ago

1.0.291

2 years ago

1.0.290

2 years ago

1.0.286

2 years ago

1.0.285

2 years ago

1.0.288

2 years ago

1.0.287

2 years ago

1.0.284

2 years ago

1.0.283

2 years ago

1.0.289

2 years ago

1.0.330

2 years ago

1.0.200

2 years ago

1.0.206

2 years ago

1.0.205

2 years ago

1.0.208

2 years ago

1.0.207

2 years ago

1.0.202

2 years ago

1.0.201

2 years ago

1.0.204

2 years ago

1.0.203

2 years ago

1.0.187

2 years ago

1.0.186

2 years ago

1.0.189

2 years ago

1.0.188

2 years ago

1.0.183

2 years ago

1.0.182

2 years ago

1.0.185

2 years ago

1.0.184

2 years ago

1.0.181

2 years ago

1.0.180

2 years ago

1.0.176

2 years ago

1.0.175

2 years ago

1.0.178

2 years ago

1.0.177

2 years ago

1.0.172

2 years ago

1.0.171

2 years ago

1.0.174

2 years ago

1.0.173

2 years ago

1.0.179

2 years ago

1.0.170

2 years ago

1.0.198

2 years ago

1.0.197

2 years ago

1.0.199

2 years ago

1.0.194

2 years ago

1.0.193

2 years ago

1.0.196

2 years ago

1.0.195

2 years ago

1.0.190

2 years ago

1.0.192

2 years ago

1.0.191

2 years ago

1.0.264

2 years ago

1.0.263

2 years ago

1.0.266

2 years ago

1.0.265

2 years ago

1.0.260

2 years ago

1.0.262

2 years ago

1.0.261

2 years ago

1.0.268

2 years ago

1.0.267

2 years ago

1.0.269

2 years ago

1.0.253

2 years ago

1.0.252

2 years ago

1.0.255

2 years ago

1.0.254

2 years ago

1.0.251

2 years ago

1.0.250

2 years ago

1.0.257

2 years ago

1.0.256

2 years ago

1.0.259

2 years ago

1.0.258

2 years ago

1.0.165

2 years ago

1.0.164

2 years ago

1.0.167

2 years ago

1.0.166

2 years ago

1.0.282

2 years ago

1.0.161

2 years ago

1.0.281

2 years ago

1.0.160

2 years ago

1.0.163

2 years ago

1.0.162

2 years ago

1.0.169

2 years ago

1.0.168

2 years ago

1.0.280

2 years ago

1.0.275

2 years ago

1.0.274

2 years ago

1.0.277

2 years ago

1.0.276

2 years ago

1.0.271

2 years ago

1.0.270

2 years ago

1.0.273

2 years ago

1.0.272

2 years ago

1.0.279

2 years ago

1.0.158

2 years ago

1.0.278

2 years ago

1.0.157

2 years ago

1.0.159

2 years ago

1.0.220

2 years ago

1.0.222

2 years ago

1.0.221

2 years ago

1.0.228

2 years ago

1.0.227

2 years ago

1.0.229

2 years ago

1.0.224

2 years ago

1.0.223

2 years ago

1.0.226

2 years ago

1.0.225

2 years ago

1.0.211

2 years ago

1.0.210

2 years ago

1.0.217

2 years ago

1.0.216

2 years ago

1.0.219

2 years ago

1.0.218

2 years ago

1.0.213

2 years ago

1.0.212

2 years ago

1.0.215

2 years ago

1.0.214

2 years ago

1.0.209

2 years ago

1.0.242

2 years ago

1.0.241

2 years ago

1.0.244

2 years ago

1.0.243

2 years ago

1.0.240

2 years ago

1.0.249

2 years ago

1.0.246

2 years ago

1.0.245

2 years ago

1.0.248

2 years ago

1.0.247

2 years ago

1.0.231

2 years ago

1.0.230

2 years ago

1.0.233

2 years ago

1.0.232

2 years ago

1.0.239

2 years ago

1.0.238

2 years ago

1.0.235

2 years ago

1.0.234

2 years ago

1.0.237

2 years ago

1.0.236

2 years ago

1.0.143

2 years ago

1.0.142

2 years ago

1.0.145

2 years ago

1.0.144

2 years ago

1.0.141

2 years ago

1.0.140

2 years ago

1.0.147

2 years ago

1.0.146

2 years ago

1.0.149

2 years ago

1.0.148

2 years ago

1.0.132

2 years ago

1.0.131

2 years ago

1.0.134

2 years ago

1.0.133

2 years ago

1.0.130

2 years ago

1.0.139

2 years ago

1.0.136

2 years ago

1.0.135

2 years ago

1.0.138

2 years ago

1.0.137

2 years ago

1.0.154

2 years ago

1.0.153

2 years ago

1.0.156

2 years ago

1.0.155

2 years ago

1.0.150

2 years ago

1.0.152

2 years ago

1.0.151

2 years ago

1.0.129

2 years ago

1.0.66

2 years ago

1.0.65

2 years ago

1.0.69

2 years ago

1.0.68

2 years ago

1.0.67

2 years ago

1.0.73

2 years ago

1.0.72

2 years ago

1.0.71

2 years ago

1.0.70

2 years ago

1.0.77

2 years ago

1.0.76

2 years ago

1.0.75

2 years ago

1.0.74

2 years ago

1.0.79

2 years ago

1.0.78

2 years ago

1.0.101

2 years ago

1.0.100

2 years ago

1.0.107

2 years ago

1.0.106

2 years ago

1.0.109

2 years ago

1.0.108

2 years ago

1.0.103

2 years ago

1.0.102

2 years ago

1.0.105

2 years ago

1.0.104

2 years ago

1.0.121

2 years ago

1.0.120

2 years ago

1.0.123

2 years ago

1.0.122

2 years ago

1.0.128

2 years ago

1.0.125

2 years ago

1.0.124

2 years ago

1.0.127

2 years ago

1.0.126

2 years ago

1.0.80

2 years ago

1.0.84

2 years ago

1.0.83

2 years ago

1.0.82

2 years ago

1.0.81

2 years ago

1.0.88

2 years ago

1.0.87

2 years ago

1.0.86

2 years ago

1.0.85

2 years ago

1.0.89

2 years ago

1.0.110

2 years ago

1.0.112

2 years ago

1.0.111

2 years ago

1.0.118

2 years ago

1.0.117

2 years ago

1.0.119

2 years ago

1.0.114

2 years ago

1.0.113

2 years ago

1.0.116

2 years ago

1.0.115

2 years ago

1.0.91

2 years ago

1.0.90

2 years ago

1.0.95

2 years ago

1.0.94

2 years ago

1.0.93

2 years ago

1.0.92

2 years ago

1.0.99

2 years ago

1.0.98

2 years ago

1.0.97

2 years ago

1.0.96

2 years ago

1.0.62

2 years ago

1.0.61

2 years ago

1.0.60

2 years ago

1.0.64

2 years ago

1.0.63

2 years ago

1.0.55

2 years ago

1.0.59

2 years ago

1.0.58

2 years ago

1.0.57

2 years ago

1.0.56

2 years ago

1.0.54

2 years ago

1.0.53

2 years ago

1.0.52

2 years ago

1.0.51

2 years ago

1.0.50

2 years ago

1.0.49

2 years ago

1.0.48

2 years ago

1.0.47

2 years ago

1.0.46

2 years ago

1.0.45

2 years ago

1.0.44

2 years ago

1.0.43

2 years ago

1.0.42

2 years ago

1.0.41

2 years ago

1.0.40

2 years ago

1.0.39

2 years ago

1.0.38

2 years ago

1.0.37

2 years ago

1.0.36

2 years ago

1.0.35

2 years ago

1.0.34

2 years ago

1.0.33

2 years ago

1.0.32

2 years ago

1.0.31

2 years ago

1.0.30

2 years ago

1.0.29

2 years ago

1.0.28

2 years ago

1.0.27

2 years ago

1.0.26

2 years ago

1.0.25

2 years ago

1.0.24

2 years ago

1.0.23

2 years ago

1.0.22

2 years ago

1.0.21

2 years ago

1.0.20

2 years ago

1.0.19

2 years ago

1.0.18

2 years ago

1.0.17

2 years ago

1.0.16

2 years ago

1.0.15

2 years ago

1.0.14

2 years ago

1.0.13

2 years ago

1.0.12

2 years ago

1.0.11

2 years ago

1.0.10

2 years ago

1.0.9

2 years ago

1.0.8

2 years ago

1.0.7

2 years ago

1.0.6

2 years ago

1.0.5

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago

0.0.1

2 years ago