jspurefix 3.4.0 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/appveyor.yml +1 -1
- package/dist/buffer/ascii/ascii-encoder.d.ts +2 -2
- package/dist/buffer/ascii/ascii-encoder.js +1 -1
- package/dist/buffer/ascii/ascii-encoder.js.map +1 -1
- package/dist/buffer/ascii/ascii-parser-state.d.ts +3 -2
- package/dist/buffer/ascii/ascii-parser-state.js +1 -2
- package/dist/buffer/ascii/ascii-parser-state.js.map +1 -1
- package/dist/buffer/ascii/ascii-parser.d.ts +1 -1
- package/dist/buffer/ascii/ascii-parser.js +5 -4
- package/dist/buffer/ascii/ascii-parser.js.map +1 -1
- package/dist/buffer/ascii/ascii-segment-parser.js.map +1 -1
- package/dist/buffer/ascii/ascii-view.d.ts +4 -3
- package/dist/buffer/ascii/ascii-view.js +8 -5
- package/dist/buffer/ascii/ascii-view.js.map +1 -1
- package/dist/buffer/encode-proxy.js +1 -1
- package/dist/buffer/encode-proxy.js.map +1 -1
- package/dist/buffer/fixml/fixml-encoder.d.ts +2 -2
- package/dist/buffer/fixml/fixml-encoder.js +1 -1
- package/dist/buffer/fixml/fixml-encoder.js.map +1 -1
- package/dist/buffer/fixml/fixml-parser.js +2 -2
- package/dist/buffer/fixml/fixml-parser.js.map +1 -1
- package/dist/buffer/fixml/fixml-view.d.ts +3 -2
- package/dist/buffer/fixml/fixml-view.js +5 -4
- package/dist/buffer/fixml/fixml-view.js.map +1 -1
- package/dist/buffer/msg-encoder.d.ts +2 -2
- package/dist/buffer/msg-encoder.js.map +1 -1
- package/dist/buffer/msg-view.d.ts +8 -6
- package/dist/buffer/msg-view.js +10 -8
- package/dist/buffer/msg-view.js.map +1 -1
- package/dist/buffer/segment/segment-description.d.ts +3 -3
- package/dist/buffer/segment/segment-description.js.map +1 -1
- package/dist/buffer/tag/tags.d.ts +2 -5
- package/dist/buffer/tag/tags.js +4 -5
- package/dist/buffer/tag/tags.js.map +1 -1
- package/dist/collections/collection.d.ts +0 -1
- package/dist/collections/collection.js.map +1 -1
- package/dist/collections/index.d.ts +0 -1
- package/dist/collections/index.js +0 -17
- package/dist/collections/index.js.map +1 -1
- package/dist/config/js-fix-config.d.ts +2 -1
- package/dist/config/js-fix-config.js +3 -3
- package/dist/config/js-fix-config.js.map +1 -1
- package/dist/dictionary/compiler/compiler-type.d.ts +3 -3
- package/dist/dictionary/compiler/compiler-type.js.map +1 -1
- package/dist/dictionary/compiler/enum-compiler.js +2 -2
- package/dist/dictionary/compiler/enum-compiler.js.map +1 -1
- package/dist/dictionary/compiler/msg-compiler.d.ts +1 -2
- package/dist/dictionary/compiler/msg-compiler.js +6 -7
- package/dist/dictionary/compiler/msg-compiler.js.map +1 -1
- package/dist/dictionary/contained/contained-component-field.d.ts +1 -1
- package/dist/dictionary/contained/contained-component-field.js.map +1 -1
- package/dist/dictionary/contained/contained-field-set.d.ts +9 -20
- package/dist/dictionary/contained/contained-field-set.js +16 -149
- package/dist/dictionary/contained/contained-field-set.js.map +1 -1
- package/dist/dictionary/contained/contained-group-field.d.ts +1 -1
- package/dist/dictionary/contained/contained-group-field.js.map +1 -1
- package/dist/dictionary/contained/contained-set-builder.d.ts +15 -0
- package/dist/dictionary/contained/contained-set-builder.js +142 -0
- package/dist/dictionary/contained/contained-set-builder.js.map +1 -0
- package/dist/dictionary/contained/contained-set.d.ts +32 -0
- package/dist/{types/FIX.5.0SP2/quickfix/xm_lnon_fix.js → dictionary/contained/contained-set.js} +1 -1
- package/dist/dictionary/contained/contained-set.js.map +1 -0
- package/dist/dictionary/contained/contained-simple-field.d.ts +1 -1
- package/dist/dictionary/contained/contained-simple-field.js.map +1 -1
- package/dist/dictionary/contained/index.d.ts +4 -1
- package/dist/dictionary/contained/index.js +4 -1
- package/dist/dictionary/contained/index.js.map +1 -1
- package/dist/dictionary/definition/category-simple-set.d.ts +1 -2
- package/dist/dictionary/definition/category-simple-set.js +1 -2
- package/dist/dictionary/definition/category-simple-set.js.map +1 -1
- package/dist/dictionary/definition/component-field-definition.d.ts +1 -1
- package/dist/dictionary/definition/component-field-definition.js +2 -2
- package/dist/dictionary/definition/component-field-definition.js.map +1 -1
- package/dist/dictionary/definition/fix-definitions.d.ts +8 -9
- package/dist/dictionary/definition/fix-definitions.js +22 -20
- package/dist/dictionary/definition/fix-definitions.js.map +1 -1
- package/dist/dictionary/definition/group-field-definition.d.ts +1 -1
- package/dist/dictionary/definition/group-field-definition.js +2 -2
- package/dist/dictionary/definition/group-field-definition.js.map +1 -1
- package/dist/dictionary/definition/message-definition.d.ts +1 -1
- package/dist/dictionary/definition/message-definition.js +2 -2
- package/dist/dictionary/definition/message-definition.js.map +1 -1
- package/dist/dictionary/definition/simple-field-definition.d.ts +2 -3
- package/dist/dictionary/definition/simple-field-definition.js +6 -7
- package/dist/dictionary/definition/simple-field-definition.js.map +1 -1
- package/dist/dictionary/parser/fix-repository/repository.js +20 -20
- package/dist/dictionary/parser/fix-repository/repository.js.map +1 -1
- package/dist/dictionary/parser/fixml/components-parser.js +18 -16
- package/dist/dictionary/parser/fixml/components-parser.js.map +1 -1
- package/dist/dictionary/parser/fixml/fields-parser.js +2 -3
- package/dist/dictionary/parser/fixml/fields-parser.js.map +1 -1
- package/dist/dictionary/parser/fixml/include-graph.js +8 -9
- package/dist/dictionary/parser/fixml/include-graph.js.map +1 -1
- package/dist/dictionary/parser/quickfix/field-definition-parser.js.map +1 -1
- package/dist/dictionary/parser/quickfix/message-parser.js +2 -1
- package/dist/dictionary/parser/quickfix/message-parser.js.map +1 -1
- package/dist/dictionary/parser/quickfix/node-parser.js +3 -2
- package/dist/dictionary/parser/quickfix/node-parser.js.map +1 -1
- package/dist/dictionary/parser/quickfix/parse-context.d.ts +3 -3
- package/dist/dictionary/parser/quickfix/parse-context.js.map +1 -1
- package/dist/dictionary/parser/quickfix/parse-progress.d.ts +1 -2
- package/dist/dictionary/parser/quickfix/parse-progress.js +2 -3
- package/dist/dictionary/parser/quickfix/parse-progress.js.map +1 -1
- package/dist/dictionary/parser/quickfix/quick-fix-xml-file-builder.js +4 -5
- package/dist/dictionary/parser/quickfix/quick-fix-xml-file-builder.js.map +1 -1
- package/dist/dictionary/parser/quickfix/quick-fix-xml-file-parser.js +6 -6
- package/dist/dictionary/parser/quickfix/quick-fix-xml-file-parser.js.map +1 -1
- package/dist/dictionary/parser/quickfix/quick-fix-xml-formatter.d.ts +1 -1
- package/dist/dictionary/parser/quickfix/quick-fix-xml-formatter.js.map +1 -1
- package/dist/dictionary/set-reduce.d.ts +2 -2
- package/dist/dictionary/set-reduce.js.map +1 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/dist/jsfix-cmd.js +4 -5
- package/dist/jsfix-cmd.js.map +1 -1
- package/dist/sample/tcp/recovering-skeleton/respawn-acceptor.js +7 -8
- package/dist/sample/tcp/recovering-skeleton/respawn-acceptor.js.map +1 -1
- package/dist/sample/tcp/trade-capture/trade-capture-client.js +3 -4
- package/dist/sample/tcp/trade-capture/trade-capture-client.js.map +1 -1
- package/dist/sample/tcp/trade-capture/trade-capture-server.js.map +1 -1
- package/dist/store/fix-msg-ascii-store-resend.d.ts +4 -3
- package/dist/store/fix-msg-ascii-store-resend.js +21 -5
- package/dist/store/fix-msg-ascii-store-resend.js.map +1 -1
- package/dist/store/fix-msg-memory-store.js +3 -4
- package/dist/store/fix-msg-memory-store.js.map +1 -1
- package/dist/store/fix-msg-store-record.js.map +1 -1
- package/dist/test/ascii/ascii-encoder.test.js.map +1 -1
- package/dist/test/ascii/ascii-store-replay.test.js +14 -1
- package/dist/test/ascii/ascii-store-replay.test.js.map +1 -1
- package/dist/test/ascii/fix-log-replay.test.js.map +1 -1
- package/dist/test/ascii/fix-repo-dict.test.js.map +1 -1
- package/dist/test/ascii/qf-50sp0-dict.test.js +7 -7
- package/dist/test/ascii/qf-50sp0-dict.test.js.map +1 -1
- package/dist/test/ascii/qf-50sp2-dict.test.js +5 -2
- package/dist/test/ascii/qf-50sp2-dict.test.js.map +1 -1
- package/dist/test/ascii/session.test.js +64 -15
- package/dist/test/ascii/session.test.js.map +1 -1
- package/dist/test/env/encoder-test.d.ts +3 -3
- package/dist/test/env/encoder-test.js.map +1 -1
- package/dist/test/env/set-constraint-helper.d.ts +4 -4
- package/dist/test/env/set-constraint-helper.js.map +1 -1
- package/dist/transport/ascii/ascii-msg-transmitter.js.map +1 -1
- package/dist/transport/ascii/ascii-session.js +5 -2
- package/dist/transport/ascii/ascii-session.js.map +1 -1
- package/dist/transport/fixml/fixml-session.js.map +1 -1
- package/dist/transport/http/http-acceptor.js +3 -4
- package/dist/transport/http/http-acceptor.js.map +1 -1
- package/dist/transport/http/http-json-sample-adapter.js +3 -4
- package/dist/transport/http/http-json-sample-adapter.js.map +1 -1
- package/dist/transport/session/dynamic-session-manager.d.ts +8 -0
- package/dist/transport/session/dynamic-session-manager.js +15 -0
- package/dist/transport/session/dynamic-session-manager.js.map +1 -0
- package/dist/transport/session/session-description.d.ts +9 -7
- package/dist/transport/session/session-description.js.map +1 -1
- package/dist/util/json-helper.d.ts +2 -2
- package/dist/util/json-helper.js.map +1 -1
- package/dist/util/message-generator.js +1 -1
- package/dist/util/message-generator.js.map +1 -1
- package/package.json +21 -21
- package/src/buffer/ascii/ascii-encoder.ts +7 -7
- package/src/buffer/ascii/ascii-parser-state.ts +4 -4
- package/src/buffer/ascii/ascii-parser.ts +6 -5
- package/src/buffer/ascii/ascii-segment-parser.ts +2 -2
- package/src/buffer/ascii/ascii-view.ts +9 -7
- package/src/buffer/encode-proxy.ts +9 -9
- package/src/buffer/fixml/fixml-encoder.ts +14 -10
- package/src/buffer/fixml/fixml-parser.ts +5 -5
- package/src/buffer/fixml/fixml-view.ts +5 -5
- package/src/buffer/msg-encoder.ts +3 -3
- package/src/buffer/msg-view.ts +18 -18
- package/src/buffer/segment/segment-description.ts +2 -2
- package/src/buffer/tag/tags.ts +4 -6
- package/src/collections/collection.ts +0 -1
- package/src/collections/index.ts +1 -1
- package/src/config/js-fix-config.ts +3 -2
- package/src/dictionary/compiler/compiler-type.ts +8 -2
- package/src/dictionary/compiler/enum-compiler.ts +2 -2
- package/src/dictionary/compiler/msg-compiler.ts +11 -12
- package/src/dictionary/contained/contained-component-field.ts +1 -1
- package/src/dictionary/contained/contained-field-set.ts +21 -176
- package/src/dictionary/contained/contained-group-field.ts +1 -1
- package/src/dictionary/contained/contained-set-builder.ts +164 -0
- package/src/dictionary/contained/contained-set.ts +83 -0
- package/src/dictionary/contained/contained-simple-field.ts +1 -1
- package/src/dictionary/contained/index.ts +4 -1
- package/src/dictionary/definition/category-simple-set.ts +1 -2
- package/src/dictionary/definition/component-field-definition.ts +1 -1
- package/src/dictionary/definition/fix-definitions.ts +28 -26
- package/src/dictionary/definition/group-field-definition.ts +1 -1
- package/src/dictionary/definition/message-definition.ts +6 -6
- package/src/dictionary/definition/simple-field-definition.ts +9 -10
- package/src/dictionary/parser/fix-repository/repository.ts +47 -40
- package/src/dictionary/parser/fixml/components-parser.ts +41 -38
- package/src/dictionary/parser/fixml/fields-parser.ts +3 -4
- package/src/dictionary/parser/fixml/include-graph.ts +13 -14
- package/src/dictionary/parser/quickfix/field-definition-parser.ts +5 -5
- package/src/dictionary/parser/quickfix/message-parser.ts +7 -5
- package/src/dictionary/parser/quickfix/node-parser.ts +13 -6
- package/src/dictionary/parser/quickfix/parse-context.ts +2 -2
- package/src/dictionary/parser/quickfix/parse-progress.ts +2 -3
- package/src/dictionary/parser/quickfix/quick-fix-xml-file-builder.ts +4 -5
- package/src/dictionary/parser/quickfix/quick-fix-xml-file-parser.ts +10 -12
- package/src/dictionary/parser/quickfix/quick-fix-xml-formatter.ts +1 -1
- package/src/dictionary/set-reduce.ts +3 -3
- package/src/index.ts +0 -1
- package/src/jsfix-cmd.ts +5 -6
- package/src/sample/tcp/recovering-skeleton/respawn-acceptor.ts +7 -8
- package/src/sample/tcp/trade-capture/trade-capture-client.ts +4 -5
- package/src/sample/tcp/trade-capture/trade-capture-server.ts +1 -1
- package/src/store/fix-msg-ascii-store-resend.ts +64 -8
- package/src/store/fix-msg-memory-store.ts +3 -4
- package/src/store/fix-msg-store-record.ts +1 -1
- package/src/transport/ascii/ascii-msg-transmitter.ts +6 -6
- package/src/transport/ascii/ascii-session.ts +11 -7
- package/src/transport/fixml/fixml-session.ts +3 -3
- package/src/transport/http/http-acceptor.ts +4 -5
- package/src/transport/http/http-json-sample-adapter.ts +3 -4
- package/src/transport/session/dynamic-session-manager.ts +16 -0
- package/src/transport/session/session-description.ts +10 -7
- package/src/util/json-helper.ts +3 -3
- package/src/util/message-generator.ts +4 -4
- package/dist/collections/dictionary.d.ts +0 -15
- package/dist/collections/dictionary.js +0 -57
- package/dist/collections/dictionary.js.map +0 -1
- package/dist/types/FIX.5.0SP2/quickfix/execution_acknowledgement.d.ts +0 -31
- package/dist/types/FIX.5.0SP2/quickfix/execution_acknowledgement.js +0 -3
- package/dist/types/FIX.5.0SP2/quickfix/execution_acknowledgement.js.map +0 -1
- package/dist/types/FIX.5.0SP2/quickfix/mass_quote_acknowledgement.d.ts +0 -26
- package/dist/types/FIX.5.0SP2/quickfix/mass_quote_acknowledgement.js +0 -3
- package/dist/types/FIX.5.0SP2/quickfix/mass_quote_acknowledgement.js.map +0 -1
- package/dist/types/FIX.5.0SP2/quickfix/set/hop_grp.d.ts +0 -5
- package/dist/types/FIX.5.0SP2/quickfix/set/hop_grp.js +0 -3
- package/dist/types/FIX.5.0SP2/quickfix/set/hop_grp.js.map +0 -1
- package/dist/types/FIX.5.0SP2/quickfix/set/msg_type_grp.d.ts +0 -8
- package/dist/types/FIX.5.0SP2/quickfix/set/msg_type_grp.js +0 -3
- package/dist/types/FIX.5.0SP2/quickfix/set/msg_type_grp.js.map +0 -1
- package/dist/types/FIX.5.0SP2/quickfix/set/not_affected_orders_grp.d.ts +0 -4
- package/dist/types/FIX.5.0SP2/quickfix/set/not_affected_orders_grp.js +0 -3
- package/dist/types/FIX.5.0SP2/quickfix/set/not_affected_orders_grp.js.map +0 -1
- package/dist/types/FIX.5.0SP2/quickfix/xm_lnon_fix.d.ts +0 -6
- package/dist/types/FIX.5.0SP2/quickfix/xm_lnon_fix.js.map +0 -1
- package/src/collections/dictionary.ts +0 -62
package/dist/jsfix-cmd.js
CHANGED
|
@@ -24,7 +24,6 @@ const compiler_1 = require("./dictionary/compiler");
|
|
|
24
24
|
const runtime_1 = require("./runtime");
|
|
25
25
|
const di_tokens_1 = require("./runtime/di-tokens");
|
|
26
26
|
const minimist_options_1 = require("minimist-options");
|
|
27
|
-
const collections_1 = require("./collections");
|
|
28
27
|
const quick_fix_xml_file_builder_1 = require("./dictionary/parser/quickfix/quick-fix-xml-file-builder");
|
|
29
28
|
const fs = require('node-fs-extra');
|
|
30
29
|
const options = (0, minimist_options_1.default)({
|
|
@@ -157,7 +156,7 @@ class JsfixCmd {
|
|
|
157
156
|
this.root = path.join(__dirname, '../');
|
|
158
157
|
this.delimiter = ascii_1.AsciiChars.Soh;
|
|
159
158
|
this.stats = {};
|
|
160
|
-
this.filter = new
|
|
159
|
+
this.filter = new Map();
|
|
161
160
|
this.messages = 0;
|
|
162
161
|
this.print = true;
|
|
163
162
|
}
|
|
@@ -429,7 +428,7 @@ class JsfixCmd {
|
|
|
429
428
|
trim() {
|
|
430
429
|
var _a, _b;
|
|
431
430
|
this.setFilter();
|
|
432
|
-
const types = this.filter.
|
|
431
|
+
const types = this.filter.size > 0 ? Array.from(this.filter.keys()) : Array.from((_b = (_a = this.definitions.simple.get('MsgType')) === null || _a === void 0 ? void 0 : _a.enums.keys()) !== null && _b !== void 0 ? _b : []);
|
|
433
432
|
const qfb = new quick_fix_xml_file_builder_1.QuickFixXmlFileBuilder(this.definitions);
|
|
434
433
|
qfb.write(types);
|
|
435
434
|
return qfb.elasticBuffer.toString();
|
|
@@ -487,7 +486,7 @@ class JsfixCmd {
|
|
|
487
486
|
});
|
|
488
487
|
}
|
|
489
488
|
types.forEach((mt) => {
|
|
490
|
-
this.filter.
|
|
489
|
+
this.filter.set(mt, true);
|
|
491
490
|
});
|
|
492
491
|
}
|
|
493
492
|
}
|
|
@@ -517,7 +516,7 @@ class JsfixCmd {
|
|
|
517
516
|
const filter = this.filter;
|
|
518
517
|
ft.receiver.on('msg', (msgType, m) => {
|
|
519
518
|
if (filter) {
|
|
520
|
-
if (filter.
|
|
519
|
+
if (filter.has(msgType)) {
|
|
521
520
|
return;
|
|
522
521
|
}
|
|
523
522
|
}
|
package/dist/jsfix-cmd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsfix-cmd.js","sourceRoot":"","sources":["../src/jsfix-cmd.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4BAAyB;AAEzB,qCAA4D;AAC5D,0CAAmE;AAGnE,iCAAkF;AAClF,2CAA2E;AAE3E,mCAAgC;AAGhC,6BAA4B;AAC5B,qCAAoC;AACpC,6BAA4B;AAC5B,iDAAkD;AAClD,oDAAoF;AAEpF,uCAA4C;AAC5C,mDAA8C;AAC9C,uDAA2C;AAC3C,+CAA0C;AAC1C,wGAAgG;AAEhG,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAA;AAEnC,MAAM,OAAO,GAAG,IAAA,0BAAY,EAAC;IAC3B,IAAI,EAAE;QACJ,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,gBAAgB;KAC1B;IAED,IAAI,EAAE;QACJ,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,GAAG;KACX;IAED,GAAG,EAAE;QACH,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,gBAAgB;KAC1B;IAED,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;KACX;IAED,SAAS,EAAE;QACT,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,GAAG;KACb;IAED,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,CAAC,GAAG,CAAC;QACZ,OAAO,EAAE,KAAK;KACf;IAED,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,CAAC,GAAG,CAAC;QACZ,OAAO,EAAE,KAAK;KACf;IAED,QAAQ,EAAE;QACR,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,CAAC,GAAG,CAAC;QACZ,OAAO,EAAE,KAAK;KACf;IAED,KAAK,EAAE;QACL,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,CAAC,IAAI,CAAC;QACb,OAAO,EAAE,KAAK;KACf;IAED,MAAM,EAAE;QACN,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,CAAC,GAAG,CAAC;QACZ,OAAO,EAAE,KAAK;KACf;IAED,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,CAAC,GAAG,CAAC;QACZ,OAAO,EAAE,IAAI;KACd;IAED,UAAU,EAAE;QACV,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,CAAC,GAAG,CAAC;QACZ,OAAO,EAAE,KAAK;KACf;IAED,MAAM,EAAE;QACN,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,CAAC,GAAG,CAAC;QACZ,OAAO,EAAE,KAAK;KACf;IAED,OAAO,EAAE;QACP,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,CAAC,GAAG,CAAC;QACZ,OAAO,EAAE,KAAK;KACf;IAED,MAAM,EAAE;QACN,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,CAAC,GAAG,CAAC;QACZ,OAAO,EAAE,IAAI;KACd;IAED,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,GAAG;KACb;IAED,OAAO,EAAE;QACP,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,CAAC;KACX;IAED,GAAG,EAAE;QACH,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,GAAG;QACV,OAAO,EAAE,EAAE;KACZ;CAoBF,CAAC,CAAA;AAEF,MAAM,IAAI,GAAQ,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,CAAA;AAE1D,IAAK,SAOJ;AAPD,WAAK,SAAS;IACZ,mDAAa,CAAA;IACb,6CAAU,CAAA;IACV,+CAAW,CAAA;IACX,2CAAS,CAAA;IACT,2CAAS,CAAA;IACT,+CAAW,CAAA;AACb,CAAC,EAPI,SAAS,KAAT,SAAS,QAOb;AAED,IAAK,OASJ;AATD,WAAK,OAAO;IACV,6CAAY,CAAA;IACZ,yCAAU,CAAA;IACV,yCAAU,CAAA;IACV,yCAAU,CAAA;IACV,+CAAa,CAAA;IACb,2CAAW,CAAA;IACX,qCAAI,CAAA;IACJ,2CAAW,CAAA;AACb,CAAC,EATI,OAAO,KAAP,OAAO,QASX;AAED,MAAM,YAAY;IAMhB,YACkB,OAAe,EACf,IAAY,EACZ,QAAgB,EAChB,UAAkB,EAClB,UAAkB,EAClB,MAAc;QALd,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAQ;QACZ,aAAQ,GAAR,QAAQ,CAAQ;QAChB,eAAU,GAAV,UAAU,CAAQ;QAClB,eAAU,GAAV,UAAU,CAAQ;QAClB,WAAM,GAAN,MAAM,CAAQ;QAE9B,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAA;QACzC,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAA;QAChE,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;QAClG,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAA;IAC7F,CAAC;CACF;AAED,MAAa,QAAQ;IAArB;QACmB,SAAI,GAAW,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAKnD,cAAS,GAAW,kBAAU,CAAC,GAAG,CAAA;QAClC,UAAK,GAAiB,EAAE,CAAA;QACf,WAAM,GAAwB,IAAI,wBAAU,EAAW,CAAA;QAChE,aAAQ,GAAW,CAAC,CAAA;QACpB,UAAK,GAAY,IAAI,CAAA;IAkgB/B,CAAC;IAhgBS,MAAM,CAAC,UAAU;QACvB,IAAI,OAAO,GAAY,OAAO,CAAC,OAAO,CAAA;QACtC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,GAAG,OAAO,CAAC,IAAI,CAAA;QACxB,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;QAC3B,CAAC;aAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzB,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAA;QAC5B,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACpB,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAA;QAC/D,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACpB,OAAO,GAAG,OAAO,CAAC,MAAM,CAAA;QAC1B,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,MAAM,CAAC,YAAY;QACzB,IAAI,IAAI,GAAc,SAAS,CAAC,KAAK,CAAA;QACrC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,GAAG,SAAS,CAAC,KAAK,CAAA;QACxB,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,IAAI,GAAG,SAAS,CAAC,KAAK,CAAA;QACxB,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,GAAG,SAAS,CAAC,MAAM,CAAA;QACzB,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,GAAG,SAAS,CAAC,OAAO,CAAA;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3B,IAAI,GAAG,SAAS,CAAC,SAAS,CAAA;QAC5B,CAAC;aAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACxB,IAAI,GAAG,SAAS,CAAC,OAAO,CAAA;QAC1B,CAAC;aAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACrB,IAAI,GAAG,SAAS,CAAC,MAAM,CAAA;QACzB,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAEO,MAAM,CAAO,SAAS,CAAE,IAAY,EAAE,GAAW;;YACvD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,CAAA;YAC3C,MAAM,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAC3C,CAAC,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE;gBACnB,MAAM,CAAC,CAAA;YACT,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEY,IAAI;;YACf,OAAO,MAAM,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAChD,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAS,EAAE;oBAC1B,IAAI,QAAQ,GAAY,IAAI,CAAA;oBAC5B,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,CAAA;oBAErC,QAAQ,OAAO,EAAE,CAAC;wBAChB,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;4BAEtB,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAA;4BACrB,MAAK;wBACP,CAAC;wBAED,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;4BAEpB,IAAI,CAAC,MAAM,EAAE,CAAA;4BACb,MAAK;wBACP,CAAC;wBAED,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;4BAEpB,MAAM,OAAO,GAAW,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAA;4BAC/D,IAAI,CAAC;gCACH,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;oCACzC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;gCACrB,CAAC;4BACH,CAAC;4BAAC,OAAO,CAAC,EAAE,CAAC;gCACX,MAAM,CAAC,CAAC,CAAC,CAAA;4BACX,CAAC;4BACD,MAAK;wBACP,CAAC;wBAED,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;4BAEvB,MAAM,OAAO,GAAW,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAA;4BACnE,IAAI,CAAC;gCACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;gCAC7C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;4BAC/C,CAAC;4BAAC,OAAO,CAAC,EAAE,CAAC;gCACX,MAAM,CAAC,CAAC,CAAC,CAAA;4BACX,CAAC;4BACD,MAAK;wBACP,CAAC;wBAED,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;4BAEpB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gCACf,IAAI,CAAC,KAAK,EAAE,CAAA;4BACd,CAAC;iCAAM,CAAC;gCACN,IAAI,CAAC,GAAG,EAAE,CAAA;4BACZ,CAAC;4BACD,MAAK;wBACP,CAAC;wBAED,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;4BACrB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAA;4BACpB,MAAK;wBACP,CAAC;wBAED,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;4BAClB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;4BACvB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;4BAChB,MAAK;wBACP,CAAC;wBAED,KAAK,OAAO,CAAC,OAAO,CAAC;wBACrB,OAAO,CAAC,CAAC,CAAC;4BACR,QAAQ,GAAG,KAAK,CAAA;wBAClB,CAAC;oBACH,CAAC;oBACD,OAAO,CAAC,QAAQ,CAAC,CAAA;gBACnB,CAAC,CAAA,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;oBACb,MAAM,CAAC,CAAC,CAAC,CAAA;gBACX,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEa,YAAY,CAAE,CAAe;;YACzC,OAAO,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACpD,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,OAAe,EAAE,OAAgB,EAAE,EAAE;oBACzD,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;gBAC1B,CAAC,CAAC,CAAA;gBACF,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;oBAC3B,MAAM,CAAC,CAAC,CAAC,CAAA;gBACX,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEe,QAAQ;;YACtB,MAAM,OAAO,GAAW,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,0BAA0B,CAAC,CAAA;YACxE,MAAM,KAAK,GAAa,MAAM,IAAA,eAAQ,EAAC,OAAO,CAAC,CAAA;YAC/C,MAAM,SAAS,GAAG,IAAI,uBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAA;YAC/D,IAAI,OAAO,GAAG,CAAC,CAAA;YACf,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACpC,CAAC;YACD,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAA;gBAClE,OAAM;YACR,CAAC;YAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YACvC,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YACvC,CAAC;QACH,CAAC;KAAA;IAEa,MAAM,CAAE,SAA2B,EAAE,OAAe;;YAChE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;gBACxD,OAAM;YACR,CAAC;YACD,MAAM,OAAO,GAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;YACtC,IAAI,UAAU,GAAY,IAAI,CAAA;YAC9B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,UAAU,GAAG,IAAI,CAAC,MAAM,KAAK,MAAM,CAAA;YACrC,CAAC;YACD,MAAM,GAAG,GAAiB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,CAAA;YAC1E,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACzC,MAAM,GAAG,GAAW,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;YACnD,MAAM,EAAE,GAAiB,IAAI,sBAAY,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,wBAAY,CAAC,GAAG,CAAC,CAAC,CAAA;YACxF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAA;YACnC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;KAAA;IAEa,MAAM,CAAE,SAA2B,EAAE,OAAe;;YAChE,MAAM,MAAM,GAAkB,IAAI,sBAAa,EAAE,CAAA;YACjD,MAAM,OAAO,GAAW,IAAI,CAAC,OAAO,IAAI,EAAE,CAAA;YAC1C,MAAM,GAAG,GAAW,cAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAA;YAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC3C,MAAM,OAAO,GAAwB,IAAI,CAAC,OAAO,CAAA;YACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;gBACjC,MAAM,OAAO,GAAW,EAAE,CAAC,CAAC,CAAC,uBAAgB,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;gBAC/E,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,OAAO,EAAE,CAAC,CAAA;gBAClC,MAAM,GAAG,GAAiB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAC9D,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA;gBACnC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;gBAC1C,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;YACvC,CAAC;YACD,MAAM,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAA;QACxE,CAAC;KAAA;IAEa,QAAQ,CAAE,GAAW,EAAE,GAAiB,EAAE,EAAgB;;;YACtE,MAAM,IAAI,GAAY,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,CAAA;YACjD,MAAM,OAAO,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,SAAS,0CAAE,OAAO,EAAE,CAAA;YAE1C,MAAM,QAAQ,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;YAC1C,MAAM,QAAQ,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YACvE,MAAM,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAA;YACxD,MAAM,QAAQ,CAAC,SAAS,CAAC,kBAAkB,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;;KAC/E;IAEO,YAAY,CAAE,OAAe,EAAE,MAAoB;QACzD,MAAM,OAAO,GAAwB,IAAI,CAAC,OAAO,CAAA;QACjD,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACtC,OAAO,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;IAClC,CAAC;IAEO,GAAG;QACT,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACpC,MAAM,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC3C,IAAI,CAAC,EAAE,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC3B,CAAC;IACH,CAAC;IAEO,KAAK;QACX,IAAI,EAAgC,CAAA;QACpC,MAAM,GAAG,GAAW,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;QACpC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAChB,EAAE,GAAG,WAAW,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;QACnC,CAAC;aAAM,CAAC;YACN,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACzC,CAAC;QACD,IAAI,EAAE,EAAE,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IAEK,YAAY,CAAE,IAAY;;YAC9B,OAAO,MAAM,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAChD,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAU,EAAE,EAAE;oBAC7B,IAAI,GAAG,EAAE,CAAC;wBACR,MAAM,CAAC,GAAG,CAAC,CAAA;oBACb,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,IAAI,CAAC,CAAA;oBACf,CAAC;gBACH,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEa,kBAAkB,CAAE,UAAkB;;YAClD,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAA;YACrD,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;YACtD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;YACpC,MAAM,gBAAgB,GAAsB,OAAO,CAAC,uBAAuB,CAAC,CAAA;YAC5E,gBAAgB,CAAC,MAAM,GAAG,UAAU,CAAA;YACpC,MAAM,WAAW,GAAgB,IAAI,sBAAW,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;YAC/E,MAAM,WAAW,CAAC,QAAQ,EAAE,CAAA;YAC5B,MAAM,YAAY,GAAiB,IAAI,uBAAY,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAA;YAClF,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;YAC1E,MAAM,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;QACxC,CAAC;KAAA;IAEO,IAAI;;QACV,IAAI,CAAC,SAAS,EAAE,CAAA;QAChB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,MAAA,MAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,0CAAE,KAAK,CAAC,IAAI,EAAE,mCAAI,EAAE,CAAA;QACvH,MAAM,GAAG,GAAG,IAAI,mDAAsB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACxD,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAChB,OAAO,GAAG,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAA;IACrC,CAAC;IAEa,OAAO;;YACnB,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACxB,MAAM,EAAE,GAAG,IAAI,wBAAiB,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACzD,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,GAAG,EAAE,CAAC,MAAM,CAAA;YACpB,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;YACrC,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;QACvC,CAAC;KAAA;IAKa,IAAI;;YAChB,IAAI,OAAO,GAAW,IAAI,CAAC,OAAO,IAAI,kCAAkC,CAAA;YACxE,IAAI,CAAC,GAAG,GAAG,IAAI,0BAAgB,EAAE,CAAA;YACjC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;YAChC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAC5B,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;YAC1C,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;YACpE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAe,oBAAQ,CAAC,YAAY,CAAC,CAAA;YACpE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAA;YAC1C,IAAI,IAAY,CAAA;YAChB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;gBAChB,MAAM,EAAE,GAAG,MAAM,IAAI,wBAAiB,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAA;gBAC7D,IAAI,CAAC,MAAM,CAAC,WAAW,GAAG,EAAE,CAAA;gBAC5B,IAAI,CAAC,WAAW,GAAG,EAAE,CAAA;YACvB,CAAC;YACD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAA;YACpC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,SAAS,GAAG,kBAAU,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBACrD,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAA;YACxC,CAAC;YACD,IAAI,CAAC,UAAU,GAAG,IAAI,iBAAU,CAAC,WAAW,CAAC,CAAA;YAC7C,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,OAAO,CAAsB,oBAAQ,CAAC,cAAc,CAAC,CAAA;YAChF,CAAC;QACH,CAAC;KAAA;IAEO,SAAS;QACf,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;YACtB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAO,EAAE,EAAE;oBAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAChB,CAAC,CAAC,CAAA;YACJ,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,EAAU,EAAE,EAAE;oBAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;gBAChB,CAAC,CAAC,CAAA;YACJ,CAAC;YACD,KAAK,CAAC,OAAO,CAAC,CAAC,EAAO,EAAE,EAAE;gBACxB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;YAC3B,CAAC,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAEa,QAAQ,CAAE,EAAgB;;YACtC,IAAI,CAAC,SAAS,EAAE,CAAA;YAChB,IAAI,IAAI,GAAY,KAAK,CAAA;YACzB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;gBAClB,IAAI,GAAG,IAAI,CAAA;YACb,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;YAClB,MAAM,QAAQ,GAAS,IAAI,IAAI,EAAE,CAAA;YACjC,MAAM,EAAE,CAAC,IAAI,EAAE,CAAA;YACf,MAAM,OAAO,GAAW,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAA;YACjE,IAAI,IAAI,EAAE,CAAC;gBACT,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,QAAQ,eAAe,OAAO,EAAE,CAAC,CAAA;YAChE,CAAC;YACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAClD,CAAC;QACH,CAAC;KAAA;IAEO,SAAS,CAAE,EAAgB;QACjC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAA;QACjB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAA;QACf,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;QAE1B,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,OAAe,EAAE,CAAY,EAAE,EAAE;YACtD,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;oBAChC,OAAM;gBACR,CAAC;YACH,CAAC;YACD,EAAE,IAAI,CAAC,QAAQ,CAAA;YACf,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;QACxB,CAAC,CAAC,CAAA;IACJ,CAAC;IAEO,KAAK,CAAE,OAAe,EAAE,CAAU;;QACxC,MAAM,IAAI,GAAc,QAAQ,CAAC,YAAY,EAAE,CAAA;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAA;QACxB,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrB,IAAI,CAAC,GAAW,CAAC,CAAA;gBACjB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;oBACpB,CAAC,GAAG,CAAC,CAAA;gBACP,CAAC;qBAAM,CAAC;oBACN,CAAC,GAAG,KAAK,CAAC,OAAO,CAAW,GAAG,CAAC,CAAA;gBAClC,CAAC;gBACD,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;gBAClB,MAAK;YACP,CAAC;YAED,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACvB,MAAM,OAAO,GAAG,CAAC,CAAC,SAAS,EAAE,CAAA;gBAC7B,IAAI,OAAO,EAAE,CAAC;oBACZ,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBACtB,CAAC;gBACD,MAAK;YACP,CAAC;YAED,KAAK,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBACtB,MAAM,QAAQ,GAAiB,CAAC,CAAC,QAAQ,EAAkB,CAAA;gBAC3D,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;oBACjD,OAAO,CAAC,GAAG,CAAC,GAAG,OAAO,KAAK,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,CAAA;oBAC/E,OAAO,CAAC,GAAG,EAAE,CAAA;gBACf,CAAC;gBACD,MAAK;YACP,CAAC;YAED,KAAK,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;gBACzB,MAAM,OAAO,GAAG,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,SAAS,0CAAE,OAAO,EAAE,CAAA;gBACvC,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;gBAC/C,CAAC;gBACD,MAAK;YACP,CAAC;YAED,KAAK,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrB,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAA;gBAC3B,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;gBACrB,CAAC;gBACD,MAAK;YACP,CAAC;YAED,KAAK,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;gBACvB,MAAM,GAAG,GAAW,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAkB,CAAC,CAAA;gBAC5E,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;gBAChB,MAAK;YACP,CAAC;YAED;gBACE,MAAM,IAAI,KAAK,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAA;QAC3C,CAAC;IACH,CAAC;IAEa,MAAM;;YAClB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAA;gBAC3F,OAAM;YACR,CAAC;YACD,MAAM,GAAG,GAAW,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YAC1B,MAAM,EAAE,GAAiB,IAAI,sBAAY,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,sBAAU,CAAC,GAAG,CAAC,CAAC,CAAA;YACzE,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;QACzB,CAAC;KAAA;IAEa,YAAY,CAAE,CAAS;;YACnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,CAAO,GAAU,EAAE,QAAgB,EAAE,EAAE;oBAC5D,IAAI,GAAG,EAAE,CAAC;wBACR,MAAM,CAAC,GAAG,CAAC,CAAA;oBACb,CAAC;oBACD,OAAO,CAAC,QAAQ,CAAC,CAAA;gBACnB,CAAC,CAAA,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEK,UAAU,CAAE,QAAgB,EAAE,UAAkB;;YACpD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,MAAM,OAAO,GAAG,IAAI,wBAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;gBAC7D,MAAM,QAAQ,GAAS,IAAI,IAAI,EAAE,CAAA;gBACjC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACT,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;gBAC1B,MAAM,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAgB,oBAAQ,CAAC,WAAW,CAAC,CAAA;gBACnF,MAAM,WAAW,GAAc,IAAI,mBAAW,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;gBAChF,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,OAAe,EAAE,CAAU,EAAE,EAAE;;oBACpD,EAAE,CAAC,CAAA;oBACH,IAAI,CAAC,KAAK,UAAU,EAAE,CAAC;wBACrB,MAAM,OAAO,GAAW,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAA;wBACjE,MAAM,MAAM,GAAG,MAAA,MAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,SAAS,0CAAE,IAAI,CAAC,UAAU,mCAAI,CAAC,CAAA;wBACjD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;wBAC9F,OAAO,CAAC,OAAO,CAAC,CAAA;oBAClB,CAAC;gBACH,CAAC,CAAC,CAAA;gBACF,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE;oBAC1B,MAAM,CAAC,CAAC,CAAC,CAAA;gBACX,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEa,SAAS,CAAE,OAAe;;YACtC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAA;gBAC3F,OAAO,IAAI,CAAA;YACb,CAAC;YACD,OAAO,MAAM,IAAI,OAAO,CAAM,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAChD,MAAM,GAAG,GAAW,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBACvC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC;qBACnB,IAAI,CAAC,QAAQ,CAAC,EAAE;oBACf,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC;yBAC/B,IAAI,CAAC,CAAC,CAAe,EAAE,EAAE;wBACxB,OAAO,CAAC,CAAC,CAAC,CAAA;oBACZ,CAAC,CAAC;yBACD,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;gBAC9B,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;oBACX,MAAM,CAAC,CAAC,CAAC,CAAA;gBACX,CAAC,CAAC,CAAA;YACN,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEO,MAAM;QACZ,MAAM,OAAO,GAAwB,IAAI,CAAC,OAAO,CAAA;QACjD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAA;YAC1F,OAAM;QACR,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;YACnD,OAAM;QACR,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAA;YAC5F,OAAM;QACR,CAAC;QACD,MAAM,EAAE,GAAW,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;QACvC,MAAM,GAAG,GAAiB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;QACvF,OAAO,CAAC,aAAa,CAAC,EAAE,EAAE,GAAG,CAAC,CAAA;QAC9B,MAAM,GAAG,GAAW,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAA;QAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IAClB,CAAC;IAEO,IAAI,CAAE,CAAS;QACrB,IAAI,CAAC,GAAW,CAAC,CAAA;QACjB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;QAC7B,CAAC;QACD,OAAO,CAAC,CAAA;IACV,CAAC;CACF;AA5gBD,4BA4gBC;AAED,SAAS,QAAQ;IACf,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAA;IAC7B,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAC1B,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;IACpC,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAA;IAC7F,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAA;IAE9E,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;IAC3D,OAAO,CAAC,GAAG,CAAC,kIAAkI,CAAC,CAAA;IAC/I,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;IACnD,OAAO,CAAC,GAAG,CAAC,qHAAqH;QAC/H,2BAA2B,CAAC,CAAA;IAC9B,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAA;IACtE,OAAO,CAAC,GAAG,CAAC,yGAAyG;QACnH,wCAAwC,CAAC,CAAA;IAC3C,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAA;IAC7C,OAAO,CAAC,GAAG,CAAC,yGAAyG;QACnH,qCAAqC,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAA;IACzE,OAAO,CAAC,GAAG,CAAC,yGAAyG;QACnH,8CAA8C,CAAC,CAAA;IACjD,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAA;IACnF,OAAO,CAAC,GAAG,CAAC,iHAAiH,CAAC,CAAA;IAC9H,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;IACjD,OAAO,CAAC,GAAG,CAAC,wFAAwF;QAClG,uDAAuD,CAAC,CAAA;IAC1D,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAA;IACvC,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAA;IAC3E,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,yHAAyH,CAAC,CAAA;IACtI,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAA;IACpF,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAA;IAC/E,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,oDAAoD,CAAC,CAAA;IACjE,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;IAC1C,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;IAChD,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;IAC1C,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,4GAA4G,CAAC,CAAA;IACzH,OAAO,CAAC,GAAG,CAAC,0HAA0H,CAAC,CAAA;IACvI,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;IAC/C,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;IAChD,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAA;IAC9D,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,6EAA6E,CAAC,CAAA;IAC1F,OAAO,CAAC,GAAG,CAAC,+HAA+H,CAAC,CAAA;IAC5I,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;IACpC,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAA;IAC3C,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;IACpC,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAA;IAC3D,OAAO,CAAC,GAAG,CAAC,4HAA4H,CAAC,CAAA;IACzI,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;IAC/C,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAA;IACjD,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAA;IAChD,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAA;IACpD,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAA;IACxC,OAAO,CAAC,GAAG,CAAC,6JAA6J,CAAC,CAAA;IAC1K,OAAO,CAAC,GAAG,CAAC,0FAA0F,CAAC,CAAA;IACvG,OAAO,CAAC,GAAG,EAAE,CAAA;IAEb,OAAO,CAAC,GAAG,CAAC,sGAAsG,CAAC,CAAA;IACnH,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;IACrD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;IACrD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;IACrD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;IACrD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;IACrD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAA;IACrD,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;IACxD,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;IACxD,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAA;IACxD,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;IACnD,OAAO,CAAC,GAAG,CAAC,+EAA+E,CAAC,CAAA;IAE5F,OAAO,CAAC,GAAG,EAAE,CAAA;AACf,CAAC;AAED,MAAM,IAAI,GAAY,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAA;AACzC,IAAI,IAAI,EAAE,CAAC;IACT,QAAQ,EAAE,CAAA;AACZ,CAAC;KAAM,CAAC;IACN,MAAM,GAAG,GAAa,IAAI,QAAQ,EAAE,CAAA;IACpC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,GAAY,EAAE,EAAE;QAC/B,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,QAAQ,EAAE,CAAA;QACZ,CAAC;IACH,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAClB,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["import 'reflect-metadata'\r\n\r\nimport { ElasticBuffer, MsgView, MsgParser } from './buffer'\r\nimport { AsciiParser, AsciiView, AsciiChars } from './buffer/ascii'\r\nimport { ILooseObject } from './collections/collection'\r\nimport { SimpleFieldDefinition, FixDefinitions } from './dictionary/definition'\r\nimport { MessageGenerator, JsonHelper, getWords, DefinitionFactory } from './util'\r\nimport { ISessionDescription, FileDuplex, StringDuplex } from './transport'\r\n\r\nimport { MsgTag } from './types'\r\nimport { IJsFixConfig } from './config'\r\n\r\nimport * as util from 'util'\r\nimport * as minimist from 'minimist'\r\nimport * as path from 'path'\r\nimport { MsgTransport } from './transport/factory'\r\nimport { EnumCompiler, ICompilerSettings, MsgCompiler } from './dictionary/compiler'\r\nimport { AsciiMsgTransmitter } from './transport/ascii/ascii-msg-transmitter'\r\nimport { SessionContainer } from './runtime'\r\nimport { DITokens } from './runtime/di-tokens'\r\nimport buildOptions from 'minimist-options'\r\nimport { Dictionary } from './collections'\r\nimport { QuickFixXmlFileBuilder } from './dictionary/parser/quickfix/quick-fix-xml-file-builder'\r\n\r\nconst fs = require('node-fs-extra')\r\n\r\nconst options = buildOptions({\r\n dict: {\r\n type: 'string',\r\n alias: 'd',\r\n default: 'data/FIX44.xml'\r\n },\r\n\r\n type: {\r\n type: 'string-array',\r\n alias: 't'\r\n },\r\n\r\n fix: {\r\n type: 'string',\r\n alias: 'f',\r\n default: 'data/FIX44.xml'\r\n },\r\n\r\n session: {\r\n type: 'string',\r\n alias: 's'\r\n },\r\n\r\n delimiter: {\r\n type: 'string',\r\n alias: 'l',\r\n default: '|'\r\n },\r\n\r\n help: {\r\n type: 'boolean',\r\n alias: ['h'],\r\n default: false\r\n },\r\n\r\n unit: {\r\n type: 'boolean',\r\n alias: ['u'],\r\n default: false\r\n },\r\n\r\n generate: {\r\n type: 'boolean',\r\n alias: ['g'],\r\n default: false\r\n },\r\n\r\n stats: {\r\n type: 'boolean',\r\n alias: ['st'],\r\n default: false\r\n },\r\n\r\n tokens: {\r\n type: 'boolean',\r\n alias: ['t'],\r\n default: false\r\n },\r\n\r\n objects: {\r\n type: 'boolean',\r\n alias: ['o'],\r\n default: true\r\n },\r\n\r\n structures: {\r\n type: 'boolean',\r\n alias: ['r'],\r\n default: false\r\n },\r\n\r\n script: {\r\n type: 'boolean',\r\n alias: ['i'],\r\n default: false\r\n },\r\n\r\n compile: {\r\n type: 'boolean',\r\n alias: ['c'],\r\n default: false\r\n },\r\n\r\n groups: {\r\n type: 'boolean',\r\n alias: ['g'],\r\n default: true\r\n },\r\n\r\n density: {\r\n type: 'number',\r\n alias: 'd',\r\n default: 0.8\r\n },\r\n\r\n repeats: {\r\n type: 'number',\r\n alias: 'r',\r\n default: 1\r\n },\r\n\r\n arr: {\r\n type: 'array',\r\n alias: 'a',\r\n default: []\r\n }\r\n\r\n /*\r\n booleans: {\r\n type: 'boolean-array',\r\n alias: 'b',\r\n default: [true, false]\r\n },\r\n\r\n numbers: {\r\n type: 'number-array',\r\n alias: 'n',\r\n default: [0, 1]\r\n },\r\n\r\n published: 'boolean',\r\n\r\n // Special option for positional arguments (`_` in minimist)\r\n arguments: 'string'\r\n */\r\n})\r\n\r\nconst argv: any = minimist(process.argv.slice(2), options)\r\n\r\nenum PrintMode {\r\n Structure = 1,\r\n Object = 2,\r\n Verbose = 3,\r\n Stats = 4,\r\n Token = 5,\r\n Encoded = 6\r\n}\r\n\r\nenum Command {\r\n Generate = 1,\r\n Replay = 2,\r\n Lookup = 3,\r\n Encode = 4,\r\n Benchmark = 5,\r\n Compile = 6,\r\n Trim,\r\n Unknown = 8\r\n}\r\n\r\nclass ParseSummary {\r\n public readonly micros_per_msg: number\r\n public readonly chars_per_second: number\r\n public readonly fields_per_second: number\r\n public readonly content_length: number\r\n\r\n constructor (\r\n public readonly content: string,\r\n public readonly view: string,\r\n public readonly msg_type: string,\r\n public readonly iterations: number,\r\n public readonly elapsed_ms: number,\r\n public readonly fields: number\r\n ) {\r\n this.content_length = this.content.length\r\n this.micros_per_msg = (this.elapsed_ms / this.iterations) * 1000\r\n this.chars_per_second = Math.round(this.content_length * this.iterations / this.elapsed_ms * 1000)\r\n this.fields_per_second = Math.round(this.fields * this.iterations / this.elapsed_ms * 1000)\r\n }\r\n}\r\n\r\nexport class JsfixCmd {\r\n private readonly root: string = path.join(__dirname, '../')\r\n private definitions: FixDefinitions\r\n private jsonHelper: JsonHelper\r\n private session: AsciiMsgTransmitter\r\n private sessionDescription: ISessionDescription\r\n private delimiter: number = AsciiChars.Soh\r\n private stats: ILooseObject = {}\r\n private readonly filter: Dictionary<boolean> = new Dictionary<boolean>()\r\n private messages: number = 0\r\n private print: boolean = true\r\n\r\n private static getCommand (): Command {\r\n let command: Command = Command.Unknown\r\n if (argv.trim) {\r\n command = Command.Trim\r\n } else if (argv.compile) {\r\n command = Command.Compile\r\n } else if (argv.generate) {\r\n command = Command.Generate\r\n } else if (argv.fix) {\r\n command = argv.benchmark ? Command.Benchmark : Command.Replay\r\n } else if (argv.field) {\r\n command = Command.Lookup\r\n } else if (argv.json) {\r\n command = Command.Encode\r\n } else if (argv.msg) {\r\n command = Command.Lookup\r\n }\r\n return command\r\n }\r\n\r\n private static getPrintMode (): PrintMode {\r\n let mode: PrintMode = PrintMode.Stats\r\n if (argv.tokens) {\r\n mode = PrintMode.Token\r\n } else if (argv.stats) {\r\n mode = PrintMode.Stats\r\n } else if (argv.objects) {\r\n mode = PrintMode.Object\r\n } else if (argv.verbose) {\r\n mode = PrintMode.Verbose\r\n } else if (argv.structures) {\r\n mode = PrintMode.Structure\r\n } else if (argv.encoded) {\r\n mode = PrintMode.Encoded\r\n } else if (argv.trim) {\r\n mode = PrintMode.Object\r\n }\r\n return mode\r\n }\r\n\r\n private static async writeFile (name: string, api: string): Promise<void> {\r\n const writer = util.promisify(fs.writeFile)\r\n await writer(name, api, { encoding: 'utf8' }\r\n ).catch((e: Error) => {\r\n throw e\r\n })\r\n }\r\n\r\n public async exec (): Promise<any> {\r\n return await new Promise<any>((resolve, reject) => {\r\n this.init().then(async () => {\r\n let actioned: boolean = true\r\n const command = JsfixCmd.getCommand()\r\n\r\n switch (command) {\r\n case Command.Generate: {\r\n // produce a test message or a valid fix log of n messages\r\n await this.generate()\r\n break\r\n }\r\n\r\n case Command.Encode: {\r\n // encode a json message back to fix\r\n this.encode()\r\n break\r\n }\r\n\r\n case Command.Replay: {\r\n // parse a file into either objects, tokens, structures or stats\r\n const repeats: number = !isNaN(argv.repeats) ? argv.repeats : 1\r\n try {\r\n for (let i: number = 0; i < repeats; ++i) {\r\n await this.replay()\r\n }\r\n } catch (e) {\r\n reject(e)\r\n }\r\n break\r\n }\r\n\r\n case Command.Benchmark: {\r\n // time how long to parse 10000 repeats of contents of file\r\n const repeats: number = !isNaN(argv.repeats) ? argv.repeats : 10000\r\n try {\r\n const summary = await this.benchmark(repeats)\r\n console.log(JSON.stringify(summary, null, 4))\r\n } catch (e) {\r\n reject(e)\r\n }\r\n break\r\n }\r\n\r\n case Command.Lookup: {\r\n // lookup a field\r\n if (argv.field) {\r\n this.field()\r\n } else {\r\n this.msg()\r\n }\r\n break\r\n }\r\n\r\n case Command.Compile: {\r\n await this.compile()\r\n break\r\n }\r\n\r\n case Command.Trim: {\r\n const xml = this.trim()\r\n console.log(xml)\r\n break\r\n }\r\n\r\n case Command.Unknown:\r\n default: {\r\n actioned = false\r\n }\r\n }\r\n resolve(actioned)\r\n }).catch((e) => {\r\n reject(e)\r\n })\r\n })\r\n }\r\n\r\n private async firstMessage (t: MsgTransport): Promise<MsgView> {\r\n return await new Promise<MsgView>((resolve, reject) => {\r\n t.receiver.on('msg', (msgType: string, msgView: MsgView) => {\r\n resolve(msgView.clone())\r\n })\r\n t.receiver.on('error', (e) => {\r\n reject(e)\r\n })\r\n })\r\n }\r\n\r\n protected async generate (): Promise<void> {\r\n const lipPath: string = path.join(this.root, 'data/examples/lipsum.txt')\r\n const words: string[] = await getWords(lipPath)\r\n const generator = new MessageGenerator(words, this.definitions)\r\n let density = 1\r\n if (argv.density) {\r\n density = parseFloat(argv.density)\r\n }\r\n if (isNaN(density)) {\r\n console.log('density must be numeric in range > 0 density <= 1.0')\r\n return\r\n }\r\n\r\n if (argv.script) {\r\n await this.script(generator, density)\r\n } else {\r\n await this.single(generator, density)\r\n }\r\n }\r\n\r\n private async single (generator: MessageGenerator, density: number): Promise<void> {\r\n if (!argv.type) {\r\n console.log('specify type to generate e.g. --type = AE')\r\n return\r\n }\r\n const msgType: string = `${argv.type}`\r\n let makeGroups: boolean = true\r\n if (argv.groups) {\r\n makeGroups = argv.groups === 'true'\r\n }\r\n const obj: ILooseObject = generator.generate(msgType, density, makeGroups)\r\n console.log(JSON.stringify(obj, null, 4))\r\n const fix: string = this.encodeObject(msgType, obj)\r\n const ft: MsgTransport = new MsgTransport(1, this.session.config, new StringDuplex(fix))\r\n if (argv.unit) {\r\n await this.unitTest(fix, obj, ft)\r\n } else {\r\n this.subscribe(ft)\r\n }\r\n }\r\n\r\n private async script (generator: MessageGenerator, density: number): Promise<void> {\r\n const buffer: ElasticBuffer = new ElasticBuffer()\r\n const repeats: number = argv.repeats || 50\r\n const key: string = MsgTag.MsgType.toString()\r\n const sf = this.definitions.simple.get(key)\r\n const session: AsciiMsgTransmitter = this.session\r\n for (let i = 0; i < repeats; ++i) {\r\n const msgType: string = sf ? MessageGenerator.getRandomEnum(sf).toString() : ''\r\n console.log(`i = ${i} ${msgType}`)\r\n const obj: ILooseObject = generator.generate(msgType, density)\r\n session.encodeMessage(msgType, obj)\r\n buffer.writeBuffer(session.buffer.slice())\r\n buffer.writeString(require('os').EOL)\r\n }\r\n await JsfixCmd.writeFile('./fix.txt', buffer.slice().toString('utf8'))\r\n }\r\n\r\n private async unitTest (fix: string, obj: ILooseObject, ft: MsgTransport): Promise<void> {\r\n const view: MsgView = await this.firstMessage(ft)\r\n const summary = view?.structure?.summary()\r\n\r\n await JsfixCmd.writeFile('./fix.txt', fix)\r\n await JsfixCmd.writeFile('./object.json', JSON.stringify(obj, null, 4))\r\n await JsfixCmd.writeFile('./token.txt', view.toString())\r\n await JsfixCmd.writeFile('./structure.json', JSON.stringify(summary, null, 4))\r\n }\r\n\r\n private encodeObject (msgType: string, object: ILooseObject): string {\r\n const session: AsciiMsgTransmitter = this.session\r\n session.encodeMessage(msgType, object)\r\n return session.buffer.toString()\r\n }\r\n\r\n private msg (): void {\r\n const definitions = this.definitions\r\n const m = definitions.message.get(argv.msg)\r\n if (m) {\r\n console.log(m.toString())\r\n }\r\n }\r\n\r\n private field (): void {\r\n let sf: SimpleFieldDefinition | null\r\n const tag: number = parseInt(argv.field, 10)\r\n const definitions = this.definitions\r\n if (!isNaN(tag)) {\r\n sf = definitions.tagToSimple[tag]\r\n } else {\r\n sf = definitions.simple.get(argv.field)\r\n }\r\n if (sf) {\r\n console.log(sf.toString())\r\n }\r\n }\r\n\r\n async ensureExists (path: string): Promise<any> {\r\n return await new Promise<any>((resolve, reject) => {\r\n fs.mkdirp(path, (err: Error) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve(true)\r\n }\r\n })\r\n })\r\n }\r\n\r\n private async compileDefinitions (outputPath: string): Promise<void> {\r\n await this.ensureExists(path.join(outputPath, 'set'))\r\n await this.ensureExists(path.join(outputPath, 'enum'))\r\n const definitions = this.definitions\r\n const compilerSettings: ICompilerSettings = require('../data/compiler.json')\r\n compilerSettings.output = outputPath\r\n const msgCompiler: MsgCompiler = new MsgCompiler(definitions, compilerSettings)\r\n await msgCompiler.generate()\r\n const enumCompiler: EnumCompiler = new EnumCompiler(definitions, compilerSettings)\r\n const writeFile = path.join(compilerSettings.output, './enum/all-enum.ts')\r\n await enumCompiler.generate(writeFile)\r\n }\r\n\r\n private trim (): string {\r\n this.setFilter()\r\n const types = this.filter.count() > 0 ? this.filter.keys() : this.definitions.simple.get('MsgType')?.enums.keys() ?? []\r\n const qfb = new QuickFixXmlFileBuilder(this.definitions)\r\n qfb.write(types)\r\n return qfb.elasticBuffer.toString()\r\n }\r\n\r\n private async compile (): Promise<void> {\r\n let output = argv.output\r\n const dp = new DefinitionFactory().getDictPath(argv.dict)\r\n if (dp) {\r\n output = dp.output\r\n }\r\n output = path.join(this.root, output)\r\n await this.compileDefinitions(output)\r\n }\r\n\r\n sys: SessionContainer\r\n config: IJsFixConfig\r\n\r\n private async init (): Promise<any> {\r\n let session: string = argv.session || 'data/session/test-initiator.json'\r\n this.sys = new SessionContainer()\r\n this.sys.registerGlobal('error')\r\n session = this.norm(session)\r\n this.sessionDescription = require(session)\r\n const container = await this.sys.makeSystem(this.sessionDescription)\r\n this.config = container.resolve<IJsFixConfig>(DITokens.IJsFixConfig)\r\n this.definitions = this.config.definitions\r\n let dict: string\r\n if (argv.dict) {\r\n dict = argv.dict\r\n const df = await new DefinitionFactory().getDefinitions(dict)\r\n this.config.definitions = df\r\n this.definitions = df\r\n }\r\n const definitions = this.definitions\r\n if (argv.delimiter) {\r\n this.delimiter = AsciiChars.firstChar(argv.delimiter)\r\n this.config.delimiter = this.delimiter\r\n }\r\n this.jsonHelper = new JsonHelper(definitions)\r\n if (argv.session) {\r\n this.session = container.resolve<AsciiMsgTransmitter>(DITokens.MsgTransmitter)\r\n }\r\n }\r\n\r\n private setFilter (): void {\r\n const types: string[] = []\r\n if (argv.type != null) {\r\n if (Array.isArray(argv.type)) {\r\n argv.type.forEach((mt: any) => {\r\n types.push(mt)\r\n })\r\n } else {\r\n argv.type.split(',').forEach((mt: string) => {\r\n types.push(mt)\r\n })\r\n }\r\n types.forEach((mt: any) => {\r\n this.filter.add(mt, true)\r\n })\r\n }\r\n }\r\n\r\n private async dispatch (ft: MsgTransport): Promise<any> {\r\n this.setFilter()\r\n let time: boolean = false\r\n if (argv.time || argv.stats) {\r\n this.print = false\r\n time = true\r\n }\r\n this.subscribe(ft)\r\n const startsAt: Date = new Date()\r\n await ft.wait()\r\n const elapsed: number = new Date().getTime() - startsAt.getTime()\r\n if (time) {\r\n console.log(`messages ${this.messages} elapsed ms ${elapsed}`)\r\n }\r\n if (argv.stats) {\r\n console.log(JSON.stringify(this.stats, null, 4))\r\n }\r\n }\r\n\r\n private subscribe (ft: MsgTransport): void {\r\n this.messages = 0\r\n this.stats = {}\r\n const filter = this.filter\r\n // the receiver is message parser which is piped from an input stream - file, socket\r\n ft.receiver.on('msg', (msgType: string, m: AsciiView) => {\r\n if (filter) {\r\n if (filter.containsKey(msgType)) {\r\n return\r\n }\r\n }\r\n ++this.messages\r\n this.onMsg(msgType, m)\r\n })\r\n }\r\n\r\n private onMsg (msgType: string, m: MsgView): void {\r\n const mode: PrintMode = JsfixCmd.getPrintMode()\r\n const print = this.print\r\n const stats = this.stats\r\n switch (mode) {\r\n case PrintMode.Stats: {\r\n let i: number = 0\r\n if (!stats[msgType]) {\r\n i = 1\r\n } else {\r\n i = stats[msgType] as number + 1\r\n }\r\n stats[msgType] = i\r\n break\r\n }\r\n\r\n case PrintMode.Verbose: {\r\n const verbose = m.toVerbose()\r\n if (verbose) {\r\n console.log(verbose)\r\n }\r\n break\r\n }\r\n\r\n case PrintMode.Object: {\r\n const asObject: ILooseObject = m.toObject() as ILooseObject\r\n if (print) {\r\n const def = this.definitions.message.get(msgType)\r\n console.log(`${msgType} [${def?.name}] = ${JSON.stringify(asObject, null, 4)}`)\r\n console.log()\r\n }\r\n break\r\n }\r\n\r\n case PrintMode.Structure: {\r\n const summary = m?.structure?.summary()\r\n if (print) {\r\n console.log(JSON.stringify(summary, null, 4))\r\n }\r\n break\r\n }\r\n\r\n case PrintMode.Token: {\r\n const tokens = m.toString()\r\n if (print) {\r\n console.log(tokens)\r\n }\r\n break\r\n }\r\n\r\n case PrintMode.Encoded: {\r\n const fix: string = this.encodeObject(msgType, m.toObject() as ILooseObject)\r\n console.log(fix)\r\n break\r\n }\r\n\r\n default:\r\n throw new Error(`unknown mode ${mode}`)\r\n }\r\n }\r\n\r\n private async replay (): Promise<any> {\r\n if (!argv.fix) {\r\n console.log('provide a path to fix file i.e. --fix=data/examples/execution-report/fix.txt')\r\n return\r\n }\r\n const fix: string = this.norm(argv.fix)\r\n const config = this.config\r\n const ft: MsgTransport = new MsgTransport(1, config, new FileDuplex(fix))\r\n await this.dispatch(ft)\r\n }\r\n\r\n private async promisedRead (f: string): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n fs.readFile(f, 'utf8', async (err: Error, contents: string) => {\r\n if (err) {\r\n reject(err)\r\n }\r\n resolve(contents)\r\n })\r\n })\r\n }\r\n\r\n async benchParse (contents: string, iterations: number): Promise<ParseSummary> {\r\n return new Promise((resolve, reject) => {\r\n const toParse = new StringDuplex(contents.repeat(iterations))\r\n const startsAt: Date = new Date()\r\n let i = 0\r\n const config = this.config\r\n const buffer = config.sessionContainer.resolve<ElasticBuffer>(DITokens.ParseBuffer)\r\n const asciiParser: MsgParser = new AsciiParser(config, toParse.readable, buffer)\r\n asciiParser.on('msg', (msgType: string, v: MsgView) => {\r\n ++i\r\n if (i === iterations) {\r\n const elapsed: number = new Date().getTime() - startsAt.getTime()\r\n const fields = v?.structure?.tags.nextTagPos ?? 0\r\n const summary = new ParseSummary(contents, v.toString(), msgType, iterations, elapsed, fields)\r\n resolve(summary)\r\n }\r\n })\r\n asciiParser.on('error', e => {\r\n reject(e)\r\n })\r\n })\r\n }\r\n\r\n private async benchmark (repeats: number): Promise<(ParseSummary | null)> {\r\n if (!argv.fix) {\r\n console.log('provide a path to fix file i.e. --fix=data/examples/execution-report/fix.txt')\r\n return null\r\n }\r\n return await new Promise<any>((resolve, reject) => {\r\n const fix: string = this.norm(argv.fix)\r\n this.promisedRead(fix)\r\n .then(contents => {\r\n this.benchParse(contents, repeats)\r\n .then((a: ParseSummary) => {\r\n resolve(a)\r\n })\r\n .catch(e => { reject(e) })\r\n }).catch(e => {\r\n reject(e)\r\n })\r\n })\r\n }\r\n\r\n private encode (): void {\r\n const session: AsciiMsgTransmitter = this.session\r\n if (!session) {\r\n console.log('provide a session json file e.g. --session=data/session/test-initiator.json')\r\n return\r\n }\r\n if (!argv.type) {\r\n console.log('provide a message type e.g. --type=8')\r\n return\r\n }\r\n if (!argv.json) {\r\n console.log('provide a json representation e.g. data/examples/execution-report/object.json')\r\n return\r\n }\r\n const ts: string = argv.type.toString()\r\n const msg: ILooseObject = this.jsonHelper.fromJson(path.join(this.root, argv.json), ts)\r\n session.encodeMessage(ts, msg)\r\n const fix: string = session.buffer.toString()\r\n console.log(fix)\r\n }\r\n\r\n private norm (p: string): string {\r\n let f: string = p\r\n if (!path.isAbsolute(p)) {\r\n f = path.join(this.root, f)\r\n }\r\n return f\r\n }\r\n}\r\n\r\nfunction showHelp (): void {\r\n console.log('this help page')\r\n console.log('npm run cmd')\r\n console.log('npm run cmd -- --help')\r\n console.log()\r\n\r\n console.log('print to console a trim quickfix format xml only including given message types')\r\n console.log('node dist/jsfix-cmd --dict=qf44 --trim --type=\"0,1,2,3,4,5,AE\"')\r\n\r\n console.log('token format i.e. [602] 687 (LegQty) = 33589')\r\n console.log('node dist/jsfix-cmd --dict=data/FIX44.xml --fix=data/examples/quickfix/FIX.4.4/execution-report/fix.txt --delimiter=\"|\" --tokens')\r\n console.log()\r\n\r\n console.log('token format use fix repo dictionary')\r\n console.log('node dist/jsfix-cmd --dict=data/fix_repo/FIX.4.4/Base --fix=data/examples/quickfix/FIX.4.4/execution-report/fix.txt' +\r\n ' --delimiter=\"|\" --tokens')\r\n console.log()\r\n\r\n console.log('structure format i.e. show locations of components etc.')\r\n console.log('node dist/jsfix-cmd --dict=data/FIX44.xml --fix=data/examples/FIX.4.4/quickfix/execution-report/fix.txt' +\r\n ' --delimiter=\"|\" --tokens --structures')\r\n console.log()\r\n\r\n console.log('full JS object in JSON format.')\r\n console.log('node dist/jsfix-cmd --dict=data/FIX44.xml --fix=data/examples/FIX.4.4/quickfix/execution-report/fix.txt' +\r\n ' --delimiter=\"|\" --tokens --objects')\r\n console.log()\r\n\r\n console.log('full JS object in JSON format - filter only type messages.')\r\n console.log('node dist/jsfix-cmd --dict=data/FIX44.xml --fix=data/examples/FIX.4.4/quickfix/execution-report/fix.txt' +\r\n ' --delimiter=\"|\" --tokens --type=8 --objects')\r\n console.log()\r\n\r\n console.log('timing stats and message counts. Structured parsing of all messages.')\r\n console.log('node dist/jsfix-cmd --dict=data/FIX44.xml --fix=data/examples/FIX.4.4/quickfix/execution-report/fix.txt --stats')\r\n console.log()\r\n\r\n console.log('encode a json object to fix format')\r\n console.log('node dist/jsfix-cmd --json=data/examples/FIX.4.4/quickfix/execution-report/object.json' +\r\n ' --session=data/session.json --type=8 --delimiter=\"|\"')\r\n console.log()\r\n\r\n console.log('display field definition')\r\n console.log('node dist/jsfix-cmd --dict=data/FIX44.xml --field=MsgType|35')\r\n console.log()\r\n\r\n console.log('display field use fix repo dictionary e.g. 271 MDEntrySize QTY Quantity or volume represented by the Market Data Entry.')\r\n console.log('node dist/jsfix-cmd --dict=data/fix_repo/FIX.4.4/Base --field=MsgType')\r\n console.log('node dist/jsfix-cmd --dict=data/fix_repo/FIX.4.4/Base --field=35')\r\n console.log()\r\n\r\n console.log('script to describe field in repository version 4.4')\r\n console.log('npm run repo44 -- --field=8')\r\n console.log()\r\n\r\n console.log('script to describe field in fixml')\r\n console.log('npm run fixml -- --field=50')\r\n console.log()\r\n\r\n console.log('generate unit test set of files - i.e. randomly generate an object, encode to fix. density 1 is all fields')\r\n console.log('node dist/jsfix-cmd --generate --type=AE --density=0.8 --unit --delimiter=\"|\" --session=data/session/test-initiator.json')\r\n console.log('npm run repo44-unit -- --type=AE')\r\n console.log('test script with no repeat groups')\r\n console.log('npm run repo44-unit -- --type=AE --groups=false')\r\n console.log()\r\n\r\n console.log('generate a fix log of randomly generated but syntactically correct messages')\r\n console.log('node dist/jsfix-cmd --generate --density=0.8 --repeats=50 --script --delimiter=\"|\" --session=data/session/test-initiator.json')\r\n console.log('npm run repo44-script')\r\n console.log('parse above generated script')\r\n console.log('npm run repo44-repscr')\r\n console.log()\r\n\r\n console.log('replay example repo fix file of 50 messages.')\r\n console.log('node dist/jsfix-cmd --session=data/session/test-initiator.json --fix=data/examples/FIX.4.4/fix.txt --delimiter=\"|\" --stats')\r\n console.log('npm run repo44-replay -- --stats')\r\n console.log('npm run repo44-replay -- --objects')\r\n console.log('npm run repo44-replay -- --tokens')\r\n console.log('npm run repo44-replay -- --structures')\r\n console.log()\r\n\r\n console.log('benchmark parse a message')\r\n console.log('node dist/jsfix-cmd --delimiter=\"|\" --session=data/session/test-initiator.json --fix=data/examples/FIX.4.4/repo/trade-capture-no-groups/fix.txt --benchmark')\r\n console.log('npm run repo44-bench -- --fix=data/examples/FIX.4.4/repo/trade-capture-no-groups/fix.txt')\r\n console.log()\r\n\r\n console.log('compile typescript interfaces - i.e. outputs to src/types/FIX4.4 - requires set and enum sub folders')\r\n console.log('npm run cmd -- --dict=repo40 --compile')\r\n console.log('npm run cmd -- --dict=repo41 --compile')\r\n console.log('npm run cmd -- --dict=repo42 --compile')\r\n console.log('npm run cmd -- --dict=repo43 --compile')\r\n console.log('npm run cmd -- --dict=repo44 --compile')\r\n console.log('npm run cmd -- --dict=repo50 --compile')\r\n console.log('npm run cmd -- --dict=repo50sp1 --compile')\r\n console.log('npm run cmd -- --dict=repo50sp2 --compile')\r\n console.log('npm run cmd -- --dict=repofixml --compile')\r\n console.log('npm run cmd -- --dict=qf44 --compile')\r\n console.log('npm run cmd -- --dict=data/handmade.xml --compile --output=src/types/handmade')\r\n\r\n console.log()\r\n}\r\n\r\nconst help: boolean = argv.h || argv.help\r\nif (help) {\r\n showHelp()\r\n} else {\r\n const cmd: JsfixCmd = new JsfixCmd()\r\n cmd.exec().then((res: boolean) => {\r\n if (!res) {\r\n showHelp()\r\n }\r\n }).catch((e: Error) => {\r\n console.error(e)\r\n })\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"jsfix-cmd.js","sourceRoot":"","sources":["../src/jsfix-cmd.ts"],"names":[],"mappings":"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","sourcesContent":["import 'reflect-metadata'\r\n\r\nimport { ElasticBuffer, MsgView, MsgParser } from './buffer'\r\nimport { AsciiParser, AsciiView, AsciiChars } from './buffer/ascii'\r\nimport { ILooseObject } from './collections/collection'\r\nimport { SimpleFieldDefinition, FixDefinitions } from './dictionary/definition'\r\nimport { MessageGenerator, JsonHelper, getWords, DefinitionFactory } from './util'\r\nimport { ISessionDescription, FileDuplex, StringDuplex } from './transport'\r\n\r\nimport { MsgTag } from './types'\r\nimport { IJsFixConfig } from './config'\r\n\r\nimport * as util from 'util'\r\nimport * as minimist from 'minimist'\r\nimport * as path from 'path'\r\nimport { MsgTransport } from './transport/factory'\r\nimport { EnumCompiler, ICompilerSettings, MsgCompiler } from './dictionary/compiler'\r\nimport { AsciiMsgTransmitter } from './transport/ascii/ascii-msg-transmitter'\r\nimport { SessionContainer } from './runtime'\r\nimport { DITokens } from './runtime/di-tokens'\r\nimport buildOptions from 'minimist-options'\r\nimport { QuickFixXmlFileBuilder } from './dictionary/parser/quickfix/quick-fix-xml-file-builder'\r\n\r\nconst fs = require('node-fs-extra')\r\n\r\nconst options = buildOptions({\r\n dict: {\r\n type: 'string',\r\n alias: 'd',\r\n default: 'data/FIX44.xml'\r\n },\r\n\r\n type: {\r\n type: 'string-array',\r\n alias: 't'\r\n },\r\n\r\n fix: {\r\n type: 'string',\r\n alias: 'f',\r\n default: 'data/FIX44.xml'\r\n },\r\n\r\n session: {\r\n type: 'string',\r\n alias: 's'\r\n },\r\n\r\n delimiter: {\r\n type: 'string',\r\n alias: 'l',\r\n default: '|'\r\n },\r\n\r\n help: {\r\n type: 'boolean',\r\n alias: ['h'],\r\n default: false\r\n },\r\n\r\n unit: {\r\n type: 'boolean',\r\n alias: ['u'],\r\n default: false\r\n },\r\n\r\n generate: {\r\n type: 'boolean',\r\n alias: ['g'],\r\n default: false\r\n },\r\n\r\n stats: {\r\n type: 'boolean',\r\n alias: ['st'],\r\n default: false\r\n },\r\n\r\n tokens: {\r\n type: 'boolean',\r\n alias: ['t'],\r\n default: false\r\n },\r\n\r\n objects: {\r\n type: 'boolean',\r\n alias: ['o'],\r\n default: true\r\n },\r\n\r\n structures: {\r\n type: 'boolean',\r\n alias: ['r'],\r\n default: false\r\n },\r\n\r\n script: {\r\n type: 'boolean',\r\n alias: ['i'],\r\n default: false\r\n },\r\n\r\n compile: {\r\n type: 'boolean',\r\n alias: ['c'],\r\n default: false\r\n },\r\n\r\n groups: {\r\n type: 'boolean',\r\n alias: ['g'],\r\n default: true\r\n },\r\n\r\n density: {\r\n type: 'number',\r\n alias: 'd',\r\n default: 0.8\r\n },\r\n\r\n repeats: {\r\n type: 'number',\r\n alias: 'r',\r\n default: 1\r\n },\r\n\r\n arr: {\r\n type: 'array',\r\n alias: 'a',\r\n default: []\r\n }\r\n\r\n /*\r\n booleans: {\r\n type: 'boolean-array',\r\n alias: 'b',\r\n default: [true, false]\r\n },\r\n\r\n numbers: {\r\n type: 'number-array',\r\n alias: 'n',\r\n default: [0, 1]\r\n },\r\n\r\n published: 'boolean',\r\n\r\n // Special option for positional arguments (`_` in minimist)\r\n arguments: 'string'\r\n */\r\n})\r\n\r\nconst argv: any = minimist(process.argv.slice(2), options)\r\n\r\nenum PrintMode {\r\n Structure = 1,\r\n Object = 2,\r\n Verbose = 3,\r\n Stats = 4,\r\n Token = 5,\r\n Encoded = 6\r\n}\r\n\r\nenum Command {\r\n Generate = 1,\r\n Replay = 2,\r\n Lookup = 3,\r\n Encode = 4,\r\n Benchmark = 5,\r\n Compile = 6,\r\n Trim,\r\n Unknown = 8\r\n}\r\n\r\nclass ParseSummary {\r\n public readonly micros_per_msg: number\r\n public readonly chars_per_second: number\r\n public readonly fields_per_second: number\r\n public readonly content_length: number\r\n\r\n constructor (\r\n public readonly content: string,\r\n public readonly view: string,\r\n public readonly msg_type: string,\r\n public readonly iterations: number,\r\n public readonly elapsed_ms: number,\r\n public readonly fields: number\r\n ) {\r\n this.content_length = this.content.length\r\n this.micros_per_msg = (this.elapsed_ms / this.iterations) * 1000\r\n this.chars_per_second = Math.round(this.content_length * this.iterations / this.elapsed_ms * 1000)\r\n this.fields_per_second = Math.round(this.fields * this.iterations / this.elapsed_ms * 1000)\r\n }\r\n}\r\n\r\nexport class JsfixCmd {\r\n private readonly root: string = path.join(__dirname, '../')\r\n private definitions: FixDefinitions\r\n private jsonHelper: JsonHelper\r\n private session: AsciiMsgTransmitter\r\n private sessionDescription: ISessionDescription\r\n private delimiter: number = AsciiChars.Soh\r\n private stats: ILooseObject = {}\r\n private readonly filter: Map<string, boolean> = new Map<string, boolean>()\r\n private messages: number = 0\r\n private print: boolean = true\r\n\r\n private static getCommand (): Command {\r\n let command: Command = Command.Unknown\r\n if (argv.trim) {\r\n command = Command.Trim\r\n } else if (argv.compile) {\r\n command = Command.Compile\r\n } else if (argv.generate) {\r\n command = Command.Generate\r\n } else if (argv.fix) {\r\n command = argv.benchmark ? Command.Benchmark : Command.Replay\r\n } else if (argv.field) {\r\n command = Command.Lookup\r\n } else if (argv.json) {\r\n command = Command.Encode\r\n } else if (argv.msg) {\r\n command = Command.Lookup\r\n }\r\n return command\r\n }\r\n\r\n private static getPrintMode (): PrintMode {\r\n let mode: PrintMode = PrintMode.Stats\r\n if (argv.tokens) {\r\n mode = PrintMode.Token\r\n } else if (argv.stats) {\r\n mode = PrintMode.Stats\r\n } else if (argv.objects) {\r\n mode = PrintMode.Object\r\n } else if (argv.verbose) {\r\n mode = PrintMode.Verbose\r\n } else if (argv.structures) {\r\n mode = PrintMode.Structure\r\n } else if (argv.encoded) {\r\n mode = PrintMode.Encoded\r\n } else if (argv.trim) {\r\n mode = PrintMode.Object\r\n }\r\n return mode\r\n }\r\n\r\n private static async writeFile (name: string, api: string): Promise<void> {\r\n const writer = util.promisify(fs.writeFile)\r\n await writer(name, api, { encoding: 'utf8' }\r\n ).catch((e: Error) => {\r\n throw e\r\n })\r\n }\r\n\r\n public async exec (): Promise<any> {\r\n return await new Promise<any>((resolve, reject) => {\r\n this.init().then(async () => {\r\n let actioned: boolean = true\r\n const command = JsfixCmd.getCommand()\r\n\r\n switch (command) {\r\n case Command.Generate: {\r\n // produce a test message or a valid fix log of n messages\r\n await this.generate()\r\n break\r\n }\r\n\r\n case Command.Encode: {\r\n // encode a json message back to fix\r\n this.encode()\r\n break\r\n }\r\n\r\n case Command.Replay: {\r\n // parse a file into either objects, tokens, structures or stats\r\n const repeats: number = !isNaN(argv.repeats) ? argv.repeats : 1\r\n try {\r\n for (let i: number = 0; i < repeats; ++i) {\r\n await this.replay()\r\n }\r\n } catch (e) {\r\n reject(e)\r\n }\r\n break\r\n }\r\n\r\n case Command.Benchmark: {\r\n // time how long to parse 10000 repeats of contents of file\r\n const repeats: number = !isNaN(argv.repeats) ? argv.repeats : 10000\r\n try {\r\n const summary = await this.benchmark(repeats)\r\n console.log(JSON.stringify(summary, null, 4))\r\n } catch (e) {\r\n reject(e)\r\n }\r\n break\r\n }\r\n\r\n case Command.Lookup: {\r\n // lookup a field\r\n if (argv.field) {\r\n this.field()\r\n } else {\r\n this.msg()\r\n }\r\n break\r\n }\r\n\r\n case Command.Compile: {\r\n await this.compile()\r\n break\r\n }\r\n\r\n case Command.Trim: {\r\n const xml = this.trim()\r\n console.log(xml)\r\n break\r\n }\r\n\r\n case Command.Unknown:\r\n default: {\r\n actioned = false\r\n }\r\n }\r\n resolve(actioned)\r\n }).catch((e) => {\r\n reject(e)\r\n })\r\n })\r\n }\r\n\r\n private async firstMessage (t: MsgTransport): Promise<MsgView> {\r\n return await new Promise<MsgView>((resolve, reject) => {\r\n t.receiver.on('msg', (msgType: string, msgView: MsgView) => {\r\n resolve(msgView.clone())\r\n })\r\n t.receiver.on('error', (e) => {\r\n reject(e)\r\n })\r\n })\r\n }\r\n\r\n protected async generate (): Promise<void> {\r\n const lipPath: string = path.join(this.root, 'data/examples/lipsum.txt')\r\n const words: string[] = await getWords(lipPath)\r\n const generator = new MessageGenerator(words, this.definitions)\r\n let density = 1\r\n if (argv.density) {\r\n density = parseFloat(argv.density)\r\n }\r\n if (isNaN(density)) {\r\n console.log('density must be numeric in range > 0 density <= 1.0')\r\n return\r\n }\r\n\r\n if (argv.script) {\r\n await this.script(generator, density)\r\n } else {\r\n await this.single(generator, density)\r\n }\r\n }\r\n\r\n private async single (generator: MessageGenerator, density: number): Promise<void> {\r\n if (!argv.type) {\r\n console.log('specify type to generate e.g. --type = AE')\r\n return\r\n }\r\n const msgType: string = `${argv.type}`\r\n let makeGroups: boolean = true\r\n if (argv.groups) {\r\n makeGroups = argv.groups === 'true'\r\n }\r\n const obj: ILooseObject = generator.generate(msgType, density, makeGroups)\r\n console.log(JSON.stringify(obj, null, 4))\r\n const fix: string = this.encodeObject(msgType, obj)\r\n const ft: MsgTransport = new MsgTransport(1, this.session.config, new StringDuplex(fix))\r\n if (argv.unit) {\r\n await this.unitTest(fix, obj, ft)\r\n } else {\r\n this.subscribe(ft)\r\n }\r\n }\r\n\r\n private async script (generator: MessageGenerator, density: number): Promise<void> {\r\n const buffer: ElasticBuffer = new ElasticBuffer()\r\n const repeats: number = argv.repeats || 50\r\n const key: string = MsgTag.MsgType.toString()\r\n const sf = this.definitions.simple.get(key)\r\n const session: AsciiMsgTransmitter = this.session\r\n for (let i = 0; i < repeats; ++i) {\r\n const msgType: string = sf ? MessageGenerator.getRandomEnum(sf).toString() : ''\r\n console.log(`i = ${i} ${msgType}`)\r\n const obj: ILooseObject = generator.generate(msgType, density)\r\n session.encodeMessage(msgType, obj)\r\n buffer.writeBuffer(session.buffer.slice())\r\n buffer.writeString(require('os').EOL)\r\n }\r\n await JsfixCmd.writeFile('./fix.txt', buffer.slice().toString('utf8'))\r\n }\r\n\r\n private async unitTest (fix: string, obj: ILooseObject, ft: MsgTransport): Promise<void> {\r\n const view: MsgView = await this.firstMessage(ft)\r\n const summary = view?.structure?.summary()\r\n\r\n await JsfixCmd.writeFile('./fix.txt', fix)\r\n await JsfixCmd.writeFile('./object.json', JSON.stringify(obj, null, 4))\r\n await JsfixCmd.writeFile('./token.txt', view.toString())\r\n await JsfixCmd.writeFile('./structure.json', JSON.stringify(summary, null, 4))\r\n }\r\n\r\n private encodeObject (msgType: string, object: ILooseObject): string {\r\n const session: AsciiMsgTransmitter = this.session\r\n session.encodeMessage(msgType, object)\r\n return session.buffer.toString()\r\n }\r\n\r\n private msg (): void {\r\n const definitions = this.definitions\r\n const m = definitions.message.get(argv.msg)\r\n if (m) {\r\n console.log(m.toString())\r\n }\r\n }\r\n\r\n private field (): void {\r\n let sf: SimpleFieldDefinition | undefined\r\n const tag: number = parseInt(argv.field, 10)\r\n const definitions = this.definitions\r\n if (!isNaN(tag)) {\r\n sf = definitions.tagToSimple[tag]\r\n } else {\r\n sf = definitions.simple.get(argv.field)\r\n }\r\n if (sf) {\r\n console.log(sf.toString())\r\n }\r\n }\r\n\r\n async ensureExists (path: string): Promise<any> {\r\n return await new Promise<any>((resolve, reject) => {\r\n fs.mkdirp(path, (err: Error) => {\r\n if (err) {\r\n reject(err)\r\n } else {\r\n resolve(true)\r\n }\r\n })\r\n })\r\n }\r\n\r\n private async compileDefinitions (outputPath: string): Promise<void> {\r\n await this.ensureExists(path.join(outputPath, 'set'))\r\n await this.ensureExists(path.join(outputPath, 'enum'))\r\n const definitions = this.definitions\r\n const compilerSettings: ICompilerSettings = require('../data/compiler.json')\r\n compilerSettings.output = outputPath\r\n const msgCompiler: MsgCompiler = new MsgCompiler(definitions, compilerSettings)\r\n await msgCompiler.generate()\r\n const enumCompiler: EnumCompiler = new EnumCompiler(definitions, compilerSettings)\r\n const writeFile = path.join(compilerSettings.output, './enum/all-enum.ts')\r\n await enumCompiler.generate(writeFile)\r\n }\r\n\r\n private trim (): string {\r\n this.setFilter()\r\n const types = this.filter.size > 0 ? Array.from(this.filter.keys()) : Array.from(this.definitions.simple.get('MsgType')?.enums.keys() ?? [])\r\n const qfb = new QuickFixXmlFileBuilder(this.definitions)\r\n qfb.write(types)\r\n return qfb.elasticBuffer.toString()\r\n }\r\n\r\n private async compile (): Promise<void> {\r\n let output = argv.output\r\n const dp = new DefinitionFactory().getDictPath(argv.dict)\r\n if (dp) {\r\n output = dp.output\r\n }\r\n output = path.join(this.root, output)\r\n await this.compileDefinitions(output)\r\n }\r\n\r\n sys: SessionContainer\r\n config: IJsFixConfig\r\n\r\n private async init (): Promise<any> {\r\n let session: string = argv.session || 'data/session/test-initiator.json'\r\n this.sys = new SessionContainer()\r\n this.sys.registerGlobal('error')\r\n session = this.norm(session)\r\n this.sessionDescription = require(session)\r\n const container = await this.sys.makeSystem(this.sessionDescription)\r\n this.config = container.resolve<IJsFixConfig>(DITokens.IJsFixConfig)\r\n this.definitions = this.config.definitions\r\n let dict: string\r\n if (argv.dict) {\r\n dict = argv.dict\r\n const df = await new DefinitionFactory().getDefinitions(dict)\r\n this.config.definitions = df\r\n this.definitions = df\r\n }\r\n const definitions = this.definitions\r\n if (argv.delimiter) {\r\n this.delimiter = AsciiChars.firstChar(argv.delimiter)\r\n this.config.delimiter = this.delimiter\r\n }\r\n this.jsonHelper = new JsonHelper(definitions)\r\n if (argv.session) {\r\n this.session = container.resolve<AsciiMsgTransmitter>(DITokens.MsgTransmitter)\r\n }\r\n }\r\n\r\n private setFilter (): void {\r\n const types: string[] = []\r\n if (argv.type != null) {\r\n if (Array.isArray(argv.type)) {\r\n argv.type.forEach((mt: any) => {\r\n types.push(mt)\r\n })\r\n } else {\r\n argv.type.split(',').forEach((mt: string) => {\r\n types.push(mt)\r\n })\r\n }\r\n types.forEach((mt: any) => {\r\n this.filter.set(mt, true)\r\n })\r\n }\r\n }\r\n\r\n private async dispatch (ft: MsgTransport): Promise<any> {\r\n this.setFilter()\r\n let time: boolean = false\r\n if (argv.time || argv.stats) {\r\n this.print = false\r\n time = true\r\n }\r\n this.subscribe(ft)\r\n const startsAt: Date = new Date()\r\n await ft.wait()\r\n const elapsed: number = new Date().getTime() - startsAt.getTime()\r\n if (time) {\r\n console.log(`messages ${this.messages} elapsed ms ${elapsed}`)\r\n }\r\n if (argv.stats) {\r\n console.log(JSON.stringify(this.stats, null, 4))\r\n }\r\n }\r\n\r\n private subscribe (ft: MsgTransport): void {\r\n this.messages = 0\r\n this.stats = {}\r\n const filter = this.filter\r\n // the receiver is message parser which is piped from an input stream - file, socket\r\n ft.receiver.on('msg', (msgType: string, m: AsciiView) => {\r\n if (filter) {\r\n if (filter.has(msgType)) {\r\n return\r\n }\r\n }\r\n ++this.messages\r\n this.onMsg(msgType, m)\r\n })\r\n }\r\n\r\n private onMsg (msgType: string, m: MsgView): void {\r\n const mode: PrintMode = JsfixCmd.getPrintMode()\r\n const print = this.print\r\n const stats = this.stats\r\n switch (mode) {\r\n case PrintMode.Stats: {\r\n let i: number = 0\r\n if (!stats[msgType]) {\r\n i = 1\r\n } else {\r\n i = stats[msgType] as number + 1\r\n }\r\n stats[msgType] = i\r\n break\r\n }\r\n\r\n case PrintMode.Verbose: {\r\n const verbose = m.toVerbose()\r\n if (verbose) {\r\n console.log(verbose)\r\n }\r\n break\r\n }\r\n\r\n case PrintMode.Object: {\r\n const asObject: ILooseObject = m.toObject() as ILooseObject\r\n if (print) {\r\n const def = this.definitions.message.get(msgType)\r\n console.log(`${msgType} [${def?.name}] = ${JSON.stringify(asObject, null, 4)}`)\r\n console.log()\r\n }\r\n break\r\n }\r\n\r\n case PrintMode.Structure: {\r\n const summary = m?.structure?.summary()\r\n if (print) {\r\n console.log(JSON.stringify(summary, null, 4))\r\n }\r\n break\r\n }\r\n\r\n case PrintMode.Token: {\r\n const tokens = m.toString()\r\n if (print) {\r\n console.log(tokens)\r\n }\r\n break\r\n }\r\n\r\n case PrintMode.Encoded: {\r\n const fix: string = this.encodeObject(msgType, m.toObject() as ILooseObject)\r\n console.log(fix)\r\n break\r\n }\r\n\r\n default:\r\n throw new Error(`unknown mode ${mode}`)\r\n }\r\n }\r\n\r\n private async replay (): Promise<any> {\r\n if (!argv.fix) {\r\n console.log('provide a path to fix file i.e. --fix=data/examples/execution-report/fix.txt')\r\n return\r\n }\r\n const fix: string = this.norm(argv.fix)\r\n const config = this.config\r\n const ft: MsgTransport = new MsgTransport(1, config, new FileDuplex(fix))\r\n await this.dispatch(ft)\r\n }\r\n\r\n private async promisedRead (f: string): Promise<string> {\r\n return new Promise((resolve, reject) => {\r\n fs.readFile(f, 'utf8', async (err: Error, contents: string) => {\r\n if (err) {\r\n reject(err)\r\n }\r\n resolve(contents)\r\n })\r\n })\r\n }\r\n\r\n async benchParse (contents: string, iterations: number): Promise<ParseSummary> {\r\n return new Promise((resolve, reject) => {\r\n const toParse = new StringDuplex(contents.repeat(iterations))\r\n const startsAt: Date = new Date()\r\n let i = 0\r\n const config = this.config\r\n const buffer = config.sessionContainer.resolve<ElasticBuffer>(DITokens.ParseBuffer)\r\n const asciiParser: MsgParser = new AsciiParser(config, toParse.readable, buffer)\r\n asciiParser.on('msg', (msgType: string, v: MsgView) => {\r\n ++i\r\n if (i === iterations) {\r\n const elapsed: number = new Date().getTime() - startsAt.getTime()\r\n const fields = v?.structure?.tags.nextTagPos ?? 0\r\n const summary = new ParseSummary(contents, v.toString(), msgType, iterations, elapsed, fields)\r\n resolve(summary)\r\n }\r\n })\r\n asciiParser.on('error', e => {\r\n reject(e)\r\n })\r\n })\r\n }\r\n\r\n private async benchmark (repeats: number): Promise<(ParseSummary | null)> {\r\n if (!argv.fix) {\r\n console.log('provide a path to fix file i.e. --fix=data/examples/execution-report/fix.txt')\r\n return null\r\n }\r\n return await new Promise<any>((resolve, reject) => {\r\n const fix: string = this.norm(argv.fix)\r\n this.promisedRead(fix)\r\n .then(contents => {\r\n this.benchParse(contents, repeats)\r\n .then((a: ParseSummary) => {\r\n resolve(a)\r\n })\r\n .catch(e => { reject(e) })\r\n }).catch(e => {\r\n reject(e)\r\n })\r\n })\r\n }\r\n\r\n private encode (): void {\r\n const session: AsciiMsgTransmitter = this.session\r\n if (!session) {\r\n console.log('provide a session json file e.g. --session=data/session/test-initiator.json')\r\n return\r\n }\r\n if (!argv.type) {\r\n console.log('provide a message type e.g. --type=8')\r\n return\r\n }\r\n if (!argv.json) {\r\n console.log('provide a json representation e.g. data/examples/execution-report/object.json')\r\n return\r\n }\r\n const ts: string = argv.type.toString()\r\n const msg: ILooseObject = this.jsonHelper.fromJson(path.join(this.root, argv.json), ts)\r\n session.encodeMessage(ts, msg)\r\n const fix: string = session.buffer.toString()\r\n console.log(fix)\r\n }\r\n\r\n private norm (p: string): string {\r\n let f: string = p\r\n if (!path.isAbsolute(p)) {\r\n f = path.join(this.root, f)\r\n }\r\n return f\r\n }\r\n}\r\n\r\nfunction showHelp (): void {\r\n console.log('this help page')\r\n console.log('npm run cmd')\r\n console.log('npm run cmd -- --help')\r\n console.log()\r\n\r\n console.log('print to console a trim quickfix format xml only including given message types')\r\n console.log('node dist/jsfix-cmd --dict=qf44 --trim --type=\"0,1,2,3,4,5,AE\"')\r\n\r\n console.log('token format i.e. [602] 687 (LegQty) = 33589')\r\n console.log('node dist/jsfix-cmd --dict=data/FIX44.xml --fix=data/examples/quickfix/FIX.4.4/execution-report/fix.txt --delimiter=\"|\" --tokens')\r\n console.log()\r\n\r\n console.log('token format use fix repo dictionary')\r\n console.log('node dist/jsfix-cmd --dict=data/fix_repo/FIX.4.4/Base --fix=data/examples/quickfix/FIX.4.4/execution-report/fix.txt' +\r\n ' --delimiter=\"|\" --tokens')\r\n console.log()\r\n\r\n console.log('structure format i.e. show locations of components etc.')\r\n console.log('node dist/jsfix-cmd --dict=data/FIX44.xml --fix=data/examples/FIX.4.4/quickfix/execution-report/fix.txt' +\r\n ' --delimiter=\"|\" --tokens --structures')\r\n console.log()\r\n\r\n console.log('full JS object in JSON format.')\r\n console.log('node dist/jsfix-cmd --dict=data/FIX44.xml --fix=data/examples/FIX.4.4/quickfix/execution-report/fix.txt' +\r\n ' --delimiter=\"|\" --tokens --objects')\r\n console.log()\r\n\r\n console.log('full JS object in JSON format - filter only type messages.')\r\n console.log('node dist/jsfix-cmd --dict=data/FIX44.xml --fix=data/examples/FIX.4.4/quickfix/execution-report/fix.txt' +\r\n ' --delimiter=\"|\" --tokens --type=8 --objects')\r\n console.log()\r\n\r\n console.log('timing stats and message counts. Structured parsing of all messages.')\r\n console.log('node dist/jsfix-cmd --dict=data/FIX44.xml --fix=data/examples/FIX.4.4/quickfix/execution-report/fix.txt --stats')\r\n console.log()\r\n\r\n console.log('encode a json object to fix format')\r\n console.log('node dist/jsfix-cmd --json=data/examples/FIX.4.4/quickfix/execution-report/object.json' +\r\n ' --session=data/session.json --type=8 --delimiter=\"|\"')\r\n console.log()\r\n\r\n console.log('display field definition')\r\n console.log('node dist/jsfix-cmd --dict=data/FIX44.xml --field=MsgType|35')\r\n console.log()\r\n\r\n console.log('display field use fix repo dictionary e.g. 271 MDEntrySize QTY Quantity or volume represented by the Market Data Entry.')\r\n console.log('node dist/jsfix-cmd --dict=data/fix_repo/FIX.4.4/Base --field=MsgType')\r\n console.log('node dist/jsfix-cmd --dict=data/fix_repo/FIX.4.4/Base --field=35')\r\n console.log()\r\n\r\n console.log('script to describe field in repository version 4.4')\r\n console.log('npm run repo44 -- --field=8')\r\n console.log()\r\n\r\n console.log('script to describe field in fixml')\r\n console.log('npm run fixml -- --field=50')\r\n console.log()\r\n\r\n console.log('generate unit test set of files - i.e. randomly generate an object, encode to fix. density 1 is all fields')\r\n console.log('node dist/jsfix-cmd --generate --type=AE --density=0.8 --unit --delimiter=\"|\" --session=data/session/test-initiator.json')\r\n console.log('npm run repo44-unit -- --type=AE')\r\n console.log('test script with no repeat groups')\r\n console.log('npm run repo44-unit -- --type=AE --groups=false')\r\n console.log()\r\n\r\n console.log('generate a fix log of randomly generated but syntactically correct messages')\r\n console.log('node dist/jsfix-cmd --generate --density=0.8 --repeats=50 --script --delimiter=\"|\" --session=data/session/test-initiator.json')\r\n console.log('npm run repo44-script')\r\n console.log('parse above generated script')\r\n console.log('npm run repo44-repscr')\r\n console.log()\r\n\r\n console.log('replay example repo fix file of 50 messages.')\r\n console.log('node dist/jsfix-cmd --session=data/session/test-initiator.json --fix=data/examples/FIX.4.4/fix.txt --delimiter=\"|\" --stats')\r\n console.log('npm run repo44-replay -- --stats')\r\n console.log('npm run repo44-replay -- --objects')\r\n console.log('npm run repo44-replay -- --tokens')\r\n console.log('npm run repo44-replay -- --structures')\r\n console.log()\r\n\r\n console.log('benchmark parse a message')\r\n console.log('node dist/jsfix-cmd --delimiter=\"|\" --session=data/session/test-initiator.json --fix=data/examples/FIX.4.4/repo/trade-capture-no-groups/fix.txt --benchmark')\r\n console.log('npm run repo44-bench -- --fix=data/examples/FIX.4.4/repo/trade-capture-no-groups/fix.txt')\r\n console.log()\r\n\r\n console.log('compile typescript interfaces - i.e. outputs to src/types/FIX4.4 - requires set and enum sub folders')\r\n console.log('npm run cmd -- --dict=repo40 --compile')\r\n console.log('npm run cmd -- --dict=repo41 --compile')\r\n console.log('npm run cmd -- --dict=repo42 --compile')\r\n console.log('npm run cmd -- --dict=repo43 --compile')\r\n console.log('npm run cmd -- --dict=repo44 --compile')\r\n console.log('npm run cmd -- --dict=repo50 --compile')\r\n console.log('npm run cmd -- --dict=repo50sp1 --compile')\r\n console.log('npm run cmd -- --dict=repo50sp2 --compile')\r\n console.log('npm run cmd -- --dict=repofixml --compile')\r\n console.log('npm run cmd -- --dict=qf44 --compile')\r\n console.log('npm run cmd -- --dict=data/handmade.xml --compile --output=src/types/handmade')\r\n\r\n console.log()\r\n}\r\n\r\nconst help: boolean = argv.h || argv.help\r\nif (help) {\r\n showHelp()\r\n} else {\r\n const cmd: JsfixCmd = new JsfixCmd()\r\n cmd.exec().then((res: boolean) => {\r\n if (!res) {\r\n showHelp()\r\n }\r\n }).catch((e: Error) => {\r\n console.error(e)\r\n })\r\n}\r\n"]}
|
|
@@ -25,12 +25,11 @@ exports.RespawnAcceptor = void 0;
|
|
|
25
25
|
const tcp_1 = require("../../../transport/tcp");
|
|
26
26
|
const tsyringe_1 = require("tsyringe");
|
|
27
27
|
const transport_1 = require("../../../transport");
|
|
28
|
-
const collections_1 = require("../../../collections");
|
|
29
28
|
let RespawnAcceptor = class RespawnAcceptor extends transport_1.FixEntity {
|
|
30
29
|
constructor(config) {
|
|
31
30
|
super(config);
|
|
32
31
|
this.config = config;
|
|
33
|
-
this.sessions = new
|
|
32
|
+
this.sessions = new Map();
|
|
34
33
|
this.logger = config.logFactory.logger('RespawnAcceptor');
|
|
35
34
|
}
|
|
36
35
|
start() {
|
|
@@ -42,27 +41,27 @@ let RespawnAcceptor = class RespawnAcceptor extends transport_1.FixEntity {
|
|
|
42
41
|
this.logger.info(`rxOnMsg msgType = ${msgType}`);
|
|
43
42
|
const o = view.toObject();
|
|
44
43
|
const key = o.StandardHeader.SenderCompID;
|
|
45
|
-
if (!this.sessions.
|
|
46
|
-
this.logger.info(`onSession: new session acceptor SenderCompID = ${key} created, count = ${this.sessions.
|
|
47
|
-
this.sessions.
|
|
44
|
+
if (!this.sessions.has(key)) {
|
|
45
|
+
this.logger.info(`onSession: new session acceptor SenderCompID = ${key} created, count = ${this.sessions.size}}`);
|
|
46
|
+
this.sessions.set(key, session);
|
|
48
47
|
}
|
|
49
48
|
}
|
|
50
49
|
resetSessionSeqNo(session) {
|
|
51
50
|
var _a;
|
|
52
51
|
const key = this.config.description.TargetCompID;
|
|
53
|
-
if (this.sessions.
|
|
52
|
+
if (this.sessions.has(key)) {
|
|
54
53
|
const lastSession = this.sessions.get(key);
|
|
55
54
|
const lastPeerSeqNum = (_a = lastSession === null || lastSession === void 0 ? void 0 : lastSession.lastPeerSeqNum()) !== null && _a !== void 0 ? _a : 0;
|
|
56
55
|
this.logger.info(`resetSessionSeqNo: set lastPeerSeqNum ${lastPeerSeqNum} for key ${key}`);
|
|
57
56
|
session.reset(lastPeerSeqNum);
|
|
58
|
-
this.sessions.
|
|
57
|
+
this.sessions.delete(key);
|
|
59
58
|
}
|
|
60
59
|
}
|
|
61
60
|
resetLastSentSeqNo() {
|
|
62
61
|
var _a;
|
|
63
62
|
if (!this.resetSeqNo()) {
|
|
64
63
|
const key = this.config.description.TargetCompID;
|
|
65
|
-
if (this.sessions.
|
|
64
|
+
if (this.sessions.has(key)) {
|
|
66
65
|
const lastSession = this.sessions.get(key);
|
|
67
66
|
const lastSentSeqNum = (_a = lastSession === null || lastSession === void 0 ? void 0 : lastSession.lastSentSeqNum()) !== null && _a !== void 0 ? _a : 0;
|
|
68
67
|
this.logger.info(`resetLastSentSeqNo: set seqNo ${lastSentSeqNum} for key ${key}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"respawn-acceptor.js","sourceRoot":"","sources":["../../../../src/sample/tcp/recovering-skeleton/respawn-acceptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA,gDAA4D;AAC5D,uCAA6C;AAC7C,kDAA0D;
|
|
1
|
+
{"version":3,"file":"respawn-acceptor.js","sourceRoot":"","sources":["../../../../src/sample/tcp/recovering-skeleton/respawn-acceptor.ts"],"names":[],"mappings":"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","sourcesContent":["import { IJsFixConfig, IJsFixLogger } from '../../../config'\r\nimport { TcpAcceptorListener } from '../../../transport/tcp'\r\nimport { inject, injectable } from 'tsyringe'\r\nimport { FixEntity, FixSession } from '../../../transport'\r\nimport { MsgView } from '../../../buffer'\r\nimport { MsgTransport } from '../../../transport/factory'\r\nimport { ILooseObject } from '../../../collections/collection'\r\n\r\n@injectable()\r\nexport class RespawnAcceptor extends FixEntity {\r\n private readonly logger: IJsFixLogger\r\n private readonly sessions: Map<string, FixSession> = new Map<string, FixSession>()\r\n\r\n constructor (@inject('IJsFixConfig') public readonly config: IJsFixConfig) {\r\n super(config)\r\n this.logger = config.logFactory.logger('RespawnAcceptor')\r\n }\r\n\r\n // if acceptor errors e.g. via a forced connection drop, then respawn\r\n // a set number of times.\r\n\r\n public async start (): Promise<any> {\r\n return await this.waitFor()\r\n }\r\n\r\n protected rxOnMsg (session: FixSession, msgType: string, view: MsgView): void {\r\n this.logger.info(`rxOnMsg msgType = ${msgType}`)\r\n const o: ILooseObject = view.toObject() as ILooseObject\r\n const key: string = o.StandardHeader.SenderCompID\r\n if (!this.sessions.has(key)) {\r\n this.logger.info(`onSession: new session acceptor SenderCompID = ${key} created, count = ${this.sessions.size}}`)\r\n this.sessions.set(key, session)\r\n }\r\n }\r\n\r\n private resetSessionSeqNo (session: FixSession): void {\r\n const key = this.config.description.TargetCompID\r\n if (this.sessions.has(key)) {\r\n const lastSession = this.sessions.get(key)\r\n const lastPeerSeqNum = lastSession?.lastPeerSeqNum() ?? 0\r\n this.logger.info(`resetSessionSeqNo: set lastPeerSeqNum ${lastPeerSeqNum} for key ${key}`)\r\n session.reset(lastPeerSeqNum)\r\n this.sessions.delete(key)\r\n }\r\n }\r\n\r\n private resetLastSentSeqNo (): void {\r\n if (!this.resetSeqNo()) {\r\n const key = this.config.description.TargetCompID\r\n if (this.sessions.has(key)) {\r\n const lastSession = this.sessions.get(key)\r\n const lastSentSeqNum = lastSession?.lastSentSeqNum() ?? 0\r\n this.logger.info(`resetLastSentSeqNo: set seqNo ${lastSentSeqNum} for key ${key}`)\r\n this.config.description.LastSentSeqNum = lastSentSeqNum\r\n }\r\n }\r\n }\r\n\r\n private onSession (session: FixSession, transport: MsgTransport): void {\r\n this.resetSessionSeqNo(session)\r\n const rx = transport.receiver\r\n rx?.on('msg', (msgType: string, view: MsgView) => { this.rxOnMsg(session, msgType, view) })\r\n }\r\n\r\n private subscribe (listener: TcpAcceptorListener): void {\r\n listener.on('session', (s, transport) => { this.onSession(s, transport) })\r\n }\r\n\r\n /*\r\n private unsubscribe (listener: TcpAcceptorListener): void {\r\n listener.removeListener('session', this.onSession)\r\n }\r\n */\r\n\r\n private resetSeqNo (): boolean {\r\n return this.config.description.ResetSeqNumFlag\r\n }\r\n\r\n public async waitFor (respawns: number = 1): Promise<any> {\r\n return await new Promise<any>(async (resolve, reject) => {\r\n let respawned = 0\r\n while (respawned <= respawns) {\r\n try {\r\n const sessionContainer = this.config.sessionContainer\r\n // if previously running a session then retrieve its last state\r\n // as need to adjust seqNo if not resetting.\r\n this.resetLastSentSeqNo()\r\n const listener = sessionContainer.resolve<TcpAcceptorListener>(TcpAcceptorListener)\r\n this.subscribe(listener)\r\n const dropConnectionTimeout = respawned === 0 ? 5 : -1\r\n sessionContainer.register('dropConnectionTimeout', { useValue: dropConnectionTimeout })\r\n this.logger.info(`waitFor: waiting for acceptor respawned = ${respawned}`)\r\n await listener.start()\r\n break\r\n } catch (e) {\r\n this.logger.info(`waitFor: error in acceptor respawned = ${respawned}`)\r\n }\r\n ++respawned\r\n }\r\n if (respawned > 0) {\r\n this.logger.info(`acceptor respawned reject = ${respawned}`)\r\n reject(respawned)\r\n } else {\r\n this.logger.info(`resolve = ${respawned}`)\r\n resolve(respawned)\r\n }\r\n })\r\n }\r\n}\r\n"]}
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.TradeCaptureClient = void 0;
|
|
4
4
|
const transport_1 = require("../../../transport");
|
|
5
5
|
const types_1 = require("../../../types");
|
|
6
|
-
const collections_1 = require("../../../collections");
|
|
7
6
|
const trade_factory_1 = require("./trade-factory");
|
|
8
7
|
class TradeCaptureClient extends transport_1.AsciiSession {
|
|
9
8
|
constructor(config) {
|
|
@@ -11,7 +10,7 @@ class TradeCaptureClient extends transport_1.AsciiSession {
|
|
|
11
10
|
super(config);
|
|
12
11
|
this.config = config;
|
|
13
12
|
this.logReceivedMsgs = true;
|
|
14
|
-
this.reports = new
|
|
13
|
+
this.reports = new Map();
|
|
15
14
|
this.fixLog = config.logFactory.plain(`jsfix.${(_b = (_a = config === null || config === void 0 ? void 0 : config.description) === null || _a === void 0 ? void 0 : _a.application) === null || _b === void 0 ? void 0 : _b.name}.txt`);
|
|
16
15
|
this.logger = config.logFactory.logger(`${this.me}:TradeCaptureClient`);
|
|
17
16
|
}
|
|
@@ -20,8 +19,8 @@ class TradeCaptureClient extends transport_1.AsciiSession {
|
|
|
20
19
|
switch (msgType) {
|
|
21
20
|
case types_1.MsgType.TradeCaptureReport: {
|
|
22
21
|
const tc = view.toObject();
|
|
23
|
-
this.reports.
|
|
24
|
-
this.logger.info(`[reports: ${this.reports.
|
|
22
|
+
this.reports.set(tc.TradeReportID, tc);
|
|
23
|
+
this.logger.info(`[reports: ${this.reports.size}] received tc ExecID = ${tc.ExecID} TradeReportID = ${tc.TradeReportID} Symbol = ${tc.Instrument.Symbol} ${tc.LastQty} @ ${tc.LastPx}`);
|
|
25
24
|
break;
|
|
26
25
|
}
|
|
27
26
|
case types_1.MsgType.TradeCaptureReportRequestAck: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trade-capture-client.js","sourceRoot":"","sources":["../../../../src/sample/tcp/trade-capture/trade-capture-client.ts"],"names":[],"mappings":";;;AACA,kDAAiD;AACjD,0CAAwC;AAMxC,
|
|
1
|
+
{"version":3,"file":"trade-capture-client.js","sourceRoot":"","sources":["../../../../src/sample/tcp/trade-capture/trade-capture-client.ts"],"names":[],"mappings":"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","sourcesContent":["import { MsgView } from '../../../buffer'\r\nimport { AsciiSession } from '../../../transport'\r\nimport { MsgType } from '../../../types'\r\nimport {\r\n ITradeCaptureReport, ITradeCaptureReportRequest,\r\n ITradeCaptureReportRequestAck\r\n} from '../../../types/FIX4.4/repo'\r\nimport { IJsFixLogger, IJsFixConfig } from '../../../config'\r\nimport { TradeFactory } from './trade-factory'\r\n\r\nexport class TradeCaptureClient extends AsciiSession {\r\n private readonly logger: IJsFixLogger\r\n private readonly fixLog: IJsFixLogger\r\n private readonly reports: Map<string, ITradeCaptureReport>\r\n\r\n constructor (public readonly config: IJsFixConfig) {\r\n super(config)\r\n this.logReceivedMsgs = true\r\n this.reports = new Map<string, ITradeCaptureReport>()\r\n this.fixLog = config.logFactory.plain(`jsfix.${config?.description?.application?.name}.txt`)\r\n this.logger = config.logFactory.logger(`${this.me}:TradeCaptureClient`)\r\n }\r\n\r\n protected onApplicationMsg (msgType: string, view: MsgView): void {\r\n this.logger.info(`${view.toJson()}`)\r\n switch (msgType) {\r\n case MsgType.TradeCaptureReport: {\r\n // create an object and cast to the interface\r\n const tc: ITradeCaptureReport = view.toObject() as ITradeCaptureReport\r\n this.reports.set(tc.TradeReportID, tc)\r\n this.logger.info(`[reports: ${this.reports.size}] received tc ExecID = ${tc.ExecID} TradeReportID = ${tc.TradeReportID} Symbol = ${tc.Instrument.Symbol} ${tc.LastQty} @ ${tc.LastPx}`)\r\n break\r\n }\r\n\r\n case MsgType.TradeCaptureReportRequestAck: {\r\n const tc: ITradeCaptureReportRequestAck = view.toObject() as ITradeCaptureReportRequestAck\r\n this.logger.info(`received tcr ack ${tc.TradeRequestID} ${tc.TradeRequestStatus}`)\r\n break\r\n }\r\n }\r\n }\r\n\r\n protected onStopped (): void {\r\n this.logger.info('stopped')\r\n }\r\n\r\n protected onDecoded (_: string, txt: string): void {\r\n this.fixLog.info(txt)\r\n }\r\n\r\n protected onEncoded (_: string, txt: string): void {\r\n this.fixLog.info(txt)\r\n }\r\n\r\n private logoutTimer (logoutSeconds: number = 32): void {\r\n setTimeout(() => {\r\n this.done()\r\n }, logoutSeconds * 1000)\r\n }\r\n\r\n protected onReady (view: MsgView): void {\r\n this.logger.info('ready')\r\n const tcr: ITradeCaptureReportRequest = TradeFactory.tradeCaptureReportRequest('all-trades', new Date())\r\n // send request to server\r\n this.send(MsgType.TradeCaptureReportRequest, tcr)\r\n const logoutSeconds = 32\r\n this.logger.info(`will logout after ${logoutSeconds}`)\r\n this.logoutTimer()\r\n }\r\n\r\n protected onLogon (view: MsgView, user: string, password: string): boolean {\r\n this.logger.info(`onLogon user ${user} ${password?.length}`)\r\n return true\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trade-capture-server.js","sourceRoot":"","sources":["../../../../src/sample/tcp/trade-capture/trade-capture-server.ts"],"names":[],"mappings":";;;AACA,kDAAiD;AACjD,0CAAwC;AAGxC,qDAGmC;AACnC,mDAA8C;AAE9C,MAAa,kBAAmB,SAAQ,wBAAY;IAMlD,YAA6B,MAAoB;;QAC/C,KAAK,CAAC,MAAM,CAAC,CAAA;QADc,WAAM,GAAN,MAAM,CAAc;QAHhC,iBAAY,GAAiB,IAAI,4BAAY,EAAE,CAAA;QACxD,gBAAW,GAA0B,IAAI,CAAA;QAI/C,IAAI,CAAC,eAAe,GAAG,IAAI,CAAA;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,qBAAqB,CAAC,CAAA;QACvE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,SAAS,MAAA,MAAA,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,WAAW,0CAAE,WAAW,0CAAE,IAAI,MAAM,CAAC,CAAA;IAC9F,CAAC;IAES,gBAAgB,CAAE,OAAe,EAAE,IAAa;;QACxD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;QACpC,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,eAAO,CAAC,yBAAyB,CAAC,CAAC,CAAC;gBACvC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,EAAgC,CAAC,CAAA;gBAC7E,MAAK;YACP,CAAC;YAED,OAAO,CAAC,CAAC,CAAC;gBACR,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAM,CAAC,SAAS,CAAC,CAAA;gBAC9C,MAAM,GAAG,GAAG,MAAA,IAAI,CAAC,MAAM,CAAC,OAAO,0CAAE,MAAM,CAAC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"trade-capture-server.js","sourceRoot":"","sources":["../../../../src/sample/tcp/trade-capture/trade-capture-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { MsgView } from '../../../buffer'\r\nimport { AsciiSession } from '../../../transport'\r\nimport { MsgType } from '../../../types'\r\nimport { IJsFixLogger, IJsFixConfig } from '../../../config'\r\n// interfaces generated by compiler to make messages easy in an IDE\r\nimport {\r\n ITradeCaptureReportRequest, ITradeCaptureReport, MsgTag, SessionRejectReason,\r\n SubscriptionRequestType, TradeRequestStatus\r\n} from '../../../types/FIX4.4/repo'\r\nimport { TradeFactory } from './trade-factory'\r\n\r\nexport class TradeCaptureServer extends AsciiSession {\r\n private readonly logger: IJsFixLogger\r\n private readonly fixLog: IJsFixLogger\r\n private readonly tradeFactory: TradeFactory = new TradeFactory()\r\n private timerHandle: NodeJS.Timeout | null = null\r\n\r\n constructor (public readonly config: IJsFixConfig) {\r\n super(config)\r\n this.logReceivedMsgs = true\r\n this.logger = config.logFactory.logger(`${this.me}:TradeCaptureServer`)\r\n this.fixLog = config.logFactory.plain(`jsfix.${config?.description?.application?.name}.txt`)\r\n }\r\n\r\n protected onApplicationMsg (msgType: string, view: MsgView): void {\r\n this.logger.info(`${view.toJson()}`)\r\n switch (msgType) {\r\n case MsgType.TradeCaptureReportRequest: {\r\n this.tradeCaptureReportRequest(view.toObject() as ITradeCaptureReportRequest)\r\n break\r\n }\r\n\r\n default: {\r\n const seqNum = view.getTyped(MsgTag.MsgSeqNum)\r\n const msg = this.config.factory?.reject(msgType, seqNum as number, `${this.me}: unexpected msg type '${msgType}'`, SessionRejectReason.InvalidMsgType)\r\n if (msg) {\r\n this.send(msgType, msg)\r\n }\r\n break\r\n }\r\n }\r\n }\r\n\r\n protected onReady (_: MsgView): void {\r\n // server waits for client to make a request\r\n this.logger.info('ready for requests.')\r\n }\r\n\r\n protected onStopped (): void {\r\n this.logger.info('stopped')\r\n if (this.timerHandle) {\r\n clearInterval(this.timerHandle)\r\n }\r\n }\r\n\r\n protected onLogon (view: MsgView, user: string, password: string): boolean {\r\n return true\r\n }\r\n\r\n protected onDecoded (_: string, txt: string): void {\r\n this.fixLog.info(txt)\r\n }\r\n\r\n protected onEncoded (_: string, txt: string): void {\r\n this.fixLog.info(txt)\r\n }\r\n\r\n private tradeCaptureReportRequest (tcr: ITradeCaptureReportRequest): void {\r\n this.logger.info(`received tcr ${tcr.TradeRequestID}`)\r\n // send back an ack.\r\n this.send(MsgType.TradeCaptureReportRequestAck, TradeFactory.tradeCaptureReportRequestAck(tcr, TradeRequestStatus.Accepted))\r\n // send some trades\r\n const batch: ITradeCaptureReport[] = this.tradeFactory.batchOfTradeCaptureReport(5)\r\n batch.forEach((tc: ITradeCaptureReport) => {\r\n this.send(MsgType.TradeCaptureReport, tc)\r\n })\r\n this.send(MsgType.TradeCaptureReportRequestAck, TradeFactory.tradeCaptureReportRequestAck(tcr, TradeRequestStatus.Completed))\r\n // start sending the odd 'live' trade\r\n switch (tcr.SubscriptionRequestType) {\r\n case SubscriptionRequestType.SnapshotAndUpdates: {\r\n this.timerHandle = setInterval(() => {\r\n if (Math.random() < 0.4) {\r\n const tc: ITradeCaptureReport = this.tradeFactory.singleTradeCaptureReport()\r\n this.send(MsgType.TradeCaptureReport, tc)\r\n }\r\n }, 5000)\r\n break\r\n }\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -9,7 +9,8 @@ export declare class FixMsgAsciiStoreResend {
|
|
|
9
9
|
constructor(store: IFixMsgStore, config: IJsFixConfig);
|
|
10
10
|
getResendRequest(startSeq: number, endSeq: number): Promise<IFixMsgStoreRecord[]>;
|
|
11
11
|
private inflateRange;
|
|
12
|
-
gap
|
|
13
|
-
inflate
|
|
14
|
-
sequenceResetGap
|
|
12
|
+
private gap;
|
|
13
|
+
private inflate;
|
|
14
|
+
private sequenceResetGap;
|
|
15
|
+
private prepareRecordForRetransmission;
|
|
15
16
|
}
|
|
@@ -33,9 +33,13 @@ class FixMsgAsciiStoreResend {
|
|
|
33
33
|
}
|
|
34
34
|
inflateRange(startSeq, endSeq, input) {
|
|
35
35
|
const toResend = [];
|
|
36
|
+
if (input.length === 0) {
|
|
37
|
+
this.gap(startSeq, endSeq + 1, toResend);
|
|
38
|
+
return toResend;
|
|
39
|
+
}
|
|
36
40
|
let expected = startSeq;
|
|
37
41
|
for (let i = 0; i < input.length; ++i) {
|
|
38
|
-
const record = input[i]
|
|
42
|
+
const record = this.prepareRecordForRetransmission(input[i]);
|
|
39
43
|
const seqNum = record.seqNum;
|
|
40
44
|
const toGap = seqNum - expected;
|
|
41
45
|
if (toGap > 0) {
|
|
@@ -52,9 +56,9 @@ class FixMsgAsciiStoreResend {
|
|
|
52
56
|
}
|
|
53
57
|
return toResend;
|
|
54
58
|
}
|
|
55
|
-
gap(beginGap,
|
|
59
|
+
gap(beginGap, newSeq, arr) {
|
|
56
60
|
if (beginGap > 0) {
|
|
57
|
-
arr.push(this.sequenceResetGap(beginGap,
|
|
61
|
+
arr.push(this.sequenceResetGap(beginGap, newSeq));
|
|
58
62
|
}
|
|
59
63
|
}
|
|
60
64
|
inflate(record) {
|
|
@@ -76,8 +80,20 @@ class FixMsgAsciiStoreResend {
|
|
|
76
80
|
const gapFill = factory === null || factory === void 0 ? void 0 : factory.sequenceReset(newSeq, true);
|
|
77
81
|
gapFill.StandardHeader = factory === null || factory === void 0 ? void 0 : factory.header(types_1.MsgType.SequenceReset, startGap);
|
|
78
82
|
gapFill.StandardHeader.PossDupFlag = true;
|
|
79
|
-
|
|
80
|
-
|
|
83
|
+
return new fix_msg_store_record_1.FixMsgStoreRecord(types_1.MsgType.SequenceReset, new Date(), startGap, gapFill, null);
|
|
84
|
+
}
|
|
85
|
+
prepareRecordForRetransmission(originalRecord) {
|
|
86
|
+
const retransmitted = originalRecord.clone();
|
|
87
|
+
const factory = this.config.factory;
|
|
88
|
+
if (!retransmitted.obj) {
|
|
89
|
+
retransmitted.obj = {};
|
|
90
|
+
}
|
|
91
|
+
const header = factory === null || factory === void 0 ? void 0 : factory.header(retransmitted.msgType, retransmitted.seqNum, new Date(), {
|
|
92
|
+
PossDupFlag: true,
|
|
93
|
+
OrigSendingTime: retransmitted.timestamp
|
|
94
|
+
});
|
|
95
|
+
retransmitted.obj = Object.assign(Object.assign({}, retransmitted.obj), { StandardHeader: header });
|
|
96
|
+
return retransmitted;
|
|
81
97
|
}
|
|
82
98
|
}
|
|
83
99
|
exports.FixMsgAsciiStoreResend = FixMsgAsciiStoreResend;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fix-msg-ascii-store-resend.js","sourceRoot":"","sources":["../../src/store/fix-msg-ascii-store-resend.ts"],"names":[],"mappings":";;;;;;;;;;;;AACA,iEAA8E;AAE9E,oCAAkC;AAClC,sCAAkD;AAClD,2CAA6C;AAG7C,MAAa,sBAAsB;IAEjC,YAA6B,KAAmB,EAAkB,MAAoB;QAAzD,UAAK,GAAL,KAAK,CAAc;QAAkB,WAAM,GAAN,MAAM,CAAc;QACpF,IAAI,CAAC,MAAM,GAAG,IAAI,mBAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,sBAAa,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAA;IACjF,CAAC;IAEY,gBAAgB,CAAE,QAAgB,EAAE,MAAc;;YAK7D,OAAO,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC3C,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;oBACrD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;gBACnD,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;oBACX,MAAM,CAAC,CAAC,CAAC,CAAA;gBACX,CAAC,CAAC,CAAA;YACJ,CAAC,CAAC,CAAA;QACJ,CAAC;KAAA;IAEO,YAAY,CAAE,QAAgB,EAAE,MAAc,EAAE,KAA2B;QACjF,MAAM,QAAQ,GAAyB,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"fix-msg-ascii-store-resend.js","sourceRoot":"","sources":["../../src/store/fix-msg-ascii-store-resend.ts"],"names":[],"mappings":"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","sourcesContent":["import { IFixMsgStore } from './fix-msg-store'\r\nimport { FixMsgStoreRecord, IFixMsgStoreRecord } from './fix-msg-store-record'\r\nimport { IJsFixConfig } from '../config'\r\nimport { MsgType } from '../types'\r\nimport { ElasticBuffer, MsgView } from '../buffer'\r\nimport { AsciiParser } from '../buffer/ascii'\r\nimport { ISequenceReset, IStandardHeader } from '../types/FIX4.4/repo'\r\n\r\nexport class FixMsgAsciiStoreResend {\r\n parser: AsciiParser\r\n constructor (public readonly store: IFixMsgStore, public readonly config: IJsFixConfig) {\r\n this.parser = new AsciiParser(this.config, null, new ElasticBuffer(160 * 1024))\r\n }\r\n\r\n public async getResendRequest (startSeq: number, endSeq: number): Promise<IFixMsgStoreRecord[]> {\r\n // need to cover request from start to end where any missing numbers are\r\n // included as gaps to allow vector of messages to be sent by the session\r\n // on a request\r\n\r\n return await new Promise((resolve, reject) => {\r\n this.store.getSeqNumRange(startSeq, endSeq).then(res => {\r\n resolve(this.inflateRange(startSeq, endSeq, res))\r\n }).catch(e => {\r\n reject(e)\r\n })\r\n })\r\n }\r\n\r\n private inflateRange (startSeq: number, endSeq: number, input: IFixMsgStoreRecord[]): IFixMsgStoreRecord[] {\r\n const toResend: IFixMsgStoreRecord[] = []\r\n // If no records for this given sequence number range, returns a single gap fill\r\n if (input.length === 0) {\r\n this.gap(startSeq, endSeq + 1, toResend)\r\n return toResend\r\n }\r\n\r\n let expected = startSeq\r\n for (let i = 0; i < input.length; ++i) {\r\n const record = this.prepareRecordForRetransmission(input[i])\r\n const seqNum = record.seqNum\r\n const toGap = seqNum - expected\r\n if (toGap > 0) {\r\n this.gap(expected, seqNum, toResend)\r\n }\r\n expected = seqNum + 1\r\n if (record.encoded) {\r\n this.inflate(record)\r\n }\r\n toResend.push(record)\r\n }\r\n if (endSeq - expected > 0) {\r\n this.gap(expected, endSeq + 1, toResend)\r\n }\r\n return toResend\r\n }\r\n\r\n private gap (beginGap: number, newSeq: number, arr: IFixMsgStoreRecord[]): void {\r\n if (beginGap > 0) {\r\n arr.push(this.sequenceResetGap(beginGap, newSeq))\r\n }\r\n }\r\n\r\n // if records were sent as encoded text then inflate back to object\r\n // so can be resent or examined\r\n\r\n private inflate (record: IFixMsgStoreRecord): void {\r\n if (record.obj) return\r\n if (!record.encoded) return\r\n const parser = this.parser\r\n parser.on('error', (_: Error) => {\r\n record.obj = null\r\n })\r\n parser.on('msg', (view: MsgView) => {\r\n record.obj = view.toObject()\r\n })\r\n // inline parse\r\n parser.parseText(record.encoded)\r\n }\r\n\r\n /**\r\n * A continuous sequence of messages not being retransmitted should be skipped over using a\r\n * single SequenceReset(35=4) message with GapFillFlag(123) set to “Y” and MsgSeqNum(34) set\r\n * to the sequence number of the first skipped message and NewSeqNo(36) must always be set\r\n * to the value of the next sequence number to be expected by the peer immediately following\r\n * the messages being skipped.\r\n */\r\n private sequenceResetGap (startGap: number, newSeq: number): IFixMsgStoreRecord {\r\n const factory = this.config.factory\r\n const gapFill: ISequenceReset = factory?.sequenceReset(newSeq, true) as ISequenceReset\r\n gapFill.StandardHeader = factory?.header(MsgType.SequenceReset, startGap) as IStandardHeader\r\n gapFill.StandardHeader.PossDupFlag = true\r\n\r\n return new FixMsgStoreRecord(\r\n MsgType.SequenceReset,\r\n new Date(),\r\n startGap,\r\n gapFill,\r\n null,\r\n )\r\n }\r\n\r\n /**\r\n * Prepares the FIX message as response to ResendRequest (2).\r\n *\r\n * The FIX session processor retransmitting a message with the PossDupFlag(43) set to \"Y\" must modify the following fields:\r\n *\r\n * SendingTime(52) set to the current sending time\r\n * OrigSendingTime(122) set to the SendingTime(52) from the original message\r\n * Recalculate the BodyLength(9)\r\n * Recalculate the CheckSum(10)\r\n *\r\n * If the message is encrypted, SecureDataLen(90) and SecureData(91) may also require re-encryption and re-encoding\r\n *\r\n * @see https://www.fixtrading.org/standards/fix-session-layer-online/#message-recovery\r\n *\r\n * @param originalRecord the FIX message to be retransmitted as possible duplicate\r\n * @returns the FIX message ready to be retransmitted\r\n */\r\n private prepareRecordForRetransmission (originalRecord: IFixMsgStoreRecord): IFixMsgStoreRecord {\r\n const retransmitted = originalRecord.clone() // We don't want to accidently change any fields of the original record\r\n\r\n const factory = this.config.factory\r\n if (!retransmitted.obj) {\r\n retransmitted.obj = {}\r\n }\r\n\r\n // Rebuilds header with the updated fields\r\n const header = factory?.header(\r\n retransmitted.msgType,\r\n retransmitted.seqNum,\r\n new Date(), // SendingTime(52)\r\n {\r\n PossDupFlag: true,\r\n OrigSendingTime: retransmitted.timestamp\r\n }\r\n )\r\n retransmitted.obj = {\r\n ...retransmitted.obj,\r\n StandardHeader: header\r\n }\r\n return retransmitted\r\n }\r\n}\r\n"]}
|