848 lines
33 KiB
XML
848 lines
33 KiB
XML
<?xml version="1.0"?>
|
|
<!--
|
|
Copyright 1991-2017 Amebis
|
|
Copyright 2016 GÉANT
|
|
|
|
This file is part of MSIBuild.
|
|
|
|
MSIBuild is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
MSIBuild is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with MSIBuild. If not, see <http://www.gnu.org/licenses/>.
|
|
-->
|
|
<package>
|
|
<job id="MakeDDF">
|
|
<runtime>
|
|
<description>Compile DDF file for shared CAB archive from input MSI files.</description>
|
|
<unnamed name="<output.ddf>" helpstring="Output DDF file" required="true"/>
|
|
<unnamed name="<input.msi ...>" helpstring="Input MSI files" required="true"/>
|
|
<named name="I" helpstring="Input files folder" type="string" required="false"/>
|
|
<named name="O" helpstring="CAB archive base name (default "Dat")" type="string" required="false"/>
|
|
<named name="C" helpstring="Compression (default "MSZIP")" type="string" required="false"/>
|
|
</runtime>
|
|
<script language="JScript" src="MSI.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 2) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
ddf_path = WScript.Arguments.Unnamed(0);
|
|
|
|
try {
|
|
var
|
|
installer = WScript.CreateObject("WindowsInstaller.Installer"),
|
|
input_path = WScript.Arguments.Named.Exists("I") ? WScript.Arguments.Named("I") : null,
|
|
output_base = WScript.Arguments.Named.Exists("O") ? WScript.Arguments.Named("O") : "Dat",
|
|
compression = WScript.Arguments.Named.Exists("C") ? WScript.Arguments.Named("C") : "MSZIP",
|
|
files = new Array(),
|
|
i, n = WScript.Arguments.Unnamed.length;
|
|
|
|
// No user interaction is desired.
|
|
installer.UILevel = msiUILevelNone;
|
|
|
|
for (i = 1; i < n; i++) {
|
|
var
|
|
msi_path = WScript.Arguments.Unnamed(i),
|
|
d;
|
|
|
|
try {
|
|
d = MSIGetFiles(installer, msi_path, input_path);
|
|
MSIMergeFiles(files, d);
|
|
} catch (err) {
|
|
throw new Error(err.number, "" + msi_path + ": " + err.description);
|
|
}
|
|
|
|
// Force JScript engine to free database and session objects, otherwise opening of another session will fail.
|
|
CollectGarbage();
|
|
}
|
|
|
|
// Create DDF file and write header properties.
|
|
var
|
|
dat = fso.CreateTextFile(ddf_path, true, false);
|
|
|
|
try {
|
|
dat.WriteLine(".Set CabinetNameTemplate=" + output_base + "*.cab");
|
|
dat.WriteLine(".Set CabinetName1=" + output_base + ".cab");
|
|
dat.WriteLine(".Set InfFileName=" + output_base + ".inf");
|
|
dat.WriteLine(".Set RptFileName=" + output_base + ".rpt");
|
|
dat.WriteLine(".Set ReservePerCabinetSize=8");
|
|
dat.WriteLine(".Set MaxDiskSize=0");
|
|
dat.WriteLine(".Set CompressionType=" + compression);
|
|
dat.WriteLine(".Set InfFileLineFormat=(*disk#*) *file#*: *file* = *Size*");
|
|
dat.WriteLine(".Set InfHeader=");
|
|
dat.WriteLine(".Set InfFooter=");
|
|
dat.WriteLine(".Set InfDateFormat=yyyy-mm-dd");
|
|
dat.WriteLine(".Set DiskDirectoryTemplate=");
|
|
dat.WriteLine(".Set Compress=ON");
|
|
dat.WriteLine(".Set Cabinet=ON");
|
|
//if (input_path)
|
|
// dat.WriteLine(".Set SourceDir=" + input_path);
|
|
for (fileKey in files) {
|
|
var
|
|
f = fso.GetFile(files[fileKey]),
|
|
d = new Date(f.DateLastModified);
|
|
|
|
// Seconds should be even. This is MAKECAB limitation.
|
|
d.setSeconds(Math.round(d.getSeconds() / 2) * 2);
|
|
|
|
dat.WriteLine("\"" + files[fileKey] + "\" /Date=" + d.getFullYear() + "-" + (d.getMonth() + 1) + "-" + d.getDate() + " /Time=" + Time2Str(d) + " " + fileKey);
|
|
}
|
|
} finally {
|
|
dat.Close();
|
|
}
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(ddf_path))
|
|
fso.DeleteFile(ddf_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="MakeDEP">
|
|
<runtime>
|
|
<description>Compile DEP dependency file from input MSI files.</description>
|
|
<unnamed name="<output.dep>" helpstring="Output DEP file" required="true"/>
|
|
<unnamed name="<target file>" helpstring="Target file dependant of input" required="true"/>
|
|
<unnamed name="<input.msi ...>" helpstring="Input MSI files" required="true"/>
|
|
<named name="I" helpstring="Input files folder" type="string" required="false"/>
|
|
</runtime>
|
|
<script language="JScript" src="MSI.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 3) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
dep_path = WScript.Arguments.Unnamed(0);
|
|
|
|
try {
|
|
var
|
|
installer = WScript.CreateObject("WindowsInstaller.Installer"),
|
|
input_path = WScript.Arguments.Named.Exists("I") ? WScript.Arguments.Named("I") : null,
|
|
target_path = WScript.Arguments.Unnamed(1),
|
|
files = new Array(),
|
|
i, n = WScript.Arguments.Unnamed.length;
|
|
|
|
// No user interaction is desired.
|
|
installer.UILevel = msiUILevelNone;
|
|
|
|
for (i = 2; i < n; i++) {
|
|
var
|
|
msi_path = WScript.Arguments.Unnamed(i),
|
|
d;
|
|
|
|
d = MSIGetFiles(installer, msi_path, input_path);
|
|
MSIMergeFiles(files, d);
|
|
|
|
// Force JScript engine to free database and session objects, otherwise opening of another session will fail.
|
|
CollectGarbage();
|
|
}
|
|
|
|
var
|
|
dat = fso.CreateTextFile(dep_path, true, false);
|
|
|
|
try {
|
|
dat.Write("\"" + target_path + "\" :");
|
|
for (fileKey in files)
|
|
dat.Write(" \\\r\n\t\"" + files[fileKey] + "\"");
|
|
dat.WriteLine();
|
|
dat.WriteLine();
|
|
} finally {
|
|
dat.Close();
|
|
}
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(dep_path))
|
|
fso.DeleteFile(dep_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="SetCAB">
|
|
<runtime>
|
|
<description>Configures MSI package to use external CAB file.</description>
|
|
<unnamed name="<database.msi>" helpstring="Output MSI file" required="true"/>
|
|
<unnamed name="<input.inf>" helpstring="Input INF file" required="true"/>
|
|
<named name="I" helpstring="Input files folder" type="string" required="false"/>
|
|
<named name="E" helpstring="Embed CAB file" type="simple" required="false"/>
|
|
</runtime>
|
|
<script language="JScript" src="MSI.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 2) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
installer = WScript.CreateObject("WindowsInstaller.Installer"),
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
input_path = WScript.Arguments.Named.Exists("I") ? WScript.Arguments.Named("I") : "",
|
|
embed = WScript.Arguments.Named.Exists("E") ? true : false,
|
|
msi_path = WScript.Arguments.Unnamed(0),
|
|
inf_path = WScript.Arguments.Unnamed(1),
|
|
cab_path = null,
|
|
cab_name;
|
|
|
|
// No user interaction is desired.
|
|
installer.UILevel = msiUILevelNone;
|
|
|
|
var
|
|
database = installer.OpenDatabase(msi_path, msiOpenDatabaseModeTransact),
|
|
session = installer.OpenPackage(database, 1),
|
|
shortNames = session.Mode(msiRunModeSourceShortNames),
|
|
lastSequence = 0,
|
|
stat,
|
|
view,
|
|
record,
|
|
updateMode,
|
|
sumInfo,
|
|
today = new Date();
|
|
|
|
if (input_path)
|
|
session.Property("OriginalDatabase") = input_path;
|
|
|
|
stat = session.DoAction("CostInitialize");
|
|
if (stat != 1)
|
|
throw new Error("Error calling CostInitialize() (code " + stat + ").");
|
|
|
|
var
|
|
dat = fso.OpenTextFile(inf_path, 1);
|
|
|
|
try {
|
|
var
|
|
section = null,
|
|
re_section = new RegExp("^\\s*\\[([^\\]]*)\\]\\s*$", "i"),
|
|
re_file_list = new RegExp("^\\s*\\((\\d+)\\)\\s*(\\d+)\\s*[:]([^=]+)[=]\\s*(\\d+)\\s*$", "i"),
|
|
re_cabinet_list = new RegExp("^\\s*(\\d+)\\s*[,]\\s*(\\d+)\\s*[,](.*)$", "i");
|
|
|
|
while (!dat.AtEndOfStream) {
|
|
var
|
|
s = new String(dat.ReadLine()),
|
|
m;
|
|
|
|
if (m = s.match(re_section)) {
|
|
// We found a section.
|
|
section = new String(m[1]);
|
|
} else if (section.toLowerCase() == "file list") {
|
|
if (m = s.match(re_file_list)) {
|
|
var
|
|
fileNum = parseInt(m[2], 10),
|
|
fileId = Trim(m[3]);
|
|
|
|
// Set file sequence in database.
|
|
view = database.OpenView("SELECT Sequence,Attributes FROM File WHERE File='" + _S(fileId) + "'");
|
|
view.Execute();
|
|
record = view.Fetch();
|
|
if (record) {
|
|
record.IntegerData(1) = fileNum;
|
|
// record.IntegerData(2) = (record.IntegerData(2) & ~msidbFileAttributesNoncompressed) | msidbFileAttributesCompressed;
|
|
view.Modify(msiViewModifyUpdate, record);
|
|
}
|
|
view.Close();
|
|
|
|
if (fileNum > lastSequence)
|
|
lastSequence = fileNum;
|
|
}
|
|
} else if (section.toLowerCase() == "cabinet list") {
|
|
if (m = s.match(re_cabinet_list)) {
|
|
if (cab_path)
|
|
throw new Error("INF file can contain one CAB archive only.");
|
|
|
|
// Read archive file name.
|
|
cab_path = Trim(m[3]);
|
|
cab_name = cab_path.split("\\");
|
|
cab_name = cab_name[cab_name.length - 1];
|
|
}
|
|
}
|
|
}
|
|
} finally {
|
|
dat.Close();
|
|
}
|
|
|
|
view = database.OpenView("SELECT DiskId,LastSequence,Cabinet FROM Media ORDER BY DiskId");
|
|
view.Execute();
|
|
record = view.Fetch();
|
|
updateMode = msiViewModifyUpdate;
|
|
if (!record) {
|
|
// Media table is empty.
|
|
record = installer.CreateRecord(3);
|
|
record.IntegerData(1) = 1;
|
|
updateMode = msiViewModifyInsert;
|
|
}
|
|
record.IntegerData(2) = lastSequence;
|
|
record.StringData(3) = (embed ? "#" : "") + cab_name;
|
|
view.Modify(updateMode, record);
|
|
|
|
sumInfo = database.SummaryInformation(3);
|
|
sumInfo.Property(PID_LASTPRINTED) = today.getVarDate();
|
|
sumInfo.Property(PID_LASTSAVE_DTM) = today.getVarDate();
|
|
sumInfo.Property(PID_WORDCOUNT) = (shortNames ? 1 : 0) | 2;
|
|
sumInfo.Persist();
|
|
|
|
if (embed) {
|
|
view = database.OpenView("SELECT Name,Data FROM _Streams");
|
|
view.Execute();
|
|
record = installer.CreateRecord(2);
|
|
record.StringData(1) = cab_name;
|
|
record.SetStream(2, cab_path);
|
|
view.Modify(msiViewModifyAssign, record);
|
|
}
|
|
|
|
// Commit database
|
|
database.Commit();
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="MakeMST">
|
|
<runtime>
|
|
<description>Build MSI language from differences between two MSI files.</description>
|
|
<unnamed name="<source.msi>" helpstring="Original MSI file" required="true"/>
|
|
<unnamed name="<destination.msi>" helpstring="Updated MSI file" required="true"/>
|
|
<unnamed name="<diff.mst>" helpstring="Output MST file" required="true"/>
|
|
</runtime>
|
|
<script language="JScript" src="MSI.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 3) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
mst_path = WScript.Arguments.Unnamed(2);
|
|
|
|
try {
|
|
var
|
|
installer = WScript.CreateObject("WindowsInstaller.Installer"),
|
|
db_src = installer.OpenDatabase(WScript.Arguments.Unnamed(0), msiOpenDatabaseModeReadOnly),
|
|
db_dst = installer.OpenDatabase(WScript.Arguments.Unnamed(1), msiOpenDatabaseModeReadOnly);
|
|
|
|
db_dst.GenerateTransform(db_src, mst_path);
|
|
db_dst.CreateTransformSummaryInfo(db_src, mst_path, msiTransformErrorNone, msiTransformValidationNone);
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(mst_path))
|
|
fso.DeleteFile(mst_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="AddStorage">
|
|
<runtime>
|
|
<description>Adds sub-storage to MSI file.</description>
|
|
<unnamed name="<database.msi>" helpstring="MSI database file" required="true"/>
|
|
<unnamed name="<transform.mst>" helpstring="MST file to add as a sub-storage" required="true"/>
|
|
<unnamed name="<name>" helpstring="Sub-storage name" required="true"/>
|
|
<named name="L" helpstring="Add transform to the list of language transforms" type="boolean" required="false"/>
|
|
</runtime>
|
|
<script language="JScript" src="MSI.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 3) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
msi_path = WScript.Arguments.Unnamed(0);
|
|
|
|
try {
|
|
var
|
|
installer = WScript.CreateObject("WindowsInstaller.Installer"),
|
|
database = installer.OpenDatabase(msi_path, msiOpenDatabaseModeTransact),
|
|
view = database.OpenView("SELECT Name,Data FROM _Storages"),
|
|
record = installer.CreateRecord(2),
|
|
stream_path = WScript.Arguments.Unnamed(1),
|
|
stream_name = WScript.Arguments.Unnamed(2);
|
|
|
|
try {
|
|
// Inserts or updates sub-storage.
|
|
record.StringData(1) = stream_name;
|
|
view.Execute(record);
|
|
record.SetStream(2, stream_path);
|
|
view.Modify(msiViewModifyAssign, record);
|
|
} catch (err) {
|
|
throw new Error(err.number, "" + stream_path + ": " + err.description);
|
|
}
|
|
|
|
if (WScript.Arguments.Named.Exists("L") && WScript.Arguments.Named("L") != false) {
|
|
// Get platform.
|
|
var
|
|
sumInfo = database.SummaryInformation(1),
|
|
template = sumInfo.Property(PID_TEMPLATE),
|
|
idx_delim = template.indexOf(";"),
|
|
platform = idx_delim >= 0 ? template.substring(0, idx_delim + 1) : ";",
|
|
languages = idx_delim >= 0 ? template.substring(idx_delim + 1).split(new RegExp("\\s*,\\s*")) : new Array();
|
|
|
|
languages.push(stream_name);
|
|
|
|
// Set template property.
|
|
sumInfo.Property(PID_TEMPLATE) = platform + languages.join(",");
|
|
sumInfo.Persist();
|
|
}
|
|
|
|
// Commit database
|
|
database.Commit();
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(msi_path))
|
|
fso.DeleteFile(msi_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="IDTDiff">
|
|
<runtime>
|
|
<description>Extract strings to translate by comparing two IDT files.</description>
|
|
<unnamed name="<output.po>" helpstring="Output PO file" required="true"/>
|
|
<unnamed name="<source.idt>" helpstring="Original IDT file" required="true"/>
|
|
<unnamed name="<destination.idt>" helpstring="Translated IDT file" required="true"/>
|
|
<named name="L" helpstring="Language identifier" type="string" required="false"/>
|
|
</runtime>
|
|
<reference object="ADODB.Stream"/>
|
|
<reference object="Scripting.FileSystemObject"/>
|
|
<script language="JScript" src="IDT.js"/>
|
|
<script language="JScript" src="PO.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 3) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
po_path = WScript.Arguments.Unnamed(0);
|
|
|
|
try {
|
|
// Open and parse IDT file(s).
|
|
var
|
|
idt_src_path = WScript.Arguments.Unnamed(1),
|
|
idt_src = new IDT(idt_src_path),
|
|
idt_dst = new IDT(WScript.Arguments.Unnamed(2));
|
|
|
|
// IDT files must represent identical table.
|
|
if (idt_src.columns.toString() != idt_dst.columns.toString() ||
|
|
idt_src.types .toString() != idt_dst.types .toString() ||
|
|
idt_src.table != idt_dst.table ||
|
|
idt_src.key .toString() != idt_dst.key .toString())
|
|
throw new Error("IDT files are not compatible.");
|
|
|
|
var po = new POCatalog();
|
|
|
|
// Add header.
|
|
po.push("",
|
|
"MIME-Version: 1.0\n" +
|
|
"Content-Type: text/plain; charset=" + po.charset + "\n" +
|
|
"Content-Transfer-Encoding: 8bit\n" +
|
|
(WScript.Arguments.Named.Exists("L") ? "Language: "+ WScript.Arguments.Named("L") +"\n" : ""), false);
|
|
|
|
// Build translations.
|
|
for (var key in idt_src.data) {
|
|
if (key in idt_dst.data) {
|
|
// We found a record in both IDT files.
|
|
for (var col in idt_src.types)
|
|
if (idt_src.isLocalizable(col) && idt_src.data[key][col] != "")
|
|
po.push(idt_src.data[key][col], idt_dst.data[key][col], false, "#: " + idt_src_path + ":" + idt_src.linenum[key]);
|
|
} else {
|
|
// The record is available in the source IDT file only.
|
|
for (var col in idt_src.types)
|
|
if (idt_src.isLocalizable(col) && idt_src.data[key][col] != "")
|
|
po.push(idt_src.data[key][col], "", false, "#: " + idt_src_path + ":" + idt_src.linenum[key]);
|
|
}
|
|
}
|
|
|
|
// Save to file.
|
|
po.save(po_path);
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(po_path))
|
|
fso.DeleteFile(po_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="IDTExtract">
|
|
<runtime>
|
|
<description>Extract strings to translate.</description>
|
|
<unnamed name="<output.po>" helpstring="Output PO file" required="true"/>
|
|
<unnamed name="<source.idt>..." helpstring="Source IDT files" required="true"/>
|
|
</runtime>
|
|
<reference object="ADODB.Stream"/>
|
|
<reference object="Scripting.FileSystemObject"/>
|
|
<script language="JScript" src="IDT.js"/>
|
|
<script language="JScript" src="PO.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 2) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
po_path = WScript.Arguments.Unnamed(0);
|
|
|
|
try {
|
|
var po = new POCatalog();
|
|
|
|
// Add header.
|
|
po.push("",
|
|
"MIME-Version: 1.0\n" +
|
|
"Content-Type: text/plain; charset=" + po.charset + "\n" +
|
|
"Content-Transfer-Encoding: 8bit\n", false);
|
|
|
|
// Build translations.
|
|
for (var i = 1, argc = WScript.Arguments.Unnamed.Length; i < argc; i++) {
|
|
// Open and parse IDT file(s).
|
|
var
|
|
idt_src_path = WScript.Arguments.Unnamed(i),
|
|
idt_src = new IDT(idt_src_path);
|
|
|
|
for (var key in idt_src.data) {
|
|
for (var col in idt_src.types)
|
|
if (idt_src.isLocalizable(col) && idt_src.data[key][col] != "") {
|
|
var src = idt_src.data[key][col];
|
|
var t = po.search(src);
|
|
if (t) {
|
|
// Text-to-translate already present. Add source to the list.
|
|
t["#"] += " " + idt_src_path + ":" + idt_src.linenum[key];
|
|
} else {
|
|
// Add text-to-translate.
|
|
po.push(src, "", false, "#: " + idt_src_path + ":" + idt_src.linenum[key]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Save to file.
|
|
po.save(po_path);
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(po_path))
|
|
fso.DeleteFile(po_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="IDTTranslate">
|
|
<runtime>
|
|
<description>Translate IDT file.</description>
|
|
<unnamed name="<destination.idt>" helpstring="Translated IDT file" required="true"/>
|
|
<unnamed name="<source.idt>" helpstring="Original IDT file" required="true"/>
|
|
<unnamed name="<catalogue.po>" helpstring="PO catalog file with translations" required="true"/>
|
|
<named name="CP" helpstring="Output code page" type="string" required="false"/>
|
|
</runtime>
|
|
<reference object="ADODB.Stream"/>
|
|
<reference object="Scripting.FileSystemObject"/>
|
|
<script language="JScript" src="IDT.js"/>
|
|
<script language="JScript" src="PO.js"/>
|
|
<script language="JScript" src="String.js"/>
|
|
<script language="JScript"><![CDATA[
|
|
if (WScript.Arguments.Unnamed.Length < 3) {
|
|
WScript.Arguments.ShowUsage();
|
|
WScript.Quit(1);
|
|
}
|
|
|
|
var
|
|
fso = WScript.CreateObject("Scripting.FileSystemObject"),
|
|
idt_dst_path = WScript.Arguments.Unnamed(0);
|
|
|
|
try {
|
|
// Open and parse source IDT file and PO catalogue.
|
|
var
|
|
idt_src = new IDT(WScript.Arguments.Unnamed(1)),
|
|
po = new POCatalog(WScript.Arguments.Unnamed(2));
|
|
|
|
// Translate records.
|
|
for (var key in idt_src.data) {
|
|
for (var col in idt_src.types) {
|
|
if (idt_src.isLocalizable(col) && idt_src.data[key][col] != "")
|
|
idt_src.data[key][col] = po.translate(idt_src.data[key][col]);
|
|
}
|
|
}
|
|
|
|
if (WScript.Arguments.Named.Exists("CP"))
|
|
idt_src.codepage = parseInt(WScript.Arguments.Named("CP"), 10);
|
|
idt_src.save(idt_dst_path);
|
|
} catch (err) {
|
|
// In case of error, delete output file.
|
|
if (fso.FileExists(idt_dst_path))
|
|
fso.DeleteFile(idt_dst_path);
|
|
|
|
throw err;
|
|
}
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
<job id="MakeGUID">
|
|
<runtime>
|
|
<description>Creates a new GUID and displays it on output.</description>
|
|
<named name="M" helpstring="Makefile macro name" type="string" required="false"/>
|
|
</runtime>
|
|
<reference object="Scriptlet.TypeLib"/>
|
|
<script language="JScript"><![CDATA[
|
|
var
|
|
tlib = WScript.CreateObject("Scriptlet.TypeLib"),
|
|
guid = tlib.Guid;
|
|
|
|
WScript.Echo(
|
|
WScript.Arguments.Named.Exists("M") ? WScript.Arguments.Named("M") + "=" + guid.toUpperCase() :
|
|
guid.toUpperCase());
|
|
|
|
WScript.Quit(0);
|
|
]]></script>
|
|
</job>
|
|
|
|
<signature>
|
|
** SIG ** MIIbIAYJKoZIhvcNAQcCoIIbETCCGw0CAQExCzAJBgUr
|
|
** SIG ** DgMCGgUAMGcGCisGAQQBgjcCAQSgWTBXMDIGCisGAQQB
|
|
** SIG ** gjcCAR4wJAIBAQQQcAVhGs441BGiowAQS9NQkAIBAAIB
|
|
** SIG ** AAIBAAIBAAIBADAhMAkGBSsOAwIaBQAEFPORRkYELKei
|
|
** SIG ** 2y91UfATkJR3evmPoIIKLzCCBM4wggO2oAMCAQICEDB6
|
|
** SIG ** NnqqPmiBpvlPCMs7OWQwDQYJKoZIhvcNAQELBQAwfzEL
|
|
** SIG ** MAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFudGVjIENv
|
|
** SIG ** cnBvcmF0aW9uMR8wHQYDVQQLExZTeW1hbnRlYyBUcnVz
|
|
** SIG ** dCBOZXR3b3JrMTAwLgYDVQQDEydTeW1hbnRlYyBDbGFz
|
|
** SIG ** cyAzIFNIQTI1NiBDb2RlIFNpZ25pbmcgQ0EwHhcNMTUx
|
|
** SIG ** MDA5MDAwMDAwWhcNMTgxMTA3MjM1OTU5WjBhMQswCQYD
|
|
** SIG ** VQQGEwJTSTERMA8GA1UECBMIU2xvdmVuaWExDzANBgNV
|
|
** SIG ** BAcTBkthbW5pazEWMBQGA1UEChQNQW1lYmlzIGQuby5v
|
|
** SIG ** LjEWMBQGA1UEAxQNQW1lYmlzIGQuby5vLjCCASIwDQYJ
|
|
** SIG ** KoZIhvcNAQEBBQADggEPADCCAQoCggEBAJfy6Bdwx2kq
|
|
** SIG ** yGhtaYAZgcA8pWLe7EbyLqBHRq/8jIVfUX1CH7fsbEz1
|
|
** SIG ** UDgIq74BvilG3BNyjJxh/lbiu2Pr2M0ad3WEy4p0kM9T
|
|
** SIG ** SmABC8k3Vc5pmJlNy1++uMpNwAbUmbGcD6Igsvk1xPWb
|
|
** SIG ** ApLoAdnO0KfTfzvRI40A0cGZVGt5y6GPemN6jT8JAp9O
|
|
** SIG ** KaWIqj3iF00c/FwS7ODZf2w/cMphLjUle+b86GyewVGE
|
|
** SIG ** MEVO5ZjS9ksEWBDWn9A6XYshSwbDWnx4xmIl0B4DcWVA
|
|
** SIG ** aY+zqEQzQbzEGC/izPDq44RiCtbhi+QqgQ/6fNXm3hbA
|
|
** SIG ** GVcYPYa4J5D1UMO+1NC2cPMCAwEAAaOCAWIwggFeMAkG
|
|
** SIG ** A1UdEwQCMAAwDgYDVR0PAQH/BAQDAgeAMCsGA1UdHwQk
|
|
** SIG ** MCIwIKAeoByGGmh0dHA6Ly9zdi5zeW1jYi5jb20vc3Yu
|
|
** SIG ** Y3JsMGYGA1UdIARfMF0wWwYLYIZIAYb4RQEHFwMwTDAj
|
|
** SIG ** BggrBgEFBQcCARYXaHR0cHM6Ly9kLnN5bWNiLmNvbS9j
|
|
** SIG ** cHMwJQYIKwYBBQUHAgIwGQwXaHR0cHM6Ly9kLnN5bWNi
|
|
** SIG ** LmNvbS9ycGEwEwYDVR0lBAwwCgYIKwYBBQUHAwMwVwYI
|
|
** SIG ** KwYBBQUHAQEESzBJMB8GCCsGAQUFBzABhhNodHRwOi8v
|
|
** SIG ** c3Yuc3ltY2QuY29tMCYGCCsGAQUFBzAChhpodHRwOi8v
|
|
** SIG ** c3Yuc3ltY2IuY29tL3N2LmNydDAfBgNVHSMEGDAWgBSW
|
|
** SIG ** O1PweTOXr32D7y4rzMq3hh5yZjAdBgNVHQ4EFgQU9we9
|
|
** SIG ** loCaLXTEfww9PSfd1JAKn8wwDQYJKoZIhvcNAQELBQAD
|
|
** SIG ** ggEBAIpxL0AvtcrbShLKgI7dmLn6WJbpdzkB9e2Cm1Mu
|
|
** SIG ** AAIiogLFF1n07l0VXZE+gqxGHB8ji2h33t+o1R8PLyyI
|
|
** SIG ** kdnMhHAd78HsqyZzabfmWuCP12TKBv77wiZkpbTo/Av+
|
|
** SIG ** z0SlpJRoMpzzXhyPPtHdby80bSu+4RXlewiDCH56aGE4
|
|
** SIG ** SSk0i8Xa9JJ/ozPKLX3Szdmg6J58XtDH/tq5K1/ABSCB
|
|
** SIG ** z6SF2Y9l9lRJpGXchSDYCPipSVUGP0WPQRTDNobSwCJD
|
|
** SIG ** XAz9UFcxWo4Rh8o/gvlLWUH+T3HhmLSRzXqt3JuqJo5x
|
|
** SIG ** H8s4vPzcGBZZFob8yRB98KD6ioFK2pjRRSw9FucwggVZ
|
|
** SIG ** MIIEQaADAgECAhA9eNf5dklgsmF99PAeyoYqMA0GCSqG
|
|
** SIG ** SIb3DQEBCwUAMIHKMQswCQYDVQQGEwJVUzEXMBUGA1UE
|
|
** SIG ** ChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlT
|
|
** SIG ** aWduIFRydXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAy
|
|
** SIG ** MDA2IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6
|
|
** SIG ** ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENs
|
|
** SIG ** YXNzIDMgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlv
|
|
** SIG ** biBBdXRob3JpdHkgLSBHNTAeFw0xMzEyMTAwMDAwMDBa
|
|
** SIG ** Fw0yMzEyMDkyMzU5NTlaMH8xCzAJBgNVBAYTAlVTMR0w
|
|
** SIG ** GwYDVQQKExRTeW1hbnRlYyBDb3Jwb3JhdGlvbjEfMB0G
|
|
** SIG ** A1UECxMWU3ltYW50ZWMgVHJ1c3QgTmV0d29yazEwMC4G
|
|
** SIG ** A1UEAxMnU3ltYW50ZWMgQ2xhc3MgMyBTSEEyNTYgQ29k
|
|
** SIG ** ZSBTaWduaW5nIENBMIIBIjANBgkqhkiG9w0BAQEFAAOC
|
|
** SIG ** AQ8AMIIBCgKCAQEAl4MeABavLLHSCMTXaJNRYB5x9uJH
|
|
** SIG ** tNtYTSNiarS/WhtR96MNGHdou9g2qy8hUNqe8+dfJ04L
|
|
** SIG ** wpfICXCTqdpcDU6kDZGgtOwUzpFyVC7Oo9tE6VIbP0E8
|
|
** SIG ** ykrkqsDoOatTzCHQzM9/m+bCzFhqghXuPTbPHMWXBySO
|
|
** SIG ** 8Xu+MS09bty1mUKfS2GVXxxw7hd924vlYYl4x2gbrxF4
|
|
** SIG ** GpiuxFVHU9mzMtahDkZAxZeSitFTp5lbhTVX0+qTYmEg
|
|
** SIG ** CscwdyQRTWKDtrp7aIIx7mXK3/nVjbI13Iwrb2pyXGCE
|
|
** SIG ** nPIMlF7AVlIASMzT+KV93i/XE+Q4qITVRrgThsIbnepa
|
|
** SIG ** ON2b2wIDAQABo4IBgzCCAX8wLwYIKwYBBQUHAQEEIzAh
|
|
** SIG ** MB8GCCsGAQUFBzABhhNodHRwOi8vczIuc3ltY2IuY29t
|
|
** SIG ** MBIGA1UdEwEB/wQIMAYBAf8CAQAwbAYDVR0gBGUwYzBh
|
|
** SIG ** BgtghkgBhvhFAQcXAzBSMCYGCCsGAQUFBwIBFhpodHRw
|
|
** SIG ** Oi8vd3d3LnN5bWF1dGguY29tL2NwczAoBggrBgEFBQcC
|
|
** SIG ** AjAcGhpodHRwOi8vd3d3LnN5bWF1dGguY29tL3JwYTAw
|
|
** SIG ** BgNVHR8EKTAnMCWgI6Ahhh9odHRwOi8vczEuc3ltY2Iu
|
|
** SIG ** Y29tL3BjYTMtZzUuY3JsMB0GA1UdJQQWMBQGCCsGAQUF
|
|
** SIG ** BwMCBggrBgEFBQcDAzAOBgNVHQ8BAf8EBAMCAQYwKQYD
|
|
** SIG ** VR0RBCIwIKQeMBwxGjAYBgNVBAMTEVN5bWFudGVjUEtJ
|
|
** SIG ** LTEtNTY3MB0GA1UdDgQWBBSWO1PweTOXr32D7y4rzMq3
|
|
** SIG ** hh5yZjAfBgNVHSMEGDAWgBR/02Wnwt3su/AwCfNDOfoC
|
|
** SIG ** rzMxMzANBgkqhkiG9w0BAQsFAAOCAQEAE4UaHmmpN/eg
|
|
** SIG ** vaSvfh1hU/6djF4MpnUeeBcj3f3sGgNVOftxlcdlWqeO
|
|
** SIG ** MNJEWmHbcG/aIQXCLnO6SfHRk/5dyc1eA+CJnj90Htf3
|
|
** SIG ** OIup1s+7NS8zWKiSVtHITTuC5nmEFvwosLFH8x2iPu6H
|
|
** SIG ** 2aZ/pFalP62ELinefLyoqqM9BAHqupOiDlAiKRdMh+Q6
|
|
** SIG ** EV/WpCWJmwVrL7TJAUwnewusGQUioGAVP9rJ+01Mj/ty
|
|
** SIG ** Z3f9J5THujUOiEn+jf0or0oSvQ2zlwXeRAwV+jYrA9zB
|
|
** SIG ** UAHxoRFdFOXivSdLVL4rhF4PpsN0BQrvl8OJIrEfd/O9
|
|
** SIG ** zUPU8UypP7WLhK9k8tAUITGCEF0wghBZAgEBMIGTMH8x
|
|
** SIG ** CzAJBgNVBAYTAlVTMR0wGwYDVQQKExRTeW1hbnRlYyBD
|
|
** SIG ** b3Jwb3JhdGlvbjEfMB0GA1UECxMWU3ltYW50ZWMgVHJ1
|
|
** SIG ** c3QgTmV0d29yazEwMC4GA1UEAxMnU3ltYW50ZWMgQ2xh
|
|
** SIG ** c3MgMyBTSEEyNTYgQ29kZSBTaWduaW5nIENBAhAwejZ6
|
|
** SIG ** qj5ogab5TwjLOzlkMAkGBSsOAwIaBQCgcDAQBgorBgEE
|
|
** SIG ** AYI3AgEMMQIwADAZBgkqhkiG9w0BCQMxDAYKKwYBBAGC
|
|
** SIG ** NwIBBDAcBgorBgEEAYI3AgELMQ4wDAYKKwYBBAGCNwIB
|
|
** SIG ** FTAjBgkqhkiG9w0BCQQxFgQURL9+7bYvlcnul/cgKu8P
|
|
** SIG ** YCzfsBcwDQYJKoZIhvcNAQEBBQAEggEAh+49jLKm/Wo6
|
|
** SIG ** gqxPR3gvpgxiMZtCxuxt4alsBLqtxLL2QfVh6Cw96lWG
|
|
** SIG ** 22XQz0lJyrfUodXW0jEXMj9ZEtaEPmdcNrLSOfVUkwpz
|
|
** SIG ** m9KkSV5XaLXqFwVw8NqtSE08rsCfuNK1R2VsmU3i6oeL
|
|
** SIG ** kacekBC1u8Vu6tFhqyMLYG7CVXwZ5wDF7mDmEvvx07NR
|
|
** SIG ** D04M5YdXy47gl7iFmT6uSOjRgSav6+ydC/t+5VUijC0T
|
|
** SIG ** c8IZqnAh4O+wXx2lDzrxFLawIoSkakAQXENmkc90j4+J
|
|
** SIG ** at+848jsCcUqi1MLt+dnrHT9P4L8S3m+LTC+cpGNma6D
|
|
** SIG ** +x1D6qjspIGJp7gJphN1LKGCDiwwgg4oBgorBgEEAYI3
|
|
** SIG ** AwMBMYIOGDCCDhQGCSqGSIb3DQEHAqCCDgUwgg4BAgED
|
|
** SIG ** MQ0wCwYJYIZIAWUDBAIBMIH/BgsqhkiG9w0BCRABBKCB
|
|
** SIG ** 7wSB7DCB6QIBAQYLYIZIAYb4RQEHFwMwITAJBgUrDgMC
|
|
** SIG ** GgUABBSIAIDRDFz/dJebI4nUE36E/UpVMQIVAKhQ+dsu
|
|
** SIG ** rZQ/t95xw1Bm3ZoLSh6QGA8yMDE3MDQxODEyNDQ1NVow
|
|
** SIG ** AwIBHqCBhqSBgzCBgDELMAkGA1UEBhMCVVMxHTAbBgNV
|
|
** SIG ** BAoTFFN5bWFudGVjIENvcnBvcmF0aW9uMR8wHQYDVQQL
|
|
** SIG ** ExZTeW1hbnRlYyBUcnVzdCBOZXR3b3JrMTEwLwYDVQQD
|
|
** SIG ** EyhTeW1hbnRlYyBTSEEyNTYgVGltZVN0YW1waW5nIFNp
|
|
** SIG ** Z25lciAtIEcyoIIKizCCBTgwggQgoAMCAQICEHsFsdRJ
|
|
** SIG ** aFFE98mJ0pwZnRIwDQYJKoZIhvcNAQELBQAwgb0xCzAJ
|
|
** SIG ** BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5j
|
|
** SIG ** LjEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29y
|
|
** SIG ** azE6MDgGA1UECxMxKGMpIDIwMDggVmVyaVNpZ24sIElu
|
|
** SIG ** Yy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25seTE4MDYG
|
|
** SIG ** A1UEAxMvVmVyaVNpZ24gVW5pdmVyc2FsIFJvb3QgQ2Vy
|
|
** SIG ** dGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTYwMTEyMDAw
|
|
** SIG ** MDAwWhcNMzEwMTExMjM1OTU5WjB3MQswCQYDVQQGEwJV
|
|
** SIG ** UzEdMBsGA1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24x
|
|
** SIG ** HzAdBgNVBAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsx
|
|
** SIG ** KDAmBgNVBAMTH1N5bWFudGVjIFNIQTI1NiBUaW1lU3Rh
|
|
** SIG ** bXBpbmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
|
|
** SIG ** ggEKAoIBAQC7WZ1ZVU+djHJdGoGi61XzsAGtPHGsMo8F
|
|
** SIG ** a4aaJwAyl2pNyWQUSym7wtkpuS7sY7Phzz8LVpD4Yht+
|
|
** SIG ** 66YH4t5/Xm1AONSRBudBfHkcy8utG7/YlZHz8O5s+K2W
|
|
** SIG ** OS5/wSe4eDnFhKXt7a+Hjs6Nx23q0pi1Oh8eOZ3D9Jqo
|
|
** SIG ** 9IThxNF8ccYGKbQ/5IMNJsN7CD5N+Qq3M0n/yjvU9bKb
|
|
** SIG ** S+GImRr1wOkzFNbfx4Dbke7+vJJXcnf0zajM/gn1kze+
|
|
** SIG ** lYhqxdz0sUvUzugJkV+1hHk1inisGTKPI8EyQRtZDqk+
|
|
** SIG ** scz51ivvt9jk1R1tETqS9pPJnONI7rtTDtQ2l4Z4xaE3
|
|
** SIG ** AgMBAAGjggF3MIIBczAOBgNVHQ8BAf8EBAMCAQYwEgYD
|
|
** SIG ** VR0TAQH/BAgwBgEB/wIBADBmBgNVHSAEXzBdMFsGC2CG
|
|
** SIG ** SAGG+EUBBxcDMEwwIwYIKwYBBQUHAgEWF2h0dHBzOi8v
|
|
** SIG ** ZC5zeW1jYi5jb20vY3BzMCUGCCsGAQUFBwICMBkaF2h0
|
|
** SIG ** dHBzOi8vZC5zeW1jYi5jb20vcnBhMC4GCCsGAQUFBwEB
|
|
** SIG ** BCIwIDAeBggrBgEFBQcwAYYSaHR0cDovL3Muc3ltY2Qu
|
|
** SIG ** Y29tMDYGA1UdHwQvMC0wK6ApoCeGJWh0dHA6Ly9zLnN5
|
|
** SIG ** bWNiLmNvbS91bml2ZXJzYWwtcm9vdC5jcmwwEwYDVR0l
|
|
** SIG ** BAwwCgYIKwYBBQUHAwgwKAYDVR0RBCEwH6QdMBsxGTAX
|
|
** SIG ** BgNVBAMTEFRpbWVTdGFtcC0yMDQ4LTMwHQYDVR0OBBYE
|
|
** SIG ** FK9j1sqjToVy4Ke8QfMpojh/gHViMB8GA1UdIwQYMBaA
|
|
** SIG ** FLZ3+mlIR59TEtXC6gcydgfRlwcZMA0GCSqGSIb3DQEB
|
|
** SIG ** CwUAA4IBAQB16rAt1TQZXDJF/g7h1E+meMFv1+rd3E/z
|
|
** SIG ** ociBiPenjxXmQCmt5l30otlWZIRxMCrdHmEXZiBWBpgZ
|
|
** SIG ** jV1x8viXvAn9HJFHyeLojQP7zJAv1gpsTjPs1rSTyEyQ
|
|
** SIG ** Y0g5QCHE3dZuiZg8tZiX6KkGtwnJj1NXQZAv4R5NTtzK
|
|
** SIG ** EHhsQm7wtsX4YVxS9U72a433Snq+8839A9fZ9gOoD+NT
|
|
** SIG ** 9wp17MZ1LqpmhQSZt/gGV+HGDvbor9rsmxgfqrnjOgC/
|
|
** SIG ** zoqUywHbnsc4uw9Sq9HjlANgCk2g/idtFDL8P5dA4b+Z
|
|
** SIG ** idvkORS92uTTw+orWrOVWFUEfcea7CMDjYUq0v+uqWGB
|
|
** SIG ** MIIFSzCCBDOgAwIBAgIQVFjyqtdB1kS8hKl7oJZS5jAN
|
|
** SIG ** BgkqhkiG9w0BAQsFADB3MQswCQYDVQQGEwJVUzEdMBsG
|
|
** SIG ** A1UEChMUU3ltYW50ZWMgQ29ycG9yYXRpb24xHzAdBgNV
|
|
** SIG ** BAsTFlN5bWFudGVjIFRydXN0IE5ldHdvcmsxKDAmBgNV
|
|
** SIG ** BAMTH1N5bWFudGVjIFNIQTI1NiBUaW1lU3RhbXBpbmcg
|
|
** SIG ** Q0EwHhcNMTcwMTAyMDAwMDAwWhcNMjgwNDAxMjM1OTU5
|
|
** SIG ** WjCBgDELMAkGA1UEBhMCVVMxHTAbBgNVBAoTFFN5bWFu
|
|
** SIG ** dGVjIENvcnBvcmF0aW9uMR8wHQYDVQQLExZTeW1hbnRl
|
|
** SIG ** YyBUcnVzdCBOZXR3b3JrMTEwLwYDVQQDEyhTeW1hbnRl
|
|
** SIG ** YyBTSEEyNTYgVGltZVN0YW1waW5nIFNpZ25lciAtIEcy
|
|
** SIG ** MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
|
|
** SIG ** mfP82AQJA4b511ymk8BCfOp8Y89dAOKO88CQ348p9Rjq
|
|
** SIG ** lLeS5dewoHOB6OkKm0p8Af+dj6Q5pw7qRfQiDDpw7TlF
|
|
** SIG ** i+TFG1zwRWhGJAVjdpsc/J5sKrFW5Yp/UnGu8jXVRiMG
|
|
** SIG ** HM9ILR20zbjZdiOOHP8+v7sGXGkHpmUO+F6ufS7tTa41
|
|
** SIG ** 78nXAEL9KJUOn11yQgm8w9pE0u3MR4Tk/MotrFi+rveu
|
|
** SIG ** 2UQNCLfCd9YaQ3DRbgPeUpLEEAhx2boiVfIfvO2bnTvi
|
|
** SIG ** Xh1Mg/+XD3sL51WDTtIN677X7K5uR7mf36XWUbwEVe3/
|
|
** SIG ** J3BMye0qSxPhsblMD8kB7lVlX2kCeGbLPwIDAQABo4IB
|
|
** SIG ** xzCCAcMwDAYDVR0TAQH/BAIwADBmBgNVHSAEXzBdMFsG
|
|
** SIG ** C2CGSAGG+EUBBxcDMEwwIwYIKwYBBQUHAgEWF2h0dHBz
|
|
** SIG ** Oi8vZC5zeW1jYi5jb20vY3BzMCUGCCsGAQUFBwICMBka
|
|
** SIG ** F2h0dHBzOi8vZC5zeW1jYi5jb20vcnBhMEAGA1UdHwQ5
|
|
** SIG ** MDcwNaAzoDGGL2h0dHA6Ly90cy1jcmwud3Muc3ltYW50
|
|
** SIG ** ZWMuY29tL3NoYTI1Ni10c3MtY2EuY3JsMBYGA1UdJQEB
|
|
** SIG ** /wQMMAoGCCsGAQUFBwMIMA4GA1UdDwEB/wQEAwIHgDB3
|
|
** SIG ** BggrBgEFBQcBAQRrMGkwKgYIKwYBBQUHMAGGHmh0dHA6
|
|
** SIG ** Ly90cy1vY3NwLndzLnN5bWFudGVjLmNvbTA7BggrBgEF
|
|
** SIG ** BQcwAoYvaHR0cDovL3RzLWFpYS53cy5zeW1hbnRlYy5j
|
|
** SIG ** b20vc2hhMjU2LXRzcy1jYS5jZXIwKAYDVR0RBCEwH6Qd
|
|
** SIG ** MBsxGTAXBgNVBAMTEFRpbWVTdGFtcC0yMDQ4LTUwHQYD
|
|
** SIG ** VR0OBBYEFAm1wf6WcpcpQ5rJ4AK6rvj9L7r2MB8GA1Ud
|
|
** SIG ** IwQYMBaAFK9j1sqjToVy4Ke8QfMpojh/gHViMA0GCSqG
|
|
** SIG ** SIb3DQEBCwUAA4IBAQAXswqI6VxaXiBrOwoVsmzFqYoy
|
|
** SIG ** h9Ox9BxTroW+P5v/17y3lIW0x1J+lOi97WGy1KeZ5MPJ
|
|
** SIG ** k8E1PQvoaApdVpi9sSI70UR617/wbVEyitUj3zgBN/bi
|
|
** SIG ** Uyt6KxGPt01sejMDG3xrCZQXu+TbWNQhE2Xn7NElyix1
|
|
** SIG ** mpx//Mm7KmirxH20z6PJbKfZxACciQp3kfRNovsxO4Zu
|
|
** SIG ** 9uYfUAOGm7/LQqvmdptyWhEBisbvpW+V592uuuYiZfAY
|
|
** SIG ** WRsRyc2At9iXRx9CCPiscR+wRlOz1LLVo6tQdUgSF4Kt
|
|
** SIG ** z+BBTzJ+zZUcv5GKCD2kp2cClt8kTKXQQcCCYKOKFzJL
|
|
** SIG ** 07zPpLSMMYICWjCCAlYCAQEwgYswdzELMAkGA1UEBhMC
|
|
** SIG ** VVMxHTAbBgNVBAoTFFN5bWFudGVjIENvcnBvcmF0aW9u
|
|
** SIG ** MR8wHQYDVQQLExZTeW1hbnRlYyBUcnVzdCBOZXR3b3Jr
|
|
** SIG ** MSgwJgYDVQQDEx9TeW1hbnRlYyBTSEEyNTYgVGltZVN0
|
|
** SIG ** YW1waW5nIENBAhBUWPKq10HWRLyEqXugllLmMAsGCWCG
|
|
** SIG ** SAFlAwQCAaCBpDAaBgkqhkiG9w0BCQMxDQYLKoZIhvcN
|
|
** SIG ** AQkQAQQwHAYJKoZIhvcNAQkFMQ8XDTE3MDQxODEyNDQ1
|
|
** SIG ** NVowLwYJKoZIhvcNAQkEMSIEIKDK6Vssn4nGmbvyS9LY
|
|
** SIG ** WmkPKs0wWaFNqgdjX9Bg5ZBvMDcGCyqGSIb3DQEJEAIv
|
|
** SIG ** MSgwJjAkMCIEIM96wXrQR+zV/cNoIgMbEtTvB4tvK0xe
|
|
** SIG ** a6Qfj/LPS61nMAsGCSqGSIb3DQEBAQSCAQBfV4PgwAUe
|
|
** SIG ** 4wJ34IGcfXzIeqpR/TjCMh8nv6UiHEBJnIAVSoxoDK79
|
|
** SIG ** uOft1F0SWmscs9Vzjcu/g2mHkKgERhioYXnpfem07AyJ
|
|
** SIG ** lCh8+doOauxqOPLi9HDl4yWm3jlxSD5igIpIzdqYvPU2
|
|
** SIG ** Jq0UavRQBAI3Jg+esyAdKO8iuHoQIYYb9a+lp3MaZuEM
|
|
** SIG ** M41nqogbZYDo5yAsunf23iLA3u7Y0L0g0FE1YaGQp+tx
|
|
** SIG ** 86Ne6DWxMz5dfuWdYvbtTr54PNen9Nzumgt2ZGt4w9VE
|
|
** SIG ** 82/mZL3qBE4RIsiiofrYg83ZdjwbZ8XLMmbb5qyns2qP
|
|
** SIG ** rrsW4XwsKdp9FnWp+u4Xv57J
|
|
</signature>
|
|
</package>
|