diff --git a/client/src/main/java/ru/trader/Main.java b/client/src/main/java/ru/trader/Main.java
index 7d2db58..a8e1a92 100644
--- a/client/src/main/java/ru/trader/Main.java
+++ b/client/src/main/java/ru/trader/Main.java
@@ -69,6 +69,7 @@ public class Main extends Application {
if (res == Dialog.Actions.YES) World.save();
else if (res == Dialog.Actions.CANCEL) we.consume();
}
+ World.shutdown();
Screeners.closeAll();
} catch (FileNotFoundException | UnsupportedEncodingException | XMLStreamException e) {
LOG.error("Ошибка при сохранении",e);
diff --git a/client/src/main/java/ru/trader/World.java b/client/src/main/java/ru/trader/World.java
index 74c05f1..f5d56a2 100644
--- a/client/src/main/java/ru/trader/World.java
+++ b/client/src/main/java/ru/trader/World.java
@@ -3,6 +3,8 @@ package ru.trader;
import org.xml.sax.SAXException;
import ru.trader.core.Market;
import ru.trader.core.SimpleMarket;
+import ru.trader.emdn.EMDN;
+import ru.trader.emdn.Station;
import ru.trader.model.ModelFabrica;
import ru.trader.store.Store;
import ru.trader.store.XSSFImporter;
@@ -17,12 +19,14 @@ import java.io.UnsupportedEncodingException;
public class World {
private static Market world;
private static final String STORE_FILE="world.xml";
+ private final static EMDN emdn = new EMDN("tcp://firehose.elite-market-data.net:9050", true);
static {
try {
File file = new File(STORE_FILE);
if (file.exists()) world = Store.loadFromFile(file);
else world = new SimpleMarket();
+ emdn.start();
} catch (ParserConfigurationException | SAXException | IOException e) {
throw new RuntimeException(e);
}
@@ -44,4 +48,11 @@ public class World {
return world;
}
+ public static Station getEMDN(String name){
+ return emdn.getVendor(name);
+ }
+
+ public static void shutdown(){
+ emdn.shutdown();
+ }
}
diff --git a/client/src/main/java/ru/trader/controllers/VendorEditorController.java b/client/src/main/java/ru/trader/controllers/VendorEditorController.java
index 1a69727..9cb1968 100644
--- a/client/src/main/java/ru/trader/controllers/VendorEditorController.java
+++ b/client/src/main/java/ru/trader/controllers/VendorEditorController.java
@@ -15,7 +15,10 @@ import org.controlsfx.control.action.Action;
import org.controlsfx.dialog.Dialog;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import ru.trader.World;
import ru.trader.core.OFFER_TYPE;
+import ru.trader.emdn.ItemData;
+import ru.trader.emdn.Station;
import ru.trader.model.*;
import ru.trader.model.support.BindingsHelper;
import ru.trader.view.support.Localization;
@@ -221,6 +224,21 @@ public class VendorEditorController {
}
}
+ public void updateFromEMDN(){
+ Station emdnData = World.getEMDN(vendor.getName());
+ LOG.debug("Update from EMDN");
+ if (emdnData == null) return;
+ for (FakeOffer offer : items.getItems()) {
+ ItemData data = emdnData.getData(offer.item.getId());
+ LOG.debug("Update item {} to {}", offer.item.getName(), data);
+ if (data != null){
+ offer.setBprice(data.getBuy());
+ offer.setSprice(data.getSell());
+ }
+ }
+ }
+
+
public class FakeOffer {
private final ItemModel item;
private DoubleProperty sprice;
diff --git a/client/src/main/java/ru/trader/model/ItemModel.java b/client/src/main/java/ru/trader/model/ItemModel.java
index 8bbe17d..a2fcad2 100644
--- a/client/src/main/java/ru/trader/model/ItemModel.java
+++ b/client/src/main/java/ru/trader/model/ItemModel.java
@@ -20,6 +20,8 @@ public class ItemModel{
public String getName() {return name != null ? name.get() : item.getName();}
+ public String getId() {return item.getName();}
+
public void setName(String value) {
LOG.info("Change name of item {} to {}", item, name);
market.updateName(this, value);
diff --git a/client/src/main/resources/view/vEditor.fxml b/client/src/main/resources/view/vEditor.fxml
index 822ed0a..76897bf 100644
--- a/client/src/main/resources/view/vEditor.fxml
+++ b/client/src/main/resources/view/vEditor.fxml
@@ -26,6 +26,7 @@
+
diff --git a/utils/src/main/java/ru/trader/emdn/EMDN.java b/utils/src/main/java/ru/trader/emdn/EMDN.java
index 08a4579..67163ea 100644
--- a/utils/src/main/java/ru/trader/emdn/EMDN.java
+++ b/utils/src/main/java/ru/trader/emdn/EMDN.java
@@ -6,6 +6,9 @@ import org.zeromq.ZMQ;
import org.zeromq.ZMQException;
import java.io.UnsupportedEncodingException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
import java.util.zip.DataFormatException;
import java.util.zip.Inflater;
@@ -13,35 +16,80 @@ public class EMDN {
private final static Logger LOG = LoggerFactory.getLogger(EMDN.class);
private final String subServer;
+ private final Market cache = new Market();
+ private ZMQ.Context context = null;
+ private ZMQ.Socket subscriber = null;
+ private ScheduledExecutorService executor;
+ private boolean clear;
- public EMDN(String subServer) {
+ public EMDN(String subServer, boolean clearOnShutdown) {
this.subServer = subServer;
+ clear = clearOnShutdown;
+ }
+
+ private void init(){
+ context = ZMQ.context(1);
+ subscriber = context.socket(ZMQ.SUB);
+ }
+
+ public void start(){
+ if (subscriber!=null) shutdown();
+ init();
+ LOG.info("Connect to server {}", subServer);
+ subscriber.connect(subServer);
+ LOG.trace("Subscribe");
+ subscriber.subscribe(new byte[0]);
+ executor = Executors.newSingleThreadScheduledExecutor();
+ executor.scheduleWithFixedDelay(() -> {
+ try {
+ byte[] receivedData = subscriber.recv(0);
+ LOG.trace("Received data: {}", receivedData);
+ if (receivedData == null) return;
+ //receivedData = decompress(receivedData);
+ String market_csv = new String(receivedData, "UTF-8");
+ parseCSV(market_csv);
+ } catch (ZMQException | UnsupportedEncodingException ex) {
+ if (!executor.isShutdown())
+ LOG.error("Error on get data from EMDN", ex);
+ }
+ }, 0, 1, TimeUnit.MILLISECONDS);
+ }
+
+ public void shutdown() {
+ if (subscriber!=null){
+ LOG.info("Shutdown EMDN client");
+ executor.shutdown();
+ subscriber.close();
+ context.term();
+ }
+ subscriber = null;
+ context = null;
+ if (clear)
+ cache.clear();
}
- public void getData(){
- ZMQ.Context context = ZMQ.context(1);
- try (ZMQ.Socket socket = context.socket(ZMQ.SUB)) {
- socket.setReceiveTimeOut(10000);
- LOG.debug("Connect to server {}", subServer);
- socket.connect(subServer);
-
- LOG.trace("Subscribe");
- socket.subscribe(new byte[0]);
- for (int i = 0; i < 5; i++) {
- try {
- byte[] receivedData = socket.recv(0);
- LOG.trace("Recived data: {}", receivedData);
- if (receivedData == null) continue;
- //receivedData = decompress(receivedData);
- String market_json = new String(receivedData, "UTF-8");
- LOG.trace("JSON: {}", market_json);
- } catch (ZMQException | UnsupportedEncodingException ex) {
- LOG.error("Error on get data from EMDN", ex);
- }
- }
+ private void parseCSV(String csv) {
+ LOG.debug("Parse csv: {}", csv);
+ if (csv.isEmpty()) return;
+ String[] flds = csv.split(",");
+ // buyPrice,sellPrice,demand,demandLevel,stationStock,stationStockLevel,categoryName,itemName,stationName,timestamp
+ ItemData item = new ItemData(flds[7]);
+ item.setBuy(Double.valueOf(flds[0]), Long.valueOf(flds[4]));
+ item.setSell(Double.valueOf(flds[1]), Long.valueOf(flds[2]));
+ LOG.trace("Item: {}", item);
+ String stName = flds[8].split("\\(")[0].trim();
+ LOG.trace("Station: {}", stName);
+ Station station = cache.getVendor(stName);
+ if (station != null){
+ LOG.trace("Is old, update");
+ station.update(item);
+ } else {
+ LOG.trace("Is new, create");
+ station = new Station(stName);
+ station.update(item);
+ cache.addVendor(station);
}
- context.term();
}
private byte[] decompress(byte[] input){
@@ -61,4 +109,9 @@ public class EMDN {
System.arraycopy(decompressed, 0, res, 0, decompressedLength);
return res;
}
+
+ public Station getVendor(String name){
+ return cache.getVendor(name);
+ }
+
}
diff --git a/utils/src/main/java/ru/trader/emdn/ItemData.java b/utils/src/main/java/ru/trader/emdn/ItemData.java
new file mode 100644
index 0000000..7508a73
--- /dev/null
+++ b/utils/src/main/java/ru/trader/emdn/ItemData.java
@@ -0,0 +1,69 @@
+package ru.trader.emdn;
+
+public class ItemData {
+ private final String name;
+ private double buy;
+ private double sell;
+ private long demand;
+ private long stock;
+
+
+ public ItemData(String name) {
+ this.name = name;
+ }
+
+ public void setSell(double price, long count){
+ sell = price;
+ demand = count;
+ }
+
+ public void setBuy(double price, long count){
+ buy = price;
+ stock = count;
+ }
+
+ public double getBuy() {
+ return buy;
+ }
+
+ public double getSell() {
+ return sell;
+ }
+
+ public long getDemand() {
+ return demand;
+ }
+
+ public long getStock() {
+ return stock;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof ItemData)) return false;
+ ItemData itemData = (ItemData) o;
+ return !(name != null ? !name.equals(itemData.name) : itemData.name != null);
+ }
+
+ @Override
+ public int hashCode() {
+ return name != null ? name.hashCode() : 0;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @Override
+ public String toString() {
+ final StringBuilder sb = new StringBuilder("{");
+ sb.append(name);
+ sb.append(" buy=").append(buy);
+ sb.append(" (").append(stock).append(")");
+ sb.append(" sell=").append(sell);
+ sb.append(" (").append(demand).append(")");
+ sb.append('}');
+ return sb.toString();
+ }
+}
diff --git a/utils/src/main/java/ru/trader/emdn/Market.java b/utils/src/main/java/ru/trader/emdn/Market.java
new file mode 100644
index 0000000..71cf9d9
--- /dev/null
+++ b/utils/src/main/java/ru/trader/emdn/Market.java
@@ -0,0 +1,19 @@
+package ru.trader.emdn;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public class Market {
+ private final ConcurrentHashMap vendors = new ConcurrentHashMap<>(40, 0.9f, 1);
+
+ public Station getVendor(String name){
+ return vendors.get(name);
+ }
+
+ public void addVendor(Station vendor){
+ vendors.put(vendor.getName(), vendor);
+ }
+
+ public void clear(){
+ vendors.clear();
+ }
+}
diff --git a/utils/src/main/java/ru/trader/emdn/Station.java b/utils/src/main/java/ru/trader/emdn/Station.java
new file mode 100644
index 0000000..ab6d369
--- /dev/null
+++ b/utils/src/main/java/ru/trader/emdn/Station.java
@@ -0,0 +1,37 @@
+package ru.trader.emdn;
+
+import java.util.concurrent.ConcurrentHashMap;
+
+public class Station {
+ private final String name;
+ private final ConcurrentHashMap items = new ConcurrentHashMap<>(15, 0.9f, 1);
+
+ public Station(String name) {
+ this.name = name;
+ }
+
+ public ItemData getData(String name){
+ return items.get(name);
+ }
+
+ void update(ItemData item){
+ items.put(item.getName(), item);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof Station)) return false;
+ Station station = (Station) o;
+ return name.equals(station.name);
+ }
+
+ @Override
+ public int hashCode() {
+ return name.hashCode();
+ }
+
+ public String getName() {
+ return name;
+ }
+}
diff --git a/utils/src/test/java/ru/trader/emdn/EMDNEmul.java b/utils/src/test/java/ru/trader/emdn/EMDNEmul.java
new file mode 100644
index 0000000..8666847
--- /dev/null
+++ b/utils/src/test/java/ru/trader/emdn/EMDNEmul.java
@@ -0,0 +1,136 @@
+package ru.trader.emdn;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.zeromq.ZMQ;
+
+import java.util.concurrent.Executors;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeUnit;
+
+public class EMDNEmul {
+ private final static Logger LOG = LoggerFactory.getLogger(EMDNEmul.class);
+
+ private ZMQ.Context context = null;
+ private ZMQ.Socket publisher = null;
+ private ScheduledExecutorService executor;
+ private final String bindAddress;
+
+ private final static byte[][] messages = new byte[][]{
+ {49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 55, 55, 49, 48, 48, 48},
+ {56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 55, 57, 49, 48, 48, 48},
+ {49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 48, 51, 48, 48, 48},
+ {48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 49, 53, 48, 48, 48},
+ {49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 51, 52, 48, 48, 48},
+ {49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 52, 54, 48, 48, 48},
+ {53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 53, 55, 48, 48, 48},
+ {50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 54, 57, 48, 48, 48},
+ {48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 56, 57, 48, 48, 48},
+ {55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 48, 48, 48, 48, 48},
+ {48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 49, 50, 48, 48, 48},
+ {48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 50, 51, 48, 48, 48},
+ {48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 51, 52, 48, 48, 48},
+ {48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 52, 54, 48, 48, 48},
+ {48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 53, 55, 48, 48, 48},
+ {48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 54, 57, 48, 48, 48},
+ {48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 56, 49, 48, 48, 48},
+ {48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 48, 49, 48, 48, 48},
+ {48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 49, 52, 48, 48, 48},
+ {48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 50, 54, 48, 48, 48},
+ {48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 51, 55, 48, 48, 48},
+ {48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 52, 57, 48, 48, 48},
+ {48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 54, 48, 48, 48, 48},
+ {48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 55, 50, 48, 48, 48},
+ {48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 56, 53, 48, 48, 48},
+ {48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 57, 54, 48, 48, 48},
+ {48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 49, 48, 56, 48, 48, 48},
+ {49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 52, 57, 48, 48, 48},
+ {56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 54, 54, 48, 48, 48},
+ {49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 55, 52, 48, 48, 48},
+ {48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 56, 48, 48, 48, 48},
+ {49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 57, 54, 48, 48, 48},
+ {49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 48, 51, 48, 48, 48},
+ {53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 49, 48, 48, 48, 48},
+ {50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 49, 54, 48, 48, 48},
+ {48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 51, 49, 48, 48, 48},
+ {55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 51, 56, 48, 48, 48},
+ {48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 52, 53, 48, 48, 48},
+ {48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 53, 49, 48, 48, 48},
+ {48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 53, 56, 48, 48, 48},
+ {48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 54, 52, 48, 48, 48},
+ {48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 55, 48, 48, 48, 48},
+ {48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 55, 54, 48, 48, 48},
+ {48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 56, 50, 48, 48, 48},
+ {48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 57, 54, 48, 48, 48},
+ {48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 48, 50, 48, 48, 48},
+ {48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 48, 57, 48, 48, 48},
+ {48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 49, 54, 48, 48, 48},
+ {48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 50, 51, 48, 48, 48},
+ {48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 51, 48, 48, 48, 48},
+ {48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 51, 54, 48, 48, 48},
+ {48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 52, 50, 48, 48, 48},
+ {48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 52, 56, 48, 48, 48},
+ {48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 53, 52, 48, 48, 48},
+ {49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 49, 55, 52, 48, 48, 48},
+ {56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 49, 57, 52, 48, 48, 48},
+ {49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 48, 54, 48, 48, 48},
+ {48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 49, 56, 48, 48, 48},
+ {49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 51, 57, 48, 48, 48},
+ {49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 53, 50, 48, 48, 48},
+ {53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 54, 52, 48, 48, 48},
+ {50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 55, 54, 48, 48, 48},
+ {48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 57, 54, 48, 48, 48},
+ {55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 48, 56, 48, 48, 48},
+ {48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 50, 48, 48, 48, 48},
+ {48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 51, 49, 48, 48, 48},
+ {48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 52, 51, 48, 48, 48},
+ {48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 53, 52, 48, 48, 48},
+ {48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 54, 54, 48, 48, 48},
+ {48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 55, 55, 48, 48, 48},
+ {48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 56, 57, 48, 48, 48},
+ {48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 49, 49, 48, 48, 48},
+ {48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 50, 53, 48, 48, 48},
+ {48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 51, 55, 48, 48, 48},
+ {48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 52, 57, 48, 48, 48},
+ {48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 54, 48, 48, 48, 48},
+ {48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 55, 50, 48, 48, 48},
+ {48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 56, 50, 48, 48, 48},
+ {48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 57, 52, 48, 48, 48},
+ {48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 53, 48, 53, 48, 48, 48},
+ {48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 53, 49, 54, 48, 48, 48}
+ };
+
+ public EMDNEmul(String bindAddress) {
+ this.bindAddress = bindAddress;
+ }
+
+ public void start(){
+ if (publisher != null) shutdown();
+ context = ZMQ.context(1);
+ publisher = context.socket(ZMQ.PUB);
+
+ LOG.debug("Start EMDN emul server, address {}", bindAddress);
+ publisher.bind(bindAddress);
+
+ executor = Executors.newSingleThreadScheduledExecutor();
+ executor.scheduleAtFixedRate(()->{
+ for (byte[] message : messages) {
+ LOG.trace("Publish message: {}", message);
+ publisher.send(message);
+ }
+ LOG.trace("Sleep... ");
+ }, 1, 5, TimeUnit.SECONDS);
+ }
+
+ public void shutdown(){
+ if (publisher!=null){
+ LOG.debug("Shutdown EMDN emul server");
+ executor.shutdown();
+ publisher.close();
+ context.term();
+ }
+ publisher = null;
+ context = null;
+ }
+
+}
diff --git a/utils/src/test/java/ru/trader/emdn/EMDNTest.java b/utils/src/test/java/ru/trader/emdn/EMDNTest.java
index 9ab03b5..359ad42 100644
--- a/utils/src/test/java/ru/trader/emdn/EMDNTest.java
+++ b/utils/src/test/java/ru/trader/emdn/EMDNTest.java
@@ -1,98 +1,39 @@
package ru.trader.emdn;
+import org.junit.After;
import org.junit.Assert;
+import org.junit.Before;
import org.junit.Test;
public class EMDNTest extends Assert {
- private final static EMDN markettool = new EMDN("tcp://firehose.elite-market-data.net:9050");
-/* Example dates
-[49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 55, 55, 49, 48, 48, 48]
-[56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 55, 57, 49, 48, 48, 48]
-[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 48, 51, 48, 48, 48]
-[48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 49, 53, 48, 48, 48]
-[49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 51, 52, 48, 48, 48]
-[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 52, 54, 48, 48, 48]
-[53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 53, 55, 48, 48, 48]
-[50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 54, 57, 48, 48, 48]
-[48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 56, 56, 57, 48, 48, 48]
-[55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 48, 48, 48, 48, 48]
-[48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 49, 50, 48, 48, 48]
-[48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 50, 51, 48, 48, 48]
-[48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 51, 52, 48, 48, 48]
-[48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 52, 54, 48, 48, 48]
-[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 53, 55, 48, 48, 48]
-[48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 54, 57, 48, 48, 48]
-[48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 52, 46, 57, 56, 49, 48, 48, 48]
-[48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 48, 49, 48, 48, 48]
-[48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 49, 52, 48, 48, 48]
-[48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 50, 54, 48, 48, 48]
-[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 51, 55, 48, 48, 48]
-[48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 52, 57, 48, 48, 48]
-[48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 54, 48, 48, 48, 48]
-[48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 55, 50, 48, 48, 48]
-[48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 56, 53, 48, 48, 48]
-[48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 48, 57, 54, 48, 48, 48]
-[48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 53, 53, 46, 49, 48, 56, 48, 48, 48]
-[49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 52, 57, 48, 48, 48]
-[56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 54, 54, 48, 48, 48]
-[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 55, 52, 48, 48, 48]
-[48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 56, 48, 48, 48, 48]
-[49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 54, 57, 54, 48, 48, 48]
-[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 48, 51, 48, 48, 48]
-[53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 49, 48, 48, 48, 48]
-[50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 49, 54, 48, 48, 48]
-[48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 51, 49, 48, 48, 48]
-[55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 51, 56, 48, 48, 48]
-[48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 52, 53, 48, 48, 48]
-[48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 53, 49, 48, 48, 48]
-[48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 53, 56, 48, 48, 48]
-[48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 54, 52, 48, 48, 48]
-[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 55, 48, 48, 48, 48]
-[48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 55, 54, 48, 48, 48]
-[48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 56, 50, 48, 48, 48]
-[48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 55, 57, 54, 48, 48, 48]
-[48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 48, 50, 48, 48, 48]
-[48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 48, 57, 48, 48, 48]
-[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 49, 54, 48, 48, 48]
-[48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 50, 51, 48, 48, 48]
-[48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 51, 48, 48, 48, 48]
-[48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 51, 54, 48, 48, 48]
-[48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 52, 50, 48, 48, 48]
-[48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 52, 56, 48, 48, 48]
-[48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 55, 58, 52, 55, 46, 56, 53, 52, 48, 48, 48]
-[49, 56, 52, 44, 49, 54, 54, 44, 48, 44, 48, 44, 49, 55, 49, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 102, 114, 117, 105, 116, 97, 110, 100, 118, 101, 103, 101, 116, 97, 98, 108, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 49, 55, 52, 48, 48, 48]
-[56, 55, 44, 55, 52, 44, 48, 44, 48, 44, 55, 51, 51, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 103, 114, 97, 105, 110, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 49, 57, 52, 48, 48, 48]
-[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 57, 44, 49, 44, 102, 111, 111, 100, 115, 44, 97, 110, 105, 109, 97, 108, 109, 101, 97, 116, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 48, 54, 48, 48, 48]
-[48, 44, 54, 52, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 102, 111, 111, 100, 115, 44, 102, 105, 115, 104, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 49, 56, 48, 48, 48]
-[49, 50, 57, 55, 44, 49, 50, 52, 51, 44, 48, 44, 48, 44, 49, 49, 44, 49, 44, 102, 111, 111, 100, 115, 44, 116, 101, 97, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 51, 57, 48, 48, 48]
-[49, 49, 49, 52, 44, 49, 48, 54, 55, 44, 48, 44, 48, 44, 54, 44, 49, 44, 102, 111, 111, 100, 115, 44, 99, 111, 102, 102, 101, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 53, 50, 48, 48, 48]
-[53, 56, 44, 52, 54, 44, 48, 44, 48, 44, 49, 56, 56, 48, 51, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 108, 101, 97, 116, 104, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 54, 52, 48, 48, 48]
-[50, 53, 54, 44, 50, 51, 55, 44, 48, 44, 48, 44, 49, 48, 49, 56, 57, 44, 49, 44, 116, 101, 120, 116, 105, 108, 101, 115, 44, 110, 97, 116, 117, 114, 97, 108, 102, 97, 98, 114, 105, 99, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 55, 54, 48, 48, 48]
-[48, 44, 53, 54, 44, 54, 55, 48, 56, 51, 44, 49, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 104, 121, 100, 114, 111, 103, 101, 110, 102, 117, 101, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 50, 57, 54, 48, 48, 48]
-[55, 51, 44, 54, 50, 44, 48, 44, 48, 44, 49, 55, 49, 55, 44, 49, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 109, 105, 110, 101, 114, 97, 108, 111, 105, 108, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 48, 56, 48, 48, 48]
-[48, 44, 49, 57, 57, 44, 53, 51, 56, 48, 56, 44, 50, 44, 48, 44, 48, 44, 99, 104, 101, 109, 105, 99, 97, 108, 115, 44, 112, 101, 115, 116, 105, 99, 105, 100, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 50, 48, 48, 48, 48]
-[48, 44, 57, 52, 55, 44, 49, 52, 51, 51, 44, 49, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 97, 103, 114, 105, 99, 117, 108, 116, 117, 114, 97, 108, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 51, 49, 48, 48, 48]
-[48, 44, 55, 49, 49, 53, 44, 49, 48, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 101, 114, 102, 111, 114, 109, 97, 110, 99, 101, 101, 110, 104, 97, 110, 99, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 52, 51, 48, 48, 48]
-[48, 44, 51, 48, 54, 44, 49, 55, 51, 56, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 98, 97, 115, 105, 99, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 53, 52, 48, 48, 48]
-[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 116, 111, 98, 97, 99, 99, 111, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 54, 54, 48, 48, 48]
-[48, 44, 49, 52, 51, 44, 49, 56, 56, 48, 52, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 98, 101, 101, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 55, 55, 48, 48, 48]
-[48, 44, 50, 53, 54, 44, 48, 44, 48, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 119, 105, 110, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 51, 56, 57, 48, 48, 48]
-[48, 44, 54, 53, 57, 44, 49, 57, 56, 54, 44, 50, 44, 48, 44, 48, 44, 100, 114, 117, 103, 115, 44, 108, 105, 113, 117, 111, 114, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 49, 49, 48, 48, 48]
-[48, 44, 50, 51, 49, 56, 44, 49, 54, 52, 55, 50, 44, 50, 44, 48, 44, 48, 44, 109, 97, 99, 104, 105, 110, 101, 114, 121, 44, 99, 114, 111, 112, 104, 97, 114, 118, 101, 115, 116, 101, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 50, 53, 48, 48, 48]
-[48, 44, 50, 56, 57, 44, 49, 50, 50, 55, 55, 44, 50, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 97, 110, 105, 109, 97, 108, 109, 111, 110, 105, 116, 111, 114, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 51, 55, 48, 48, 48]
-[48, 44, 52, 54, 55, 53, 44, 48, 44, 49, 44, 48, 44, 48, 44, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 116, 101, 114, 114, 97, 105, 110, 101, 110, 114, 105, 99, 104, 109, 101, 110, 116, 115, 121, 115, 116, 101, 109, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 52, 57, 48, 48, 48]
-[48, 44, 52, 52, 57, 49, 44, 50, 56, 49, 50, 44, 50, 44, 48, 44, 48, 44, 119, 101, 97, 112, 111, 110, 115, 44, 112, 101, 114, 115, 111, 110, 97, 108, 119, 101, 97, 112, 111, 110, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 54, 48, 48, 48, 48]
-[48, 44, 53, 53, 48, 44, 54, 50, 49, 54, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 100, 111, 109, 101, 115, 116, 105, 99, 97, 112, 112, 108, 105, 97, 110, 99, 101, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 55, 50, 48, 48, 48]
-[48, 44, 55, 48, 56, 52, 44, 53, 50, 55, 51, 44, 50, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 111, 110, 115, 117, 109, 101, 114, 116, 101, 99, 104, 110, 111, 108, 111, 103, 121, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 56, 50, 48, 48, 48]
-[48, 44, 50, 53, 50, 44, 48, 44, 49, 44, 48, 44, 48, 44, 99, 111, 110, 115, 117, 109, 101, 114, 95, 105, 116, 101, 109, 115, 44, 99, 108, 111, 116, 104, 105, 110, 103, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 52, 57, 52, 48, 48, 48]
-[48, 44, 54, 56, 44, 51, 48, 49, 54, 49, 44, 50, 44, 48, 44, 48, 44, 119, 97, 115, 116, 101, 44, 98, 105, 111, 119, 97, 115, 116, 101, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 53, 48, 53, 48, 48, 48]
-[48, 44, 55, 49, 49, 53, 44, 55, 50, 55, 48, 44, 50, 44, 48, 44, 48, 44, 109, 101, 100, 105, 99, 105, 110, 101, 115, 44, 112, 114, 111, 103, 101, 110, 105, 116, 111, 114, 99, 101, 108, 108, 115, 44, 69, 114, 97, 110, 105, 110, 32, 40, 65, 90, 69, 66, 65, 78, 32, 67, 73, 84, 89, 41, 44, 50, 48, 49, 52, 45, 48, 56, 45, 50, 55, 84, 49, 53, 58, 48, 56, 58, 48, 51, 46, 53, 49, 54, 48, 48, 48]
+ private final static EMDN markettool = new EMDN("tcp://localhost:9050", true);
+
+ private final static EMDNEmul server = new EMDNEmul("tcp://localhost:9050");
+ @Before
+ public void setUp() throws Exception {
+ server.start();
+ markettool.start();
+ }
- */
@Test
public void testGetData() throws Exception {
- markettool.getData();
+ // wait submit
+ Thread.sleep(4000);
+ Station station = markettool.getVendor("Eranin");
+ assertNotNull(station);
+ ItemData itemData = station.getData("cropharvesters");
+ assertNotNull(itemData);
+ assertEquals(0,itemData.getBuy(), 0.0001);
+ assertEquals(0,itemData.getStock());
+ assertEquals(2318,itemData.getSell(), 0.0001);
+ assertEquals(16472,itemData.getDemand());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ markettool.shutdown();
+ server.shutdown();
}
}
diff --git a/utils/src/test/resources/log4j.properties b/utils/src/test/resources/log4j.properties
index 6e9f687..1d4c1a4 100644
--- a/utils/src/test/resources/log4j.properties
+++ b/utils/src/test/resources/log4j.properties
@@ -6,4 +6,3 @@ log4j.appender.stdout.layout.ConversionPattern=%p: %d{dd.MM.yyyy HH:mm:ss} (%F:%
log4j.logger.ru.trader.emdn.EMDN = TRACE
-log4j.logger.org.zeromq = TRACE
\ No newline at end of file