tag:blogger.com,1999:blog-82892849589636441422024-03-13T05:57:51.749-07:00Simply the Simplepanbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.comBlogger18125tag:blogger.com,1999:blog-8289284958963644142.post-75550742265161083042015-12-11T11:37:00.000-08:002015-12-11T11:37:05.359-08:00Property Manager - Manage your properties in a clean and efficient way<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
Well, how many times while starting a new project, we have to think of externalizing our properties files (not one but many for DB, Cache, third party integration, environment constant etc ... ). It's again a fresh start every and each time. There isn't a time when we can reuse either the existing framework or existing property management server to externalize that piece of component from our application. Hence our application is always tied to the way we read properties. It might be from the JSON file, XML file or simply the Key Value pair.<br />
<br />
Isn't it beautiful (both from DEV n DEVOPS point of view) that if we have multiple projects, we can provide the guys a unified console to manage the properties, irrespective of the project. A Centralized property management server that does this task so that our application, can only focus on doing the task it was being created for.<br />
<br />
This is my problem from some years, but dint get much time to create one off the hook but this time i tried it off and it came very well. Congratulations, well now we have something which is very simple to set up and it takes off the headache. The developer only needs to integrate the client and to be provided with the project/env/release version and the library will give him all the properties that he asked the DEVOPS to create for the project (or it can be directly created if the access is granted to use the console by the developer).<br />
<br />
Since, DEMO of the application is always important then the explanation, here is the LIVE LINK to the running application on HEROKU.<br />
<br />
<h3 style="text-align: left;">
DEMO: </h3>
<a href="https://vast-cliffs-8955.herokuapp.com/">LIVE PROPERTY MANAGER</a><br />
<br />
Here is a snapshot of how the UI of the application will look like .<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-9aRYZO06oB8/VmshohqynEI/AAAAAAAAHWU/I5B3TIi9_ww/s1600/HomePage.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="612" src="http://2.bp.blogspot.com/-9aRYZO06oB8/VmshohqynEI/AAAAAAAAHWU/I5B3TIi9_ww/s640/HomePage.JPG" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
This application is totally based on MONGODB + EXPRESS with mongoose as the ORM framework and AngularJS as the client side framework. The client UI is an single page application completely being manged by AngularJS and Bootstrap ( Angular UI Bootstrap) components are being used to render the UI. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<h3 style="clear: both; text-align: left;">
<b>CLIENTS: </b></h3>
Since this is an server side application we need a language specific client to access the properties in your project. Libraries has been created in NODEJS (avaiable as NPM Module) and Java (available as a GITHUB Project will be soon available in MVN Repository).<br />
If the client doesn't exist for your working language, let me know and i am very sure we can created it in a very short span of time.<br />
<br />
<h3 style="text-align: left;">
<b>PROJECT DETAILS: </b></h3>
GITHUB: <a href="https://github.com/panbhatt/propserver">https://github.com/panbhatt/propserver</a><br />
<br />
NODEJS Module : <a href="https://github.com/panbhatt/propserver-node-client">https://github.com/panbhatt/propserver-node-client</a><br />
NPM : npm i propserver-node-client <br />
<br />
JAVA : <a href="https://github.com/panbhatt/propserver-java-client">https://github.com/panbhatt/propserver-java-client</a><br />
<br />
All the API's of the project are being documented property via SWAGGER and can be found in the swagger console available at <a href="https://vast-cliffs-8955.herokuapp.com/swagger/">https://vast-cliffs-8955.herokuapp.com/swagger/</a> <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-FiWsDvHVp_0/Vmskk03NDkI/AAAAAAAAHWc/AgkR3dgRoHk/s1600/API_Documentation.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="640" src="http://4.bp.blogspot.com/-FiWsDvHVp_0/Vmskk03NDkI/AAAAAAAAHWc/AgkR3dgRoHk/s640/API_Documentation.JPG" width="522" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
All the API's of the project can be tested with the above Swagger API Console. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
I hope it will be helfpul for you. Let me know, in comments how we can improve this project (by email or via GITHUB too.)</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Note: There is a project ZUUL available at devnull.org (however the site is down since long) but it is only made for java ( plus a spring client is also there but it lacks little documentation and it is little cumbersome of set it up). It also provides similar features but only Java support. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Let me know, if you like it. It is free for anyone's use. Just drop me a mail and if there are donations that would be awesome for me to buy a BEER... !!!!!!. </div>
<br /></div>
panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com0tag:blogger.com,1999:blog-8289284958963644142.post-16527198514286663222015-11-06T12:53:00.000-08:002015-11-06T12:53:14.529-08:00Nodejs n Java - Using Java code in NodeJS<div dir="ltr" style="text-align: left;" trbidi="on">
Being a seasoned java developer, switching to NodeJS and dealing with the way Nodejs works is quite challenging. Plus, what about the work done in the Java, isn't we have to redo all that thing in Nodejs... well, what if i say No... whooooo..how...<br />
<br />
NodeJS is too open, and with the NAN library (native abstractions for Node) it does provide a way to use Java libraries and your custom code in NodeJS. Since node is being developed in C++ there are ways to invoke C++ code in NodeJS, however this kept changing between Node V0.10.x n V0.12.7. I really found it a bit on the higher end of learning curve although its great and fun experience to work with it. However with the complexity, i also decided to try another road. Since it is my bread and butter for quite long time, it seems to be good chance to go back in the old territory and see, how things can be bridged.<br />
<br />
Enough talk lets start coding...<br />
I have uploaded all the Java + NodeJS code on my Github repo <a href="https://github.com/panbhatt/JavaNodeSample">https://github.com/panbhatt/JavaNodeSample</a><br />
<br />
Basically, we have to use two NPM module "java" which acts as a wrapper across the Java API's and 'node-java-maven' through which we can use any library present under MVN repo... well everything is available under MVN,, isnt???/<br />
<br />
Steps to run the example<br />
1. Clone the repo and do an "npm install" .<br />
2. execute "node index.js" . This file will simply replicate the functionality of NodeMain.java and simply invoke every function present in it. (without argument, with integer argument, with String argument, calling instance n static methods, getting a returned value from the Java program.<br />
3. execute "node maven.js" -> This will replicate the functionality of MavenMain.java (which will be using Apache commons lang ver 3.0)... Open package.json and see the "java" keyword . yes we can specify any java library via this and can load this in our nodejs program before executing any java code.<br />
<br />
I have purposely created a lib directory which will contains the custom code that we have written via using Apache Commons Lang and the whole maven project is being included undeer "NodeSample" folder in the Git Repo.<br />
<br />
Every Java function, can be called either in an SYNCHRONOUS or Asynchronous manner. Both of the programs have an example of this.<br />
<br />
Here are some of the detailed links that will be helpful.<br />
<br />
<a href="https://github.com/joeferner/node-java">https://github.com/joeferner/node-java</a> -> Github repo of actual 'java' module<br />
https://github.com/joeferner/node-java-maven -> github Repo of actual 'node-java-maven' module.<br />
<br />
I hope this will prove helpful for daily Nodejs programmer or the Java guys who are making a shift to NodejS (like me... ummmm.). Let me know if there is a problem.<br />
<br /></div>
panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com1tag:blogger.com,1999:blog-8289284958963644142.post-42046297024539499172015-07-14T08:11:00.004-07:002015-07-14T08:11:41.910-07:00MongoDB Authentication - My Notes<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<br />
<br />
for setting the authentication:<br />
> use admin<br />
> show collections<br />
system.indexes<br />
system.users<br />
> db.createUser({ "user" : "panbhatt" , "pwd" : "*******" , "roles" : [ "readWrite" ]})<br />
OR<br />
db.addUser("panbhatt","internet") // This is OLD<br />
> db.system.users.find()<br />
// To Verify that the user has been registered.<br />
<br />
now switch to another database<br />
> use logs<br />
> Add the user same as above conditions<br />
<br />
use db.dropUser("nameofUser") // to drop an user.<br />
<br />
http://blog.amussey.com/post/62809509642/mongodb-installing-and-configuring-authentication<br />
<br /></div>
panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com2tag:blogger.com,1999:blog-8289284958963644142.post-13625135342266414432014-10-16T20:36:00.001-07:002014-10-16T20:36:53.350-07:00Shell Script - Short Learning for big future. <div dir="ltr" style="text-align: left;" trbidi="on">
From a long time, i wanted to write a summarized view of various features available in shell scripting. Finally after reading 2 books of shell scripting, I am trying to summarized the best features so that it can be completed in minimum amount of time by a developer who wants a quick cheat sheet type of page, where one can find all the daily useful commands & remember it for long time. here is the pointed form of the summary:-<br />
<br />
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="1"><span style="font-size: 11pt; font-weight: bold;">Cat
/etc/shells</span><span style="font-size: 11pt;"> -> Lists the shells available</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="2"><span style="font-size: 11pt; font-weight: bold;">echo $SHELL</span><span style="font-size: 11pt;"> -> Get current running shell</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">ps $$</span><span style="font-size: 11pt;"> -> gives the PID of the shell
running in the system. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">type -a ls</span><span style="font-size: 11pt;"> -> Gives whether ls is
external or internal command, with path</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Bash Startup
Scripts</span><span style="font-size: 11pt;"> <br />
a.</span><span style="font-size: 11pt; font-weight: bold;"> /etc/profile</span><span style="font-size: 11pt;"> - The systemwide initialization file, executed for
login shells<br />
b.</span><span style="font-size: 11pt; font-weight: bold;"> $HOME/.bash_profile, $HOME/.bash_login, and
$HOME/.profile</span><span style="font-size: 11pt;">
runs second when a user logs in in that order.<br />
c. </span><span style="font-size: 11pt; font-weight: bold;">$HOME/.bash_logout </span><span style="font-size: 11pt;">invoked when you log out. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">apt-cache
search shell </span><span style="font-size: 11pt;">->
To find the list of available shell packages under ubuntu</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">which bash</span><span style="font-size: 11pt;"> -> Will give you the full
path of shell command (try </span><span style="font-size: 11pt; font-weight: bold;">Whereis </span><span style="font-size: 11pt;">-> this will give the
location+man location of this command )</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">vi hello.sh</span><span style="font-size: 11pt;"> -> Create a new file and
write </span><span style="font-size: 11pt; font-weight: bold;">echo "hello world"</span><span style="font-size: 11pt;"> in it. Execute </span><span style="font-size: 11pt; font-weight: bold;">chmod +x hello.sh</span><span style="font-size: 11pt;"> and then execute </span><span style="font-size: 11pt; font-weight: bold;">./hello.sh</span><span style="font-size: 11pt;"> to execute the commands
under it. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="9"><span style="font-size: 11pt; font-weight: bold;">#!/bin/bash</span><span style="font-size: 11pt;"> -> this is the Shebang
tha tis to be used at the first line of every script</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="10"><span style="font-size: 11pt;">Execute a script also via
"</span><span style="font-size: 11pt; font-weight: bold;">bash hello.sh</span><span style="font-size: 11pt;">"</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="11"><span style="font-size: 11pt;">Debug mode: "</span><span style="font-size: 11pt; font-weight: bold;">bash -xv
hello.sh</span><span style="font-size: 11pt;">" or use set -x/+x , -v/+v, -n/+n in
script</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="12"><span style="font-size: 11pt; font-weight: bold;">Env</span><span style="font-size: 11pt;"> or </span><span style="font-size: 11pt; font-weight: bold;">printenv </span><span style="font-size: 11pt;">-> list all the system
variables</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="13"><span style="font-size: 11pt; font-weight: bold;">Find /home
-name *.c -> </span><span style="font-size: 11pt;">will
find all C files under /home</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="14"><span style="font-size: 11pt; font-weight: bold;">printf
"${PATH}\n"</span><span style="font-size: 11pt;"> -> Use
printf extensively as like in C.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="15"><span style="font-size: 11pt; font-weight: bold;">personName="Pankaj
Bhatt"<br />
echo "Person name is ${personName}</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="16"><span style="font-size: 11pt; font-weight: bold;">lastName=${variable:-"bhatt"}</span><span style="font-size: 11pt;"> -> If variable is empty it will
assign value 'bhatt'</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="17"><span style="font-size: 11pt; font-weight: bold;">Sleep 3</span><span style="font-size: 11pt;"> -> Halt the execution of 3 sceonds.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="18"><span style="font-size: 11pt; font-weight: bold;">Echo *.conf</span><span style="font-size: 11pt;"> -> Show all the conf
files within current directory</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Export</span><span style="font-size: 11pt;"> -> This command is used
to export variables to all child processes</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Export -n</span><span style="font-size: 11pt;"> -> Gives the list of all
variables exported to this shell. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Unset
varname</span><span style="font-size: 11pt;"> ->
Will unset the value of the variable.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="22"><span style="font-size: 11pt; font-weight: bold;">read -p
"Enter your name : "name</span><span style="font-size: 11pt;"> -> For
reading the value in an Variable</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="23"><span style="font-size: 11pt;">Read arguments -t 10 For
Timeout input (abort if don’t enter),-s for password</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="24"><span style="font-size: 11pt; font-weight: bold;">ans=$((x +y
))</span><span style="font-size: 11pt;"> -> To Do the mathematical computation
for two variables, if either x or y is can't converted to INTEGER it
should be used as ZERO. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="25"><span style="font-size: 11pt; font-weight: bold;">declare -i
num1=10</span><span style="font-size: 11pt;">
-> declare an integer variable. (Assigning else results 0)</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="26"><span style="font-size: 11pt; font-weight: bold;">readonly
varName = value</span><span style="font-size: 11pt;">
-> being used to create a constant </span><span style="font-size: 11pt; font-weight: bold;">OR<br />
declare -r varname=value</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="27"><span style="font-size: 11pt; font-weight: bold;">varc=${varName:?Error
varName is not defined or is empty} -> </span><span style="font-size: 11pt;">To check whether varName is defined or not,
otherwise the remaining string will
be used to display the error. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="28"><span style="font-size: 11pt; font-weight: bold;">let
sum=no1+no2 :- </span><span style="font-size: 11pt;">Let
command can be used to do mathmatical operations without using $ in front
of variables. Or $[ no1 + no2 ] can also be used and results can be
assigned to result. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="29"><span style="font-size: 11pt; font-weight: bold;">bc</span><span style="font-size: 11pt;"> comamnd can be used to do
mathematical computation. </span><span style="font-size: 11pt; font-weight: bold;">echo "4 * 0.56" | bc</span><span style="font-size: 11pt;"> </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="30"><span style="font-size: 11pt; font-weight: bold;">Export
JAVA_HOME= /usr/bin/java/jdk</span><span style="font-size: 11pt;"> -> This
command will treat java_home as env variable going forward. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="31"><span style="font-size: 11pt; font-weight: bold;">Whatis ls
-> </span><span style="font-size: 11pt;">This
command gives a short description of the command from man pages. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="32"><span style="font-size: 11pt; font-weight: bold;">history</span><span style="font-size: 11pt;"> -> Command is used to see
the history of commands you typed. CTRL-R is used to search the command
while typing. !<lineno> will execute the command from command
history. </lineno></span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="33"><span style="font-size: 11pt; font-weight: bold;">!!</span><span style="font-size: 11pt;"> -> This will execute the
last command you typed.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="34"><span style="font-size: 11pt;">A {} is used to repeat a
pattern. E.g. </span><span style="font-size: 11pt; font-weight: bold;">echo file{1,2,3}.txt</span><span style="font-size: 11pt;"> will print -> file1.txt file2.txt file3.txt</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="35"><span style="font-size: 11pt; font-weight: bold;">Wildcard
(*,?.[..]) s</span><span style="font-size: 11pt;">upports
the above pattern. E.g. </span><span style="font-size: 11pt; font-weight: bold;">ls
*.{c,java}</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="36"><span style="font-size: 11pt; font-weight: bold;">ls [ab]*.sh
-> </span><span style="font-size: 11pt;">only lists
the file starting with a or b. </span><span style="font-size: 11pt; font-weight: bold;">[a-d]*.sh </span><span style="font-size: 11pt;">-> Only a-d starting filenames. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="37"><span style="font-size: 11pt; font-weight: bold;">ls -d */</span><span style="font-size: 11pt;"> -> Gives you a list of
all the directories present in the current pwd. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="38"><span style="font-size: 11pt; font-weight: bold;">Alias</span><span style="font-size: 11pt;"> -. It list all the alias
present in the system.</span></li>
<ol style="direction: ltr; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="a">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="1"><span style="font-size: 11pt; font-weight: bold;">Alias ls
='ls -lah'</span><span style="font-size: 11pt;">
-> To create alias for any command</span></li>
</ol>
<ol style="direction: ltr; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="a">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="2"><span style="font-size: 11pt; font-weight: bold;">Unalias ls</span><span style="font-size: 11pt;"> -> to Remove
the Alias<br />
Alias remove with the session, to store them permanently store them
in /{HOME}/.bashrc file</span></li>
</ol>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="39"><span style="font-size: 11pt; font-weight: bold;">STARTUP
Scripts</span></li>
<ol style="direction: ltr; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="a">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="1"><span style="font-size: 11pt; font-weight: bold;">/etc/profile
-> </span><span style="font-size: 11pt;">Linux
wide system properties file. Runs first when a user logs in.</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">/etc/profile.d
-></span><span style="font-size: 11pt;"> directly
contains all files that Runs SECOND when user logs in. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">${HOME}/.bash_profile
-></span><span style="font-size: 11pt;"> Runs
third when user logs in. Internally this calls </span><span style="font-size: 11pt; font-weight: bold;">.bashrc</span><span style="font-size: 11pt;"> in HOME directory. Use this
for setting anything. Once done type n press "</span><span style="font-size: 11pt; font-weight: bold;">bash</span><span style="font-size: 11pt;">" for to refresh the
settings placed in </span><span style="font-size: 11pt; font-weight: bold;">.bashrc</span><span style="font-size: 11pt;"> file.</span></li>
</ol>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; font-weight: bold; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0px; margin-top: 0px; vertical-align: middle;" value="40"><span style="font-size: 11pt;">cat </span><span style="font-size: 11pt; font-weight: normal;">command is being used for seeing the contents on
the screen.</span><span style="font-size: 11pt;"> </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; font-weight: bold; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0px; margin-top: 0px; vertical-align: middle;" value="41"><span style="font-size: 11pt;">PS1 </span><span style="font-size: 11pt; font-weight: normal;">is the variable that holds the command prompt
you use. Set it in .bashrc file, via using </span><span style="font-size: 11pt;">export PS1=</span><span style="font-size: 11pt; font-weight: normal;">''${HOME}"</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; font-weight: bold; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0px; margin-top: 0px; vertical-align: middle;" value="42"><span style="font-size: 11pt;">CTRL-D</span><span style="font-size: 11pt; font-weight: normal;"> is the command, which is being used
to come out of the shell. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; font-weight: bold; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0px; margin-top: 0px; vertical-align: middle;" value="43"><span style="font-size: 11pt;">Setting Shell options:-</span></li>
<ol style="direction: ltr; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="a">
<li style="margin-bottom: 0px; margin-top: 0px; vertical-align: middle;" value="1"><span style="font-size: 11pt;">set -o -: </span><span style="font-size: 11pt; font-weight: normal;">This will list all the shell
configured variables.</span></li>
</ol>
<ol style="direction: ltr; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="a">
<li style="margin-bottom: 0px; margin-top: 0px; vertical-align: middle;" value="2"><span style="font-size: 11pt;">set -o variableName :-</span><span style="font-size: 11pt; font-weight: normal;"> This will unset a specific
variable listed from the above command. </span></li>
<li style="margin-bottom: 0px; margin-top: 0px; vertical-align: middle;"><span style="font-size: 11pt;">set
+o variableName :-</span><span style="font-size: 11pt; font-weight: normal;"> This will set a specific variable listed from
the above command. </span></li>
</ol>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="44"><span style="font-size: 11pt; font-weight: bold;">shopt</span><span style="font-size: 11pt;"> -> to list some of the
variables configured for the environment. For setting it use "</span><span style="font-size: 11pt; font-weight: bold;">shopt -s
<varname></varname></span><span style="font-size: 11pt;">"
and for unset </span><span style="font-size: 11pt; font-weight: bold;">-u option</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Setting Env
Variables :-</span><span style="font-size: 11pt;">
Modify ~/.bash_rc and include line </span><span style="font-size: 11pt; font-weight: bold;">EXPORT</span><span style="font-size: 11pt;"> </span><span style="font-size: 11pt; font-weight: bold;"><env_var_name>="<value>"</value></env_var_name></span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">System Vide
Shell Options: </span><span style="font-size: 11pt;">in
</span><span style="font-size: 11pt; font-weight: bold;">/etc/profile.d</span><span style="font-size: 11pt;"> directory create a file</span><span style="font-size: 11pt; font-weight: bold;"> java.sh</span><span style="font-size: 11pt;"> (with execute
permissions) and write export java
commands in it.E.g. </span><span style="font-size: 11pt; font-weight: bold;">export JAVA_HOME</span><span style="font-size: 11pt;">=/usr/lib/java/jdk1.6u50 ; \n export PATH=$</span><span style="font-size: 11pt; font-weight: bold;">PATH:$JAVA_HOME/bin</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">test</span><span style="font-size: 11pt;"> command is being used for
checking the file existence or test values<br />
</span><span style="font-size: 11pt; font-weight: bold;">test -f /bin/bash && echo "File Exists" || echo
"File does not exists."
</span><span style="font-size: 11pt;">-> It
will print File Exists</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">If [test]
CONDITION</span><span style="font-size: 11pt;">
-> then … … …else … … .. -> fi ( You can also use </span><span style="font-size: 11pt; font-weight: bold;">elif</span><span style="font-size: 11pt;"> in place of </span><span style="font-size: 11pt; font-weight: bold;">else if</span><span style="font-size: 11pt;"> }
<br />
</span><span style="font-size: 11pt; font-weight: bold;">if [ $myAge -gt 0 ]</span><span style="font-size: 11pt;"> -> This is
also a valid condiion </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="49"><span style="font-size: 11pt; font-weight: bold;">Exit status
of the command -> </span><span style="font-size: 11pt;">Use $? To get the status of the earlier command executed</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="50"><span style="font-size: 11pt; font-weight: bold;">Connection
command e.g. </span><span style="font-size: 11pt;"> > Second set of commands will execute
only when first is successful</span></li>
</ol>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<span style="font-weight: bold;">test! -d /tmp/foo</span> <span style="color: red; font-weight: bold;">&&</span> <span style="font-weight: bold;">{ read-p
"Directory /tmp/foo not found. Hit [Enter] to exit..."enter; exit 1;
}</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<span style="font-weight: bold;">|| Operator -> </span>echo "ram here"
>> /dev/null || echo "I M Executing" -> second will only execute on failure of
first. </div>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="51"><span style="font-size: 11pt; font-weight: bold;">-ge, -eq,
lt, -le, -gt, -ne</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">test -z</span><span style="font-size: 11pt;"> -> to check that the
string is not empty &length is not
zero</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">File operation with </span><span style="font-size: 11pt; font-weight: bold;">test : -a : </span><span style="font-size: 11pt;">if file exists, -b : if file exists and block
special file , -d : is a directory , -e : if file exists, -f : regular
file , -s size</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Command line
arguments:</span><span style="font-size: 11pt;"> $0,
$1, $2, $3, $4 etc. </span><span style="font-size: 11pt; font-weight: bold;">$*/$@</span><span style="font-size: 11pt;"> -> Represents all command
line arguments.</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Parameters
set by shell:</span><span style="font-size: 11pt;"> </span><span style="font-size: 11pt; font-weight: bold;">$*, $@, $#,
$-, $?, $$, $! , ($? -> </span><span style="font-size: 11pt;">Represents the status of the
last executed command)</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="56"><span style="font-size: 11pt; font-weight: bold;">exit N</span><span style="font-size: 11pt;"> -> Where N represents the
code that is being returned for the script execution status code. 0 means
success</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="57"><span style="font-size: 11pt; font-weight: bold;">case $val in
\n "pankaj") echo
"got it" ;; \n "abc") echo " This is second
change";; \n *) echo "Default Case";; esac<br />
</span><span style="font-size: 11pt;">The pattern
to be matched can contain regular expression characters.<br />
You can use "</span><span style="font-size: 11pt; font-weight: bold;">shopt -s nocasematch</span><span style="font-size: 11pt;">" in the script, to
ignore case comparison while case matching in SWITCH case.</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">For
$variable in</span><span style="font-size: 11pt;">
(some kind of list, can be string/numbers etc) \n do \n
cmd1;cmd2;cmd3; done<br />
C Like for loop also works here.</span><span style="background: yellow; font-size: 11pt; font-weight: bold;">
for (( i =1; i <=5; i++ ))</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="59"><span style="font-size: 11pt; font-weight: bold;">While [ $n
-eq 0 ] \n do \n </span><span style="font-size: 11pt;">cmd1;
cmd2; cmd3 ;</span><span style="font-size: 11pt; font-weight: bold;"> \n done<br />
while : \n do cmd1; cmd2; cmd3 \n done -> </span><span style="font-size: 11pt;">This is an indefinite loop or
(while true ) or (while false)</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="60"><span style="font-size: 11pt; font-weight: bold;">Until [
condition ]</span><span style="font-size: 11pt;">
\n </span><span style="font-size: 11pt; font-weight: bold;">do</span><span style="font-size: 11pt;">
\n </span><span style="font-size: 11pt; font-weight: bold;">cmd1; cmd2; cmd3;</span><span style="font-size: 11pt;"> \n </span><span style="font-size: 11pt; font-weight: bold;">done
-> </span><span style="font-size: 11pt;">Reverse
of While, until the condition becomes true, it will run.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="61"><span style="font-size: 11pt; font-weight: bold;">Select var
in list \n do \n cmd1;cmd2;cmd3; \n done</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="62"><span style="font-size: 11pt; font-weight: bold;">Break </span><span style="font-size: 11pt;">is used to come outside of
the innermost loop while </span><span style="font-size: 11pt; font-weight: bold;">break N </span><span style="font-size: 11pt;">is to come out of the N
levels of loops.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="63"><span style="font-size: 11pt; font-weight: bold;">continue</span><span style="font-size: 11pt;"> is also used to keep on
going the loop.</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">$(ls)</span><span style="font-size: 11pt;"> -> This will execute a
command enclose in $() and can assign it results in an variable. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;"><</span><span style="font-size: 11pt;"> :- for input,</span><span style="font-size: 11pt; font-weight: bold;"> ></span><span style="font-size: 11pt;"> :- for output , </span><span style="font-size: 11pt; font-weight: bold;">2></span><span style="font-size: 11pt;"> :- error redirection, </span><span style="font-size: 11pt; font-weight: bold;">&></span><span style="font-size: 11pt;"> :- use to redirect both
output and error to the same place, 2>> Append error log</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">/dev/null</span><span style="font-size: 11pt;"> :- All the data written on
this is being discarded by the system.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="67"><span style="font-size: 11pt; font-weight: bold;">bash -c
"cd /home; ls -la"</span><span style="font-size: 11pt;"> -> This
comman will execute the script script inline as it is being passed to the
command. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="68"><span style="font-size: 11pt; font-weight: bold;">cat abc.txt
> /dev/lp0 -> </span><span style="font-size: 11pt;">print the file to the printer. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="69"><span style="font-size: 11pt;">File Descriptor can be
assigned to an input file or to an output file , </span><span style="font-size: 11pt; font-weight: bold;">exec 3<
abc.txt</span><span style="font-size: 11pt;"> OR </span><span style="font-size: 11pt; font-weight: bold;">exec 3> abc.txt</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Enclose
multiple commands in single block : { cd /home; ls -la ; dir ; }</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Watch -n 5
"ls -la; df -h ;" -> </span><span style="font-size: 11pt;">Watch the execution of this command very 2 seconds.
Press CTRL-C to come out.</span><span style="font-size: 11pt; font-weight: bold;"> </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Command
& -> </span><span style="font-size: 11pt;">To
put the command in the background.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="73"><span style="font-size: 11pt;">Pipes are a way to send the
output of one command to another one.
e.g </span><span style="font-size: 11pt; font-weight: bold;">cat abc.txt > grep "ram"</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="74"><span style="font-size: 11pt; font-weight: bold;">pstree </span><span style="font-size: 11pt;">-> This is the command
that will be used to display the tree of process with there childs.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="75"><span style="font-size: 11pt; font-weight: bold;">pgrep -u
pankaj,ram : </span><span style="font-size: 11pt;">This
is used to list the processes of pankaj & ram user in the system. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">pkill</span><span style="font-size: 11pt;"> is a command to kill the
processes that belongs to a group/user.</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">trap : </span><span style="font-size: 11pt;">trap is the command which is
being used to trap (any of the SIGTERM signal) and execute a codes based
on that. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Functions</span><span style="font-size: 11pt;"> are being created in shell
scripting. Just like in other languages, arguments are being accessible by
$0,$1<br />
Eg. </span></li>
</ol>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<span style="font-weight: bold;">myFun()</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
{</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .75in; margin: 0in;">
echo
"Hello, how things are" $1</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
}</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
echo
"start calling the function"</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
myFun
Argument1<br />
Any outside variable defined within the Function will change its value. To
declare any local variable within function use "<span style="font-weight: bold;">local nm=$1</span>"<br />
return command can be used to return a value from the function, if no value is
being specified hen last command status will be returned. <br />
We can write all the functions in a single script and then can include then
file in our main script. E.g. if we have functions.sh at home directory then
include it via "<span style="font-weight: bold;">. /home/pankaj/functions.sh</span>"
. Then you can call every function present in that file. Or another way is to
use the source command e.g. "<span style="font-weight: bold;">source
/home/pankaj/functions.sh</span>".<br />
you can use '<span style="font-weight: bold;">&' </span>operator to execute a
function in the background. (just like a normal shell command). </div>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="79"><span style="font-size: 11pt;">Subshells are the shells
within which your script runs within a shell. You need to EXPORT every
variable/function that is defined in the main shell to get it accessed by
the Subshell.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="80"><span style="font-size: 11pt;">exec command can be used to
replace this shell with specified program without swapping to a new
subshell or process. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="81"><span style="font-size: 11pt;">. (dot) command is used to
run the script in the current shell, so that any parameters that are
defined in the mains shell should be accessible, otherwise they wont be
accessible to the script running under a subshell. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Compond command is a way to
encapsulating multiple commands under a single umbrella. All commands will
be executed and generate there output</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">You can also display dialog
boxes while running your script. For this "sudo apt-get install
dialog" and then you can use it in script <br />
E.g. </span><span style="font-size: 11pt; font-weight: bold;">dialog --title "hello world" --msgbox
"Hello World 6 20"</span><span style="font-size: 11pt;"> </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">The tty command is used to
display the name of device file attached with the terminal. Or (file
connected with standard input).</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="85"><span style="font-size: 11pt;">Colored output can be print
on the console. E.g. </span><span style="font-size: 11pt; font-weight: bold;">echo -e "\e[1;31m This is red text
\e[0m"</span><span style="font-size: 11pt;">
</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">For every process in the
system you can get the list of environment varialbles by </span><span style="font-size: 11pt; font-weight: bold;">cat /proc/{PID}/environ</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Get Length of a variable via
"length=</span><span style="font-size: 11pt; font-weight: bold;">${#varName}</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Tee command is used to get
the data from the last command to store the output in an file and also
show it to the screen<br />
E.g. </span><span style="font-size: 11pt; font-weight: bold;">echo "Ram teri ganga maili"</span><span style="font-size: 11pt;"> | tee out.txt -> will
store the contents in out.txt as well as it store it to the file. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">/dev/stdout</span><span style="font-size: 11pt;"> -> refers to the standard
output and </span><span style="font-size: 11pt; font-weight: bold;">/dev/stdin</span><span style="font-size: 11pt;"> -> Refers to the keyboard,</span><span style="font-size: 11pt; font-weight: bold;"> /dev/stderr</span><span style="font-size: 11pt;"> -> To screen, </span><span style="font-size: 11pt; font-weight: bold;">/dev/null</span><span style="font-size: 11pt;"> -> discard all</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">You can also create a array in shell scripts via </span><span style="font-size: 11pt; font-weight: bold;">arry_Name=("ram","shyam");
arry_Name[0]=100; echo ${arry_Name[$index]}<br />
</span><span style="font-size: 11pt;">To print
all values of an Array Use</span><span style="font-size: 11pt; font-weight: bold;"> . ${arry_Name[*]} or ${arry_Name[@]} <br />
</span><span style="font-size: 11pt;">An
associate array is being used to use the STRING as the INDEX in the array.
e.g. </span><span style="font-size: 11pt; font-weight: bold;">declare -A arry_Name</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="91"><span style="font-size: 11pt; font-weight: bold;">sleep 30 :</span><span style="font-size: 11pt;"> is a a command that is being
used to sleep fo r specific of time. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="92"><span style="font-size: 11pt;">xargs command can be used to
take input from STDIN n convert it to the parameters passed to another command. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">tr is the command which is
used for Translating</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="94"><span style="font-size: 11pt;">Md5sum is the command to
calculate the md5 of all the filenames that are present in the md5sum
command. Same as sha1sum.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="95"><span style="font-size: 11pt;">Md5deep & sha1deep is
used to calculate the md5 n sha1 of the complete directory. (similarly base64 is also there)</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="96"><span style="font-size: 11pt;">Sort command is also being
used to sort multiple filenames. Uniq is also used with sort to generate
unique file name.</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Mktemp is a command to create
a temp file in the /tmp directory. Use (-d) to create a temp directory.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="98"><span style="font-size: 11pt; font-weight: bold;">split</span><span style="font-size: 11pt;"> command is used to break a
file in multiple chunks. E.g. </span><span style="font-size: 11pt; font-weight: bold;">split -b 100k data.file</span><span style="font-size: 11pt;"> :It will break the chunks in 100K.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="99"><span style="font-size: 11pt;">Csplit is an extended command
of split that is used to split files based upon certain conditions (like
presence of text etc).</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">rename is the command which
is used to rename the files from one to anther and you can use WILDCARD
character. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">/usr/share/dict directory
contain the dictionary. Aspell is the command used to find any word there.
</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">dd is a command available
through which you can generate large size files like 100M etc. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="103"><span style="font-size: 11pt;">/dev/zero is a special
character device, which infinitely returns the zero byte (\0). </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="104"><span style="font-size: 11pt;">comm is a command available
through which we can generate the differences between two files. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="105"><span style="font-size: 11pt;">Chmod is the command which is
used the change the file permissions for user/groups/others<br />
E.g. </span><span style="font-size: 11pt; font-weight: bold;">chmod u=rwx g=rw o=r filename</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">chown command is use to
change the ownership of the files. The format is : </span><span style="font-size: 11pt; font-weight: bold;">chown
user.group filename</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">/etc/resolv.conf
</span><span style="font-size: 11pt;">is the file that
contains the list of DNS Servers. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">chattr</span><span style="font-size: 11pt;"> is the command which is used
to make the file immutable. E.g. </span><span style="font-size: 11pt; font-weight: bold;">chattr +I fileName (</span><span style="font-size: 11pt;">you even can't delete it, use -I to reverse this).</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="109"><span style="font-size: 11pt;">touch command is used to
create the new file or modify the timestamp of the file to the current
timestamp. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="110"><span style="font-size: 11pt;">Symbolic links are being created by "</span><span style="font-size: 11pt; font-weight: bold;">ln -s targetFileName symbolic_link_name</span><span style="font-size: 11pt;">"</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="111"><span style="font-size: 11pt;">File command is being used to
tell the type of file. E.g "</span><span style="font-size: 11pt; font-weight: bold;">file abc.sh</span><span style="font-size: 11pt;">"</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="112"><span style="font-size: 11pt;">Loopback files can be used to
create a file system out of a single file. You can mount the file at a
specific mount point. See details
in the LINUX shell Scripting Cookbook for details. Page no 124. You can
also create the partition inside loopback images and mount it separately.
You can also mount ISO files as loopback files. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="113"><span style="font-size: 11pt; font-weight: bold;">/dev/zero</span><span style="font-size: 11pt;"> is a file which will always
contain zero, if you read from it. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="114"><span style="font-size: 11pt; font-weight: bold;">cdrecord</span><span style="font-size: 11pt;"> command is used to create an
ISO into a CD-ROM. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="115"><span style="font-size: 11pt;">Diff command is used to find
the difference between two files/directories. A host of options are there,
through which you can customize the output. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">pushd and
popd</span><span style="font-size: 11pt;"> commands
are being used to push a specific directory to the stack and then do a CD
into it automatically. </span><span style="font-size: 11pt; font-weight: bold;">Dirs</span><span style="font-size: 11pt;"> is the command that can be used to find the appropriate
number of directories in the stack. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">wc</span><span style="font-size: 11pt;"> is the command which is used
to count the number of lines/words/characters from a text file. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">tree</span><span style="font-size: 11pt;"> is the command use to print
the complete tree of the complete file system. It does not come bydefault,
you have to use it. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Grep is the command used to
search a test across multiple files. E.g. </span><span style="font-size: 11pt; font-weight: bold;">grep "pattern" file1
file2. </span><span style="font-size: 11pt;">egrep is
just an extended version of grep command with extended regular
expresstions. Its same as </span><span style="font-size: 11pt; font-weight: bold;">"grep -E" Option.</span><span style="font-size: 11pt;"> -o option is used to print
only that line which match the pattern. "</span><span style="font-size: 11pt; font-weight: bold;">-c</span><span style="font-size: 11pt;">" is used to count.
"</span><span style="font-size: 11pt; font-weight: bold;">-n</span><span style="font-size: 11pt;">"
prints the line number. "</span><span style="font-size: 11pt; font-weight: bold;">-R</span><span style="font-size: 11pt;">" recursively search
over a directory. "</span><span style="font-size: 11pt; font-weight: bold;">-I</span><span style="font-size: 11pt;">" ignoring the case. Use "</span><span style="font-size: 11pt; font-weight: bold;">-e</span><span style="font-size: 11pt;">" if there are multiple
patterns to match with. "</span><span style="font-size: 11pt; font-weight: bold;">--include</span><span style="font-size: 11pt;">" option is being used
to match the files that needs to be included in the search. </span><span style="font-size: 11pt; font-weight: bold;">--include
*.{c,cpp} . "</span><span style="font-size: 11pt;">--</span><span style="font-size: 11pt; font-weight: bold;">exclude"
</span><span style="font-size: 11pt;">is used for
exclusion of files. "</span><span style="font-size: 11pt; font-weight: bold;">-q</span><span style="font-size: 11pt;">" is being used for quiet output, then you can use
return status of the command to check whether there are any matches or
not. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">cut</span><span style="font-size: 11pt;"> is the command which is used
to cut the text in a columnar fashion. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="121"><span style="font-size: 11pt; font-weight: bold;">sed</span><span style="font-size: 11pt;"> is being used for text
replacements. E.g. </span><span style="font-size: 11pt; font-weight: bold;">sed 's/pattern/replace_string/' file. </span><span style="font-size: 11pt;">Use -I option to save the
changes int eh file after replacements.
</span><span style="font-size: 11pt; font-weight: bold;">Awk </span><span style="font-size: 11pt;">is used for advanced text processing. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="122"><span style="font-size: 11pt; font-weight: bold;">wget</span><span style="font-size: 11pt;"> is a command which is used
to download a file from the internet.</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="123"><span style="font-size: 11pt; font-weight: bold;">Lynx</span><span style="font-size: 11pt;"> is a command available
through which you can get the TEXT content of a webpage.</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Curl command used to hit a
web page/API and get response. "--cookie" option is used to
specify cookies. </span><span style="font-size: 11pt; font-weight: bold; text-decoration: underline;">--cookie
"user=ram;a=b". </span><span style="font-size: 11pt;">-H is being used to specify headers. </span><span style="font-size: 11pt; font-weight: bold;">curl -H
"Host: </span><a href="http://www.slynux.org/"><span style="font-size: 11pt; font-weight: bold;">www.slynux.org</span></a><span style="font-size: 11pt; font-weight: bold;">" -H
"Accept-language: en" URL. </span><span style="font-size: 11pt;">-I/-head</span><span style="font-size: 11pt; font-weight: bold;"> </span><span style="font-size: 11pt;">option to show only response headers. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">tar -cvf
output.tar file1 file2 file3 file4 file5
-> </span><span style="font-size: 11pt;">To
compress all the files in an tar file<br />
</span><span style="font-size: 11pt; font-weight: bold;">tar -xf output.tar -C
/path/to/extractdirectory</span><span style="font-size: 11pt;"> -> To uncompress all the files.</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">gzip</span><span style="font-size: 11pt;"> is used to zip a file while </span><span style="font-size: 11pt; font-weight: bold;">gunzip</span><span style="font-size: 11pt;"> is used to unzip the files.
Similarly zip/unzip (</span><span style="font-size: 11pt; font-weight: bold;">-r</span><span style="font-size: 11pt;"> is being used for recursively).</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">rsync is the command to keep
in sync two files/directories E.g. </span><span style="font-size: 11pt; font-weight: bold;">rsync -av /opt/jboss/data
slynux@192.168.0.6:/home/backups/data</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="128"><span style="font-size: 11pt;">To add a scheduler in linux,
add a CRON expression based entry in CRONTAB file</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="129"><span style="font-size: 11pt; font-weight: bold;">Ifconfig</span><span style="font-size: 11pt;"> is the command used to show
the network interfaces. This command is used to set the static IP address
on a specific network interface. </span><span style="font-size: 11pt; font-weight: bold;">ifconfig wlan0 192.168.0.80</span><span style="font-size: 11pt;"> </span><span style="font-size: 11pt; font-weight: bold;">netmask
255.255.255.0</span><span style="font-size: 11pt;">.
To automatically get the IP from the DHCP use "</span><span style="font-size: 11pt; font-weight: bold;">dhclient
eth0</span><span style="font-size: 11pt;">"</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Route, host, nslookup ,
traceroute ( show all hops to the destination). </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">lsof -I</span><span style="font-size: 11pt;"> & </span><span style="font-size: 11pt; font-weight: bold;">netstat</span><span style="font-size: 11pt;"> are being used for port
analysis. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Df (disk free)/ du (disk
usage) . d</span><span style="font-size: 11pt; font-weight: bold;">u -a directory : </span><span style="font-size: 11pt;">lists size of all files and then of complete directory. </span><span style="font-size: 11pt; font-weight: bold;">Du -c</span><span style="font-size: 11pt;"> : shows all count sum of all
files. --exclude is used to
exclude some file/directory for there usage calculation. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="133"><span style="font-size: 11pt; font-weight: bold;">time</span><span style="font-size: 11pt;"> command can be used to
measure the amount of time taken by the command. E.g. "</span><span style="font-size: 11pt; font-weight: bold;">time ls
-la" . </span><span style="font-size: 11pt;">In
addtion, this command can be used to find exit status, number of signals
received, number of context switches made etc. </span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="134"><span style="font-size: 11pt;">Users Details:
who/w/users/last/</span></li>
</ol>
<br />
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="135"><span style="font-size: 11pt; font-weight: bold;">logrotate</span><span style="font-size: 11pt;"> is the command which is
useful to configure the log rotation of various files in any directory of
the file system. The configuration directory for every process is in </span><span style="font-size: 11pt; font-weight: bold;">/etc/logrotate.d</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Fsck </span><span style="font-size: 11pt;">is the comman for file system
scan. E.g. </span><span style="font-size: 11pt; font-weight: bold;">fsck /dev/sdb0</span><span style="font-size: 11pt;">. </span><span style="font-size: 11pt; font-weight: bold;">/etc/fstab</span><span style="font-size: 11pt;"> is the file containing all the file systems. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Wall is a command which is
used to write a message to all the terminals of all the users who are
logged in the system. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Gathering
system information:</span><span style="font-size: 11pt;"> hostname/uname -n/uname -a/ uname
-r/uname -m</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">cat
/proc/cpuinfo; cat /proc/meminfo/ , cat /proc/partitions; </span><span style="font-size: 11pt;">use </span><span style="font-size: 11pt; font-weight: bold;">lshw </span><span style="font-size: 11pt;">to get the info about
complete file system.</span></li>
</ol>
</div>
panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com0tag:blogger.com,1999:blog-8289284958963644142.post-20520113396972707822014-09-25T21:15:00.002-07:002014-09-25T21:15:56.640-07:00Docker Summarized Overview - 5 mins food for Geeks<div dir="ltr" style="text-align: left;" trbidi="on">
Docker:<br />
From a long time, i was quite fascinated by the way docker works and unfortunately i dint get a part of it, why the hell it can't run with windows directly (without installing boot2docker). This really challenges me to learn it from upside down and i embark my Journey to a great component called LXC in Linux. Believe me, you would understand DOCKER very easily if you know how LXC worked. Finally, i got to know DOCKER is just a way of managing your dockers in a better manner with some cherries on the cake like repository etc.<br />
<br />
Here are my summarized notes, that anyone can learn from. I tried to keep them crisp and short. It is for just giving DOCKER a try and at least have a spoonfull of the dish.<br />
<br />
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold; text-decoration: underline;">Docker installation:</span></div>
<div style="font-family: Calibri; font-size: 10.5pt; margin: 0in;">
<span style="background: #FCFCFC; color: #48484c;">$ sudo apt</span><span style="background: #FCFCFC; color: #93a1a1;">-</span><span style="background: #FCFCFC; color: #1e347b;">get</span><span style="background: #FCFCFC; color: #48484c;">
update<br />
$ sudo apt</span><span style="background: #FCFCFC; color: #93a1a1;">-</span><span style="background: #FCFCFC; color: #1e347b;">get</span><span style="background: #FCFCFC; color: #48484c;"> install docker</span><span style="background: #FCFCFC; color: #93a1a1;">.</span><span style="background: #FCFCFC; color: #48484c;">io<br />
$ sudo ln </span><span style="background: #FCFCFC; color: #93a1a1;">-</span><span style="background: #FCFCFC; color: #48484c;">sf </span><span style="background: #FCFCFC; color: #93a1a1;">/</span><span style="background: #FCFCFC; color: #48484c;">usr</span><span style="background: #FCFCFC; color: #93a1a1;">/</span><span style="background: #FCFCFC; color: #48484c;">bin</span><span style="background: #FCFCFC; color: #93a1a1;">/</span><span style="background: #FCFCFC; color: #48484c;">docker</span><span style="background: #FCFCFC; color: #93a1a1;">.</span><span style="background: #FCFCFC; color: #48484c;">io </span><span style="background: #FCFCFC; color: #93a1a1;">/</span><span style="background: #FCFCFC; color: #48484c;">usr</span><span style="background: #FCFCFC; color: #93a1a1;">/</span><span style="background: #FCFCFC; color: #1e347b;">local</span><span style="background: #FCFCFC; color: #93a1a1;">/</span><span style="background: #FCFCFC; color: #48484c;">bin</span><span style="background: #FCFCFC; color: #93a1a1;">/</span><span style="background: #FCFCFC; color: #48484c;">docker<br />
$ sudo sed </span><span style="background: #FCFCFC; color: #93a1a1;">-</span><span style="background: #FCFCFC; color: #48484c;">i '$acomplete -F _docker docker' </span><span style="background: #FCFCFC; color: #93a1a1;">/</span><span style="background: #FCFCFC; color: #48484c;">etc</span><span style="background: #FCFCFC; color: #93a1a1;">/</span><span style="background: #FCFCFC; color: #48484c;">bash_completion</span><span style="background: #FCFCFC; color: #93a1a1;">.</span><span style="background: #FCFCFC; color: #48484c;">d</span><span style="background: #FCFCFC; color: #93a1a1;">/</span><span style="background: #FCFCFC; color: #48484c;">docker</span><span style="background: #FCFCFC; color: #93a1a1;">.</span><span style="background: #FCFCFC; color: #48484c;">io</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
Sudo docker search
ubuntu -> search for keyword docker</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
Sodu docker pull
ubuntu -> to Pull all ubuntu images from Docker</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
Sudo docker images
-> show the list of all images</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
sudo docker run -i
-t ubuntu /bin/bash -> running the bash sheel correctly</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
# Start a new
container</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">JOB=$(sudo docker run -d ubuntu /bin/sh -c "while
true; do echo Hello world; sleep 1; done")</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
-> After above
command, the container will start and u have to press Ctrl-C to come out of it
and then have to you docker ps to see it
is running. </div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
# Stop the container</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">docker stop $JOB</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
# Start the
container</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">docker start $JOB</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
# Restart the
container</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">docker restart $JOB</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
# SIGKILL a
container</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">docker kill $JOB</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
# Remove a container</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">docker stop $JOB</span> # Container must be stopped to
remove it</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">docker rm $JOB</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
Installation of
Shipyard. -> </div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<a href="https://www.digitalocean.com/community/tutorials/docker-explained-how-to-containerize-and-use-nginx-as-a-prox">https://www.digitalocean.com/community/tutorials/docker-explained-how-to-containerize-and-use-nginx-as-a-prox</a>y</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
Installation of
apache/nginx -> </div>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="1"><span style="font-size: 11pt; font-weight: bold;">sudo docker
run -i -t -p 80:80 ubuntu /bin/bash</span><span style="font-size: 11pt;"> <br />
NOw you will be entered in the shell. Press CTRL-P & CTRL-Q
aftewards to come out of the shell</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Sudo docker
ps</span><span style="font-size: 11pt;"> <br />
THis will list the container ID of the process</span></li>
</ol>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="3"><span style="font-size: 11pt; font-weight: bold;">Sudo docker
attach 3edaace90360</span><span style="font-size: 11pt;"> <br />
This will take you to the shell. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">Sudo apt-get
update</span><span style="font-size: 11pt;"> <br />
As the image you have download is older one, so you will need to
update the package list. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt; font-weight: bold;">sudo apt-get
install apache2</span><span style="font-size: 11pt;"><br />
This will install the apache on the system.</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Sudo service apache2 start</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Sudo apt-get install curl</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Curl </span><a href="http://localhost/"><span style="font-size: 11pt;">http://localhost</span></a><span style="font-size: 11pt;"> <br />
It will show the complete
Apache Page. </span></li>
</ol>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;"> sudo docker
commit 3edaace90360 panbhatt/pankaj_ubuntu_apache</span><br />
This will store all the changes in that container by this name</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">Sudo docker images</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
It will list the
image that is just created with the name same. </div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">Sudo docker login</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
This will prompt for
the docker username and password. </div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">sudo docker push panbhatt/ubuntu-apache</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
This will push the
image to the docker repository</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">Sudo docker inspect 3edaace90360</span> </div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
This will list the
complete setting of the container (e.g. the network ports being exposed).</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">sudo docker port
3edaace90360 80</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
This will show
whether the port 80 is being used by the container or not</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
You can also
establish the LINKING Between the server, see section 2.3.1 of Docker
documentation</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">Networking</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">sudo apt-get install bridge-utils</span> (to install brtcl on ubuntu)</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">Sudo brctl show</span>
(see networking for Ubuntu, how docker establish the DOCKER brdige)</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">Sudo ifconfig docker0</span> -> To see the details
of the bridge. The set of IP addres to be given to continers</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
You can also control
the list of IP addresses need to be given to the docker. 2.4 section</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
Docker can also
provide a functionality to allow communication between the various contains, by
using -icc parameter which can be set
true/false in the bridge configuration. </div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
Pipework project is
an great work at Github to connect multiple
containers</div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
You can always make
sure that your containers are running with process managers like systemD,
upstart & supervisor . Check docker documentation for 2.5 for this. </div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
Shared director or
VOLUME is the best way to share the directories from one container to another,
(even if the source container is not working at all). </div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
You can also mount a
HOST directory to an container too. This will allow it to use any available
configuration or properties directory to the host system. </div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin: 0in;">
<span style="font-weight: bold;">DockerFile</span></div>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="1"><span style="font-size: 11pt;">Touch Dockerfile</span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Write the following contents,
see documentation for greater detail. <br />
</span> </li>
</ol>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<span style="background: yellow; mso-highlight: yellow;"># DOCKER-VERSION 1.0.1</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<span style="background: yellow; mso-highlight: yellow;">FROM ubuntu:14.10</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<span style="background: yellow; mso-highlight: yellow;">RUN sudo apt-get update</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<span style="background: yellow; mso-highlight: yellow;">RUN sudo apt-get install -y
nginx</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<span style="background: yellow; mso-highlight: yellow;">RUN sudo apt-get install -y curl</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<span style="background: yellow; mso-highlight: yellow;">RUN sudo service nginx restart</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<br /></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<span style="background: yellow; mso-highlight: yellow;">EXPOSE 80</span></div>
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<br /></div>
<ol style="direction: ltr; font-family: Calibri; font-size: 11pt; margin-bottom: 0in; margin-left: 0.375in; margin-top: 0in; unicode-bidi: embed;" type="1">
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;" value="3"><span style="font-size: 11pt;">Build the image by running
the following command<br />
</span><span style="font-size: 11pt; font-weight: bold;">sudo docker build -t panbhatt/ubuntu_nginx_df .<br />
if it says -> "</span><span style="font-size: 11pt;">Successfully built fc09cc5af0c5"<br />
use "sudo docker images" to see your name of this VM is
there. </span></li>
<li style="margin-bottom: 0; margin-top: 0; vertical-align: middle;"><span style="font-size: 11pt;">Now Run this image: <br />
</span><span style="font-size: 11pt; font-weight: bold;">sudo docker run -i -p 8000:80
-t panbhatt/ubuntu_nginx_df /bin/bash</span><span style="font-size: 11pt;"><br />
Now attach yourself to this and enjoy.</span></li>
</ol>
<br />
<div style="font-family: Calibri; font-size: 11.0pt; margin-left: .375in; margin: 0in;">
<br /></div>
</div>
panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com0tag:blogger.com,1999:blog-8289284958963644142.post-29382693991640644342014-07-16T14:18:00.001-07:002014-07-16T14:18:17.484-07:00Java Currency Detail via Locale and Currency Code<div dir="ltr" style="text-align: left;" trbidi="on">
Sometimes, while developing our API's we need to give the currency details while formatting a currency. The details of the currency are like what Symbol to use, did we have a separator, what is the number of decimal places, should we place the symbol before or after the formatted number.<br />
<br />
This can easily be achieved by using Java API's rather then storing it in the database. Here is the java code that generates all these details. It would be very much helpful if we want to return this information in the API related to currency.<br />
<br />
// Source Code<br />
<br />
Locale locale = new Locale("ja", "JP");<br />
Currency currency = Currency.getInstance("JPY");<br />
boolean bPre = false;<br />
int ndx = -1;<br />
double price = 12345.67;<br />
<br />
DecimalFormatSymbols df = DecimalFormatSymbols.getInstance(locale) ;<br />
df.setCurrency(currency);<br />
NumberFormat nF = NumberFormat.getCurrencyInstance(locale);<br />
nF.setCurrency(currency);<br />
System.out.println("CURRENCY SYMBOL = " + df.getCurrencySymbol());<br />
System.out.println("DECIMAL SEPARATOR = " + df.getDecimalSeparator());<br />
System.out.println("GROUP SEPARATOR = " + df.getGroupingSeparator());<br />
System.out.println("CURRENCY CODE = " + df.getInternationalCurrencySymbol());<br />
System.out.println("DECIMAL PLACE = " + nF.getMaximumFractionDigits());<br />
String sLP = ((DecimalFormat) nF).toLocalizedPattern();<br />
ndx = sLP.indexOf('\u00A4'); // currency sign<br />
<br />
if (ndx > 0) {<br />
bPre = false;<br />
} else {<br />
bPre = true;<br />
}<br />
<br />
System.out.println("CURRENCY PLACE BEFORE = " + bPre);<br />
System.out.println("FORMATTED CURRENCY: " + nF.format(price));<br />
<br />
// Output<br />
<div class="MsoNormal">
<b><span style="color: #1f497d;">//For vi_VN Locale and VND
currency code.</span></b><span style="color: #1f497d;"> <br />
<br />
CURRENCY SYMBOL = đ<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">DECIMAL SEPARATOR = ,<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">GROUP SEPARATOR = .<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">CURRENCY
CODE = VND<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">DECIMAL
PLACE = 0<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">CURRENCY PLACE
BEFORE = <b>false</b><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">FORMATTER CURRENCY: <b>12.346 đ</b><o:p></o:p></span></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<b><span style="color: #1f497d;">// For India
Locale hi_IN and INR Currency Code<o:p></o:p></span></b></div>
<div class="MsoNormal">
<span style="color: #1f497d;">CURRENCY SYMBOL = </span><span style="color: #1f497d; font-family: "Mangal","serif";">रू</span><span style="color: #1f497d;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">DECIMAL SEPARATOR = .<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">GROUP SEPARATOR = ,<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">CURRENCY
CODE = INR<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">DECIMAL
PLACE = 2<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">CURRENCY PLACE
BEFORE = <b>true</b></span><span style="color: #1f497d;">FORMATTED CURRENCY: </span><b><span style="color: #1f497d; font-family: "Mangal","serif";">रू</span><span style="color: #1f497d;"> </span></b><b><span style="color: #1f497d; font-family: "Mangal","serif";">१२</span><span style="color: #1f497d;">,</span></b><b><span style="color: #1f497d; font-family: "Mangal","serif";">३४५</span><span style="color: #1f497d;">.</span></b><b><span style="color: #1f497d; font-family: "Mangal","serif";">६७</span></b></div>
<div class="MsoNormal">
<span style="color: #1f497d;"><br />
<b>// For JAPAN Locale ja_JP and JPY Currency Code<o:p></o:p></b></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">CURRENCY SYMBOL = </span><span style="color: #1f497d; font-family: "MS Gothic"; mso-bidi-font-family: "MS Gothic";">¥</span><span style="color: #1f497d;"><o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">DECIMAL SEPARATOR = .<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">GROUP SEPARATOR = ,<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">CURRENCY
CODE = JPY<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">DECIMAL
PLACE = 0<o:p></o:p></span></div>
<div class="MsoNormal">
<span style="color: #1f497d;">CURRENCY PLACE
BEFORE = <b>true</b><o:p></o:p></span></div>
<br />
<div class="MsoNormal">
<span style="color: #1f497d;">FORMATTED CURRENCY: </span><b><span style="color: #1f497d; font-family: "MS Gothic"; mso-bidi-font-family: "MS Gothic";">¥</span><span style="color: #1f497d;">12,346</span></b><span style="color: #1f497d;"><o:p></o:p></span></div>
<br />
<br /></div>
panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com0tag:blogger.com,1999:blog-8289284958963644142.post-33226043436935911782014-02-17T10:17:00.001-08:002014-02-17T10:17:27.989-08:00Groovy - The Groove of Java ( Groovy for Impatient)<div dir="ltr" style="text-align: left;" trbidi="on">
<div dir="ltr" style="text-align: left;" trbidi="on">
Finally, after a long period of time, i started writing back... I decided to give Groovy a chance, and it really bounced back with a bang as like always. Such a great language, which seems like not getting enough attraction as it should be. I would be say (if performance should not be the only barometer), then this may be a perfect replacement of Java.<br />
Every feature provided by Groovy either turns out to be really nice crafted feature on top of the solid foundations provided by Java. I am going to write a series of posts on Groovy (especially for the impatient Java developers), so that they can add something sharp in their armory.<br />
<br />
I am starting with the Java5 features and how they are implemented/Enhanced in Groovy. I will try to provide a basic set of examples that will work on your system without any problem. I am assuming that Groovy has been installed and GROOVY_HOME environment variable has been created with Groovy bin folder being presented in the PATH of the operating system.<br />
<br />
<br />
<ol style="text-align: left;">
<li><u style="font-weight: bold;">Autoboxing and Unboxing:</u><br />As Groovy supports metaprogramming, groovy provides an automatic promotion/demotion of objects based upon the kind of usage. E.g.
<pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> int firstVariable = 100;
print firstVariable .getClass().name
</code>
</pre>
This will going to print "java.lang.Integer" because of usage of the int is being like an object, so the primitive has been converted to object. Prior Groovy 2.0 primitives are being treated always as objects but going forward 2.0 further optimizations has been done to make intype conversion.
</li>
<li><u style="font-weight: bold;">For Each loop: </u> For-each loop which has been introduced in Java 5, needs us to declare the type of the Array/Collection, this constraint has been removed in Groovy.<br />
<pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> String[] stringAr = [ " Ram ", "Shyam ", "Manoj" ]
for(str in stringAr)
print(str)
</code></pre>
This will print " Ram Shyam Manoj" without any indication in FOR loop what is the TYPE of STR variable. Groovy identifies this at Runtime, thus providing a way to change the type of object at Runtime, it can be collection/array.
</li>
<li><u style="font-weight: bold;">Enum:</u> Enums as like java can be used in Switch case, but Groovy provides a functionality to use multiple ENUM in a single case statement or a range of ENUM values.
<pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> enum NUM { ONE, TWO, THREE,FOUR, FIVE, SIX, SEVEN, EIGHT }
NUM myNumber = NUM.THREE
switch(myNumber) {
case [NUM.ONE, NUM.TWO]:
print "You have entered either 1 or 2 "
break
case NUM.ONE .. NUM.SEVEN:
print "You entered somewhere between 1 and 7 "
break
default :
print "I dint know what you have entered"
}
</code></pre>
This will print "You entered somewhere between 1 and 7 ", which is indeed an enhancement over the way Java handles the Switch cases with ENUM.
</li>
<li><b style="text-decoration: underline;">Variable Arguments: </b> Variable arguments can be provided in same way as that of java however instead of sum(int a, int... b) we can also use sum(int a, int[] b), where b represents an array of integers. </li>
<li><u style="font-weight: bold;">Annotations:</u> Groovy supports all the annotations provided by Java, however it adds up a number of specific annotations which are very much useful keeping an eye over the Dynamic nature of language e.g. @TypeChecked. I will explore all the supported annotations in the coming posts. </li>
<li><u style="font-weight: bold;">Static Import:</u> All Static variables/functions can be imported with an advantage that an ALIAS can be created for the long name of function/class.<br /><b>E.g import static Math.random as RND</b><br />Now we can use RND() in place of random()</li>
<li><u style="font-weight: bold;">Generics:</u> Groovy fully supports generics of java with an added advantage, that the TYPE CHECKING of performing any operation can be delegated to runtime, and groovy is going to take care of conversion of the parameter to the type of generic which is declared.<br />E.g. </li>
</ol>
</div>
<pre style="background-image: URL(http://2.bp.blogspot.com/_z5ltvMQPaa8/SjJXr_U2YBI/AAAAAAAAAAM/46OqEP32CJ8/s320/codebg.gif); background: #f0f0f0; border: 1px dashed #CCCCCC; color: black; font-family: arial; font-size: 12px; height: auto; line-height: 20px; overflow: auto; padding: 0px; text-align: left; width: 99%;"><code style="color: black; word-wrap: normal;"> List<String> list = new ArrayList<String>();
list.add("Pankaj");
list.add(5);
list.add(5.4);
print list
</code></pre>
This code will print "Pankaj 5 5.4" while java wont be able to compile it. and Groovy adds the groovy and automatically find the best possible conversion to remove the error.<br />
<br />
That's all for now, in the next post, we are going to cover the new set of annotations which are introduced in Groovy.<br />
<br />
<br /></div>
panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com0tag:blogger.com,1999:blog-8289284958963644142.post-5524605062857553782012-07-29T03:47:00.000-07:002012-07-29T04:18:40.086-07:00Spring MVC WADL generation<div dir="ltr" style="text-align: left;" trbidi="on">
<link href="http://alexgorbatchev.com/pub/sh/2.1.364/styles/shCore.css" rel="stylesheet" type="text/css"></link>
<link href="http://alexgorbatchev.com/pub/sh/2.1.364/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link>
<script src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shCore.js" type="text/javascript">
</script>
<script src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCss.js" type="text/javascript">
</script>
<script src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushJava.js" type="text/javascript">
</script>
<script src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPython.js" type="text/javascript">
</script>
<script src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushSql.js" type="text/javascript">
</script>
<script src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushXml.js" type="text/javascript">
</script>
<script language="javascript">
<span class="GRcorrect" id="GRmark_1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd_SyntaxHighlighter:0" grphrase="1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd" grtype="null">SyntaxHighlighter</span><span class="GRcorrect" id="GRmark_1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd_.:1" grphrase="1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd" grtype="null">.</span>config<span class="GRcorrect" id="GRmark_1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd_.:2" grphrase="1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd" grtype="null">.</span><span class="GRcorrect" id="GRmark_1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd_bloggerMode:3" grphrase="1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd" grtype="null">bloggerMode</span> = true;
SyntaxHighlighter<span class="GRcorrect" id="GRmark_1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd_.:4" grphrase="1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd" grtype="null">.</span>config<span class="GRcorrect" id="GRmark_1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd_.:5" grphrase="1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd" grtype="null">.</span><span class="GRcorrect" id="GRmark_1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd_clipboardSwf:6" grphrase="1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd" grtype="null">clipboardSwf</span> = 'http://alexgorbatchev.com/pub/sh/2.1.364/scripts/clipboard.swf';
SyntaxHighlighter<span class="GRcorrect" id="GRmark_1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd_.:7" grphrase="1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd" grtype="null">.</span>all<span class="GRcorrect" id="GRmark_1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd_(:8" grphrase="1797ba2efbfbeecf20b8c7578a3c8a9e0030f6bd" grtype="null">(</span>);
</script>
<br />
<div dir="ltr" style="text-align: left;" trbidi="on">
As in other REST based frameworks in <span class="GRcorrect" grphrase="82c506f94afef55d72537e3e01ca9c9d2c3109d9" grtype="null" id="GRmark_82c506f94afef55d72537e3e01ca9c9d2c3109d9_java:0">java</span>, most of them provide an out of <span class="GRcorrect" grphrase="82c506f94afef55d72537e3e01ca9c9d2c3109d9" grtype="null" id="GRmark_82c506f94afef55d72537e3e01ca9c9d2c3109d9_box support:1">box support</span> for <span class="GRcorrect" grphrase="82c506f94afef55d72537e3e01ca9c9d2c3109d9" grtype="null" id="GRmark_82c506f94afef55d72537e3e01ca9c9d2c3109d9_genreation:2">genreation</span> of <span class="GRcorrect" grphrase="82c506f94afef55d72537e3e01ca9c9d2c3109d9" grtype="null" id="GRmark_82c506f94afef55d72537e3e01ca9c9d2c3109d9_WADL file:3">WADL file</span> ( web application description language). It's an XML file that is being composed of the description of all the resources that <span class="GRcorrect" grphrase="949ebd631a423ce9c3b2cb6c1409691a3a35f8bf" grtype="null" id="GRmark_949ebd631a423ce9c3b2cb6c1409691a3a35f8bf_your:0">your</span> REST based API is going to expose. This blog is a collection of the codes , that is being used in order to generate WADL through Spring. (Note: spring MVC does not provide an inbuilt way of generating this file and does not implements JSR-311 fully, so we can expect some mismatch here and there), however other frameworks like JERSEY (which is a full fledged REST implementation) provides complete support for this.<br />
<br />
In order to generate application<span class="GRcorrect" grphrase="ddf4848cdad76ce3d8fa4081c0a6609cabebb2d0" grtype="null" id="GRmark_ddf4848cdad76ce3d8fa4081c0a6609cabebb2d0_.:0">.</span><span class="GRcorrect" grphrase="ddf4848cdad76ce3d8fa4081c0a6609cabebb2d0" grtype="null" id="GRmark_ddf4848cdad76ce3d8fa4081c0a6609cabebb2d0_wadl:1">wadl</span>, we must have to understand the structure of the WADL (<a data-mce-href="http://www.w3.org/Submission/wadl/wadl.xsd" href="http://www.w3.org/Submission/wadl/wadl.xsd" style="color: rgb(0, 0, 255) !important; font-family: arial, helvetica, sans-serif; font-size: 12px; line-height: 20px; text-align: -webkit-auto;">http://www.w3.org/Submission/wadl/wadl.xsd</a>). This XSD contains a list of all XML elements and attributes that can be present within <span class="GRcorrect" grphrase="d5cf3c89dc1179810f3abc7ebf111a65006fc93e" grtype="null" id="GRmark_d5cf3c89dc1179810f3abc7ebf111a65006fc93e_an:0">an</span> WADL file).<br />
<br />
There are simply two steps to achieve the generation:<br />
<b style="text-decoration: underline;">Step 1:</b> Via using the above XSD we have to generate the classes, that will represent all the elements in the WADL XML file. The command is simple one. Just download the XSD onto your local machine and hit the command "<b><span class="GRcorrect" grphrase="c59572f81edc98942fafe711c071b783e88d6a36" grtype="null" id="GRmark_c59572f81edc98942fafe711c071b783e88d6a36_xjc:0">xjc</span> </b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b></b><b><span class="GRcorrect" grphrase="c59572f81edc98942fafe711c071b783e88d6a36" grtype="null" id="GRmark_c59572f81edc98942fafe711c071b783e88d6a36_wadl:1">wadl</span><span class="GRcorrect" grphrase="c59572f81edc98942fafe711c071b783e88d6a36" grtype="null" id="GRmark_c59572f81edc98942fafe711c071b783e88d6a36_.:2">.</span><span class="GRcorrect" grphrase="c59572f81edc98942fafe711c071b783e88d6a36" grtype="null" id="GRmark_c59572f81edc98942fafe711c071b783e88d6a36_xsd:3">xsd</span></b>" and you will get a number of <span class="GRcorrect" grphrase="c59572f81edc98942fafe711c071b783e88d6a36" grtype="null" id="GRmark_c59572f81edc98942fafe711c071b783e88d6a36_java:4">java</span> file in the working directory. In case you want to specify a specific package name for the generated <span class="GRcorrect" grphrase="cd11101a867fc59e1aa3086ec912d0c273af1baa" grtype="null" id="GRmark_cd11101a867fc59e1aa3086ec912d0c273af1baa_java:0">java</span> files, you can achieve this via a number of command line options provided by <b><span class="GRcorrect" grphrase="cd11101a867fc59e1aa3086ec912d0c273af1baa" grtype="null" id="GRmark_cd11101a867fc59e1aa3086ec912d0c273af1baa_xjc:1">xjc</span>. </b>So for example <span class="GRcorrect" grphrase="146fe3cfb812a954a7c89faa65119ec5ef767539" grtype="null" id="GRmark_146fe3cfb812a954a7c89faa65119ec5ef767539_i:0">i</span> have generated the files in the following folder "<b><span class="GRcorrect" grphrase="146fe3cfb812a954a7c89faa65119ec5ef767539" grtype="null" id="GRmark_146fe3cfb812a954a7c89faa65119ec5ef767539_com:1">com</span><span class="GRcorrect" grphrase="146fe3cfb812a954a7c89faa65119ec5ef767539" grtype="null" id="GRmark_146fe3cfb812a954a7c89faa65119ec5ef767539_.:2">.</span>mine<span class="GRcorrect" grphrase="146fe3cfb812a954a7c89faa65119ec5ef767539" grtype="null" id="GRmark_146fe3cfb812a954a7c89faa65119ec5ef767539_.:3">.</span><span class="GRcorrect" grphrase="146fe3cfb812a954a7c89faa65119ec5ef767539" grtype="null" id="GRmark_146fe3cfb812a954a7c89faa65119ec5ef767539_wadl:4">wadl</span><span class="GRcorrect" grphrase="146fe3cfb812a954a7c89faa65119ec5ef767539" grtype="null" id="GRmark_146fe3cfb812a954a7c89faa65119ec5ef767539_.:5">.</span>artifact</b>" and here is a list of all the files present in that folder. ( I have renamed each file so that the name starts with WADL).<br />
1.<br />
<b><br /></b><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-he38YwD8wfE/UBULvjYFTsI/AAAAAAAADgE/Ip6z7g8KZtQ/s1600/Untitled.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-he38YwD8wfE/UBULvjYFTsI/AAAAAAAADgE/Ip6z7g8KZtQ/s1600/Untitled.jpg" /></a></div>
<b>Step2: </b>This step is all about writing a spring controller, that will map to the "<b>application<span class="GRcorrect" grphrase="20f93b738f4af3a972e5b452255970ecdbcab6a2" grtype="null" id="GRmark_20f93b738f4af3a972e5b452255970ecdbcab6a2_.:0">.</span><span class="GRcorrect" grphrase="20f93b738f4af3a972e5b452255970ecdbcab6a2" grtype="null" id="GRmark_20f93b738f4af3a972e5b452255970ecdbcab6a2_wadl:1">wadl</span></b>" path and will generate the XML. <span class="GRcorrect" grphrase="45e304c3ac6d45b71d9f1cb826fe89a4abb05eb4" grtype="null" id="GRmark_45e304c3ac6d45b71d9f1cb826fe89a4abb05eb4_we:0">we</span> have to make sure, that the JAXB <span class="GRcorrect" grphrase="45e304c3ac6d45b71d9f1cb826fe89a4abb05eb4" grtype="null" id="GRmark_45e304c3ac6d45b71d9f1cb826fe89a4abb05eb4_marshall:1">marshall</span> or any <span class="GRcorrect" grphrase="45e304c3ac6d45b71d9f1cb826fe89a4abb05eb4" grtype="null" id="GRmark_45e304c3ac6d45b71d9f1cb826fe89a4abb05eb4_otther:2">otther</span> that we are using, must be onto the classpath as Spring will make use of it to generate the XML file. Here is the source code for generating this.
<br />
<pre class="brush: java; highlight: [5, 35]">package com.mine.wadl.generator;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Set;
import javax.servlet.http.HttpServletRequest;
import javax.xml.namespace.QName;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.condition.ProducesRequestCondition;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import com.mine.wadl.artifact.WadlApplication;
import com.mine.wadl.artifact.WadlDoc;
import com.mine.wadl.artifact.WadlMethod;
import com.mine.wadl.artifact.WadlParam;
import com.mine.wadl.artifact.WadlParamStyle;
import com.mine.wadl.artifact.WadlRepresentation;
import com.mine.wadl.artifact.WadlRequest;
import com.mine.wadl.artifact.WadlResource;
import com.mine.wadl.artifact.WadlResources;
import com.mine.wadl.artifact.WadlResponse;
/**
* <b>Type name:</b>WadlController.java
<b>Description:</b> <i> This Class
* will be responsible for generation the Web application descriptor file based
* upon the </i>
<b>References:</b>
*
*
*
* @author Pankaj Bhatt.
* @version 1.0, June 2012
*/
@Controller
@RequestMapping
public class WadlController {
// @Autowired
private RequestMappingHandlerMapping handlerMapping;
/**
* Constructor for initializing the Wadl Controller
*
* @param handlerMapping
*/
@Autowired
public WadlController(RequestMappingHandlerMapping handlerMapping) {
this.handlerMapping = handlerMapping;
}
/**
* This is a function which will be responsible for generating the WADL
* file.
*
* @param request : Represents the Request
* @return WadlApplication : This object will be converted to the WADL File.
*/
@RequestMapping(method = RequestMethod.GET, produces = { "application/xml" })
public @ResponseBody WadlApplication generateWadl(HttpServletRequest request) {
WadlApplication result = new WadlApplication();
WadlDoc doc = new WadlDoc();
doc.setTitle("REST Service WADL");
result.getDoc().add(doc);
WadlResources wadResources = new WadlResources();
wadResources.setBase(getBaseUrl(request));
Map<requestmappinginfo, handlermethod=""> handletMethods = handlerMapping
.getHandlerMethods();
for (Map.Entry<requestmappinginfo, handlermethod=""> entry : handletMethods
.entrySet()) {
WadlResource wadlResource = new WadlResource();
HandlerMethod handlerMethod = entry.getValue();
RequestMappingInfo mappingInfo = entry.getKey();
Set<string> pattern = mappingInfo.getPatternsCondition().getPatterns();
Set<requestmethod> httpMethods = mappingInfo.getMethodsCondition().getMethods();
ProducesRequestCondition producesRequestCondition = mappingInfo
.getProducesCondition();
Set<mediatype> mediaTypes = producesRequestCondition
.getProducibleMediaTypes();
for (RequestMethod httpMethod : httpMethods) {
WadlMethod wadlMethod = new WadlMethod();
for (String uri : pattern) {
wadlResource.setPath(uri);
}
wadlMethod.setName(httpMethod.name());
Method javaMethod = handlerMethod.getMethod();
wadlMethod.setId(javaMethod.getName());
WadlDoc wadlDocMethod = new WadlDoc();
wadlDocMethod.setTitle(javaMethod.getDeclaringClass().getName()+ "." + javaMethod.getName());
wadlMethod.getDoc().add(wadlDocMethod);
// Request
WadlRequest wadlRequest = new WadlRequest();
Annotation[][] annotations = javaMethod.getParameterAnnotations();
Class[] paramTypes = javaMethod.getParameterTypes();
int parameterCounter = 0;
for (Annotation[] annotation : annotations) {
for (Annotation annotation2 : annotation) {
if (annotation2 instanceof RequestParam) {
RequestParam param2 = (RequestParam) annotation2;
WadlParam waldParam = new WadlParam();
waldParam.setName(param2.value());
waldParam.setStyle(WadlParamStyle.QUERY);
waldParam.setRequired(param2.required());
if (paramTypes != null
&& paramTypes.length > parameterCounter) {
if (paramTypes.length > parameterCounter
&& (paramTypes[parameterCounter] == javax.servlet.http.HttpServletRequest.class || paramTypes[parameterCounter] == javax.servlet.http.HttpServletResponse.class))
parameterCounter++;
if (paramTypes.length > parameterCounter
&& (paramTypes[parameterCounter] == javax.servlet.http.HttpServletRequest.class || paramTypes[parameterCounter] == javax.servlet.http.HttpServletResponse.class))
parameterCounter++;
if (paramTypes.length > parameterCounter) {
waldParam
.setType(getQNameForType(paramTypes[parameterCounter]));
parameterCounter++;
}
}
String defaultValue = cleanDefault(param2
.defaultValue());
if (!defaultValue.equals("")) {
waldParam.setDefault(defaultValue);
}
wadlRequest.getParam().add(waldParam);
} else if (annotation2 instanceof PathVariable) {
PathVariable param2 = (PathVariable) annotation2;
WadlParam waldParam = new WadlParam();
waldParam.setName(param2.value());
waldParam.setStyle(WadlParamStyle.TEMPLATE);
waldParam.setRequired(true);
if (paramTypes != null
&& paramTypes.length > parameterCounter) {
if (paramTypes.length > parameterCounter
&& (paramTypes[parameterCounter] == javax.servlet.http.HttpServletRequest.class || paramTypes[parameterCounter] == javax.servlet.http.HttpServletResponse.class))
parameterCounter++;
if (paramTypes.length > parameterCounter
&& (paramTypes[parameterCounter] == javax.servlet.http.HttpServletRequest.class || paramTypes[parameterCounter] == javax.servlet.http.HttpServletResponse.class))
parameterCounter++;
if (paramTypes.length > parameterCounter) {
waldParam
.setType(getQNameForType(paramTypes[parameterCounter]));
parameterCounter++;
}
}
wadlRequest.getParam().add(waldParam);
} else
parameterCounter++;
}
}
if (!wadlRequest.getParam().isEmpty()) {
wadlMethod.setRequest(wadlRequest);
}
// Response
if (!mediaTypes.isEmpty()) {
WadlResponse wadlResponse = new WadlResponse();
wadlResponse.getStatus().add(200l);
for (MediaType mediaType : mediaTypes) {
WadlRepresentation wadlRepresentation = new WadlRepresentation();
wadlRepresentation.setMediaType(mediaType.toString());
wadlResponse.getRepresentation()
.add(wadlRepresentation);
}
wadlMethod.getResponse().add(wadlResponse);
}
wadlResource.getMethodOrResource().add(wadlMethod);
}
wadResources.getResource().add(wadlResource);
}
result.getResources().add(wadResources);
return result;
}
private String getBaseUrl(HttpServletRequest request) {
return request.getScheme() + "://" + request.getServerName() + ":"
+ request.getServerPort() + "" + request.getContextPath() + "/"
+ request.getServletPath().substring(1);
}
private String cleanDefault(String value) {
value = value.replaceAll("\t", "");
value = value.replaceAll("\n", "");
value = value.replaceAll("?", "");
value = value.replaceAll("?", "");
value = value.replaceAll("?", "");
return value;
}
/**
* This is an private function, which will return the QName based upon the
* Java Type.
*
* @param classType
* : Represent the type of class
* @return QName
*/
private QName getQNameForType(Class classType) {
QName qName = null;
/**
* Check whether the thing that is coming is an Array of a data type or
* not.
*/
if (classType.isArray()) {
classType = classType.getComponentType();
}
if (classType == java.lang.Long.class)
qName = new QName("http://www.w3.org/2001/XMLSchema", "long");
else if (classType == java.lang.Integer.class)
qName = new QName("http://www.w3.org/2001/XMLSchema", "integer");
else if (classType == java.lang.Double.class)
qName = new QName("http://www.w3.org/2001/XMLSchema", "double");
else if (classType == java.lang.String.class)
qName = new QName("http://www.w3.org/2001/XMLSchema", "string");
else if (classType == java.util.Date.class)
qName = new QName("http://www.w3.org/2001/XMLSchema", "date");
return qName;
}
}
</pre>
<br />
I know this is a long stuff, but let me go one by one & line by line( I will only explain those stuff, which will help you to customize your implementation).<br />
<br />
<b>Line 61-64: </b>This is the most important part of the generation, as it initialized the contains the initialization of RequestMappingHandlerMapping object, which is present within spring and contains all the details of all the URI's that we have exposed through Spring MVC. In addtion, to it, it also contains details of the methods that have those Spring MVC Rest based annotations. later on we will see how we will make use of this to find out the information in which we are in
terested in.
<br/>
<b>Line 74: </b>
<b></b><br />
<b></b>We are simply annotating a function so that it will be invoked once we type "<b>http://blah.com/springserveletmapping/application.wadl</b>".<br />
<b>Line 75 - 113</b>: As you can see here we are creating the foundationg for generating XML and invoking functions of requ>estmappinghandlermapping to find out the set of functions which have the Spring MVC Rest based annotations. We are also looking for the media types that are being supported by the functions, ( if any present in the defintions of the functions). This is continued till line no 113.<br />
<b>Line 114: </b>This is the section, in which we are being interested in, Here as we know, every function that ismapped to some URI via spring MVC , can have any type of parameters.<br />
E.g. public <b>DataToBeReturned </b>getLoginData(<b>@PathVariable</b> int id, HttpServeltRequest req, <b>@RequestParam(value="name" , required=true)</b> String userName)<br />
However, in the WADL we only want those parameters to be listed which we are collecting from the URI e.g. either from header, requst parameters or through path variables, any other parameters beyond them is need not be included in the WADL. So h<span class="GRcorrect" grphrase="2c947ec32f5673402a9eb635e5bd3b271261fa25" grtype="null" id="GRmark_2c947ec32f5673402a9eb635e5bd3b271261fa25_inclusing:0">ere we ar</span>e removing the inclusing of HttpServletRequest and HttpServletResponse from inclusion in WADL.<br />
Based on the type of annotation on the parameter it will be included either as a path variable or request parameter (type QUERY). For all @RequestParameter it is mandatory to include (<b>value </b>and <b>required </b><span class="GRcorrect" grphrase="fc450ae4ba6f9a762337151e503937196ffd4212" grtype="null" id="GRmark_fc450ae4ba6f9a762337151e503937196ffd4212_wont:0">attr</span>ibute) otherwise we wont<span class="GRcorrect" grphrase="fc450ae4ba6f9a762337151e503937196ffd4212" grtype="null" id="GRmark_fc450ae4ba6f9a762337151e503937196ffd4212_corressponding:1"> be able to in</span>clude the corressponding i<span class="GRcorrect" grphrase="7dee9f0d3d237c35f5ab0f99c4ac71f19157ff5d" grtype="null" id="GRmark_7dee9f0d3d237c35f5ab0f99c4ac71f19157ff5d_value:0">nform</span>a<span class="GRcorrect" grphrase="7dee9f0d3d237c35f5ab0f99c4ac71f19157ff5d" grtype="null" id="GRmark_7dee9f0d3d237c35f5ab0f99c4ac71f19157ff5d_attribute:1">tion in t</span>he WADL. <b>value </b>attri<span class="GRcorrect" grphrase="7dee9f0d3d237c35f5ab0f99c4ac71f19157ff5d" grtype="null" id="GRmark_7dee9f0d3d237c35f5ab0f99c4ac71f19157ff5d_e.g:2">but</span>e reflects the name (e.g what is the request parameter name) and <b>required </b> tells us whether that parameter is n<span class="GRcorrect" grphrase="7dee9f0d3d237c35f5ab0f99c4ac71f19157ff5d" grtype="null" id="GRmark_7dee9f0d3d237c35f5ab0f99c4ac71f19157ff5d_for:3">ece</span>ssary for processing for the request or not, otherwise you will bound to get a BAD Request <span class="GRcorrect" grphrase="7ea7f6268e203615d06448ce32f4844400782953" grtype="null" id="GRmark_7ea7f6268e203615d06448ce32f4844400782953_ine:0">( H</span>ttp 400 error code)<br />
<span class="GRcorrect" grphrase="7ea7f6268e203615d06448ce32f4844400782953" grtype="null" id="GRmark_7ea7f6268e203615d06448ce32f4844400782953_at:1">.<br />
<br />
<b></b></span><b></b><br />
<b>Line 212: </b>The function at this line, will help us in calculating the Base URI on which all the resources are being mapped. This has to be modified as per your own requirements.<br />
<b>Line 236: </b>Here we are specifying a function, that will return the type of QName for the type of parameters that we are passing in the fun<span class="GRcorrect" grphrase="244e7e7c167d606aadeaf5d2c2a049366fe8f920" grtype="null" id="GRmark_244e7e7c167d606aadeaf5d2c2a049366fe8f920_an:0">ct</span>ion th<span class="GRcorrect" grphrase="cebe9b23c57d1b3e144bdd4ab057045618ce3923" grtype="null" id="GRmark_cebe9b23c57d1b3e144bdd4ab057045618ce3923_since:0">at is</span> mapped to an URI. since he<span class="GRcorrect" grphrase="cebe9b23c57d1b3e144bdd4ab057045618ce3923" grtype="null" id="GRmark_cebe9b23c57d1b3e144bdd4ab057045618ce3923_,:1">r</span>e, I am<span class="GRcorrect" grphrase="cebe9b23c57d1b3e144bdd4ab057045618ce3923" grtype="null" id="GRmark_cebe9b23c57d1b3e144bdd4ab057045618ce3923_,:2"> </span>only u<span class="GRcorrect" grphrase="cebe9b23c57d1b3e144bdd4ab057045618ce3923" grtype="null" id="GRmark_cebe9b23c57d1b3e144bdd4ab057045618ce3923_,:3">s</span>ing <b>Lo<span class="GRcorrect" grphrase="cebe9b23c57d1b3e144bdd4ab057045618ce3923" grtype="null" id="GRmark_cebe9b23c57d1b3e144bdd4ab057045618ce3923_,:4">n</span>g,Integer,Double,String,Date</b>. In, case you need to add more, please change this function<span class="GRcorrect" grphrase="3e826d609ffa47e2f8a6f2cc27dbe5ad417d150b" grtype="null" id="GRmark_3e826d609ffa47e2f8a6f2cc27dbe5ad417d150b_parameter:0"> to inclu</span>de the type of parameter of your choice).<br />
<br />
And that's all. Once you <span class="GRcorrect" grphrase="cf3e89371e45fbda4f08dd95e8d019ccf5ce1bb6" grtype="null" id="GRmark_cf3e89371e45fbda4f08dd95e8d019ccf5ce1bb6_.:0">w</span><span class="GRcorrect" grphrase="cf3e89371e45fbda4f08dd95e8d019ccf5ce1bb6" grtype="null" id="GRmark_cf3e89371e45fbda4f08dd95e8d019ccf5ce1bb6_wadl:1">ill </span>hit at /application.wadl you<span class="GRcorrect" grphrase="cf3e89371e45fbda4f08dd95e8d019ccf5ce1bb6" grtype="null" id="GRmark_cf3e89371e45fbda4f08dd95e8d019ccf5ce1bb6_mentioning:2"> will get </span>the XML File, mentioning your resou<span class="GRcorrect" grphrase="bf66e94af02b0a34746e931793b892305f72824c" grtype="null" id="GRmark_bf66e94af02b0a34746e931793b892305f72824c_file:0">rces</span>. I have tested the file consumption by SOAP UI and <span class="GRcorrect" grphrase="ef5a4e11f65e7a44b8668301926f3618c6d7c194" grtype="null" id="GRmark_ef5a4e11f65e7a44b8668301926f3618c6d7c194_i:0">i</span>t all blends well.<br />
<br />
Here i have s<span class="GRcorrect" grphrase="ef5a4e11f65e7a44b8668301926f3618c6d7c194" grtype="null" id="GRmark_ef5a4e11f65e7a44b8668301926f3618c6d7c194_3.1.0.:1">pecifi</span>cally used Spring<span class="GRcorrect" grphrase="ef5a4e11f65e7a44b8668301926f3618c6d7c194" grtype="null" id="GRmark_ef5a4e11f65e7a44b8668301926f3618c6d7c194_i:2"> </span>3.1.0.Release, however i<span class="GRcorrect" grphrase="ef5a4e11f65e7a44b8668301926f3618c6d7c194" grtype="null" id="GRmark_ef5a4e11f65e7a44b8668301926f3618c6d7c194_3.1.1:3"> will</span> suggest to go for 3.1.1Release as it has some nice little improvements.<br />
<br />
At the<span class="GRcorrect" grphrase="98a529856172a177406bc5e572f008d7ac2116f5" grtype="null" id="GRmark_98a529856172a177406bc5e572f008d7ac2116f5_lot:0"> la</span>st, <span class="GRcorrect" grphrase="98a529856172a177406bc5e572f008d7ac2116f5" grtype="null" id="GRmark_98a529856172a177406bc5e572f008d7ac2116f5_tomasz:1">I am t</span>h<span class="GRcorrect" grphrase="98a529856172a177406bc5e572f008d7ac2116f5" grtype="null" id="GRmark_98a529856172a177406bc5e572f008d7ac2116f5_nurkiewicz:2">ankful to </span>lot to <b>tomasz nurkiewicz & Grégory OLIVER</b>, it is only because of their direction and help with code, I am able to do this. So all the appreciation goes t<span class="GRcorrect" grphrase="460ee7bdf4d0ff9e610e9536a4d091a6fafa22b5" grtype="null" id="GRmark_460ee7bdf4d0ff9e610e9536a4d091a6fafa22b5_tomasz:0">o them</span> dire<span class="GRcorrect" grphrase="460ee7bdf4d0ff9e610e9536a4d091a6fafa22b5" grtype="null" id="GRmark_460ee7bdf4d0ff9e610e9536a4d091a6fafa22b5_gregory:1">ctly. T</span>hanks tomasz and gregory.<br />
<br />
here are some of the links, that you may find useful.<br />
<br />
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<a data-mce-href="http://www.w3.org/Submission/wadl/wadl.xsd" href="http://www.w3.org/Submission/wadl/wadl.xsd" style="color: rgb(0, 0, 255) !important;">http://www.w3.org/Submission/wadl/wadl.xsd</a></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<br /></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<a data-mce-href="http://nurkiewicz.blogspot.in/2012/01/gentle-introduction-to-wadl-in-java.html" href="http://nurkiewicz.blogspot.in/2012/01/gentle-introduction-to-wadl-in-java.html" style="color: rgb(0, 0, 255) !important;">http://nurkiewicz.blogspot.in/2012/01/gentle-introduction-to-wadl-in-java.html</a></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<a data-mce-href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" style="color: rgb(0, 0, 255) !important;">http://nurkiewicz.blogspot.in/2012/02/auto<span class="GRcorrect" grphrase="e5ef5ae9f7c1f8017ea598f2b68e3b151f4106bc" grtype="null" id="GRmark_e5ef5ae9f7c1f8017ea598f2b68e3b151f4106bc_l:0">m</span>atically-g<span class="GRcorrect" grphrase="e5ef5ae9f7c1f8017ea598f2b68e3b151f4106bc" grtype="null" id="GRmark_e5ef5ae9f7c1f8017ea598f2b68e3b151f4106bc_.:1">e</span>nerat<span class="GRcorrect" grphrase="9db47bbe99ea07b991b3dd2ff9f88f92e2dcbad1" grtype="null" id="GRmark_9db47bbe99ea07b991b3dd2ff9f88f92e2dcbad1_ere:0">ing</span>-wad</a></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<a data-mce-href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" style="color: rgb(0, 0, 255) !important;"></a></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<a data-mce-href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" style="color: rgb(0, 0, 255) !important;"></a></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<a data-mce-href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" style="color: rgb(0, 0, 255) !important;"></a></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<a data-mce-href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" style="color: rgb(0, 0, 255) !important;"></a></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<a data-mce-href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" style="color: rgb(0, 0, 255) !important;"></a></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<a data-mce-href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" style="color: rgb(0, 0, 255) !important;"></a></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<a data-mce-href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" style="color: rgb(0, 0, 255) !important;"></a></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<a data-mce-href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" style="color: rgb(0, 0, 255) !important;"></a></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<a data-mce-href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" style="color: rgb(0, 0, 255) !important;"></a></div>
<span class="GRcorrect" grphrase="9db47bbe99ea07b991b3dd2ff9f88f92e2dcbad1" grtype="null" id="GRmark_9db47bbe99ea07b991b3dd2ff9f88f92e2dcbad1_Tomasz GitHub url:1"></span><br />
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<span class="GRcorrect" grphrase="9db47bbe99ea07b991b3dd2ff9f88f92e2dcbad1" grtype="null" id="GRmark_9db47bbe99ea07b991b3dd2ff9f88f92e2dcbad1_Tomasz GitHub url:1"><a data-mce-href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" href="http://nurkiewicz.blogspot.in/2012/02/automatically-generating-wadl-in-spring.html" style="color: rgb(0, 0, 255) !important;">l-in-spring.html</a></span></div>
<span class="GRcorrect" grphrase="9db47bbe99ea07b991b3dd2ff9f88f92e2dcbad1" grtype="null" id="GRmark_9db47bbe99ea07b991b3dd2ff9f88f92e2dcbad1_Tomasz GitHub url:1">
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
</div>
</span><br />
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
</div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
</div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
</div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
</div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
</div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
</div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
</div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
</div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
</div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
Here is Tomasz GitHub url for this project : <a href="https://github.com/nurkiewicz/spring-rest-wadl" style="background-color: white; text-align: left;">https://github.com/nurkiewicz/spring-rest-wadl</a></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
Hope, it helps the deve<span class="GRcorrect" grphrase="00e57f055f5f6bafe5e731156c2caff616481aef" grtype="null" id="GRmark_00e57f055f5f6bafe5e731156c2caff616481aef_time:0">lope</span>r community. </div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
If get time<span class="GRcorrect" grphrase="00e57f055f5f6bafe5e731156c2caff616481aef" grtype="null" id="GRmark_00e57f055f5f6bafe5e731156c2caff616481aef_i:1">,</span> or if there is a need <span class="GRcorrect" grphrase="00e57f055f5f6bafe5e731156c2caff616481aef" grtype="null" id="GRmark_00e57f055f5f6bafe5e731156c2caff616481aef_pom:2">i w</span>ill upload the maven pom for this project. </div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
<br /></div>
<div style="font-family: arial, helvetica, sans-serif; font-size: 12px; height: auto !important; line-height: 20px; overflow: visible; padding: 0px; text-align: -webkit-auto; width: auto !important;">
Thanks. </div>
<br />
<br />
<br />
<br /></div>
</div>panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com4tag:blogger.com,1999:blog-8289284958963644142.post-71112064475862623782012-05-15T10:31:00.000-07:002012-05-15T10:31:01.999-07:00Spring MVC - REST ( JSON/XML) - Configuration<div dir="ltr" style="text-align: left;" trbidi="on">
<link href="http://alexgorbatchev.com/pub/sh/2.1.364/styles/shCore.css" rel="stylesheet" type="text/css"></link>
<link href="http://alexgorbatchev.com/pub/sh/2.1.364/styles/shThemeDefault.css" rel="stylesheet" type="text/css"></link>
<script src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shCore.js" type="text/javascript">
</script>
<script src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushCss.js" type="text/javascript">
</script>
<script src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushJava.js" type="text/javascript">
</script>
<script src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushPython.js" type="text/javascript">
</script>
<script src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushSql.js" type="text/javascript">
</script>
<script src="http://alexgorbatchev.com/pub/sh/2.1.364/scripts/shBrushXml.js" type="text/javascript">
</script>
<script language="javascript">
SyntaxHighlighter.config.bloggerMode = true;
SyntaxHighlighter.config.clipboardSwf = 'http://alexgorbatchev.com/pub/sh/2.1.364/scripts/clipboard.swf';
SyntaxHighlighter.all();
</script>
<br />
<div dir="ltr" style="text-align: left;" trbidi="on">
<br />This post is <span class="GRcorrect" grphrase="e28157219b4b06144bf3f2963cfe1ab411edfdbf" grtype="null" id="GRmark_e28157219b4b06144bf3f2963cfe1ab411edfdbf_an:0">an</span> compilation of the problems that <span class="GRcorrect" grphrase="e28157219b4b06144bf3f2963cfe1ab411edfdbf" grtype="null" id="GRmark_e28157219b4b06144bf3f2963cfe1ab411edfdbf_i:1">i</span> have faced while configuring <span class="GRcorrect" grphrase="e28157219b4b06144bf3f2963cfe1ab411edfdbf" grtype="null" id="GRmark_e28157219b4b06144bf3f2963cfe1ab411edfdbf_an:2">an</span> Spring MVC Application that will <span class="GRcorrect" grphrase="e28157219b4b06144bf3f2963cfe1ab411edfdbf" grtype="null" id="GRmark_e28157219b4b06144bf3f2963cfe1ab411edfdbf_acts:3">acts</span> as an API server providing all the services in <span class="GRcorrect" grphrase="e28157219b4b06144bf3f2963cfe1ab411edfdbf" grtype="null" id="GRmark_e28157219b4b06144bf3f2963cfe1ab411edfdbf_an:4">an</span> REST based manner.<br />
It is <span class="GRcorrect" grphrase="718b0a1c1dd6663f40910df4193892706d282482" grtype="null" id="GRmark_718b0a1c1dd6663f40910df4193892706d282482_an:0">an</span> simple task to configure the whole environment and to make services available. However <span class="GRcorrect" grphrase="93e9c48e1081f2c73c290284b6d9fbca7a88fafb" grtype="null" id="GRmark_93e9c48e1081f2c73c290284b6d9fbca7a88fafb_i:0">i</span> have faced the following set of problems, which are little different in nature-><br />
<br />
<ol style="text-align: left;">
<li>Use JAXB annotations for the keys of the JSON that is being returned from the server (by default the JACKSON processor will take the variables names and will associate them as the keys in the returned JSON.</li>
<li>Use same keys (<span class="GRcorrect" grphrase="3891af9195bd0564f9d0f54be211a0c9ab53dd01" grtype="null" id="GRmark_3891af9195bd0564f9d0f54be211a0c9ab53dd01_json:0">in <span class="GRcorrect" grphrase="3891af9195bd0564f9d0f54be211a0c9ab53dd01" grtype="null" id="GRmark_3891af9195bd0564f9d0f54be211a0c9ab53dd01_json:0">j</span></span><span class="GRcorrect" grphrase="3891af9195bd0564f9d0f54be211a0c9ab53dd01" grtype="null" id="GRmark_3891af9195bd0564f9d0f54be211a0c9ab53dd01_json:0">son</span>) / tags (in xml) to receive the request (in POST/PUT).</li>
<li>Apply Hibernate Validator by making use of Spring validation.</li>
</ol>
<div>
Guys at <span class="GRcorrect" grphrase="9c729293ab7ef54d8dbe540a95d55f5c895a74a3" grtype="null" id="GRmark_9c729293ab7ef54d8dbe540a95d55f5c895a74a3_VMWare:0">VMW</span><span class="GRcorrect" grphrase="9c729293ab7ef54d8dbe540a95d55f5c895a74a3" grtype="null" id="GRmark_9c729293ab7ef54d8dbe540a95d55f5c895a74a3_VMWare:0">are</span> spring has done a fabulous <span class="GRcorrect" grphrase="9c729293ab7ef54d8dbe540a95d55f5c895a74a3" grtype="null" id="GRmark_9c729293ab7ef54d8dbe540a95d55f5c895a74a3_jobs:1">j</span><span class="GRcorrect" grphrase="9c729293ab7ef54d8dbe540a95d55f5c895a74a3" grtype="null" id="GRmark_9c729293ab7ef54d8dbe540a95d55f5c895a74a3_jobs:1">obs</span> and all of the above mentioned requirements will be collated into a single line of XML that you need to <span class="GRcorrect" grphrase="9c729293ab7ef54d8dbe540a95d55f5c895a74a3" grtype="null" id="GRmark_9c729293ab7ef54d8dbe540a95d55f5c895a74a3_declared:2">decla</span><span class="GRcorrect" grphrase="9c729293ab7ef54d8dbe540a95d55f5c895a74a3" grtype="null" id="GRmark_9c729293ab7ef54d8dbe540a95d55f5c895a74a3_declared:2">red</span> in your dispatcher-servlet<span class="GRcorrect" grphrase="9c729293ab7ef54d8dbe540a95d55f5c895a74a3" grtype="null" id="GRmark_9c729293ab7ef54d8dbe540a95d55f5c895a74a3_.:3">.</span>xml (or any of the other spring application context file you are importing to build your app context</div>
<div>
).</div>
<div>
<b>&</b></div>
<div>
<b><span class="GRspelling">lt;</span><span class="GRcorrect" grphrase="1f0bacde736b7f20439e74710140322e244e40c8" grtype="null" id="GRmark_1f0bacde736b7f20439e74710140322e244e40c8_mvc:0">mvc</span><span class="GRcorrect" grphrase="1f0bacde736b7f20439e74710140322e244e40c8" grtype="null" id="GRmark_1f0bacde736b7f20439e74710140322e244e40c8_::1">:</span>annotation-driven/></b></div>
<div>
This line does a number of things</div>
<div>
<ol style="text-align: left;">
<li>Automatically add all types of interceptors like XML Based interceptors, String, Form based interceptors.</li>
<li>Will provide automatic marshalling of your response/value object in XML/JSON</li>
<li>Will provide the validation of your request VO, if you have enabled the @ExceptionHandler annotation on some method in your controller.</li>
</ol>
<div>
The problem<span class="GRcorrect" grphrase="eb4e88d616513d694b60231f2fdaa21180489ba4" grtype="null" id="GRmark_eb4e88d616513d694b60231f2fdaa21180489ba4_i:0"> </span>that <span class="GRcorrect" grphrase="eb4e88d616513d694b60231f2fdaa21180489ba4" grtype="null" id="GRmark_eb4e88d616513d694b60231f2fdaa21180489ba4_i:0">i</span> had faced is<span class="GRcorrect" grphrase="eb4e88d616513d694b60231f2fdaa21180489ba4" grtype="null" id="GRmark_eb4e88d616513d694b60231f2fdaa21180489ba4_i:1"> </span>that <span class="GRcorrect" grphrase="eb4e88d616513d694b60231f2fdaa21180489ba4" grtype="null" id="GRmark_eb4e88d616513d694b60231f2fdaa21180489ba4_i:1">i</span> could not be able to use my JAXB annotations as the KEYS in my request/response, because<span class="GRcorrect" grphrase="eb4e88d616513d694b60231f2fdaa21180489ba4" grtype="null" id="GRmark_eb4e88d616513d694b60231f2fdaa21180489ba4_i:2"> </span>when <span class="GRcorrect" grphrase="eb4e88d616513d694b60231f2fdaa21180489ba4" grtype="null" id="GRmark_eb4e88d616513d694b60231f2fdaa21180489ba4_i:2">i</span> declared a different Jackson processor and added it to the AnnotationHandlerAdapter provided by spring, it is being ignored brutally by Spring under the wraps. And the one defined by the <<span class="GRcorrect" grphrase="7fb893797565bb940f880a726f3c4a1754fa2404" grtype="null" id="GRmark_7fb893797565bb940f880a726f3c4a1754fa2404_mvc:0">mvc</span><span class="GRcorrect" grphrase="7fb893797565bb940f880a726f3c4a1754fa2404" grtype="null" id="GRmark_7fb893797565bb940f880a726f3c4a1754fa2404_::1">:</span>annotation-driven/> one will take priority. As soon as <span class="GRcorrect" grphrase="99294867657955577f83276f0ed986b8af4fc4d7" grtype="null" id="GRmark_99294867657955577f83276f0ed986b8af4fc4d7_the:0">the</span> remove this annotation to make my<span class="GRspelling"> JSO</span>N (with <span class="GRcorrect" grphrase="99294867657955577f83276f0ed986b8af4fc4d7" grtype="null" id="GRmark_99294867657955577f83276f0ed986b8af4fc4d7_jaxb:1">jaxb</span> annotations you required another library JACKSON-XC<span class="GRcorrect" grphrase="99294867657955577f83276f0ed986b8af4fc4d7" grtype="null" id="GRmark_99294867657955577f83276f0ed986b8af4fc4d7_.:2">.</span>jar) the validation thing ceases to <span class="GRcorrect" grphrase="99294867657955577f83276f0ed986b8af4fc4d7" grtype="null" id="GRmark_99294867657955577f83276f0ed986b8af4fc4d7_stopped:3">stopped</span>. This all for<span class="GRcorrect" grphrase="dfef1bef3707f1d827fe326c39f5987dedc0a52d" grtype="null" id="GRmark_dfef1bef3707f1d827fe326c39f5987dedc0a52d_onto:0">ces </span>me to<span class="GRcorrect" grphrase="dfef1bef3707f1d827fe326c39f5987dedc0a52d" grtype="null" id="GRmark_dfef1bef3707f1d827fe326c39f5987dedc0a52d_varous:1"> look </span><span class="GRcorrect" grphrase="dfef1bef3707f1d827fe326c39f5987dedc0a52d" grtype="null" id="GRmark_dfef1bef3707f1d827fe326c39f5987dedc0a52d_onto:0">onto</span> the <span class="GRcorrect" grphrase="dfef1bef3707f1d827fe326c39f5987dedc0a52d" grtype="null" id="GRmark_dfef1bef3707f1d827fe326c39f5987dedc0a52d_varous:1">varous</span> JIRA bugs raised against this annotation <span class="GRcorrect" grphrase="dfef1bef3707f1d827fe326c39f5987dedc0a52d" grtype="null" id="GRmark_dfef1bef3707f1d827fe326c39f5987dedc0a52d_i:2">a</span>nd finally <span class="GRcorrect" grphrase="dfef1bef3707f1d827fe326c39f5987dedc0a52d" grtype="null" id="GRmark_dfef1bef3707f1d827fe326c39f5987dedc0a52d_i:2">i</span> will be able to solve the problem with the help of Spr<span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_::0">i</span>ng 3.1.</div>
</div>
<div>
<br /></div>
<div>
Note<span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_::0">:</span>- In case you are using<span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:1"> sp</span>ring 3.0 <span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:1">jar</span>, please replace them with<span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"> Sp</span>ring 3.1 <span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_3.1.:3"><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_3.1.:3"><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2"></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_3.1.:3"><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2">j</span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_jar:2">ar</span> </span></span></span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_xsd:4">and</span> use <span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_3.1.:3">3.1.</span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_xsd:4">xsd</span> everywhere in your application context xml files (because the configuration which is represented below will only work it the XSD of 3.1 is being used as 3.0 does not allow any attribute and sub-element <span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_mvc:5">wit</span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_::6">h</span>in the <<span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_mvc:5">mvc</span><span class="GRcorrect" grphrase="712ef97a63058d832a219ffa13dae7710fc0588e" grtype="null" id="GRmark_712ef97a63058d832a219ffa13dae7710fc0588e_::6">:</span>annotation-driven/> option.</div>
<div>
Following is the configuration which will allow use to solve the above three problems.</div>
<div>
(Please make sure before running the code you must have all the bindings and jar files available in your classpath, Here is a brief listing of those.<br />
-> For Validation: Hibernate-validator 4.2.0.Final.jar, javax.validation.api (JSR 303)<br />
-> For Jackson : Jackson-core.jar, jackson-mapper-asl.jar, jacakson-xc.1.7.5.jar<br />
-> For JaxB -> Jaxb API and Impl . jar<br />
<br />
Configuration code:<br />
<div>
<pre class="brush: xml; highlight: [5, 15]"><beans xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:oxm="http://www.springframework.org/schema/oxm" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xsi:schemalocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
http://www.springframework.org/schema/oxm http://www.springframework.org/schema/oxm/spring-oxm-3.1.xsd">
<bean class="org.codehaus.jackson.xc.JaxbAnnotationIntrospector" id="jaxbAnnotationInspector">
<bean class="org.codehaus.jackson.map.ObjectMapper" id="jacksonObjectMapper">
<property name="serializationConfig.annotationIntrospector" ref="jaxbAnnotationInspector">
<property name="deserializationConfig.annotationIntrospector" ref="jaxbAnnotationInspector">
</property></property></bean>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller" id="jaxb2Marshaller">
<property name="classesToBeBound">
<list>
<value>com.mycompany..CreateEmployeeRequestVO</value>
<value>com.mycompany..CreateEmployeeResponseVO</value>
</list>
</property>
</bean>
<bean class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean" id="validator">
<bean class="org.springframework.format.support.FormattingConversionServiceFactoryBean" id="conversionservice">
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.xml.MarshallingHttpMessageConverter">
<property name="marshaller" ref="jaxb2Marshaller">
<property name="unmarshaller" ref="jaxb2Marshaller">
<property name="supportedMediaTypes">
<list>
<bean class="org.springframework.http.MediaType">
<constructor-arg index="0" value="application"></constructor-arg>
<constructor-arg index="1" value="xml"></constructor-arg>
<constructor-arg index="2" value="UTF-8">
</constructor-arg></bean>
</list>
</property>
</property></property></bean>
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper" ref="jacksonObjectMapper">
<property name="supportedMediaTypes">
<list>
<bean class="org.springframework.http.MediaType">
<constructor-arg index="0" value="application"></constructor-arg>
<constructor-arg index="1" value="json"></constructor-arg>
<constructor-arg index="2" value="UTF-8"></constructor-arg>
</bean>
</list>
</property>
</property></bean>
</mvc:message-converters>
</mvc:annotation-driven>
</bean></bean></bean></beans>
</pre>
</div>
NOTE: Please note that in above xml the last line has only one </beans> and nothing else. The three </bean> is being printed wrongly by the javascript library, i am using.<br />
<br />
Here is the description of the components of XML file<br />
<br />
<ul style="text-align: left;">
<li>Line 1-5 simply declares the XML namespaces and the various XSD files we are going to use.</li>
<li>Line 10-15 will register the JAXB Annotation Introspecter and associate itself with the ObjectMapper of the jackson library. (Many of the blogs will show directly mapping this to annotationIntrospector property of the objectmapper, but it has been changed, with the introduction of new API, now the annotationIntrospector is present in the serializationConfig and deserializationConfig object of the Object Mapper). This is the key to use JAXB annotations in the JSON Processing.</li>
<li>Line 18-27 registers the JAXB2 Marshaller taken from the OXM Library. here we can register the varous classes that we have to use either for taking the input or in generating the output i.e. RequestValueObject and ResponseValueObject. However, i found that there is no way through which you can give directly a packagename or a list of packages. The Other option that we have is to use eitehr the contextPath property or the jaxb.index thing.</li>
<li>LIne 31-32 will intialize the Spring Validator and the conversion service factory bean, which will automatically going to use the hibernate validator present on the classpath. The advantage of using hibernate validator is that the availablity of extra custom annotations like NotEmpty etc. It provides an way through which we can remove the annotations from our value objeect and place at in an XML file and at run time, the validator picks that file to perform the listed constraints on the various attributes of the request Value object.</li>
<li>Line 34-62 is the meat of the whole subject and contains all the necesseary plumbing to make the things work. (Note: for this t<span class="GRspelling">o w</span>ork we mu<span class="GRspelling">st </span>have to include Spring 3.1 xsd otherwise Spring will throw an error that no element or att<span class="GRspelling">rib</span>ute will be alloweed with <mvc:annotation-driven>). IT does two things:</mvc:annotation-driven></li>
<ul>
<li>Registeres the custom XML marshaller converter with the automatically registered AnnotationHandlerAdapter by replacing the existing default converter.</li>
<li>Registers the custom JSON mapping converter, where we are using new created jacksonObjectMapper rather then the one which is avaiable by default. This also will displace the default registered converter with AnnotationHandlerAdapter with this one.</li>
</ul>
</ul>
<div>
And that's all. Voila.. all of our test cases are running and our JSON/XML are being generated/consumed properly. In order to achieve this, i had taken help from various links, which i had mentioned below. And at last thanks to Juergen Holler and the team for the clear explanation on the JIRA.<br />
<br />
<a href="https://jira.springsource.org/browse/SPR-6306">https://jira.springsource.org/browse/SPR-6306</a><br />
<a href="https://jira.springsource.org/browse/SPR-7504">https://jira.springsource.org/browse/SPR-7504</a><br />
<a href="https://jira.springsource.org/browse/SPR-7967">https://jira.springsource.org/browse/SPR-7967</a><br />
<a href="https://jira.springsource.org/browse/SPR-6817">https://jira.springsource.org/browse/SPR-6817</a><br />
<a href="https://jira.springsource.org/browse/SPR-6524">https://jira.springsource.org/browse/SPR-6524</a>
<br />
<br />
<a href="http://www.aviyehuda.com/2010/04/using-hibernate-validator-to-cover-your-validation-needs/">http://www.aviyehuda.com/2010/04/using-hibernate-validator-to-cover-your-validation-needs/</a>
<br />
<a href="http://java.dzone.com/articles/using-hibernate-validator">http://java.dzone.com/articles/using-hibernate-validator</a>
<br />
<a href="http://stackoverflow.com/questions/8679122/custom-httpmessageconverters-does-not-take-precedence-for-string-objects-in-spri">http://stackoverflow.com/questions/8679122/custom-httpmessageconverters-does-not-take-precedence-for-string-objects-in-spri</a><br />
<a href="http://stackoverflow.com/questions/7199652/mvcannotation-driven-with-un-annotated-controllers">http://stackoverflow.com/questions/7199652/mvcannotation-driven-with-un-annotated-controllers</a><br />
<a href="http://forum.springsource.org/showthread.php?106594-complete-XML-for-mimicing-annotation-driven">http://forum.springsource.org/showthread.php?106594-complete-XML-for-mimicing-annotation-driven</a><br />
<a href="http://stackoverflow.com/questions/6177913/configuring-the-jacksonobjectmapper-not-working-in-spring-mvc-3">http://stackoverflow.com/questions/6177913/configuring-the-jacksonobjectmapper-not-working-in-spring-mvc-3</a><br />
<a href="http://scottfrederick.blogspot.in/2011/03/customizing-spring-3-mvcannotation.html">http://scottfrederick.blogspot.in/2011/03/customizing-spring-3-mvcannotation.html</a><br />
<a href="http://stackoverflow.com/questions/3693397/howto-get-rid-of-mvcannotation-driven">http://stackoverflow.com/questions/3693397/howto-get-rid-of-mvcannotation-driven</a><br />
<a href="http://forum.springsource.org/showthread.php?101450-lt-mvc-annotation-driven-gt-issues">http://forum.springsource.org/showthread.php?101450-lt-mvc-annotation-driven-gt-issues</a><br />
<br />
I hope, it will prove useful for the developer community.<br />
<br />
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
</div>
</div>panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com1tag:blogger.com,1999:blog-8289284958963644142.post-11722771933045966512011-07-28T06:45:00.000-07:002011-07-28T06:45:32.821-07:00MySql - ( Tomcat, Spring, C3P0) - Communication Link Failure Error & Explanation<div dir="ltr" style="text-align: left;" trbidi="on"><span style="font-family: Calibri, sans-serif; font-size: 11pt;">This blog explains the famous mysql “communication Link Failure” error, and provide the working example of the code that works finally. The blog post is just a result of the all ideas & findings that I went through while looking the cause for this error on blogosphere and documentation. I have applied many techniques that are being mentioned, however none of the approach works finally and some R&D has resulted in the successfully behavior, as required.</span><br />
<span style="font-family: Calibri, sans-serif; font-size: 11pt;"></span><br />
<div class="MsoNormal"><b style="mso-bidi-font-weight: normal;">Environment & Softwares:</b><br />
Windows XP, Apache Tomcat 6.0.32, Spring 3.0.3, Hibernate 3.5, C3p0-0.9.11, MySql 5<br />
<b> Error: </b><br />
<i> Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure</i></div><div class="MsoNormal"><i>Last packet sent to the server was 0 ms ago.</i></div><div class="MsoNormal"><i><br />
</i></div><div class="MsoNormal"><b style="font-style: italic;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;">Reason:</span></b><span style="font-family: Calibri, sans-serif; font-size: 11pt;"> The error comes because the connections in our connection pool goes stale and mysql removes the connection also from his own internal pool through a thread which get invokes after WAIT_TIMEOUT as being configured in the MySQL Server.</span></div><div class="MsoNormal"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><br />
</span></div><div class="MsoNormal"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><b style="mso-bidi-font-weight: normal;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;">Example:</span></b><span style="font-family: Calibri, sans-serif; font-size: 11pt;"> Suppose our web based application is being configured to take a fixed number of connections from the database at the start of the application, however as we progress through time and reached a limit where a connection in the pool has not been used more than WAIT TIMEOUT configured in the mysql server. If we hit any SQL/HQL statement through that pool, we are going to get the above error with a message “Last packet was sent to the server was x ms ago”.</span></span></div><div class="MsoNormal"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><br />
</span></span></div><div class="MsoNormal"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"></span></span></div><div class="MsoNormal"><b style="mso-bidi-font-weight: normal;">Properties involed: </b>Solution of the above problem will involve only three properties one on mysql side and two on the coding side (configured through application-dao.xml).</div><div class="MsoNormal"><br />
<b style="mso-bidi-font-weight: normal;">WAIT_TIMOUT</b> (on mysql side, this can easily be configured through the mysql administrator and should be around 10 minutes, by default the value is 28800 which is very high, because the stale connection can remain in mysql pool for 8 hours). For Testing I reduced it to 30 seconds.<br />
<b style="mso-bidi-font-weight: normal;">IDLECONNECTIONTESTPERIOD:</b> This property of C3p0 specifies the after how much time the library should check for the validity of the connection in connection pool. This should be set less then the wait_timeout period configured above. For testing I set it to 20 seconds<br />
<b style="mso-bidi-font-weight: normal;">MAXIDLETIME: </b>This C3p0 property signifies how long an idle connection can remain in the pool. For testing I set it to 25 seconds.</div><div class="MsoNormal"><br />
</div><div class="MsoNormal"></div><div class="MsoNormal"><b style="mso-bidi-font-weight: normal;">NOTE:</b> we always have to remember that the value of idleTestConnectionTestPeriod should be less then that of maxIdleTime and the value of both of these properties should be less than that of wait_timeout as being configured on the DB server.</div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><span style="font-family: Calibri, sans-serif; font-size: 11pt;">However, while configuring the datasource (C3P0 datasource) through the spring property files, we have to make sure, that we are setting these properties in C3p0 datasource and not in the session factory. The reason is plain simple unless you are using hibernate-c3p0 (check out for correct version of C3p0 for a specific Hibernate version) Provider, it is not going to work. For this you need to set the following property in the session factory “properties” attribute. <br />
</span><span class="pln"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10.5pt; padding-bottom: 0in; padding-left: 0in; padding-right: 0in; padding-top: 0in;">hibernate</span></span><span class="pun"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10.5pt; padding-bottom: 0in; padding-left: 0in; padding-right: 0in; padding-top: 0in;">.</span></span><span class="pln"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10.5pt; padding-bottom: 0in; padding-left: 0in; padding-right: 0in; padding-top: 0in;">connection</span></span><span class="pun"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10.5pt; padding-bottom: 0in; padding-left: 0in; padding-right: 0in; padding-top: 0in;">.</span></span><span class="pln"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10.5pt; padding-bottom: 0in; padding-left: 0in; padding-right: 0in; padding-top: 0in;">provider_class </span></span><span class="pun"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10.5pt; padding-bottom: 0in; padding-left: 0in; padding-right: 0in; padding-top: 0in;">=</span></span><span class="pln"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10.5pt; padding-bottom: 0in; padding-left: 0in; padding-right: 0in; padding-top: 0in;"> org</span></span><span class="pun"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10.5pt; padding-bottom: 0in; padding-left: 0in; padding-right: 0in; padding-top: 0in;">.</span></span><span class="pln"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10.5pt; padding-bottom: 0in; padding-left: 0in; padding-right: 0in; padding-top: 0in;">hibernate</span></span><span class="pun"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10.5pt; padding-bottom: 0in; padding-left: 0in; padding-right: 0in; padding-top: 0in;">.</span></span><span class="pln"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10.5pt; padding-bottom: 0in; padding-left: 0in; padding-right: 0in; padding-top: 0in;">connection</span></span><span class="pun"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10.5pt; padding-bottom: 0in; padding-left: 0in; padding-right: 0in; padding-top: 0in;">.</span></span><span class="pln"><span style="border-bottom-color: windowtext; border-bottom-style: none; border-bottom-width: 1pt; border-left-color: windowtext; border-left-style: none; border-left-width: 1pt; border-right-color: windowtext; border-right-style: none; border-right-width: 1pt; border-top-color: windowtext; border-top-style: none; border-top-width: 1pt; color: black; font-family: Consolas; font-size: 10.5pt; padding-bottom: 0in; padding-left: 0in; padding-right: 0in; padding-top: 0in;">C3P0ConnectionProvider<br />
</span></span><span style="font-family: Calibri, sans-serif; font-size: 11pt;">I tried to set this provider, however hibernate is not picking this up and still the internal Spring/Hibernate connection provider is being used instead of C3p0 provider. So have to drop this.<br style="mso-special-character: line-break;" /> <br style="mso-special-character: line-break;" /> </span></div><div class="MsoNormal"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><b><u>here is the final datasource configuration:</u></b></span></span></div><div><pre class="brush: xml; highlight: [5, 15]"><beans:bean class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" id="dataSource">
<beans:property name="driverClass">
<beans:value>com.mysql.jdbc.Driver</beans:value>
</beans:property>
<beans:property name="jdbcUrl">
<beans:value>jdbc:mysql://192.168.1.1:3306/testDB?autoReconnect=true</beans:value>
</beans:property>
<beans:property name="properties">
<beans:props>
<beans:prop key="user">root</beans:prop>
<beans:prop key="password">mysqlpassword</beans:prop>
</beans:props>
</beans:property>
<beans:property name="idleConnectionTestPeriod">
<beans:value>20</beans:value>
</beans:property>
<beans:property name="maxIdleTime">
<beans:value>25</beans:value>
</beans:property>
</beans:bean>
</pre></div><br />
<span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">In session factory you can set a number of attributes and verify whether these are being set or not by just going through the JConsole ( actually this solves my error, since I can check whether the properties are actually being set or not, in my case previously I am setting them in sessionFactory and assuming they will be used, however jConsole tell me that the ComboPooldataSource properties are not the same one as I specified in the xml file, that prompt me to set them in the ComboPooldataSource instead of specifying in the sessionFactory)</span><br />
<span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;"><br />
</span><br />
<span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">Here is the Configuration for hibernate SessionFactory:</span><br />
<br />
<pre class="brush: xml; highlight: [5, 15]">
<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <beans:property name="dataSource">
<beans:ref local="dataSource" />
</beans:property>
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.dialect"> org.hibernate.dialect.MySQL5InnoDBDialect</beans:prop>
<beans:prop key="hibernate.show_sql">true</beans:prop>
<!-- Configuring the C3P0 properties for the Connection Pooling -->
<beans:prop key="hibernate.c3p0.min_size">10</beans:prop>
<beans:prop key="hibernate.c3p0.max_size">20</beans:prop>
<beans:prop key="hibernate.c3p0.idle_test_period">20</beans:prop>
<beans:prop key="hibernate.c3p0.timeout">25</beans:prop>
<beans:prop key="hibernate.c3p0.max_statements">10</beans:prop>
<beans:prop key="hibernate.c3p0.acquire_increment">2</beans:prop>
<beans:prop key="hibernate.c3p0.validate">true</beans:prop> <!-- THis is an Important Part -, Do not keep it, it’s a Risky and time Consuming operation-->
<beans:prop key="hibernate.c3p0.preferredTestQuery">select 1;</beans:prop>
</beans:props>
</beans:property>
</beans:bean>
</pre><br />
<br />
<div class="MsoNormal"><b style="mso-bidi-font-weight: normal;">Test results:</b> so finally when I set the above properties (remember properties defined in sessionFactory does not work for me because I don’t have the extra jar hibernate-c3p0.jar of 6KB and using it does not worked also). <br />
<b> Wait_timeout:</b> 30<br />
<b> idleConnectionTestPeriod</b>: 20<br />
<b> maxIdleTime:</b> 25</div><div class="MsoNormal">If I hit the database now after a period of 30 seconds I never got the error “Communication Failure” because internally C3p0 verifies the validity of every connection in 20 seconds & if a connection lies unused or unchecked ie. Remain idle for 25 seconds, it will die out automatically. Thus I got my problem solved finally. </div><span style="font-family: Calibri, sans-serif; font-size: 11pt;">If you have to use the set of attributes in session factory instead of defining like this in ComboPoolDataSource please see the documentation of C3P0 and the associate hibernate property. Make sure you are associating every c3p0 property with “<b style="mso-bidi-font-weight: normal;">connection”</b> or “<b style="mso-bidi-font-weight: normal;">hibernate”</b></span><span style="font-family: Calibri, sans-serif; font-size: 11pt;"> keywords as per the documentation, else see the JConsole to check whether you are able to set the property or not.<br style="mso-special-character: line-break;" /> <br style="mso-special-character: line-break;" /> </span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/-gZGJPHNxtpk/TjFgqjUdpII/AAAAAAAADcs/Ae18EAcGnyk/s1600/abc.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="252" src="http://2.bp.blogspot.com/-gZGJPHNxtpk/TjFgqjUdpII/AAAAAAAADcs/Ae18EAcGnyk/s320/abc.JPG" width="320" /></a></div><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><br />
</span><br />
<span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;">Here is a list of blogs that proved useful while searching for the solution of the problem and different things worked for different geeks.</span></span><br />
<span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><br />
</span></span><br />
<span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"></span></span><br />
<div class="MsoNormal"><a href="http://hibernatedb.blogspot.com/2009/05/c3p0properties.html"><b><span style="font-family: Arial, sans-serif; font-size: 10pt;">http://hibernatedb.blogspot.com/2009/05/c3p0properties.html</span></b></a><b><span style="font-family: Arial, sans-serif; font-size: 10pt;"><o:p></o:p></span></b></div><div class="MsoNormal"><a href="http://amemon.wordpress.com/2007/07/15/monitoring-c3p0-using-jmxjconsole/"><b><span style="font-family: Arial, sans-serif; font-size: 10pt;">http://amemon.wordpress.com/2007/07/15/monitoring-c3p0-using-jmxjconsole/</span></b></a><b><span style="font-family: Arial, sans-serif; font-size: 10pt;"><o:p></o:p></span></b></div><div class="MsoNormal"><a href="http://stackoverflow.com/questions/4104125/how-to-monitor-c3p0-connections"><b><span style="font-family: Arial, sans-serif; font-size: 10pt;">http://stackoverflow.com/questions/4104125/how-to-monitor-c3p0-connections</span></b></a><b><span style="font-family: Arial, sans-serif; font-size: 10pt;"><o:p></o:p></span></b></div><div class="MsoNormal"><a href="http://www.mchange.com/projects/c3p0/index.html#timeout"><b><span style="font-family: Arial, sans-serif; font-size: 10pt;">http://www.mchange.com/projects/c3p0/index.html#timeout</span></b></a><b><span style="font-family: Arial, sans-serif; font-size: 10pt;"><o:p></o:p></span></b></div><div class="MsoNormal"><a href="http://www.mchange.com/projects/c3p0/index.html#idleConnectionTestPeriod"><b><span style="font-family: Arial, sans-serif; font-size: 10pt;">http://www.mchange.com/projects/c3p0/index.html#idleConnectionTestPeriod</span></b></a><b><span style="font-family: Arial, sans-serif; font-size: 10pt;"><o:p></o:p></span></b></div><div class="MsoNormal"><a href="http://www.codefin.net/2007/05/hibernate-and-mysql-connection-timeouts.html"><b><span style="font-family: Arial, sans-serif; font-size: 10pt;">http://www.codefin.net/2007/05/hibernate-and-mysql-connection-timeouts.html</span></b></a><b><span style="font-family: Arial, sans-serif; font-size: 10pt;"><o:p></o:p></span></b></div><div class="MsoNormal"><b><span style="font-family: Arial, sans-serif; font-size: 10pt;"><a href="http://www.mchange.com/projects/c3p0/#hibernate-specific">http://www.mchange.com/projects/c3p0/#hibernate-specific</a> </span></b><b><span style="font-family: Arial, sans-serif; font-size: 10pt;"><o:p></o:p></span></b></div><br />
</div>panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com1tag:blogger.com,1999:blog-8289284958963644142.post-37660475678833226032011-07-05T21:32:00.000-07:002011-07-05T21:32:20.701-07:00NetBeans SpringMVC (REST) Project Junit testing: Errors & Resolutions<div dir="ltr" style="text-align: left;" trbidi="on"><div dir="ltr" style="text-align: left;" trbidi="on"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">This blog is a consolidated view of the problems that are being faced while executing JUNIT based test cases for a <span style="mso-spacerun: yes;"> </span>Spring MVC based web project in Netbeans.</span></span><br />
<span style="font-family: Calibri, sans-serif; font-size: 11pt;">The project environment is:<br />
1. NetBeans 6.9<br />
2. JDK 6u13<br />
3. Tomcat 6.0.32<br />
4. Windows XP</span><br />
<span style="font-family: Calibri, sans-serif; font-size: 11pt;"><br />
</span><br />
<span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><b>Problems faced while executing Junit test cases:</b><br />
<span style="font-family: Calibri, sans-serif; font-size: 11pt;">1. Memory problems while executing test cases<br />
2. A number of properties are being exposed with the help of catalina.properties like the proxy username and password need not to be hardcoded in the applicationcontext files & a number of different properties files (like cache.properties, dbdetails.properties)</span></span></span><br />
<span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><br />
</span></span></span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-svKRwih1f0M/ThPity-pABI/AAAAAAAADbc/y6n2Usc4ZBw/s1600/pkg_str.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-svKRwih1f0M/ThPity-pABI/AAAAAAAADbc/y6n2Usc4ZBw/s1600/pkg_str.JPG" /></a><a href="http://3.bp.blogspot.com/-svKRwih1f0M/ThPity-pABI/AAAAAAAADbc/y6n2Usc4ZBw/s1600/pkg_str.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br />
</a></div><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">The test package "Test Packages" contains all the Junit test cases. </span><br />
<span class="Apple-style-span" style="font-family: Calibri, sans-serif;"><span class="Apple-style-span" style="font-size: 15px;"><br />
</span></span><br />
<span class="Apple-style-span" style="font-family: Calibri, sans-serif;"><span class="Apple-style-span" style="font-size: 15px;"><br />
</span></span><br />
<span class="Apple-style-span" style="font-family: Calibri, sans-serif;"><span class="Apple-style-span" style="font-size: 15px;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;">An Example of a single test case is</span></span></span></div><pre class="brush: java; highlight: [5, 15]">@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(
{
"classpath*:/web/WEB-INF/applicationContext.xml",
"classpath*:/web/WEB-INF/dispatcher-servlet.xml"
})
public class DaoTest {
// JUNIT Specific Code
}
</pre><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Since our project requires a number of properties file that are being configured through catalina.properties like logback configuration file path, dbdetails properties file path etc. (since we are loading all the properties defined in all of these properties file through Spring PropertyPlaceHolderConfigurer) which is provided automatically at runtime while running the application under TOMCAT, here the challenge is to provide all those properties through an external medium to the spring junit runner, so that the Spring application context is being initialized successfully.</span><br />
<span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><br />
</span><br />
<span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><b>For This Go to NetBeans menu: </b></span></span><br />
<span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;">a. Tools -> Options -> ANT Tab<br />
b. Look for the properties at the bottom of the window.</span></span></span><br />
<span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><br />
</span></span></span><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/-10top0PjHV8/ThPj9oS1SHI/AAAAAAAADbg/Fv51jqJigHw/s1600/properties.JPG" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="273" src="http://1.bp.blogspot.com/-10top0PjHV8/ThPj9oS1SHI/AAAAAAAADbg/Fv51jqJigHw/s320/properties.JPG" width="320" /></a></div><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">For each of the properties that you have externalize by making use of catalina.properties we need to enter a line here in the PROPERTIES box.<br />
E.g. Suppose we have a propery named “https.proxyPort” defined in the catalina.properties then we need to define a property here also, however we need to keep in mind that each property needs to be prepended by “test-sys-prop.”</span></span></span></span><br />
<span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><br />
</span></span></span></span><br />
<span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="mso-spacerun: yes;"> </span>So the final property is <b style="mso-bidi-font-weight: normal;">test-sys-prop.https.proxyPort=1971 </b>as shown in above diagram. <br />
Similarly if we have externalize the Log4j property file it will be <br />
<b style="mso-bidi-font-weight: normal;">test-sys-prop.logback.configurationFile=file\:///c\:/logback.xml<br />
NOTE: </b>The “<b style="mso-bidi-font-weight: normal;">\</b>” entered above is automatically added by netbeans we just need to add the following.<br />
test-sys-prop.logback.configurationFile=file:///c:/logback.xml</span></span></span></span></span><br />
<span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><br />
</span></span></span></span></span><br />
<span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Now Click on “OK” and netbeans will start building the indices for internal purposes. <br />
Start Running your Junit Test Cases and Spring will initialize properly as in the TOMCAT.<span style="mso-spacerun: yes;"> </span>And we can get access to all our beans by using @Autowired annotation in the test Cases.</span></span></span></span></span></span><br />
<span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: Calibri, sans-serif; font-size: 11pt;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><br />
</span></span></span></span></span></span><br />
<b style="mso-bidi-font-weight: normal;"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Memory Problem: <br />
</span></b><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: EN-US; mso-ascii-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-bidi-language: AR-SA; mso-bidi-theme-font: minor-bidi; mso-fareast-font-family: Calibri; mso-fareast-language: EN-US; mso-fareast-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;">Now if we are doing some memory intensive work, we need to provide netbeans with the –Xms and –Xmx runtime arguments. Otherwise we will keep on getting OutofMemoryError : heap space. To remove this:<br />
Right Click on the project -> Properties -> Run<br style="mso-special-character: line-break;" /> <!--[if !supportLineBreakNewLine]--><br style="mso-special-character: line-break;" /> <!--[endif]--></span><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-rtnwGvIU5v0/ThPkdmTnZHI/AAAAAAAADbk/Lh2wPjFZcZQ/s1600/memory.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><br />
<img border="0" height="194" src="http://4.bp.blogspot.com/-rtnwGvIU5v0/ThPkdmTnZHI/AAAAAAAADbk/Lh2wPjFZcZQ/s320/memory.JPG" width="320" /></a></div><div class="separator" style="clear: both; text-align: center;"><br />
</div><div class="separator" style="clear: both; text-align: center;"></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">Place the –Xms & -Xmx parameter as per your requirements.</span></div><div style="text-align: left;"><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;"><br />
</span></div><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">Hope it helps you to do the UNIT Testing in NetBeans.</span><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 11pt;"> For this blog, I have taken help of a number of blogs,the main one is :</span><a href="http://forums.netbeans.org/post-294.html" style="font-family: Calibri, sans-serif; font-size: 11pt;">http://forums.netbeans.org/post-294.html</a></div>panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com1tag:blogger.com,1999:blog-8289284958963644142.post-67113708739914264722011-04-06T23:31:00.000-07:002011-04-06T23:31:32.944-07:00Spring Web Service - Part III ( Creating Web Services by java bean both for SOAP 1.1 & SOAP 1.2)<div dir="ltr" style="text-align: left;" trbidi="on">In the Last part of the servies, we will learn how to Develop web services that will support both SOAP 1.1 and SOAP 1.2 protocol, (Spring WS does not provide out of box support for this and we need to tweak the things little bit).<br />
There are many ways through which you can generate the Web services, like<br />
<ul><li>Manually creating the WSDL file and place it in WEB-INF directory of your web application.</li>
<li>Creating the Request XML XSD and let the framework to create the WSDL</li>
</ul><div>The Second one is preferred approach as compared to the first one, as you does not have to code the WSDL directly either with tool or yourself. </div><div>In order to create the following tutorial, i had taken help from a number of blogs, following are the their links, however I could not find a complete one, so summarizing all this in a single post.</div><div><a href="http://forum.springsource.org/showthread.php?t=71766">http://forum.springsource.org/showthread.php?t=71766</a><br />
<a href="http://krams915.blogspot.com/">http://krams915.blogspot.com/</a><br />
<br />
</div><div>Listed here are the steps:</div><div><ol style="text-align: left;"><li>First we will create a xsd which represents the schema of the input xml, below is a snipped of it, It only contains three fields that need to be passed to the Server, ( ID, Name, Email) and in response two things are being returned to the client ( CODE, DESCRIPTION)<br />
<pre class="brush: xml; highlight: [5, 15]"><schema attributeformdefault="qualified" elementformdefault="qualified" targetnamespace="http://krams915.blogspot.com/ws/schema/oss" xmlns:tns="http://krams915.blogspot.com/ws/schema/oss" xmlns="http://www.w3.org/2001/XMLSchema">
<element name="id" tns:maxoccurs="1" tns:minoccurs="1">
<simpletype>
<restriction base="string">
<minlength value="7">
<pattern value="([0-9])+">
</pattern></minlength></restriction>
</simpletype>
</element>
<element name="name" tns:maxoccurs="1" tns:minoccurs="1">
<simpletype>
<restriction base="string">
<minlength value="3">
<pattern value="([A-Z]|[a-z]|\s|\.)+">
</pattern></minlength></restriction>
</simpletype>
</element>
<element name="email" tns:maxoccurs="1" tns:minoccurs="1">
<simpletype>
<restriction base="string">
<minlength value="6">
<pattern value="[A-Za-z0-9._%+-]+@([A-Za-z0-9-]+\.)+([A-Za-z0-9]{2,4})">
</pattern></minlength></restriction>
</simpletype>
</element>
<element name="code" tns:maxoccurs="1" tns:minoccurs="1">
<simpletype>
<restriction base="string">
<enumeration value="SUCCESS">
<enumeration value="FAILURE">
</enumeration></enumeration></restriction>
</simpletype>
</element>
<element name="description" tns:maxoccurs="1" tns:minoccurs="1">
<simpletype>
<restriction base="string">
</restriction>
</simpletype>
</element>
<element name="subscriptionRequest" tns:maxoccurs="1" tns:minoccurs="1">
<complextype>
<sequence>
<element ref="tns:id">
<element ref="tns:name">
<element ref="tns:email">
</element></element></element></sequence>
</complextype>
</element>
<element name="subscriptionResponse" tns:maxoccurs="1" tns:minoccurs="1">
<complextype>
<sequence>
<element ref="tns:code">
<element ref="tns:description">
</element></element></sequence>
</complextype>
</element>
</schema>
</pre>it Clearly Shows that the contents of Subscription Request and Subscription Response, as described above. <br />
</li>
<li>Now we need to create the Java Objects corresponds to both Request and Response.<br />
<b><u>SubscriptionRequest.java<br />
</u></b><br />
<pre class="brush: java; highlight: [5, 15]">package com.test;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
*
* @author PankajB
*/
@XmlRootElement(namespace="http://krams915.blogspot.com/ws/schema/oss",name="subscriptionRequest")
public class SubscriptionRequest {
private String id;
private String name;
private String email;
@XmlElement(name="email",namespace="http://krams915.blogspot.com/ws/schema/oss")
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@XmlElement(name="id",namespace="http://krams915.blogspot.com/ws/schema/oss")
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@XmlElement(name="name",namespace="http://krams915.blogspot.com/ws/schema/oss")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
</pre><u style="font-weight: bold;"> SubscriptionResponse.java</u><br />
<pre class="brush: java;">package com.test;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
/**
*
* @author PankajB
*/
@XmlRootElement(namespace = "http://krams915.blogspot.com/ws/schema/oss", name = "subscriptionResponse")
public class SubscriptionResponse {
private String code;
private String description;
@XmlElement(name = "code", namespace = "http://krams915.blogspot.com/ws/schema/oss")
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
@XmlElement(name = "description", namespace = "http://krams915.blogspot.com/ws/schema/oss")
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
</pre><br />
</li>
<li>Now we need to write our main POJO which which handle the request and generate a response. It pretty simply class, annotated with some special annotations.<br />
<pre class="brush: java; highlight: [5, 15]">package com.test;
import javax.xml.ws.soap.SOAPBinding;
import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;
import org.springframework.ws.server.endpoint.annotation.RequestPayload;
import org.springframework.ws.server.endpoint.annotation.ResponsePayload;
/**
*
* @author PankajB
*/
@Endpoint(value = SOAPBinding.SOAP12HTTP_BINDING)
public class SubscriptionService {
@PayloadRoot(localPart = "subscriptionRequest", namespace = "http://krams915.blogspot.com/ws/schema/oss")
@ResponsePayload
public SubscriptionResponse processSubscription(@RequestPayload SubscriptionRequest subscriptionRequest) {
SubscriptionResponse response = new SubscriptionResponse();
System.out.println("Coming Here......... " + subscriptionRequest.getName());
response.setCode("234");
response.setCode("Successfully Executed the application.");
return response;
}
}
</pre>here it simply, receive the Payload ( what is being sent by the client in the XML and converted to our SubscriptionRequest Object and generates an SubscriptionResponse type of object, which will again be automatically going to be converted by the Spring Jaxb marshaller in the XML format.<br />
This Ends the first part of the story, now let's move to the configuration.<br />
</li>
<li>First of all in the configuration files, let's visit web.xml<br />
<pre class="brush: xml; highlight: [5, 15]"><web-app version="2.5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>spring-ws</servlet-name>
<servlet-class>org.springframework.ws.transport.http.MessageDispatcherServlet</servlet-class>
<init-param>
<param-name>transformWsdlLocations</param-name><param-value>true</param-value></init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>spring-ws</servlet-name>
<url-pattern>/service/*</url-pattern>
</servlet-mapping>
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
</pre>This Simply tells the container that this servlet is going to receive any of the call that matches with the URI /service/*<br />
</li>
<li><br />
Now we have the spring-ws-servlet.xml (spring-ws comes from servlet name above in web.xml) which will define all the components related to Spring Web Service.<br />
<pre class="brush: xml; highlight: [5, 15]"><beans:beans xmlns:aop="http://www.springframework.org/schema/aop" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:sws="http://www.springframework.org/schema/web-services" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:util="http://www.springframework.org/schema/util" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/web-services http://www.springframework.org/schema/web-services/web-services-2.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">
<context:component-scan base-package="com.test">
<beans:bean class="com.test.soap.MyFactory" id="messageFactory">
<beans:bean class="org.springframework.ws.soap.addressing.server.SimpleActionEndpointMapping" id="endpointMapping">
<beans:bean class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping" id="soap11EndpointMapping">
<beans:bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller" id="marshaller">
<beans:property name="classesToBeBound">
<beans:list>
<beans:value>com.test.SubscriptionRequest</beans:value>
<beans:value>com.test.SubscriptionResponse</beans:value>
</beans:list>
</beans:property>
<beans:property name="marshallerProperties">
<beans:map>
<beans:entry key="jaxb.formatted.output" value-ref="true">
</beans:entry></beans:map>
</beans:property>
</beans:bean>
<beans:bean class="java.lang.Boolean" id="true">
<beans:constructor-arg value="True">
</beans:constructor-arg></beans:bean>
<sws:annotation-driven>
<sws:dynamic-wsdl createsoap11binding="true" createsoap12binding="true" id="subscription" locationuri="/service/SubService/" porttypename="SubscriptionRequest" targetnamespace="http://krams915.blogspot.com/ws/schema/oss">
<sws:xsd location="/WEB-INF/subscription.xsd">
</sws:xsd></sws:dynamic-wsdl>
<sws:interceptors>
<beans:bean class="org.springframework.ws.server.endpoint.interceptor.PayloadLoggingInterceptor" id="loggingInterceptor">
</beans:bean></sws:interceptors>
</sws:annotation-driven></beans:bean></beans:bean></beans:bean></context:component-scan></beans:beans>
</pre><br />
Most of the Things has been commenting in the XML itself, for better understanding.<br />
</li>
<li><br />
Since we need to support both SOAP 1.1 & SOAP 1.2 we need to write out own factory, that is going to be an implementation of SoapMessageFactory.<br />
<pre class="brush: java; highlight: [5, 15]">/*
*
* This All has been done as per the things present at this link.
* http://forum.springsource.org/showthread.php?t=56560
*
*/
package com.test.soap;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.soap.SoapMessage;
import org.springframework.ws.soap.SoapMessageFactory;
import org.springframework.ws.soap.SoapVersion;
import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
import org.springframework.ws.transport.TransportInputStream;
public class MyFactory implements SoapMessageFactory, InitializingBean {
// This is the Request Context Attribute.
private static final String REQUEST_CONTEXT_ATTRIBUTE = "MyFactory";
private static final Log logger = LogFactory.getLog(MyFactory.class);
// Two message factories for processing two differnet types of protocols.
private SaajSoapMessageFactory soap11MessageFactory = new SaajSoapMessageFactory();
private SaajSoapMessageFactory soap12MessageFactory = new SaajSoapMessageFactory();
// This Object, will be responsible for choosing the Protocol on Runtime, it can be application/xml or text/xml (SOAP 1.2 & SOAP 1.1)
private SoapProtocolChooser soapProtocolChooser = new MySoapProtocolChooser();
private void setMessageFactoryForRequestContext(SaajSoapMessageFactory mf) {
RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
attrs.setAttribute(REQUEST_CONTEXT_ATTRIBUTE, mf, RequestAttributes.SCOPE_REQUEST);
}
private SaajSoapMessageFactory getMessageFactoryForRequestContext() {
RequestAttributes attrs = RequestContextHolder.getRequestAttributes();
SaajSoapMessageFactory mf = (SaajSoapMessageFactory) attrs.getAttribute(REQUEST_CONTEXT_ATTRIBUTE, RequestAttributes.SCOPE_REQUEST);
return mf;
}
// Function called, when we are settign the SOPA Version
public void setSoapVersion(SoapVersion version) {
System.out.println("setSoapVersion called with: " + version + " -- ignoring");
}
// This Function, will set teh SOAP Proptocl chooser
public void setSoapProtocolChooser(SoapProtocolChooser soapProtocolChooser) {
System.out.println("Setting out the SOAP Protocol Chooser");
this.soapProtocolChooser = soapProtocolChooser;
}
// Function will be invoked, when Spring will create the Bean.
public void afterPropertiesSet() throws Exception {
soap11MessageFactory.setSoapVersion(SoapVersion.SOAP_11);
soap11MessageFactory.afterPropertiesSet();
soap12MessageFactory.setSoapVersion(SoapVersion.SOAP_12);
soap12MessageFactory.afterPropertiesSet();
System.out.println("Setting both the SOAP Version to 1.1 and 1.2");
}
// Function for creating the Web Service Message.
public SoapMessage createWebServiceMessage() {
return getMessageFactoryForRequestContext().createWebServiceMessage();
}
// Function for creating the Web Service Message from inputStream.
public SoapMessage createWebServiceMessage(InputStream inputStream) throws IOException {
setMessageFactoryForRequestContext(soap12MessageFactory);
if (inputStream instanceof TransportInputStream) {
TransportInputStream transportInputStream = (TransportInputStream) inputStream;
if (soapProtocolChooser.useSoap11(transportInputStream)) {
setMessageFactoryForRequestContext(soap11MessageFactory);
}
}
SaajSoapMessageFactory mf = getMessageFactoryForRequestContext();
if (mf == soap11MessageFactory) {
System.out.println("Final soapMessageFactory? " + soap11MessageFactory);
} else {
System.out.println("Final soapMessageFactory? " + soap12MessageFactory);
}
return mf.createWebServiceMessage(inputStream);
}
}
</pre>This class is not alone itself, and works with the help of some associating classes & interfaces described below.<br />
<u style="font-weight: bold;"> SoapProtocolChooser.java Interface:</u> This is the Interface that is being defined for Choosing a SOAP Protocol chooser class at run time.<br />
<pre class="brush: java; highlight: [5, 15]">package com.test.soap;
import java.io.IOException;
import org.springframework.ws.transport.TransportInputStream;
public interface SoapProtocolChooser {
public boolean useSoap11(TransportInputStream transportInputStream) throws IOException;
}
</pre><u style="font-weight: bold;"> MySoapProtocolChooser.java Implementation of Above Defined Interface: </u><br />
<pre class="brush: java; highlight: [5, 15]">/**
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package com.test.soap;
/**
*
* @author PankajB
*/
import java.io.IOException;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.ws.transport.TransportInputStream;
public class MySoapProtocolChooser implements SoapProtocolChooser {
private static final Log logger = LogFactory.getLog(MySoapProtocolChooser.class);
private static final Pattern userAgentPattern = Pattern.compile("html", Pattern.CASE_INSENSITIVE);
public boolean useSoap11(TransportInputStream transportInputStream) throws IOException {
for (Iterator headerNames = transportInputStream.getHeaderNames(); headerNames.hasNext();) {
String headerName = (String) headerNames.next();
logger.debug("found headerName: " + headerName);
for (Iterator headerValues = transportInputStream.getHeaders(headerName); headerValues.hasNext();) {
String headerValue = (String) headerValues.next();
logger.debug(" headerValue? " + headerValue);
// Something weird with case names
/* if (headerName.toLowerCase().contains("user-agent")) {
System.out.println("UserAgent - " + headerValue);
Matcher m = userAgentPattern.matcher(headerValue);
if (m.find()) {
logger.debug("Found AXIS in header. Using SOAP 1.1");
return true;
}
}*/
// This is the code written in order to support multiple Endpints by selection of SOAP
if (headerName.toLowerCase().contains("content-type")) {
logger.debug("Content Type - " + headerValue);
if (headerValue.trim().toLowerCase().contains("text/xml")) {
logger.debug("Found text/xml in header. Using SOAP 1.1");
return true;
}
}
}
}
return false;
}
}
</pre>The Above code is pretty self explanatory.<br />
This Class is being invoked by MyFactory class in method createWebServiceMessage(InputStream) to determine which SOAP Message Factory is going to be used, either 1.1 or 1.2<br />
</li>
</ol>That's all we required, now we can simply deploy our application to the web container after creating a WAR file. <br />
<b> Now simply call the HTTP URI: http://localhost:8080/SpringWSGen/service/service/SubService/subscription.wsdl</b><br />
<b>( Note: service has been writted two times because:</b><br />
<b> </b><span class="Apple-style-span" style="color: #cc0000;"> 1. we have service/* servlet mapping, so first one belongs to it.</span><br />
<span class="Apple-style-span" style="color: #cc0000;"> 2. we have service/SubService in the dynamic WSDL generation tag in sprng-ws-servlet.xml, so second one refers to it. Obviously one can go ahead with any mappings he want )</span><br />
you will see the following WSDL Generated. now it can be invoked in any tool example SOAP UI to get to know which one is being called. As the WSDL File has the bindings for both the SOAP 1.1 & SOAP 1.2<br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/-5nymaaOemi4/TZ1Y9ARlMmI/AAAAAAAADaI/n1FUorZM8Ns/s1600/WSDL_View.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="233" src="http://4.bp.blogspot.com/-5nymaaOemi4/TZ1Y9ARlMmI/AAAAAAAADaI/n1FUorZM8Ns/s400/WSDL_View.JPG" width="400" /></a></div><br />
So that's all for the time beings. here can you create Spring Web Services through this. I will have some interesting URL's thta just add to the above functionaltiy, that i will add later on.<br />
Thanks Spring, for creating such a light weight framework.<br />
Please let me know, in case you want the complete source code. I will host it somewhere.</div></div>panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com9tag:blogger.com,1999:blog-8289284958963644142.post-45988859106611588542011-03-05T02:47:00.000-08:002011-03-05T02:47:56.061-08:00Spring Web Services 2 - Part II ( Marshalling , UnMarshalling using JAXB)<div dir="ltr" style="text-align: left;" trbidi="on">In second part of the series, we will talk about how to use Marshaller's in order to automatically convert your request and response object to the SOAP Body XML (of request n response ) with the corresponding Namespace defined in the Java Source files.<br />
Just like the first part, we will use <a href="http://panbhatt.blogspot.com/2011/03/spring-web-services-2-part-i.html">Spring WS2- Part I</a> we will use the same web service hosted at W3Schools.com but this time, with a very short code, as compared to Part-I .<br />
Spring Web Services 2 makes use of a number of marshallers and unmarshallers in order to perform the tasks that include Spring OXM, Castom, Jaxb2. As JAXB 2 is the specification, so we will go by that only.<br />
<br />
<b>Note: </b>Please add Jaxb libraries in your classpath while performing the action during this tutorial.<br />
<br />
Configuration: So we will directly delve in the spring configuration (acjaxb.xml) as required for this tutorial.<br />
<pre class="brush: xml; highlight: [5, 15]"><beans:beans xmlns:aop="http://www.springframework.org/schema/aop" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<beans:bean class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory" id="messageFactory">
<beans:bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller" id="marshaller">
<beans:property name="classesToBeBound">
<beans:list>
<beans:value>springwsjxb.CelsiusToFahrenheit</beans:value>
<beans:value>springwsjxb.CelsiusToFahrenheitResponse</beans:value>
</beans:list>
</beans:property>
<beans:property name="marshallerProperties">
<beans:map>
<beans:entry key="jaxb.formatted.output" value-ref="true">
</beans:entry></beans:map>
</beans:property>
</beans:bean>
<beans:bean class="java.lang.Boolean" id="true">
<beans:constructor-arg value="True">
</beans:constructor-arg></beans:bean>
<beans:bean class="org.springframework.ws.client.core.WebServiceTemplate" id="webServiceTemplate">
<beans:constructor-arg ref="messageFactory">
<beans:property name="defaultUri" value="http://www.w3schools.com/webservices/tempconvert.asmx">
<beans:property name="marshaller" ref="marshaller">
<beans:property name="unmarshaller" ref="marshaller">
</beans:property></beans:property></beans:property></beans:constructor-arg></beans:bean>
</beans:bean></beans:beans></pre><br />
As our current configuration describes that we are using two classes CelsiusToFahrenheit and CelsiusToFahrenheitResponse present in the springws packagejxb. Here is the corresponding source code for both of them. The Source code includes the Namespace details also, it becomes very important once we need to generate the XML, in any case if we missed out the namespace the coressponding web service will not be able to parse it and will throw an exception.<br />
<b><u>CelsiusToFahrenheit.java</u></b><br />
<b><u><br />
</u></b><br />
<pre class="brush: java; highlight: [5, 15]">package springwsjxb;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
*
* @author PankajB
*/
@XmlType(name="tem")
@XmlRootElement(name="CelsiusToFahrenheit",namespace="http://tempuri.org/")
public class CelsiusToFahrenheit {
private int celsius;
@XmlElement(name="Celsius",namespace="http://tempuri.org/")
public int getCelsius() {
return celsius;
}
public void setCelsius(int celsius) {
this.celsius = celsius;
}
}
<span class="Apple-style-span" style="font-family: 'Times New Roman';"><span class="Apple-style-span" style="white-space: normal;">
</span></span></pre><b><u>CelsiusToFahrenheitResponse.java</u></b><br />
<b><u><br />
</u></b><br />
<br />
<pre class="brush: java; highlight: [5, 15]">package springwsjxb;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="CelsiusToFahrenheitResponse",namespace="http://tempuri.org/")
public class CelsiusToFahrenheitResponse {
private int result;
//CelsiusToFahrenheitResult is the name of the XML Element which is being returned from the Web service and belongs to namespace "http://tempuri.org/"
@XmlElement(name="CelsiusToFahrenheitResult",namespace="http://tempuri.org/")
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
}
</pre>As per the requirements of the web service, we had kept only those variables here in our objects.<br />
Now our Main.java file which will be responsible for invoking the web service and give us the response object.<br />
<b><u>Main.java</u></b><br />
<b><u><br />
</u></b><br />
<pre class="brush: java; highlight: [5, 15]">package springwsjxb;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.client.core.WebServiceMessageCallback;
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.ws.soap.SoapMessage;
/**
*
* @author PankajB
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try
{
// Load the spring web service configuration file
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springwsjxb/acjaxbb.xml");
WebServiceTemplate webServiceTemplate = (WebServiceTemplate)applicationContext.getBean("webServiceTemplate");
// Creating the Request Object and setting it properties
CelsiusToFahrenheit celsiusToFahrenheit=new CelsiusToFahrenheit();
celsiusToFahrenheit.setCelsius(100);
// Invoking the web service and getting the response back.
CelsiusToFahrenheitResponse c=(CelsiusToFahrenheitResponse)webServiceTemplate.marshalSendAndReceive(celsiusToFahrenheit,new WebServiceMessageCallback() {
// Setting the SOAP Action
public void doWithMessage(WebServiceMessage message) {
((SoapMessage)message).setSoapAction("http://tempuri.org/CelsiusToFahrenheit");
}
});
System.out.println("THE RESPONSE From Web Service IS "+ c.getResult());
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}</pre>The code is pretty self explanatory, except at one point where we need to cast the object to our corresponding response, as the web service template does not provide any way to specify in the parameter list about the kind of response object we are expecting to receive.<br />
<br />
Once it gets executed we will receive the result on to our console.<br />
Someetimes our web servie is accessible only through HTTPS protocol, however the tried to just replace the URI Of my web services template, and it seems to work without any added configurtion. It might be possible that we need to install the certificate on our system either manually or through a software called PORTECLE.<br />
So that's all for the time.<br />
In the next part we will see how to create a web service through spring ws 2 and implement the same endpoint for both SOAP 1.1 & SOAP 1.2 i.e. we will not bother about whether client is invoking through text/xml or application/soap+xml (SOAP 1.2). Really Spring WS makes it so easy.<br />
Thanks Arjen Postuma.<br />
<br />
<br />
</div>panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com7tag:blogger.com,1999:blog-8289284958963644142.post-18862345139082132392011-03-01T11:34:00.000-08:002011-03-01T11:34:07.621-08:00Spring Web Services 2 - Part I<div dir="ltr" style="text-align: left;" trbidi="on">This is an introductory article, in a three part series which illustrates the use of Spring Web Services in a Java/J2EE Application.<br />
All the Examples has been created by using Spring 3, Spring Web Services 2, JAX-WS, JAXB 2.2, and wsdl4j.jar<br />
<br />
This Part will simplify the process of invoking a simple web service located at w3schools.com ( to convert a temperature from Celsius to Fahrenheit ).<br />
Web Service URL is : <a href="http://www.w3schools.com/webservices/tempconvert.asmx">http://www.w3schools.com/webservices/tempconvert.asmx </a><br />
<a href="http://www.w3schools.com/webservices/tempconvert.asmx"></a>WSDL is : <a href="http://www.w3schools.com/webservices/tempconvert.asmx?wsdl">http://www.w3schools.com/webservices/tempconvert.asmx?wsdl</a><br />
<br />
Note: Please use SOAP UI, an excellent tool for testing the web services.<br />
<br />
So as per Spring WS Configuration, we will create a WebServiceTemplate which follows the same pattern as of JDBCTemplate, RestTemplate etc<br />
So our application context (ac.xml) file in this case is:<br />
<pre class="brush: xml; highlight: [5, 15]"><beans:beans xmlns:aop="http://www.springframework.org/schema/aop" xmlns:beans="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:task="http://www.springframework.org/schema/task" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<beans:bean class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory" id="messageFactory">
<beans:bean class="org.springframework.ws.client.core.WebServiceTemplate" id="webServiceTemplate">
<beans:constructor-arg ref="messageFactory">
<beans:property name="defaultUri" value="http://www.w3schools.com/webservices/tempconvert.asmx">
</beans:property></beans:constructor-arg></beans:bean>
</beans:bean></beans:beans>
</pre>Now we have to construct two Classes:<br />
1. This Class will represent the java representation of the SOAP REQUEST BODY with all the tags defined through JAXB 2.2 framework. CelsiusToFahrenheit.java <br />
<br />
<pre class="brush: java; highlight: [5, 15]">
package springws;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
/**
*
* @author PankajB
* namespace represent the namespace of the elements, plz see wsdl for greater information
* CelsiusToFahrenheit is the Root Element name
*/
@XmlType(name="tem")
@XmlRootElement(name="CelsiusToFahrenheit",namespace="http://tempuri.org/")
public class CelsiusToFahrenheit {
private int celsius;
@XmlElement(name="Celsius",namespace="http://tempuri.org/")
public int getCelsius() {
return celsius;
}
public void setCelsius(int celsius) {
this.celsius = celsius;
}
}
</pre><br/><br />
2. This class will represent the response that is coming from the Web service. CelsiusToFahrenheitResponse.java<br />
<br/><br />
<pre class="brush: java; highlight: [5, 15]">
package springws;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name="CelsiusToFahrenheitResponse",namespace="http://tempuri.org/")
public class CelsiusToFahrenheitResponse {
private int result;
@XmlElement(name="CelsiusToFahrenheitResult",namespace="http://tempuri.org/")
public int getResult() {
return result;
}
public void setResult(int result) {
this.result = result;
}
}
</pre><br/><br />
<br />
Now the Final Part will be is to load the xml file and perform the invocation. The Source Code is easy to read, hence does not contain much comments (Sorry for this guys!!!)<br />
<br />
<b>Main.java </b><br />
<pre class="brush: java; highlight: [5, 15]">package springws;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.ws.WebServiceMessage;
import org.springframework.ws.client.core.WebServiceMessageCallback;
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.ws.soap.SoapMessage;
/**
*
* @author PankajB
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try
{
// getting the file present in springws package
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springws/ac.xml");
// get the Bean
WebServiceTemplate webServiceTemplate = (WebServiceTemplate)applicationContext.getBean("webServiceTemplate");
// Create the Marshaller, so that we can generate the request SOAP Body XMl
JAXBContext jc= JAXBContext.newInstance(CelsiusToFahrenheit.class);
Marshaller m=jc.createMarshaller();
// Creating the Request Object
CelsiusToFahrenheit celsiusToFahrenheit=new CelsiusToFahrenheit();
celsiusToFahrenheit.setCelsius(10);
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
StringWriter wr=new StringWriter();
// Marshalling the object to the writer
m.marshal(celsiusToFahrenheit, wr);
System.out.println(wr.toString());
StringWriter finalResponseWriter = new StringWriter();
// Creating the Source and Result object, that will contain the corressponding REUQEST & RESPONSE.
StreamSource webServiceInput = new StreamSource(new StringReader(wr.toString()));
StreamResult webServiceOutput = new StreamResult(finalResponseWriter);
// Invoking the Web Service
webServiceTemplate.sendSourceAndReceiveToResult(webServiceInput,new WebServiceMessageCallback() {
// This is very much required, since we need to set the ACTION as defined in the WSDL. ( Since a web service can contain multiple options
public void doWithMessage(WebServiceMessage message) {
// Please see the WSDL for more details.
((SoapMessage)message).setSoapAction("http://tempuri.org/CelsiusToFahrenheit");
}
}, webServiceOutput);
// This line, will print the Response to the Console
System.out.println(finalResponseWriter.toString());
// This will simply unmarshal the xml response in the Java Object (for easy handling of response)
JAXBContext jaxc=JAXBContext.newInstance(CelsiusToFahrenheitResponse.class);
CelsiusToFahrenheitResponse tr=(CelsiusToFahrenheitResponse)jaxc.createUnmarshaller().unmarshal(new StringReader(finalResponseWriter.toString()));
System.out.println(tr.getResult() + " is the result");
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}
</pre>Once the following will be executed, we will see the response on our console.<br />
<br />
In the next two parts we will see the following:<br />
Part 2: Making use of JAXB Marshalling & UnMarshalling to automate the above manual marshalling through coding.<br />
Part 3: How to create a web service through Spring WS and provide a simple end point to support both SOAP 1.1 & SOAP 1.2 <br />
So, stay tuned.<br />
</div>panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com0tag:blogger.com,1999:blog-8289284958963644142.post-5162193521448196342011-01-18T22:26:00.000-08:002011-01-18T22:26:41.001-08:00Java 4,5,6.. What next???? Python.. Scala.. Erlang...For a Java Fan it becomes a lot easier day by day to lost in the overgrowing languages in the JVM world, that includes Groovy, Jython and a host of other languages with Groovy being the Flag bearer. However with the stagnancy of Java ( i m saying this because the next java version is slated to be released in Summer of 2012) and with the introduction of other languages, it seems a good choice/time for a java developer to taste other languages. Some of the major languages that a java developer i think one should follow on is.<br />
<br />
<br />
<ul><li><b>PYTHON:</b> It seems to be a great language by syntax and looks like a relative of 'C' language. The Current version of Python 2.7 is seems to be much popular than 3x version. Because of its ability to run on multiple platforms that includes (Linux, JVM, .Net) i think this should be the first choice of a developer. The emergence of Various Development Frameworks like WxPython, Django ( best for web app development) provide a strong reason to go for this language. In addition we also have to consider Google's Bet on python, ( Google really invest heavily on python with Guido Van Rassum on this board, ya the same person who created python). I think before trying out the same java feature ever and ever again, one should see the new angle python brought into development e.g. Virtual enviroment, Easy_install, Pip etc. The central repository pypi definitely helps the developer to get an understanding of all the libraries with their documentation a lot.<br />
Some important links are:<br />
<span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px;"><a href="http://zetcode.com/wxpython/">http://zetcode.com/wxpython/</a><br />
<a href="http://www.searchforpython.com/">http://www.searchforpython.com</a><br />
<a href="http://www.clemesha.org/blog/modern-python-hacker-tools-virtualenv-fabric-pip/">http://www.clemesha.org/blog/modern-python-hacker-tools-virtualenv-fabric-pip/</a><br />
<a href="http://www.catonmat.net/blog/learning-python-programming-language-through-video-lectures/">http://www.catonmat.net/blog/learning-python-programming-language-through-video-lectures/</a><br />
<a href="http://code.google.com/edu/languages/google-python-class/">http://code.google.com/edu/languages/google-python-class/</a><br />
<a href="http://agiliq.com/blog/2010/11/i-am-so-starving-same-web-app-in-various-python-we/">http://agiliq.com/blog/2010/11/i-am-so-starving-same-web-app-in-various-python-we/</a><br />
<a href="http://sujitpal.blogspot.com/2010/08/python-web-application-with-spring.html">http://sujitpal.blogspot.com/2010/08/python-web-application-with-spring.html</a><br />
</span></li>
<li><b>ERLANG: </b>Wanna go for a concurrent languages, that ERLANG seems to be extremely fit to the concurrent world. Developed by Ericssion in 1985 and open sourced in 2000 this language serves as a basis for one of biggest platforms on the world, that includes FACEBOOK CHAT and facebook page rendering things. The Syntax is seems to be an complex one, but with the time it turns out to do the thing in a much simpler way. It also plays a great part in the NoSql movement with CouchDB being created in it. So give ERLANG a try, if concurrency seems to exist anywhere near you.<br />
In addition this also support Web development, Nitrogen is the framework here, that one needs to look into.</li>
<li><b>GROOVY: </b>The ability to call itself Java++ and with the recent web development in GRAILS framework ( somewhat similiar to Rails framwork) will make this language an excellent choice for Java developers, since the language fundaments and syntax seems a lot similar to java. ( Relationship can be considered Java -> Groovy as C -> C++). since you can use all the java libraries can be used in GROOVY, so a java developer can find him/her on the best side of river & safe at home.</li>
<li><b>SCALA: </b>The mixture of OOP & FP ( functional programming) and its concurrent features makes this languages an excellent bread earning language of future. Since scala provide the concurrency in terms of "ACTORS" ( ya inherited from ERLANG) and with web development frameworks like LIFT, SINATRA it can be termed as the replacement of java on to the JVM in the next coming years. Like Groovy you can use all existing java libraries, however the learning curve is little steep because of the complexity of the language. But as per my observation and as per the blogosphere world this language can fit extremely well in the Java world.<br />
Even as per a blog the Groovy developer says "if he knows that Scala exists and is about to come then he would never had developed Groovy". This statement itself says a lot about Scala.<br />
Some important links are:<br />
<span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px;"><a href="http://www.slideshare.net/mariogleichmann/scala-a-scalable-language">http://www.slideshare.net/mariogleichmann/scala-a-scalable-language</a><br />
<a href="http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html">http://macstrac.blogspot.com/2009/04/scala-as-long-term-replacement-for.html</a> </span></li>
</ul><div>Personally out of above 4 i will mark the languages in this order Python -> Scala -> Erlang unless you have a special inclination or have a special requirement.</div><div>So go ahead, give it a try and find out to do the thing differently rather then repeating yourself each and every time. SO remember, remain DRY ( dont repeat yourself).</div><div> If you want to know about the Good Books in any of the above, please write me in the comments section or mail me. Surely, will love to tell anyone.</div><div> Sorry, for the Typos..</div>panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com13tag:blogger.com,1999:blog-8289284958963644142.post-30903935881907849762011-01-10T23:31:00.000-08:002011-01-10T23:31:41.280-08:00No Nonsense - Apache + Python + Django installation gude<b><u>Python + Apache Integration:</u></b><br />
In order to work python with apache, we need to take care of the python version with the apache version. if we are using python version <= 2.5 then we have to use <b>mod_python</b> instead of using <b>mod_wsgi</b>. MOD_WSGI used to work with python 2.6 and python 2.7 version.<br />
<br />
This post will simply presents a guide to install Django on the Apache 2.2 version with python 2.7<br />
For that we need to follow the steps in the order:<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><br />
</div><ul><li> Download the Mod_wsgi.so from the following link <a href="http://code.google.com/p/modwsgi/">http://code.google.com/p/modwsgi/</a> as per your apache and python version.</li>
<li> Place the ".so" apache module file in the Modules folder of apache installation.</li>
<li>Modify the Httpd.conf file to include the following line in it. (make sure you rename the so file to mod_wsgi, otherwise use the complete name in the below listing)<br />
<b><i>LoadModule wsgi_module modules/mod_wsgi.so </i></b> </li>
<li>Now create a sample Django project called "<b>Sample</b>" in ("<b>C:\djangoprojects</b>") directory and create multiple apps in it. The directory structure of Sample is given below. (dont care about <b>apache_django</b>.<b>py</b> we will discuss this filelater on )<br />
<a href="http://2.bp.blogspot.com/_M_Jj-0uEvJU/TSwD3H9oCBI/AAAAAAAADXs/xkTwLMlBGNE/s1600/DjangoProject.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/_M_Jj-0uEvJU/TSwD3H9oCBI/AAAAAAAADXs/xkTwLMlBGNE/s1600/DjangoProject.JPG" style="cursor: move;" /></a><br />
</li>
<li><a href="http://1.bp.blogspot.com/_M_Jj-0uEvJU/TSwDZ2FkVfI/AAAAAAAADXo/T8zGymvjbzI/s1600/Sample+Folder+contents.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a>Now create a simple app "<b>Users</b>" in the this django project "c:\djangoprojects\sample", the directory contents are as below<br />
<a href="http://1.bp.blogspot.com/_M_Jj-0uEvJU/TSwDZ2FkVfI/AAAAAAAADXo/T8zGymvjbzI/s1600/Sample+Folder+contents.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/_M_Jj-0uEvJU/TSwDZ2FkVfI/AAAAAAAADXo/T8zGymvjbzI/s1600/Sample+Folder+contents.JPG" style="cursor: move;" /></a></li>
<li><a href="http://1.bp.blogspot.com/_M_Jj-0uEvJU/TSwDZ2FkVfI/AAAAAAAADXo/T8zGymvjbzI/s1600/Sample+Folder+contents.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"></a>Make sure you are able to run the Project using the inbuilt Django server. by using following URL (http://localhost:8000/Sample/Users)</li>
<li>Now Create a file called "<b>apache_django.wsgi"</b> in the Sample project folder. This file basically provides an bridge between the APACHE and the Django. This provides the apache with the wsgi handler for the Python Web based application.<br />
Paste the following contents in this file.<br />
<i style="font-weight: bold;"># apache django settings.</i><br />
<i style="font-weight: bold;">import os</i><br />
<i style="font-weight: bold;">import sys</i><br />
<i style="font-weight: bold;">sys.path.append("C:\\djnagoProjects")</i><br />
<i style="font-weight: bold;">os.environ['DJANGO_SETTINGS_MODULE'] = 'Sample.settings'</i><br />
<i style="font-weight: bold;">import django.core.handlers.wsgi</i><br />
<i style="font-weight: bold;">application = django.core.handlers.wsgi.WSGIHandler()</i><br />
where, Sample.settings refers to the Settings.py file of Django present in the Sample project folder as shown above.</li>
<li>Now in the apache Httpd.conf file paste the following lines at the bottom<br />
<i style="font-weight: bold;">WSGIScriptAlias /Django "C:/djnagoProjects/Sample/apache_django.wsgi"</i><br />
<i style="font-weight: bold;"><Directory "C:/djnagoProjects/Sample"></i><br />
<i style="font-weight: bold;">Order allow,deny</i><br />
<i style="font-weight: bold;">Allow from all</i><br />
<i style="font-weight: bold;"></Directory></i><br />
Where, the first line will specify that the whole application will be accessbile at (http://localhost/Django) and the individual module will be available at (http://localhost/Django/Users).<br />
And the rest of the lines are simply allow you to allow the access rights over the directory.</li>
<li>That's all, just make sure you restart apache and that's the complete magic is being done through Mod_wsgi bridge. Now access the path (http://localhost/Django) and the result is<br />
<br />
<a href="http://3.bp.blogspot.com/_M_Jj-0uEvJU/TSwHKogVqoI/AAAAAAAADXw/YObXU5-8pW0/s1600/Sample_Page.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="187" src="http://3.bp.blogspot.com/_M_Jj-0uEvJU/TSwHKogVqoI/AAAAAAAADXw/YObXU5-8pW0/s320/Sample_Page.JPG" style="cursor: move;" width="320" /></a><br />
<br />
Please write back, in case i made an error , or u face any problems....<br />
Happy Pythoning.......</li>
</ul>panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com0tag:blogger.com,1999:blog-8289284958963644142.post-64502128891290565542011-01-09T20:45:00.000-08:002011-01-09T20:45:23.102-08:00Monitoring Your server - javaDuring development and testing times we required to continously monitor our server for a number of resons:<br />
<br />
<ol><li>Find out amount of memory taken</li>
<li>Find out the number of classes loaded in memory</li>
<li>Checking out the different types of memory being used by our program ( Heap, Permgen etc. )</li>
<li>To get a know how of all the SQL commands issued by the application</li>
<li>and a number of things.... that a developer had to take care.</li>
</ol><div>This can be achieved using a number of open source tools available freely on our blogosphere. Two of the most popular are</div><div><ol><li>Java Melody ( Awesome one , <a href="http://code.google.com/p/javamelody/">Java Melody</a> )</li>
<li>Lambda Probe ( <a href="http://www.lambdaprobe.org/d/index.htm">http://www.lambdaprobe.org/d/index.htm</a> )</li>
</ol><div> both are excellent tools and how to use them is being covered in the online documentation of both of the projects. Both of them comes as a war file, so we can directly deploy it to the server and monitor the details of our requests, sessions, memory and lots of things.</div></div><div> however There is an advantage that i found of Melody over Probe is that melody can be used to cover up a single application on to the server i.e. if you have an WAR deployed on to the server, you can find the details only in context of the same application, and not to the complete server. In addition Melody is an active project while Probe seems to be an dead one.<br />
Both of them has the unique advantage of running over multiple servers because both of them supports the Server API specification, so we just need to use some filters which are being present in the assoicated Jar Files and make the available to our application.</div><div>As I am started using Java melody i will post more of the details regarding it soon. </div><div>Here are some of the attached details being thrown by both of them. I had used Melody within a particular application while Probe to cover up the whole server.</div><div>Happy Monitoring........</div><div><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/_M_Jj-0uEvJU/TSqOyx3g20I/AAAAAAAADXg/mxXsFhF_UFc/s1600/javaMelody.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="190" src="http://3.bp.blogspot.com/_M_Jj-0uEvJU/TSqOyx3g20I/AAAAAAAADXg/mxXsFhF_UFc/s320/javaMelody.JPG" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_M_Jj-0uEvJU/TSqO0rPAgFI/AAAAAAAADXk/nypV2P9c1kQ/s1600/Probe.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="132" src="http://4.bp.blogspot.com/_M_Jj-0uEvJU/TSqO0rPAgFI/AAAAAAAADXk/nypV2P9c1kQ/s320/Probe.JPG" width="320" /></a></div><div><br />
</div>panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com5tag:blogger.com,1999:blog-8289284958963644142.post-35688464068306933622010-12-21T01:02:00.000-08:002010-12-21T01:02:35.331-08:00Command Line Debugging in Java ::: JDBEver wondered, how the IDE helps us in debugging the program , or our application by using breakpoints, watches, expressions etc.<br />
In the world of java you can do it easliy by using jdb command line action provided by Java.. lets write down a simple program to perform command line debugging in java.<br />
<b>Lets write down a simple program to add two numbers in java. </b><br />
<ol><li>import java.io.*;</li>
<li><br />
</li>
<li>public class Sum</li>
<li><br />
</li>
<li> {</li>
<li> public static void main(String arfs[])</li>
<li> {</li>
<li><br />
</li>
<li> int i,j;</li>
<li> i=10;</li>
<li> j=25;</li>
<li> System.out.println(" I = " + i + " J = " + j);</li>
<li> int sum=i+j;</li>
<li> System.out.println("Sum = " + sum);</li>
<li><br />
</li>
<li> }</li>
<li> }</li>
</ol><div><b>Now compile the above code by using</b></div><div><b>javac -g Sum.java</b></div><div>Here -g option is used to inject the debug information into the generated class files, This can easily be viewed by checking the file size using with and without "g" option. </div><div><br />
</div><div><b>Start the Execution of this program by using following command</b></div><div><div style="font-weight: bold;"><br />
</div><div style="font-weight: bold;">>java -Xdebug -agentlib:jdwp=transport=dt_s<span class="Apple-style-span" style="font-weight: normal;"><b><div style="display: inline !important;">hmem,address=9999,server=y,suspend=y <span class="Apple-style-span" style="color: red;">Sum</span> </div></b></span></div><div><div style="display: inline !important;"><b style="font-weight: normal;"> the message "</b><b><u>Listening for transport dt_shmem at address: 9999</u></b><b style="font-weight: normal;">" is generated showing that the debugger is started with this program and ready to listen the request on the port no 9999. </b></div></div></div><div><div style="display: inline !important;"><b style="font-weight: normal;"><br />
</b></div></div><div><b>Open a separate window and type the following at the command prompt.</b></div><div><b>> jdb -attach 9999</b><br />
<b> Following output will be generated</b><br />
<div>Set uncaught java.lang.Throwable</div><div>Set deferred uncaught java.lang.Throwable</div><div>Initializing jdb ...</div><div><br />
</div><div>> VM Started: No frames on the current call stack<br />
main[1] </div><div><br />
</div><div>Now the debugger is ready to start debugging the program. We just need to pass the jdb specific commands to the debugger.<br />
main[1]: This represents the current call stack on the heap where the execution is.</div><div>Now assume main[1] will be your command prompt for the time being.</div><div><b>1. Type cont </b></div><div> main[1] cont (PRESS ENTER)</div><div>output will be: </div><div><div>> Set deferred breakpoint Sum.main</div><div><br />
</div><div>Breakpoint hit: "thread=main", Sum.main(), line=10 bci=0</div><div>10 i=10;</div><div><br />
</div><div>main[1]</div></div><div><b>2. Now Type "Stop at Sum:12" to instruct the debugger to stop the execution of the program at the 12 line.</b></div><div>main[1] Stop at Sum:12</div><div>Output will be: Set breakpoint Sum:12</div><div><b>3. Now Type "cont" to continue with the execution of the code.</b></div><div><b>4.</b><b> Now as per the program i and j has been initialized, so use the following command to view the values present in i and j.</b></div><div>main[1] print i<b> </b></div><div><b>output >> i = 10</b></div><div>Similarly u can inspect the value of other variables that are being initialized till the execution of the line, otherwise you will get null</div><div><b>5. Now type "cont" to continue the execution.</b></div><div><b> It will simply exit the debugger and will fall on to the main prompt.</b></div><div><b><br />
</b></div><div>so "<b>cont</b>" is being used to continue with the execution of the program</div><div> "<b>Stop at Sum:12</b>" to stop the execution of program at a particular line.</div><div><br />
</div><div> I hope it would be helpful for beginners, to understand how to debug your program through command line. </div><div>Following are the screenshots attached.</div><div><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_M_Jj-0uEvJU/TRBsqUGytgI/AAAAAAAADWg/ycX0nA3lMNQ/s1600/1..JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="83" src="http://4.bp.blogspot.com/_M_Jj-0uEvJU/TRBsqUGytgI/AAAAAAAADWg/ycX0nA3lMNQ/s320/1..JPG" width="320" /></a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="http://1.bp.blogspot.com/_M_Jj-0uEvJU/TRBsuOrMOTI/AAAAAAAADWk/WjSj2xOzat8/s1600/2.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="242" src="http://1.bp.blogspot.com/_M_Jj-0uEvJU/TRBsuOrMOTI/AAAAAAAADWk/WjSj2xOzat8/s320/2.JPG" width="320" /></a></div><div><br />
</div><div style="font-weight: bold;"><br />
</div></div><div><b>For this tutorial i had used the tutorial from the following awesome links:</b></div><div><b><a href="http://www.herongyang.com/jtool/jdb.html">http://www.herongyang.com/jtool/jdb.html</a></b></div><div><a href="http://cscarioni.blogspot.com/2010/12/understanding-how-java-debug-works.html">http://cscarioni.blogspot.com/2010/12/understanding-how-java-debug-works.html</a></div><div><br />
</div><div><br />
</div><div><br />
</div>panbhatthttp://www.blogger.com/profile/14109600598430874932noreply@blogger.com2