Commit 7df3caea authored by Ali El Amrani's avatar Ali El Amrani

[D3 bug resolved] addition of d3charge

parent 65b21810
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
// Generated by purs bundle 0.14.3
var PS = {};
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Control.Apply"] = $PS["Control.Apply"] || {};
var exports = $PS["Control.Apply"];
var Apply = function (Functor0, apply) {
this.Functor0 = Functor0;
this.apply = apply;
};
var apply = function (dict) {
return dict.apply;
};
exports["Apply"] = Apply;
exports["apply"] = apply;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Control.Applicative"] = $PS["Control.Applicative"] || {};
var exports = $PS["Control.Applicative"];
var Control_Apply = $PS["Control.Apply"];
var Applicative = function (Apply0, pure) {
this.Apply0 = Apply0;
this.pure = pure;
};
var pure = function (dict) {
return dict.pure;
};
var liftA1 = function (dictApplicative) {
return function (f) {
return function (a) {
return Control_Apply.apply(dictApplicative.Apply0())(pure(dictApplicative)(f))(a);
};
};
};
exports["Applicative"] = Applicative;
exports["pure"] = pure;
exports["liftA1"] = liftA1;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
......@@ -77,6 +38,90 @@ var PS = {};
exports["identity"] = identity;
exports["categoryFn"] = categoryFn;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Data.Function"] = $PS["Data.Function"] || {};
var exports = $PS["Data.Function"];
var flip = function (f) {
return function (b) {
return function (a) {
return f(a)(b);
};
};
};
var $$const = function (a) {
return function (v) {
return a;
};
};
exports["flip"] = flip;
exports["const"] = $$const;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Data.Functor"] = $PS["Data.Functor"] || {};
var exports = $PS["Data.Functor"];
var Functor = function (map) {
this.map = map;
};
var map = function (dict) {
return dict.map;
};
exports["Functor"] = Functor;
exports["map"] = map;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Control.Apply"] = $PS["Control.Apply"] || {};
var exports = $PS["Control.Apply"];
var Control_Category = $PS["Control.Category"];
var Data_Function = $PS["Data.Function"];
var Data_Functor = $PS["Data.Functor"];
var Apply = function (Functor0, apply) {
this.Functor0 = Functor0;
this.apply = apply;
};
var apply = function (dict) {
return dict.apply;
};
var applySecond = function (dictApply) {
return function (a) {
return function (b) {
return apply(dictApply)(Data_Functor.map(dictApply.Functor0())(Data_Function["const"](Control_Category.identity(Control_Category.categoryFn)))(a))(b);
};
};
};
exports["Apply"] = Apply;
exports["apply"] = apply;
exports["applySecond"] = applySecond;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Control.Applicative"] = $PS["Control.Applicative"] || {};
var exports = $PS["Control.Applicative"];
var Control_Apply = $PS["Control.Apply"];
var Applicative = function (Apply0, pure) {
this.Apply0 = Apply0;
this.pure = pure;
};
var pure = function (dict) {
return dict.pure;
};
var liftA1 = function (dictApplicative) {
return function (f) {
return function (a) {
return Control_Apply.apply(dictApplicative.Apply0())(pure(dictApplicative)(f))(a);
};
};
};
exports["Applicative"] = Applicative;
exports["pure"] = pure;
exports["liftA1"] = liftA1;
})(PS);
(function(exports) {
"use strict";
......@@ -162,40 +207,6 @@ var PS = {};
exports["foldl"] = foldl;
exports["foldableArray"] = foldableArray;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Data.Function"] = $PS["Data.Function"] || {};
var exports = $PS["Data.Function"];
var flip = function (f) {
return function (b) {
return function (a) {
return f(a)(b);
};
};
};
var $$const = function (a) {
return function (v) {
return a;
};
};
exports["flip"] = flip;
exports["const"] = $$const;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Data.Functor"] = $PS["Data.Functor"] || {};
var exports = $PS["Data.Functor"];
var Functor = function (map) {
this.map = map;
};
var map = function (dict) {
return dict.map;
};
exports["Functor"] = Functor;
exports["map"] = map;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
......@@ -334,7 +345,9 @@ var PS = {};
(function(exports) {
/* eslint-disable no-eq-null, eqeqeq */
"use strict";
"use strict";
exports["null"] = null;
exports.nullable = function (a, r, f) {
return a == null ? r : f(a);
......@@ -351,6 +364,7 @@ var PS = {};
return $foreign.nullable(n, Data_Maybe.Nothing.value, Data_Maybe.Just.create);
};
exports["toMaybe"] = toMaybe;
exports["null"] = $foreign["null"];
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
......@@ -402,6 +416,32 @@ var PS = {};
exports.react = require("react");
exports.reactDOM = require('react-dom');
})(PS["Reactix.React"] = PS["Reactix.React"] || {});
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Control.Bind"] = $PS["Control.Bind"] || {};
var exports = $PS["Control.Bind"];
var Bind = function (Apply0, bind) {
this.Apply0 = Apply0;
this.bind = bind;
};
var Discard = function (discard) {
this.discard = discard;
};
var discard = function (dict) {
return dict.discard;
};
var bind = function (dict) {
return dict.bind;
};
var discardUnit = new Discard(function (dictBind) {
return bind(dictBind);
});
exports["Bind"] = Bind;
exports["bind"] = bind;
exports["discard"] = discard;
exports["discardUnit"] = discardUnit;
})(PS);
(function(exports) {
"use strict";
......@@ -419,21 +459,6 @@ var PS = {};
};
};
})(PS["Effect"] = PS["Effect"] || {});
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Control.Bind"] = $PS["Control.Bind"] || {};
var exports = $PS["Control.Bind"];
var Bind = function (Apply0, bind) {
this.Apply0 = Apply0;
this.bind = bind;
};
var bind = function (dict) {
return dict.bind;
};
exports["Bind"] = Bind;
exports["bind"] = bind;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
......@@ -488,6 +513,7 @@ var PS = {};
exports["functorEffect"] = functorEffect;
exports["applyEffect"] = applyEffect;
exports["applicativeEffect"] = applicativeEffect;
exports["bindEffect"] = bindEffect;
exports["monadEffect"] = monadEffect;
})(PS);
(function(exports) {
......@@ -561,6 +587,7 @@ var PS = {};
var $foreign = $PS["Reactix.React"];
var Control_Applicative = $PS["Control.Applicative"];
var Control_Apply = $PS["Control.Apply"];
var Control_Bind = $PS["Control.Bind"];
var Data_Function = $PS["Data.Function"];
var Data_Functor = $PS["Data.Functor"];
var Effect = $PS["Effect"];
......@@ -577,9 +604,13 @@ var PS = {};
var Component = function (x) {
return x;
};
var unsafeHooksEffect = Hooks;
var runHooks = function (v) {
return v;
};
var readRef = function (r) {
return FFI_Simple_Objects["getProperty'"](r)("current");
};
var rawCreateElement = function (c) {
return function (p) {
return function (cs) {
......@@ -617,6 +648,16 @@ var PS = {};
return Control_Apply.apply(Effect.applyEffect)(v)(v1);
};
});
var bindHooks = new Control_Bind.Bind(function () {
return applyHooks;
}, function (v) {
return function (f) {
return function __do() {
var $21 = v();
return runHooks(f($21))();
};
};
});
var applicativeHooks = new Control_Applicative.Applicative(function () {
return applyHooks;
}, (function () {
......@@ -625,11 +666,15 @@ var PS = {};
return Hooks($22($23));
};
})());
exports["unsafeHooksEffect"] = unsafeHooksEffect;
exports["createElement"] = createElement;
exports["createDOMElement"] = createDOMElement;
exports["hooksComponent"] = hooksComponent;
exports["readRef"] = readRef;
exports["applicativeHooks"] = applicativeHooks;
exports["bindHooks"] = bindHooks;
exports["componentIsComponent"] = componentIsComponent;
exports["react"] = $foreign.react;
exports["reactDOM"] = $foreign.reactDOM;
})(PS);
(function(exports) {
......@@ -1341,13 +1386,30 @@ var PS = {};
var $foreign = $PS["Data.String.Common"];
exports["toUpper"] = $foreign.toUpper;
})(PS);
(function(exports) {
"use strict";
exports.unit = {};
})(PS["Data.Unit"] = PS["Data.Unit"] || {});
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Data.Unit"] = $PS["Data.Unit"] || {};
var exports = $PS["Data.Unit"];
var $foreign = $PS["Data.Unit"];
exports["unit"] = $foreign.unit;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Reactix.Utils"] = $PS["Reactix.Utils"] || {};
var exports = $PS["Reactix.Utils"];
var Data_String_CodePoints = $PS["Data.String.CodePoints"];
var Data_String_Common = $PS["Data.String.Common"];
var Data_String_Common = $PS["Data.String.Common"];
var Data_Unit = $PS["Data.Unit"];
var Effect = $PS["Effect"];
var FFI_Simple_Functions = $PS["FFI.Simple.Functions"];
var Reactix_React = $PS["Reactix.React"];
var ucFirst = (function () {
var help = function (v) {
return Data_String_Common.toUpper(v.before) + v.after;
......@@ -1356,7 +1418,11 @@ var PS = {};
return function ($9) {
return help($8($9));
};
})();
})();
var hook = function (f) {
return Reactix_React.unsafeHooksEffect(FFI_Simple_Functions.delay(FFI_Simple_Functions.delayMonad(Effect.monadEffect))(Data_Unit.unit)(f));
};
exports["hook"] = hook;
exports["ucFirst"] = ucFirst;
})(PS);
(function(exports) {
......@@ -1553,19 +1619,160 @@ var PS = {};
exports["infoCorpusR"] = infoCorpusR;
exports["infoPhyloR"] = infoPhyloR;
})(PS);
(function(exports) {
/* global exports */
"use strict";
exports.unsafeForeignProcedure = function(args) {
return function (stmt) {
return Function(wrap(args.slice()))();
function wrap() {
return !args.length ? stmt : 'return function (' + args.shift() + ') { ' + wrap() + ' };';
}
};
};
})(PS["Data.Foreign.EasyFFI"] = PS["Data.Foreign.EasyFFI"] || {});
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Data.Foreign.EasyFFI"] = $PS["Data.Foreign.EasyFFI"] || {};
var exports = $PS["Data.Foreign.EasyFFI"];
var $foreign = $PS["Data.Foreign.EasyFFI"];
var unsafeForeignFunction = function (args) {
return function (expr) {
return $foreign.unsafeForeignProcedure(args)("return " + (expr + ";"));
};
};
exports["unsafeForeignFunction"] = unsafeForeignFunction;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Graphics.D3.Util"] = $PS["Graphics.D3.Util"] || {};
var exports = $PS["Graphics.D3.Util"];
var Data_Foreign_EasyFFI = $PS["Data.Foreign.EasyFFI"];
var ffi = Data_Foreign_EasyFFI.unsafeForeignFunction;
exports["ffi"] = ffi;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Graphics.D3.Selection"] = $PS["Graphics.D3.Selection"] || {};
var exports = $PS["Graphics.D3.Selection"];
var Graphics_D3_Util = $PS["Graphics.D3.Util"];
var Existing = function (attr, attr$prime, attr$prime$prime, remove, style, style$prime, style$prime$prime, text, text$prime, text$prime$prime) {
this.attr = attr;
this["attr'"] = attr$prime;
this["attr''"] = attr$prime$prime;
this.remove = remove;
this.style = style;
this["style'"] = style$prime;
this["style''"] = style$prime$prime;
this.text = text;
this["text'"] = text$prime;
this["text''"] = text$prime$prime;
};
var unsafeText$prime$prime = Graphics_D3_Util.ffi([ "text", "selection", "" ])("selection.text(function (d, i) { return text(d)(i); })");
var unsafeText$prime = Graphics_D3_Util.ffi([ "text", "selection", "" ])("selection.text(text)");
var unsafeText = Graphics_D3_Util.ffi([ "text", "selection", "" ])("selection.text(text)");
var unsafeStyle$prime$prime = Graphics_D3_Util.ffi([ "key", "val", "selection", "" ])("selection.style(key, function (d, i) { return val(d)(i); })");
var unsafeStyle$prime = Graphics_D3_Util.ffi([ "key", "val", "selection", "" ])("selection.style(key, val)");
var unsafeStyle = Graphics_D3_Util.ffi([ "key", "val", "selection", "" ])("selection.style(key, val)");
var unsafeRemove = Graphics_D3_Util.ffi([ "selection", "" ])("selection.remove()");
var unsafeAttr$prime$prime = function (dictAttrValue) {
return Graphics_D3_Util.ffi([ "key", "val", "selection", "" ])("selection.attr(key, function (d, i) { return val(d)(i); })");
};
var unsafeAttr$prime = function (dictAttrValue) {
return Graphics_D3_Util.ffi([ "key", "val", "selection", "" ])("selection.attr(key, val)");
};
var unsafeAttr = function (dictAttrValue) {
return Graphics_D3_Util.ffi([ "key", "val", "selection", "" ])("selection.attr(key, val)");
};
var style = function (dict) {
return dict.style;
};
var rootSelectEl = Graphics_D3_Util.ffi([ "node", "" ])("d3.select(node)");
var existingSelection = new Existing(function (dictAttrValue) {
return unsafeAttr();
}, function (dictAttrValue) {
return unsafeAttr$prime();
}, function (dictAttrValue) {
return unsafeAttr$prime$prime();
}, unsafeRemove, unsafeStyle, unsafeStyle$prime, unsafeStyle$prime$prime, unsafeText, unsafeText$prime, unsafeText$prime$prime);
exports["rootSelectEl"] = rootSelectEl;
exports["style"] = style;
exports["existingSelection"] = existingSelection;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Reactix.Hooks"] = $PS["Reactix.Hooks"] || {};
var exports = $PS["Reactix.Hooks"];
var Control_Applicative = $PS["Control.Applicative"];
var Control_Apply = $PS["Control.Apply"];
var Data_Unit = $PS["Data.Unit"];
var Effect = $PS["Effect"];
var FFI_Simple_Functions = $PS["FFI.Simple.Functions"];
var Reactix_React = $PS["Reactix.React"];
var Reactix_Utils = $PS["Reactix.Utils"];
var useRef = function (r) {
return Reactix_Utils.hook(function (v) {
return Control_Applicative.pure(Effect.applicativeEffect)(FFI_Simple_Functions["applyMethod'"](Reactix_React.react)("useRef")([ r ]));
});
};
var useEffect = function (e) {
return Reactix_Utils.hook(function (v) {
return Control_Applicative.pure(Effect.applicativeEffect)(FFI_Simple_Functions["applyMethod'"](Reactix_React.react)("useEffect")([ e ]));
});
};
var nothing = Control_Applicative.pure(Effect.applicativeEffect)(Data_Unit.unit);
var thenNothing = function (e) {
return Control_Apply.applySecond(Effect.applyEffect)(e)(Control_Applicative.pure(Effect.applicativeEffect)(nothing));
};
var useEffect$prime = function ($19) {
return useEffect(thenNothing($19));
};
exports["useRef"] = useRef;
exports["useEffect'"] = useEffect$prime;
})(PS);
(function($PS) {
"use strict";
$PS["Phylo.Isoline"] = $PS["Phylo.Isoline"] || {};
var exports = $PS["Phylo.Isoline"];
var Control_Applicative = $PS["Control.Applicative"];
var Control_Bind = $PS["Control.Bind"];
var Data_Maybe = $PS["Data.Maybe"];
var Data_Nullable = $PS["Data.Nullable"];
var Data_Unit = $PS["Data.Unit"];
var Effect = $PS["Effect"];
var FFI_Simple_Functions = $PS["FFI.Simple.Functions"];
var Graphics_D3_Selection = $PS["Graphics.D3.Selection"];
var Reactix_DOM_HTML = $PS["Reactix.DOM.HTML"];
var Reactix_Hooks = $PS["Reactix.Hooks"];
var Reactix_React = $PS["Reactix.React"];
var isolineCpt = (function () {
var cpt = function (v) {
return function (v1) {
return Control_Applicative.pure(Reactix_React.applicativeHooks)(Reactix_DOM_HTML.div({
className: "phyloIsoline"
})([ Reactix_DOM_HTML.text("Here lies the isoline") ]));
return Control_Bind.bind(Reactix_React.bindHooks)(Reactix_Hooks.useRef(Data_Nullable["null"]))(function (containerRef) {
return Control_Bind.discard(Control_Bind.discardUnit)(Reactix_React.bindHooks)(Reactix_Hooks["useEffect'"](FFI_Simple_Functions.delay(FFI_Simple_Functions.delayMonad(Effect.monadEffect))(Data_Unit.unit)(function (v2) {
var mContainer = Data_Nullable.toMaybe(Reactix_React.readRef(containerRef));
if (mContainer instanceof Data_Maybe.Nothing) {
return Control_Applicative.pure(Effect.applicativeEffect)(Data_Unit.unit);
};
if (mContainer instanceof Data_Maybe.Just) {
return function __do() {
Control_Bind.bind(Effect.bindEffect)(Graphics_D3_Selection.rootSelectEl(mContainer.value0))(Graphics_D3_Selection.style(Graphics_D3_Selection.existingSelection)("background-color")("#e60101"))();
return Data_Unit.unit;
};
};
throw new Error("Failed pattern match at Phylo.Isoline (line 41, column 9 - line 46, column 22): " + [ mContainer.constructor.name ]);
})))(function () {
return Control_Applicative.pure(Reactix_React.applicativeHooks)(Reactix_DOM_HTML.div({
id: "phyloIsoline",
ref: containerRef
})([ ]));
});
});
};
};
return Reactix_React.hooksComponent("isoline")(cpt);
......@@ -1606,19 +1813,6 @@ var PS = {};
var app = Reactix_React.createElement(Reactix_React.componentIsComponent)(appCpt);
exports["app"] = app;
})(PS);
(function(exports) {
"use strict";
exports.unit = {};
})(PS["Data.Unit"] = PS["Data.Unit"] || {});
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Data.Unit"] = $PS["Data.Unit"] || {};
var exports = $PS["Data.Unit"];
var $foreign = $PS["Data.Unit"];
exports["unit"] = $foreign.unit;
})(PS);
(function(exports) {
'use strict';
......@@ -1672,6 +1866,24 @@ var PS = {};
var document = FFI_Simple_Globals.unsafeGlobal("document");
exports["document"] = document;
})(PS);
(function(exports) {
'use strict';
var d3 =require("d3/dist/d3.js");
if (window !== undefined) {
window.d3 = d3;
}
exports.d3 = d3;
})(PS["Graphics.D3.Base"] = PS["Graphics.D3.Base"] || {});
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
$PS["Graphics.D3.Base"] = $PS["Graphics.D3.Base"] || {};
var exports = $PS["Graphics.D3.Base"];
var $foreign = $PS["Graphics.D3.Base"];
exports["d3"] = $foreign.d3;
})(PS);
(function($PS) {
// Generated by purs version 0.14.3
"use strict";
......@@ -1686,6 +1898,7 @@ var PS = {};
var Data_Unit = $PS["Data.Unit"];
var Effect = $PS["Effect"];
var FFI_Simple_Functions = $PS["FFI.Simple.Functions"];
var Graphics_D3_Base = $PS["Graphics.D3.Base"];
var Reactix_React = $PS["Reactix.React"];
var render = function (e) {
return function (d) {
......@@ -1701,11 +1914,13 @@ var PS = {};
if (v instanceof Data_Maybe.Just) {
return render(App.app({})([ ]))(v.value0);
};
throw new Error("Failed pattern match at Main (line 31, column 1 - line 31, column 38): " + [ v.constructor.name ]);
throw new Error("Failed pattern match at Main (line 32, column 1 - line 32, column 38): " + [ v.constructor.name ]);
};
var main = paint(Data_Nullable.toMaybe(FFI_Simple_Functions["applyMethod'"](DOM_Simple_Document.document)("getElementById")([ "app" ])));
var d3charge = Graphics_D3_Base.d3;
exports["main"] = main;
exports["render"] = render;
exports["paint"] = paint;
exports["d3charge"] = d3charge;
})(PS);
PS["Main"].main();
\ No newline at end of file
......@@ -5,7 +5,7 @@ import Prelude
import App (app)
import DOM.Simple (Element, boundingRect)
import DOM.Simple as DOM
import DOM.Simple.Console (log)
import DOM.Simple.Console (log, log2)
import DOM.Simple.Document (document)
import DOM.Simple.Element (boundingRect)
import DOM.Simple.Types (DOMRect)
......@@ -16,6 +16,7 @@ import Data.Tuple.Nested ((/\))
import Effect (Effect)
import Effect.Class (liftEffect)
import FFI.Simple ((...), delay, args2)
import Graphics.D3.Base
import Phylo.Ressources as PR
import Phylo.Types as PT
import Reactix as R
......@@ -32,7 +33,8 @@ paint :: Maybe Element -> Effect Unit
paint Nothing = log "[main] container not found"
paint (Just c) = render (app {} []) c
d3charge :: D3
d3charge = d3
......
module Phylo.Isoline where
import Graphics.D3.Base
import Prelude
import DOM.Simple.Console (log)
import DOM.Simple.Console (log, log2)
import Data.Array (length)
import Data.Int (toNumber, round)
import Data.Maybe (Maybe(..), fromMaybe, maybe)
import Data.Nullable (null, toMaybe)
import Effect.Aff (Aff, launchAff_)
import FFI.Simple (delay)
import Graphics.D3.Base (D3Eff)
import Graphics.D3.Contour as Contour
import Graphics.D3.Selection as Selection
import Phylo.TypesExample as PTE
......@@ -32,19 +32,20 @@ isoline props = R.createElement isolineCpt props []
isolineCpt :: R.Component Isoline
isolineCpt = R.hooksComponent "isoline" cpt where
cpt {} _ = do
-- containerRef <- R.useRef null
--
-- R.useEffect' $ do
-- delay unit $ \_ -> do
-- let mContainer = toMaybe $ R.readRef containerRef
-- case mContainer of
-- Nothing -> pure unit
-- Just cr -> do
-- _ <- Selection.rootSelectEl cr
--
-- pure unit
-- pure $ H.div {id:"phyloIsoline", ref: containerRef}[]
pure $ H.div {className:"phyloIsoline"}[H.text "Here lies the isoline"]
containerRef <- R.useRef null
R.useEffect' $ do
delay unit $ \_ -> do
let mContainer = toMaybe $ R.readRef containerRef
case mContainer of
Nothing -> pure unit
Just cr -> do
_ <- Selection.rootSelectEl cr
>>= Selection.style "background-color" "#e60101"
pure unit
pure $ H.div {id:"phyloIsoline", ref: containerRef}[]
-- pure $ H.div {className:"phyloIsoline"}[H.text "Here lies the isoline"]
-- drawIsoline :: Array PhyloObject -> Effect Unit
-- drawIsoline branches = do
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment