GithubHelp home page GithubHelp logo

ibm / nodejs-itoolkit Goto Github PK

View Code? Open in Web Editor NEW
41.0 17.0 35.0 1.34 MB

A JavaScript (Node.js) library for communicating with IBM i

License: MIT License

JavaScript 100.00%
ibmi xmlservice nodejs nodejs-modules itoolkit ibmioss hacktoberfest

nodejs-itoolkit's Introduction

Node.js itoolkit

npm Supported Node Versions ryver-chat ryver-signup Documentation Status

itoolkit is a Node.js interface to XMLSERVICE to access all things IBM i.

Table of Contents

Introduction

XMLSERVICE provides interfaces to interact with IBM i resources such as programs and commands. XMLSERVICE receives xml input and returns xml output.

For example run a CL command by sending the following XML input to XMLSERVICE.

<?xml version="1.0" encoding="UTF-8"?>
<myscript>
   <cmd exec="rexx">RTVJOBA USRLIBL(?) SYSLIBL(?)</cmd>
</myscript>

XMLSERVICE will run the command and respond with XML output.

<?xml version="1.0" encoding="UTF-8"?>
<myscript>
   <cmd exec="rexx">
      <success>+++ success RTVJOBA USRLIBL(?) SYSLIBL(?)</success>
      <row>
         <data desc="USRLIBL">QGPL  QTEMP</data>
      </row>
      <row>
         <data desc="SYSLIBL">QSYS  QSYS2  QHLPSYS  QUSRSYS</data>
      </row>
   </cmd>
</myscript>

itoolkit, with the help of an XML parser, can run the same CL command with:

const { Connection, CommandCall } = require('itoolkit');
const { XMLParser } = require('fast-xml-parser');

const connection = new Connection({
  transport: 'ssh',
  transportOptions: { host: 'myhost', username: 'myuser', password: 'mypassword' },
});

const command = new CommandCall({ type: 'cl', command: 'RTVJOBA USRLIBL(?) SYSLIBL(?)' });

connection.add(command);

connection.run((error, xmlOutput) => {
  if (error) {
    throw error;
  }

  const Parser = new XMLParser();
  const result = Parser.parse(xmlOutput);

  console.log(JSON.stringify(result));
});

The purpose of this package is to simplify the process of creating XMLSERVICE input, invoking XMLSERVICE, and returning XMLSERVICE output from Node.js.

Installation

$ npm install itoolkit

Features

Documentation

Please read the docs.

Tests

Refer to the README.

Contributing

Please read the contribution guidelines.

License

MIT

Release

For information on making a release, read RELEASE.md.

nodejs-itoolkit's People

Contributors

aaronbartell avatar abmusse avatar alanseiden avatar danny-hcs avatar dependabot[bot] avatar dmabupt avatar gajenderi avatar jkdavew avatar kadler avatar markdirish avatar rangercairns avatar theprez avatar xwyatt avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nodejs-itoolkit's Issues

Allow the Connection constructor to accept a single object for configuration.

I propose we allow iConn constructor to accept a single object for configuration

This would serve as the recommended v1.0.0 of creating a new iConn object.

The current signature allowing of (database, user, password [,restOptions]) will still be compatible.

Benefits:

  • We can add an option transport to allow new transports to be specified see #26

  • We can add an option returnError to allow for errors for errors to be set within the user passed call back to iConn.run function see #2. By default this would be set to true when using single object signature.

  • We can added an option returnXml to allow for raw xml output when set to true and output from xmlToJson when set to false. By default this would be set to false so that users don't have to call xmlToJson after run()

  • We can addnew options as needed in the future.

  • We do not have to care about positional parameters.

Bug handling non-url-safe characters in XML document

Simple issue in iRest.js which causes &, #, or ? anywhere in the XML document to cause an XMLSERVICE error.

Arises because JavaScript's encodeURI() does not encode these characters, resulting in an invalid URI if the XML document contains them - need to use encodeURIComponent() on each query parameter instead.

How can I add a data structure as return type for iPgm?

Hi!

I try to use iPgm to call some ILE RPG service programs on our machine.
Until now, I've had success to call a procedure which returns one single value.
Now I try to call a procedure which returns a mixed data structure instead, and I'm stuck.

Does iPgm already offer this feature?

Example code:

// RPG Prodedure interface with return data structure
dcl-ds chkOnlAnmDs qualified;
fenr zoned(5:0);
oida char(4);
end-ds;
// Procedure Interface
dcl-pr #chkOnlAnm likeds(chkOnlAnmDs);
username char(50) value;
password char(1990) value;
end-pr;

What I recently tried (I tested several attempts)

// Node.js code to call the procedure
var itoolkit = require("itoolkit");
var conn = new itoolkit.iConn("*LOCAL");
var pgm = new itoolkit.iPgm("#CHKONLANM", { lib: "HBUHA", func: "#CHKONLANM" });
pgm.addParam("PATRICK2", "50A");
pgm.addParam("PATRIC", "1990A");
pgm.addReturn([[0, "5S0"], ["", "4A"]]);
conn.add(pgm);
conn.run(function(antwort) {
console.log("conn finished");
console.log(antwort);
const jsonAntwort = itoolkit.xmlToJson(antwort);
console.log(JSON.stringify(jsonAntwort));
});

Proposal: Drop SqlCall.connect()

@ThePrez @kadler @dmabupt

I Propose we drop SqlCall.connect() method.

This method creates the XMLSERVICE connect tag:

<connect [conn='label' db='x' uid='x' pwd='x' options='label']/>

This tag uses XMLSERVICE to provide user authentication.

Since the toolkit (with transports) already authenticates as the user I doubt this behavior is needed or wanted.

Portuguese chars error

Original report by António Ramos (Bitbucket: ramstein74, GitHub: ramstein74).


hello i´m querying my iseries with idb-connector but
when i have a record with this field
PORCELANA P/MAÇARICO DE IGNIÇ."
i get returned this instead

"PORCELANA P/MAÇARICO DE IGNIãX\u0001"

why?

thank you and please help me solve this issue otherwise i have to use ugly java code...

thank you

my relevant code
var db2i = require("idb-connector");
var dbconn = new db2i.dbconn();
dbconn.setConnAttr(db2i.SQL_ATTR_DBC_SYS_NAMING, db2i.SQL_TRUE);
dbconn.conn("*LOCAL", "XXX", "XXX"); // connect to local database
var stm = new db2i.dbstmt(dbconn);
let query="select * from lib.table";
stm.exec(query, function (result) {
res.send(result)
stm.close()
console.log(...);
})
etc...

Modularize itoolkit.js

I propose we modularize the classes and methods within itoolkit.js

Move The following to there own files:

  • iConn class move to iconn.js
  • iPgm class mov to ipgm.js
  • iSql class move to isql.js
  • iCmd function move to icmd.js
  • iSh function move to ish.js
  • xmlToJson move to utils.js

For xmlToJson & __getClass functions

I propose we create a new file called utils.js and move both there since both are commonly used across the classes in the project.

Add exports to still allow access to all relevant Classes/Methods through itoolkit.js

In the end itoolkit.js will simply be our main entry point

module.exports = {
  iConn: require('./iconn').iConn,
  iSh: require('./ish').iSh,
  iQsh: require('./iqsh').iQsh,
  iPgm: require('./ipgm').iPgm,
  iSql: require('./isql').iSql,
  iWork: require('./iwork').iWork,
  iProd: require('./iprod').iProd,
  iUserSpace: require('./iuserSpace').iUserSpace,
  iNetwork: require('./inetwork').iNetwork,
  iObj: require('./iobj').iObj,
  iDataQueue: require('./idataq').iDataQueue,
  xmlToJson: require('./utils').xmlToJson
};

@dmabupt @kadler @ThePrez @markdirish

What do you all think?

If approved I will submit a PR with these changes

xmlToJson Issue

Original report by Danny Roessner (Bitbucket: droessner, GitHub: droessner).


There is an issue parsing xml output from an sql query using xmlToJson in certain cases.

For example, my query raw response is:

#!xml

<?xml version='1.0'?><myscript><sql>
<query error='fast' conn='conn1' stmt='stmt1'>
<success><![CDATA[+++ success *query here*]]></success>
</query>
<fetch block='all' desc='on' stmt='stmt1'>
<row><data desc='SPCDEC'></data><data desc='SPCCNT'>0</data></row>
<row><data desc='SPCDEC'></data><data desc='SPCCNT'>0</data></row>
<row><data desc='SPCDEC'></data><data desc='SPCCNT'>0</data></row>
<row><data desc='SPCDEC'></data><data desc='SPCCNT'>0</data></row>
<success>+++ success stmt1</success>
</fetch>
</sql>
</myscript>

xmlToJson output:

#!json

[ [ { desc: 'SPCDEC', value: '</data><data desc=\'SPCCNT\'>0' } ],
  [ { desc: 'SPCDEC', value: '</data><data desc=\'SPCCNT\'>0' } ],
  [ { desc: 'SPCDEC', value: '</data><data desc=\'SPCCNT\'>0' } ],
  [ { desc: 'SPCDEC', value: '</data><data desc=\'SPCCNT\'>0' } ] ]

It looks like there is a bug in the sql row regex.

Suggesting changing lines 45-46 in itoolkit.js to:

#!javascript

  var sqlRowG = /<data desc='[\s\S]+?'>[\s\S]*?<\/data>/g;
  var sqlRow = /<data desc='([\s\S]+?)'>([\s\S]*?)<\/data>/;

This fixed the issue for my case.

Deprecate xmlTojson

This will be removed in v2.

Need to update replace references to xml2json with xml2js in:

  • docs
  • examples
  • tests
  • code

Extract Data Queue functions in to a real DataQueue class

It should work something like this:

let dq = new DataQueue(transport, "MYLIB", "MYQUEUE");

await dq.send("This is a string");
await dq.sendAsEbcdic(*This is converted to UTF-8 bytes");

let s1 = await dq.receive();
let s2 = await dq.receiveFromEbcdic();

await dq.clear();

Additionally, objects and arrays could be serialized to JSON strings and sent.

Toolkit.sendToDataQueue and Toolkit.receiveFromDataQueue should be deprecated and removed in 2.0.

Establish a common code style

I propose we should:

  • use eslint to maintain consistent styling throughout the project.

  • import and use the same .eslintrc used by the idb-pconnector

@IBM/ibmi-open-source

Also would like to add JSdoc annotations to the classes.

What do you all think?

If approved I will lint all files in the project and submit a PR.

Remove ixml.js

These definitions are not useful as they do not change, nor do they get used widely and only seem to make the code more difficult to read. The literal values should be inlined wherever they are used.

itoolkit npm

Original report by Aaron Bartell (Bitbucket: aaronbartell, GitHub: aaronbartell).


I think it would be good to create an itoolkit npm so it can be stored as a dependency and be easily obtained via npm install.

Is IBM ok with doing this? If so, I can accomplish the task if you'd like.

Bug in translating XML to JSON - error markup

There is a bug during translating XML to JSON.
itoolkit.js, errorReg constant.
In XML there is a new line sign between markups, I got nulls instead of error code.
Adding new line sign resolves this problem.

Suggesting change this line of code:
const errorReg = /<error>.*?\*\*\* error (.*?)<\/error>.*?<error>(.*?)<\/error>/;
To this:
const errorReg = /<error>.*?\*\*\* error (.*?)<\/error>.*?\n<error>(.*?)<\/error>/;

Proposal for factory class

I'd like to propose a new factory method (either in this module or a closely-related module, like itoolkit-factory).

The idea is that an application can run on any platform (Linux, IBM i, Mac, Cloud) and not need to worry about choosing the correct transport. Instead, the factory should select the best transport for the surrounding operating environment. This would allow applications to be able to developed or deployed anywhere without code changes (and without understanding the various transports)

The factory would take in (hostname) as a constructor and have (username, password) as parameters. Proposed logic would be, in pseudocode:

if ( `idb-pconnector` is installed and ibmi ) 
   try returning a toolkit object with `idb-pconnector` transport
if ( `idb-connector` is installed and ibmi ) 
   try returning a toolkit object with `idb-connector` transport
if ( `odbc` is installed) 
   try returning a toolkit object with `odbc` transport
if ( `ssh2` is installed) 
   try returning a toolkit object with `ssh2` transport
else
   try returning a toolkit object with REST transport (perhaps check an env var or have an extra param for port number)

The factory will also need to be able to clean up connections.
The factory could also manage connections itself so that every request doesn't get a new instance of the transport mechanism (for instance, using a single SSH connection for all the requests, or using connection pooling)

service program parameter pass by value

XMLSERVICE 1.9.9.3 (03–13–2017) reported a fix for by="val" to be on , not but it looks like itoolkit is still passing it on the tag. This is a problem when using itoolkit with a procedure containing a parameter passed by value in a service program.

AS400 - RPG Debug option when triggered from Node.js

Hi All

I would like to know if there is anyway to debug AS400 programs when called from Node.Js applications.
As it is a stateless i'm unable to capture the Job Details to do a service job and debug.

Thanks in advance
Sri

iPgm parameters: Make declarations for parameter types easier to use

Hi!

This is rather a nice-to-have than an actual issue, but it seems to be worth to mention it.
In our company, we currently modernize our ILE RPG software. Hence we go for free format. As far as I‘ve seen, we need to declare parameter types for iPgm with the classic format („10A“ instead of „char(10)“).
May it be possible to support free format syntax in iPgm functions as well?

If I got it correctly, this may also be something that needs to be changed in the XMLSERVICE layer (?)

This is just syntactic sugar. But in long term, it may be better maintainable to have the same syntax in both definitions.

xmlToJson returns success on XMLSERVICE error

When submitting both a CHGLIBL and an SQL query where the query has an error, iToolKit is not returning an error. For example, with the following response from XMLSERVICE:

<?xml version='1.0'?>\n
<report>\n
    <version>XML Toolkit 1.9.9.3</version>\n
    <error>\n
        <errnoile>3025</errnoile>\n
        <errnoilemsg>
            <![CDATA[No such path or directory.]]>
        </errnoilemsg>\n
        <errnoxml>1100004</errnoxml>\n
        <xmlerrmsg>
            <![CDATA[XML run loop failed]]>
        </xmlerrmsg>\n
        <xmlhint>
            <![CDATA[p(103) <sql]]>
        </xmlhint>\n
    </error>\n
    <error>\n
        <sqlcode>-205</sqlcode>\n
        <sqlstate>42703</sqlstate>\n
        <errnoxml>1500001</errnoxml>\n
        <xmlerrmsg>
            <![CDATA[SQL fail]]>
        </xmlerrmsg>\n
        <xmlhint>
            <![CDATA[42703:-205:Column NAMEX not in table TESTF in TEST.]]>
        </xmlhint>\n
    </error>\n
    <error>\n
        <errnoile>3025</errnoile>\n
        <errnoilemsg>
            <![CDATA[No such path or directory.]]>
        </errnoilemsg>\n
        <errnoxml>1500002</errnoxml>\n
        <xmlerrmsg>
            <![CDATA[SQL excp]]>
        </xmlerrmsg>\n
        <xmlhint>
            <![CDATA[<fetch block='all' desc='on'></fetch]]>
        </xmlhint>\n
    </error>\n
    <error>\n
        <errnoile>3025</errnoile>\n
        <errnoilemsg>
            <![CDATA[No such path or directory.]]>
        </errnoilemsg>\n
        <errnoxml>1100004</errnoxml>\n
        <xmlerrmsg>
            <![CDATA[XML run loop failed]]>
        </xmlerrmsg>\n
        <xmlhint>
            <![CDATA[p(103) <sql]]>
        </xmlhint>\n
    </error>\n
    <xmloutput>
        <![CDATA[
        <?xml version='1.0'?><myscript><cmd exec='cmd' error='fast'><success>+++ success CHGLIBL LIBL(TEST) CURLIB(TEST)</success>\n</cmd>\n<sql>\n<query error='fast' conn='conn1' stmt='stmt1'>\n<error>         *** error SELECT namex FROM testf    </error>\n<version>XML Toolkit 1.9.9.3</version>\n<error>\n<sqlcode>-205</sqlcode>\n<sqlstate>42703</sqlstate>\n<errnoxml>1500001</errnoxml>\n<xmlerrmsg>         SQL fail   </xmlerrmsg>\n<xmlhint>         42703:-205:Column NAMEX not in table TESTF in TEST.   </xmlhint>\n</error>\n<error>\n<sqlcode>-205</sqlcode>\n<sqlstate>42703</sqlstate>\n<errnoxml>1500001</errnoxml>\n<xmlerrmsg>         SQL fail   </xmlerrmsg>\n<xmlhint>         42703:-205:Column NAMEX not in table TESTF in TEST.   </xmlhint>\n</error>\n<jobinfo>\n<jobipc>*NA</jobipc>\n<jobipcskey>FFFFFFFF</jobipcskey>\n<jobname>QSQSRVR</jobname>\n<jobuser>QUSER</jobuser>\n<jobnbr>243670</jobnbr>\n<jobsts>*ACTIVE</jobsts>\n<curuser>DROMO</curuser>\n<ccsid>37</ccsid>\n<dftccsid>37</dftccsid>\n<paseccsid>0</paseccsid>\n<langid>ENU</langid>\n<cntryid>US</cntryid>\n<sbsname>QSYSWRK</sbsname>\n<sbslib>QSYS</sbslib>\n<curlib>TEST</curlib>\n<syslibl>QSYS QSYS2 QHLPSYS QUSRSYS</syslibl>\n<usrlibl>TEST</usrlibl>\n<jobcpffind>see log scan, not error list</jobcpffind>\n</jobinfo>\n</query>\n<fetch block='all' desc='on'>\n</fetch>\n</sql>\n]]>
</xmloutput>\n
<jobinfo>\n
...

xmlToJson returns:

[
    {
        "type": "cmd",
        "success": true,
        "cmd": "CHGLIBL LIBL(TEST) CURLIB(TEST)"
    },
    {
        "type": "sql",
        "success": true,
        "stmt": "CHGLIBL LIBL(TEST) CURLIB(TEST)"
    }
]

This is because the sqlRegG regex matches the last <sql]]> in the XML above and finds the +++ success in its contents.

Deprecate SqlCall class

Data access is much better through node-odbc or idb-pconnector. This should be deprecated in V1 and removed in V2.

Memory leak in DB2 Addon

Original report by Xu Meng (Bitbucket: mengxumx, GitHub: dmabupt).


istoredp.js calls DB2 addon to run XMLSERVICE requests. But there is a memory leak issue in the new async DB2 driver for Node.js v4/v6. To resolve the issue, we need to replace the code "delete stmt/conn" with "stmt.close()/conn.close()" to explicitly clean up.

When the DB2 addon fix is released, the istoredp.js file should be updated accordingly.

Add CHANGELOG.md

We should document the changes between 0.1.6 -> 1.0.0.

Outline the features, fixes, and breaking changes.

Add New Transports

I propose we add additional transports to the toolkit.

Currently the toolkit supports 2 transports REST and DB2 (calling idb-connector stored proceduce)

We can enhance the itoolkit by incorporating

  • ODBC transport
  • SSH transport
  • idb-pconnector (Explore ways of making use of connection pooling)

ODBC and SSH transports would allow users from non IBM i machines to use the itoolkit.

To do so we would need to update iConn constructor see #25

The current signature of iConn constructo (database, user, password [,restOptions]) will use rest transport when the fourth positional argument is an object.

Otherwise will use idb-connector as the transport.

Also we should move all transports under a single directory lib/transports

istoredp.js - needs connect pool option (current design too slow)

Original report by Tony Cairns (Bitbucket: rangercairns, GitHub: rangercairns).


First, to avoid over reaction, many applications using current istoredp.js conn open/close design will work (below).

#!nodejs

var conn = new db.dbconn()
conn.disconn();

However, as workload stress increases (calls per min/sec), istoredp.js full open/close design will likely either stall or even fail. Technically, node db2 driver is often using 'server mode', wherein each open/close will attach/detach a QSQSRVR job to 'run' db2 work. While this happens relatively quickly in human terms, our machine can become very stressed doing all the open/close work. Therefore, we need a new design option to enable connection pools.

Optional read:

I do not want to start a debate about asynchronous (callback) vs. 'taming nodejs' with synchronous thinking like await facility. In fact, maybe we can use one of these 'make nodejs look synchronous' tools as another istoredp.js option. For now, let's just admit that asynchronous nodejs is the correct model, and, correct applications should be using callbacks that handle indeterminate order of task events.

So on then ...

Most every language running on IBM i eventually arrives at the need for db2 connection pools. Each has a different way of implementing the pooling technique.

However, nodejs is asynchronous nature, requires some rather tricky connection pool thinking. In fact, most db2a customer applications i have seen are completely wrong because they share a single connection across asynchronous operations like db.exec, db.prepare, etc. This will FAIL, when the work load gets heavy.

SO, we need a db2 connection pooling class that can be shared with both db2a work and also use the same connection pool with this toolkit.

I have a bears example of db2a connection pooling. This is a crude pooling class, but provides a basic pattern to keep applications from running into the ditch when machine is stressed (fails). I do NOT say this is the best design for a formal connection pool class, but it may help people understand this looming problem.

node4 bears example with connect pool

Removal of sync functions

In the currently published package, there is the option to do synchronous calls to the various functions in the iDataQueue, iNetwork, iObj, iProd, iUserSpace, and iWork.

As currently implemented, calling synchronously is a mess. It looks like the code creates a timeout to check if the result has been returned. If not, it creates ANOTHER timeout to check if the result is returned, spinning more and more timeouts until it either returns or timesout. Just doing static analysis of the code, I'm not even convinced it returns correctly, and I believe there has been customer confusion in the past when trying to use this package synchronously.

Because no one should be using this package synchronously anyway, @abmusse and I believe that we should remove all that logic and, for now, assume that the user is passing a callback function. Once we get that baked in, we can look at using more modern asynchronous methods like Promises.

iSql no result set

Original report by Brian Jerome (Bitbucket: bjerome, GitHub: brianmjerome).


I'm revisiting this project to use in production since the db2sock is in limbo.

I am trying to make a simple sql query, but nothing is returned.

let conn = new xt.iConn('*LOCAL');
...
let sql = new xt.iSql();  /* Test iSql Class */
    
sql.prepare("call qsys2.tcpip_info()");
sql.execute();
sql.fetch();
sql.free();
conn.add(sql);
conn.run((str) => {console.log(str)});

I can run this with strsql and I do get a result set, but when running it with the iToolkit QXMLSERV I don't receive a result.

============
INPUT XML
============
<?xml version='1.0'?><myscript><sql><prepare error='fast'>call qsys2.tcpip_info()</prepare><execute error='fast'></execute><fetch block='all' desc='on'></fetch><free></free></sql></myscript>
============
OUTPUT XML
============
SQLConnect: conn obj [1802fafd0] handler [18]
PrepareAsync().
SQLPrepare(0): call QXMLSERV.iPLUG512K(?,?,?,?)
BindParamAsync().
SQLBindParameter(0) TYPE[ 1] SIZE[1024] DIGI[0] IO[1] IND[ -3]
SQLBindParameter(0) TYPE[ 1] SIZE[1024] DIGI[0] IO[1] IND[ -3]
SQLBindParameter(0) TYPE[14] SIZE[524288] DIGI[0] IO[1] IND[190]
SQLBindParameter(0) TYPE[14] SIZE[524288] DIGI[0] IO[2] IND[524288]
ExecuteAsync().
SQLExecute(-1):

SQLDisconnect: conn obj [1802fafd0] handler [18]

added iQsh

Original report by Tony Cairns (Bitbucket: rangercairns, GitHub: rangercairns).


The latest XMLSERVICE supports tag. I added iQsh class to itoolkit.js.

#!node

var assert = require('assert');
var NodeVer = process.version.slice(1,2);
assert.notEqual(NodeVer, '0', 'Unsupported version of Node.js!');
var xt = require('/QOpenSys/QIBM/ProdData/OPS/Node'+NodeVer+'/os400/xstoolkit/lib/itoolkit');
var hint = 'check the "success" property in return value'

var opt = {
  xslib : 'XMLSERVICE',
  db   : '*LOCAL',
  user : 'USER',
  pwd  : 'PWD'
  //host : 'ut28p63',
  //port : 80,
  //path : '/cgi-bin/xmlcgi.pgm'
};

var conn = new xt.iConn(opt.db,null,null,opt);
conn.debug(true);
conn.add(xt.iQsh('system wrksyssts'));
conn.run(function(str){
  var results = xt.xmlToJson(str);
  var success = true;
  results.every(function(result, i){
    if(result.hasOwnProperty('success'))
      success = result.success == true;
  });
  console.log(JSON.stringify(results));
});

DB2 access issue

Original report by Anoop Mundathan (Bitbucket: mundathananoop, GitHub: Unknown).


While accessing DB2 file, getting below error

Node version : v6.9.1

IBM I : v7r2

module.js:597
return process.dlopen(module, path._makeLong(filename));
^

Error: Symbol resolution failed for /QOpenSys/QIBM/ProdData/Node/os400/db2i/bin/db2i.node because:
Symbol _ZN2v816FunctionTemplate12SetClassNameENS_6HandleINS_6StringEEE (number 120) is not exported from dependent
module node.
Symbol _ZN2v816FunctionTemplate3NewEPNS_7IsolateEPFvRKNS_20FunctionCallbackInfoINS_5ValueEEEENS_6HandleIS4_EENSA_INS_9SignatureEEEi (number 123) is not exported from dependent
module node.
Symbol ZN2v86Object3SetENS_6HandleINS_5ValueEEES3 (number 135) is not exported from dependent
module node.
Symbol _ZN2v86Object3SetEjNS_6HandleINS_5ValueEEE (number 136) is not exported from dependent
module node.
Symbol _ZN2v86String9Utf8ValueC1ENS_6HandleINS_5ValueEEE (number 138) is not exported from dependent
module node.
Symbol ZN2v88Function4CallENS_6HandleINS_5ValueEEEiPS3 (number 144) is not exported from dependent
module node.
Additional errors occurred but are not reported.
Examine .loader section symbols with the 'dump -Tv' command.
at Error (native)
at Object.Module._extensions..node (module.js:597:18)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)
at Object. (/QOpenSys/QIBM/ProdData/Node/os400/db2i/lib/db2.js:19:13)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)

})

Here is my code snippet

var db = require('/QOpenSys/QIBM/ProdData/Node/os400/db2i/lib/db2');
http.createServer((req, res) => {
    
    db.init();
    db.conn("*LOCAL");
    
    
    // Handle POST /login Request 
    if (method === 'POST' && url === '/login') {
        let body = '';
        req.on('data', chunk => body += chunk)
           .on('end', () => {
             let values = parseValues(body);
             let username = values[0];
             let password = values[1];
             
             db.exec("SELECT NAME, PWD FROM MYLIB.USERP", rs => {
                 res.writeHead(200, {'Content-Type': 'text/plain'});
                 res.end(JSON.stringify(rs));
             });

             db.close();

           });

    }

}).listen(PORT, SERVER, () => {
    console.log(`Server running at http://${SERVER}:${PORT}`);
});

Rename Classes

Current classes have names like 'iPgm' and 'iConn'. These names are bad for a number of reasons (arent Pgms and Conns but a class that calls programs and connections, don't fit in with with the style configuration of using uppercase classes/constructors).

We should create a 'new' API that renames these classes, and use that in our documentation. Then for the old class names, wrap the calls around the new calls and throw a warning that these calls are deprecated. This will help people using the old code transition, while also making sure new users are using the new API.

Classes that need to be fixed:

  • iDataQueue
  • iNetwork
  • iObj
  • iProd
  • iConn
  • iPgm
  • iSql
  • iUserSpace
  • iWork

Should we stop recommending '-g' in the install instructions?

Original report by Jesse G (Bitbucket: ThePrez, GitHub: ThePrez).


It seems to me that '-g' isn't a good practice for NPM packages in general. Having a global install does not shield individual applications from possibly-untested changes. In a production/enterprise environment, I would expect an application to test with a specific version of all modules and then contain all said modules in its own directory structure.

Adding data structure name to the XMLtoJSON-converter

Original report by Torbjørn Høivik (Bitbucket: torban91, GitHub: Unknown).


Hey, we've been using the itoolkit for a little while and noticed the XMLtoJSON-converter cuts away the datastructure name from the XML.

Example:

XML response:

#!XML

<?xml version='1.0'?><myscript><pgm name='SKSFOR03' error='fast'>
<parm io='META'>
<ds len='1'>
<data type='256A'></data>
<data type='50A'>FTJ01</data>
<data type='5A'>00000</data>
<data type='15A'>INFO</data>
<data type='100A'>Processing ok (00000)</data>
<data type='10A'>2017-09-14</data>
<data type='8A'>09.50.15</data>
<data type='12A'>000000000000</data></ds>
</parm><parm io='FORINN'>
<ds len='1'><data type='11A'>2346</data></ds>
</parm><parm io='FORUTMETA'>
<ds len='1'>
<data type='5A'>7</data>
<data type='11A'>400509401</data></ds></parm>
<parm io='FORUT'>
<ds dim='140' len='1'>
<data type='11A'>15365409</data>
<data type='5A'>4</data>
<data type='3A'>M07</data>
<data type='30A'>Bilforsikring (ansatt)</data>
<data type='75A'>HONDA , 2016, ZA17792, 75% bonus 1.Ã¥r, -> 75% bonus 2.Ã¥r</data><data type='1A'>A</data>
<data type='8A'>20170525</data>
<data type='8A'>20180525</data>
<data type='10A'>NICE_SP1G</data>
<data type='5A'>AUTO</data>
<data type='1A'>Y</data>
<data type='11A'>70</data>
<data type='25A'>SpareBank 1 Skadeforsikri</data><data type='50A'>HONDA</data><data type='10A'>10</data>
<data type='10A'>ZA17792</data>
<data type='1A'>N</data><data type='1A'>Y</data>
<data type='1A'>Y</data><data type='1A'>N</data>
<data type='1A'>N</data><data type='1A'>J</data>
<data type='1A'></data></ds>
<ds dim='140' len='1'><data type='11A'>10700169</data><data type='5A'>13</data><data type= ...
...
...
...
..

After we've converted it to JSON:

#!JSON
{
    "type": "pgm",
    "success": true,
    "data": [
        {
            "type": "256A",
            "value": ""
        },
        {
            "type": "50A",
            "value": "FTJ01"
        },
        {
            "type": "5A",
            "value": "00000"
        },
        {
            "type": "15A",
            "value": "INFO"
        },
        {
            "type": "100A",
            "value": "Processing ok (00000)"
        },
        {
            "type": "10A",
            "value": "2017-09-27"
        },
        {
            "type": "8A",
            "value": "10.26.18"
        },
        {
            "type": "12A",
            "value": "000000000000"
        },
        {
            "type": "11A",
            "value": "2346"
        },
        {
            "type": "5A",
            "value": "7"
        },
        {
            "type": "11A",
            "value": "400509401"
        },
        {
            "type": "11A",
            "value": "15365409"
        },
        {
            "type": "5A",
            "value": "4"
        },
        {
            "type": "3A",
            "value": "M07"
        },
        {
            "type": "30A",
            "value": "Bilforsikring (ansatt)"
        },
        {
            "type": "75A",
            "value": "HONDA , 2016, ZA17792, 75% bonus 1.år, -> 75% bonus 2.år"
        },
        {
            "type": "1A",
            "value": "A"
        },
        {
            "type": "8A",
            "value": "20170525"
        },
        {
            "type": "8A",
            "value": "20180525"
        },
        {
            "type": "10A",
            "value": "NICE_SP1G"
        },
        {
            "type": "5A",
            "value": "AUTO"
        },
        {
            "type": "1A",
            "value": "Y"
        },
        {
            "type": "11A",
            "value": "70"
        },
        {
            "type": "25A",
            "value": "SpareBank 1 Skadeforsikri"
        },
        {
            "type": "50A",
            "value": "HONDA"
        },
        {
            "type": "10A",
            "value": "10"
        },
        {
            "type": "10A",
            "value": "ZA17792"
        },
        {
            "type": "1A",
            "value": "N"
        },
        {
            "type": "1A",
            "value": "Y"
        },
        {
            "type": "1A",
            "value": "Y"
        },
        {
            "type": "1A",
            "value": "N"
        },
        {
            "type": "1A",
            "value": "N"
        },
        {
            "type": "1A",
            "value": "J"
        },
        {
            "type": "1A",
            "value": ""
        },
        {
            "type": "11A",
            "value": "10700169"
        },
        {
            "type": "5A",
            "value": "13"
        },
        {
            "type": "3A",
            "value": "M07"
        },
        {
            "type": "30A",
            "value": "Bilforsikring (ansatt)"
        },
        ...
       ...
...
}

We would very much like to keep the etc. tags in the json-response so we can see where the data belongs. This becomes especially true with the 'FORUT'-tag as this can have several items in it's response and makes it difficult to seperate out which data belongs to which item.

Refactor Code for 1.0

This entire repository needs a little lot of TLC. For instance, it seems to have been written with no deference to DRY principles. For example, lib/idataq.js has a class with 3 functions, sendToDataQueue, receiveFromDataQueue, and clearDataQueue. 90% of the code in these functions is the same, the only difference is the iPgm parameters that are added at the beginning of functions. The rest of the code is more like... looping and waiting for the results to come back, and I'm not even sure that code is written all that great.

While I'm linting (#21), I'm going to get familiar with the program and then I'll propose what we should do to abstract a lot of this out into a single function, then pass the parameters that need to be sent to the pgm.

Toolkit.getInstalledProducts() fails when using REST transport

When using rest transport on getInstalledProducts test case in ToolkitFunctional.js it fails with Server response code 414 URI Too Long.

My thought is that the XML input encoded within the URL GET request is too large causing the test to fail.

The xml input is rather large:

<?xml version='1.0'?>
<myscript>
	<pgm name='QSZSLTPR' lib='QSYS' error='fast'>
		<parm io='out'>
			<ds>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
				<data type='2h'></data>
				<data type='7A'></data>
				<data type='10A'></data>
				<data type='10A'></data>
				<data type='1A'></data>
				<data type='1A'></data>
				<data type='2A'></data>
				<data type='14A'></data>
				<data type='132A'></data>
			</ds>
		</parm>
		<parm>
			<ds>
				<data type='10i0'>197</data>
				<data type='10A'>*ALL</data>
				<data type='1A'>1</data>
				<data type='1A'>1</data>
				<data type='10A'>*ALL</data>
				<data type='10A'>*INSTLD</data>
				<data type='10i0'>197</data>
			</ds>
		</parm>
		<parm>
			<data type='8A'>PRDS0200</data>
		</parm>
		<parm>
			<ds>
				<data type='7A'></data>
				<data type='5A'></data>
				<data type='6A'></data>
			</ds>
		</parm>
		<parm io='out'>
			<ds>
				<data type='10i0'>0</data>
				<data type='10i0'>0</data>
				<data type='10i0'>0</data>
			</ds>
		</parm>
		<parm io='both'>
			<ds len='rec2'>
				<data type='10i0'>0</data>
				<data type='10i0' setlen='rec2'>0</data>
				<data type='7A'></data>
				<data type='1A'></data>
			</ds>
		</parm>
	</pgm>
</myscript

Simplify/remove ixml.js

ixml.js includes various definitions for XMLSERVICE tags and attributes. This is way overly complicated and over-engineered.

For instance, I_XML_ATTR_KEY_ERROR is defined to the string "error". Having definitions like this can be useful, however:

  • this string will never change as it would break compatibility
  • "error" is in the key name, so you already have to know what you're looking for
  • I_XML_ATTR_KEY_ERROR is longer and more complicated to type (caps, underscores)

This abstraction brings no benefits whatsoever, while imposing extra mental effort to understand and parse the abstraction.

A better model would be to use Javascript template literals or possibly a template engine (though this might be overkill as well).

Rename transports

transports/irest.js -> transports/http.js
iRestHTTP -> httpCall
transports/istoredp.js -> transports/idb.js

Node.js and field names as input to ipgm.js

Original report by Magne Kofoed (Bitbucket: magnekofoed, GitHub: magnekofoed).


Is it possible to put field names into ipgm.js (and xmlservice) and get the field names in the response? Both single variable names and field names in datastructures. I want to have the field names in the response from xmlservice in order to create a better json response.

Aaron: Who can be the Assignee here?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.