teius 0.0.2-mswin32 → 0.1.0-mswin32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/ext/Makefile +138 -0
- data/ext/teius.c +88 -36
- data/ext/teius.o +0 -0
- data/ext/teius.so +0 -0
- data/lib/teius.rb +35 -0
- data/lib/teius.so +0 -0
- data/test/teius_test.rb +57 -3
- metadata +8 -3
data/ext/Makefile
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
|
2
|
+
SHELL = /bin/sh
|
3
|
+
|
4
|
+
#### Start of system configuration section. ####
|
5
|
+
|
6
|
+
srcdir = .
|
7
|
+
topdir = d:/msys/local/lib/ruby/1.8/i386-mingw32
|
8
|
+
hdrdir = $(topdir)
|
9
|
+
VPATH = $(srcdir);$(topdir);$(hdrdir)
|
10
|
+
|
11
|
+
DESTDIR = d:
|
12
|
+
prefix = $(DESTDIR)/msys/local
|
13
|
+
exec_prefix = $(DESTDIR)/msys/local
|
14
|
+
sitedir = $(prefix)/lib/ruby/site_ruby
|
15
|
+
rubylibdir = $(libdir)/ruby/$(ruby_version)
|
16
|
+
archdir = $(rubylibdir)/$(arch)
|
17
|
+
sbindir = $(exec_prefix)/sbin
|
18
|
+
datadir = $(prefix)/share
|
19
|
+
includedir = $(prefix)/include
|
20
|
+
infodir = $(prefix)/info
|
21
|
+
sysconfdir = $(prefix)/etc
|
22
|
+
mandir = $(prefix)/man
|
23
|
+
libdir = $(DESTDIR)/msys/local/lib
|
24
|
+
sharedstatedir = $(prefix)/com
|
25
|
+
oldincludedir = $(DESTDIR)/usr/include
|
26
|
+
sitearchdir = $(sitelibdir)/$(sitearch)
|
27
|
+
bindir = $(exec_prefix)/bin
|
28
|
+
localstatedir = $(prefix)/var
|
29
|
+
sitelibdir = $(sitedir)/$(ruby_version)
|
30
|
+
libexecdir = $(exec_prefix)/libexec
|
31
|
+
|
32
|
+
CC = gcc
|
33
|
+
LIBRUBY = lib$(LIBRUBY_SO).a
|
34
|
+
LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
|
35
|
+
LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
|
36
|
+
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
|
37
|
+
|
38
|
+
CFLAGS = -g -O2
|
39
|
+
CPPFLAGS = -I. -I$(topdir) -I$(hdrdir) -I$(srcdir) -Id:/msys/local/include/libxml2
|
40
|
+
CXXFLAGS = $(CFLAGS)
|
41
|
+
DLDFLAGS = -Wl,--enable-auto-import,--export-all
|
42
|
+
LDSHARED = gcc -shared -s
|
43
|
+
AR = ar
|
44
|
+
EXEEXT = .exe
|
45
|
+
|
46
|
+
RUBY_INSTALL_NAME = ruby
|
47
|
+
RUBY_SO_NAME = msvcrt-ruby18
|
48
|
+
arch = i386-mingw32
|
49
|
+
sitearch = i386-msvcrt
|
50
|
+
ruby_version = 1.8
|
51
|
+
ruby = d:/msys/local/bin/ruby
|
52
|
+
RUBY = $(ruby)
|
53
|
+
RM = rm -f
|
54
|
+
MAKEDIRS = mkdir -p
|
55
|
+
INSTALL = /bin/install -c
|
56
|
+
INSTALL_PROG = $(INSTALL) -m 0755
|
57
|
+
INSTALL_DATA = $(INSTALL) -m 644
|
58
|
+
COPY = cp
|
59
|
+
|
60
|
+
#### End of system configuration section. ####
|
61
|
+
|
62
|
+
preload =
|
63
|
+
|
64
|
+
libpath = d:/msys/local/lib $(libdir)
|
65
|
+
LIBPATH = -L"d:/msys/local/lib" -L"$(libdir)"
|
66
|
+
DEFFILE =
|
67
|
+
|
68
|
+
CLEANFILES =
|
69
|
+
DISTCLEANFILES =
|
70
|
+
|
71
|
+
extout =
|
72
|
+
extout_prefix =
|
73
|
+
target_prefix =
|
74
|
+
LOCAL_LIBS =
|
75
|
+
LIBS = $(LIBRUBYARG_SHARED) -lxml2 -lwsock32
|
76
|
+
SRCS = teius.c
|
77
|
+
OBJS = teius.o
|
78
|
+
TARGET = teius
|
79
|
+
DLLIB = $(TARGET).so
|
80
|
+
STATIC_LIB =
|
81
|
+
|
82
|
+
RUBYCOMMONDIR = $(sitedir)$(target_prefix)
|
83
|
+
RUBYLIBDIR = $(sitelibdir)$(target_prefix)
|
84
|
+
RUBYARCHDIR = $(sitearchdir)$(target_prefix)
|
85
|
+
|
86
|
+
TARGET_SO = $(DLLIB)
|
87
|
+
CLEANLIBS = $(TARGET).so $(TARGET).il? $(TARGET).tds $(TARGET).map
|
88
|
+
CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
|
89
|
+
|
90
|
+
all: $(DLLIB)
|
91
|
+
static: $(STATIC_LIB)
|
92
|
+
|
93
|
+
clean:
|
94
|
+
@-$(RM) $(CLEANLIBS:/=\) $(CLEANOBJS:/=\) $(CLEANFILES:/=\)
|
95
|
+
|
96
|
+
distclean: clean
|
97
|
+
@-$(RM) Makefile extconf.h conftest.* mkmf.log
|
98
|
+
@-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES:/=\)
|
99
|
+
|
100
|
+
realclean: distclean
|
101
|
+
install: install-so install-rb
|
102
|
+
|
103
|
+
install-so: $(RUBYARCHDIR)
|
104
|
+
install-so: $(RUBYARCHDIR)/$(DLLIB)
|
105
|
+
$(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
|
106
|
+
$(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
|
107
|
+
install-rb: pre-install-rb install-rb-default
|
108
|
+
install-rb-default: pre-install-rb-default
|
109
|
+
pre-install-rb: Makefile
|
110
|
+
pre-install-rb-default: Makefile
|
111
|
+
$(RUBYARCHDIR):
|
112
|
+
$(MAKEDIRS) $@
|
113
|
+
|
114
|
+
site-install: site-install-so site-install-rb
|
115
|
+
site-install-so: install-so
|
116
|
+
site-install-rb: install-rb
|
117
|
+
|
118
|
+
.SUFFIXES: .c .m .cc .cxx .cpp .o
|
119
|
+
|
120
|
+
.cc.o:
|
121
|
+
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
|
122
|
+
|
123
|
+
.cxx.o:
|
124
|
+
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
|
125
|
+
|
126
|
+
.cpp.o:
|
127
|
+
$(CXX) $(CXXFLAGS) $(CPPFLAGS) -c $<
|
128
|
+
|
129
|
+
.c.o:
|
130
|
+
$(CC) $(CFLAGS) $(CPPFLAGS) -c $<
|
131
|
+
|
132
|
+
$(DLLIB): $(OBJS)
|
133
|
+
@-$(RM) $@
|
134
|
+
$(LDSHARED) $(DLDFLAGS) $(LIBPATH) -o $@ $(OBJS) $(LOCAL_LIBS) $(LIBS)
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
$(OBJS): ruby.h defines.h
|
data/ext/teius.c
CHANGED
@@ -6,12 +6,14 @@
|
|
6
6
|
|
7
7
|
static VALUE cParseError;
|
8
8
|
static VALUE cXpathError;
|
9
|
-
static VALUE
|
9
|
+
static VALUE cNodeNotFound;
|
10
|
+
static VALUE cNodeNotUnique;
|
10
11
|
static VALUE cNode;
|
11
12
|
static VALUE cDocument;
|
12
13
|
static ID sRequired;
|
13
14
|
static ID sFirst;
|
14
15
|
static ID sAll;
|
16
|
+
static ID sUnique;
|
15
17
|
|
16
18
|
static void doc_free(void *p) {
|
17
19
|
xmlFreeDoc(p);
|
@@ -62,24 +64,24 @@ static VALUE node_find(int argc, VALUE *argv, VALUE self) {
|
|
62
64
|
rb_scan_args(argc, argv, "21", &rType, &rXpath, &rOptions);
|
63
65
|
int required = 0;
|
64
66
|
if (argc == 3) {
|
65
|
-
VALUE rRequired = rb_hash_aref(rOptions, sRequired);
|
66
|
-
required = rRequired != Qnil;
|
67
|
+
VALUE rRequired = rb_hash_aref(rOptions, ID2SYM(sRequired));
|
68
|
+
required = rRequired != Qnil && rRequired != Qfalse;
|
67
69
|
}
|
68
70
|
|
69
71
|
xmlNodePtr node = NULL;
|
70
72
|
Data_Get_Struct(self, xmlNode, node);
|
71
73
|
xmlDocPtr doc = node->doc;
|
72
74
|
|
73
|
-
|
74
|
-
|
75
|
+
xmlXPathContextPtr context;
|
76
|
+
xmlXPathObjectPtr result;
|
75
77
|
|
76
|
-
|
78
|
+
context = xmlXPathNewContext(doc);
|
77
79
|
context->node = node;
|
78
80
|
|
79
81
|
char *xpath = StringValuePtr(rXpath);
|
80
82
|
result = xmlXPathEvalExpression(xpath, context);
|
81
83
|
if (result == NULL) {
|
82
|
-
|
84
|
+
xmlErrorPtr err = xmlGetLastError();
|
83
85
|
xmlXPathFreeContext(context);
|
84
86
|
rb_raise(cXpathError, "Couldn't evaluate xpath [%s]: %s",
|
85
87
|
xpath, err->message);
|
@@ -88,19 +90,24 @@ static VALUE node_find(int argc, VALUE *argv, VALUE self) {
|
|
88
90
|
xmlNodeSetPtr node_set = result->nodesetval;
|
89
91
|
int size = node_set != NULL ? node_set->nodeNr : 0;
|
90
92
|
|
93
|
+
ID type = SYM2ID(rType);
|
91
94
|
if (size == 0 && required) {
|
92
95
|
xmlXPathFreeObject(result);
|
93
96
|
xmlXPathFreeContext(context);
|
94
|
-
rb_raise(
|
97
|
+
rb_raise(cNodeNotFound, "No such node in %s: %s", node->name, xpath);
|
98
|
+
} else if (size > 1 && type == sUnique) {
|
99
|
+
xmlXPathFreeObject(result);
|
100
|
+
xmlXPathFreeContext(context);
|
101
|
+
rb_raise(cNodeNotUnique, "node at path %s from %s is not unique",
|
102
|
+
xpath, node->name);
|
95
103
|
}
|
96
104
|
|
97
105
|
VALUE rResult;
|
98
|
-
|
99
|
-
if (type == sFirst) { /* Just return first node */
|
106
|
+
if (type == sFirst || type == sUnique) { /* Just return first node */
|
100
107
|
if (size == 0) {
|
101
108
|
rResult = Qnil;
|
102
109
|
} else {
|
103
|
-
|
110
|
+
rResult = Data_Wrap_Struct(cNode, 0, 0, node_set->nodeTab[0]);
|
104
111
|
}
|
105
112
|
} else if (type == sAll) { /* Return ruby array of all nodes */
|
106
113
|
int i;
|
@@ -108,15 +115,15 @@ static VALUE node_find(int argc, VALUE *argv, VALUE self) {
|
|
108
115
|
for (i=0; i < size; i++) {
|
109
116
|
xmlNodePtr cur_node = node_set->nodeTab[i];
|
110
117
|
|
111
|
-
/* Create
|
118
|
+
/* Create Node and store it in arr */
|
112
119
|
VALUE rNode = Data_Wrap_Struct(cNode, 0, 0, cur_node);
|
113
120
|
rb_ary_store(arr, i, rNode);
|
114
121
|
}
|
115
|
-
rResult = arr;
|
122
|
+
rResult = arr;
|
116
123
|
} else {
|
117
124
|
xmlXPathFreeObject(result);
|
118
125
|
xmlXPathFreeContext(context);
|
119
|
-
rb_raise(rb_eArgError, "Unknown type: :%s (should be :first or :all)",
|
126
|
+
rb_raise(rb_eArgError, "Unknown type: :%s (should be :first, :unique or :all)",
|
120
127
|
rb_id2name(type));
|
121
128
|
}
|
122
129
|
|
@@ -132,18 +139,56 @@ static VALUE node_name(VALUE self) {
|
|
132
139
|
return rb_str_new2(node->name);
|
133
140
|
}
|
134
141
|
|
142
|
+
static VALUE node_xpath(VALUE self) {
|
143
|
+
xmlNodePtr node = NULL;
|
144
|
+
Data_Get_Struct(self, xmlNode, node);
|
145
|
+
return rb_str_new2(xmlGetNodePath(node));
|
146
|
+
}
|
147
|
+
|
148
|
+
static VALUE node_pointer(VALUE self) {
|
149
|
+
xmlNodePtr node = NULL;
|
150
|
+
Data_Get_Struct(self, xmlNode, node);
|
151
|
+
return INT2NUM((int)node);
|
152
|
+
}
|
153
|
+
|
135
154
|
static VALUE parse_file(VALUE self, VALUE rFilename) {
|
136
|
-
|
155
|
+
xmlDocPtr doc = xmlReadFile(StringValuePtr(rFilename), NULL, 0);
|
137
156
|
if (doc == NULL) {
|
138
|
-
|
139
|
-
|
140
|
-
|
157
|
+
xmlErrorPtr err = xmlGetLastError();
|
158
|
+
rb_raise(cParseError, "could not parse file %s: %s",
|
159
|
+
StringValuePtr(rFilename), err->message);
|
141
160
|
}
|
142
161
|
|
143
|
-
|
144
|
-
|
162
|
+
/* Load new document */
|
163
|
+
VALUE rDoc = Data_Wrap_Struct(cDocument, 0, doc_free, doc);
|
145
164
|
|
146
|
-
|
165
|
+
return rDoc;
|
166
|
+
}
|
167
|
+
|
168
|
+
static VALUE parse_string(VALUE self, VALUE rDocString) {
|
169
|
+
xmlDocPtr doc = xmlReadDoc(StringValuePtr(rDocString), NULL, NULL, 0);
|
170
|
+
if (doc == NULL) {
|
171
|
+
xmlErrorPtr err = xmlGetLastError();
|
172
|
+
rb_raise(cParseError, "could not parse string: %s", err->message);
|
173
|
+
}
|
174
|
+
|
175
|
+
/* Load new document */
|
176
|
+
VALUE rDoc = Data_Wrap_Struct(cDocument, 0, doc_free, doc);
|
177
|
+
|
178
|
+
return rDoc;
|
179
|
+
}
|
180
|
+
|
181
|
+
static VALUE document_to_s(VALUE self, VALUE rDocString) {
|
182
|
+
xmlDocPtr doc = NULL;
|
183
|
+
xmlChar *mem;
|
184
|
+
int size;
|
185
|
+
|
186
|
+
Data_Get_Struct(self, xmlDoc, doc);
|
187
|
+
xmlDocDumpMemory(doc, &mem, &size);
|
188
|
+
VALUE rStr = rb_str_new2(mem);
|
189
|
+
xmlFree(mem);
|
190
|
+
|
191
|
+
return rStr;
|
147
192
|
}
|
148
193
|
|
149
194
|
void Init_teius() {
|
@@ -153,25 +198,32 @@ void Init_teius() {
|
|
153
198
|
sRequired = rb_intern("required");
|
154
199
|
sFirst = rb_intern("first");
|
155
200
|
sAll = rb_intern("all");
|
201
|
+
sUnique = rb_intern("unique");
|
156
202
|
|
157
203
|
/* Modules */
|
158
204
|
VALUE mTeius = rb_define_module("Teius");
|
159
205
|
|
160
206
|
/* Exceptions */
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
"
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
207
|
+
cParseError = rb_define_class_under(mTeius, "ParseError", rb_eStandardError);
|
208
|
+
cXpathError = rb_define_class_under(mTeius, "XpathError", rb_eStandardError);
|
209
|
+
cNodeNotFound = rb_define_class_under(mTeius,
|
210
|
+
"NodeNotFound", rb_eStandardError);
|
211
|
+
cNodeNotUnique = rb_define_class_under(mTeius,
|
212
|
+
"NodeNotUnique", rb_eStandardError);
|
213
|
+
|
214
|
+
/* Node */
|
215
|
+
cNode = rb_define_class_under(mTeius, "Node", rb_cObject);
|
216
|
+
rb_define_method(cNode, "value", node_value, 0);
|
217
|
+
rb_define_method(cNode, "document", node_document, 0);
|
218
|
+
rb_define_method(cNode, "attributes", node_attributes, 0);
|
219
|
+
rb_define_method(cNode, "find", node_find, -1);
|
220
|
+
rb_define_method(cNode, "name", node_name, 0);
|
221
|
+
rb_define_method(cNode, "xpath", node_xpath, 0);
|
222
|
+
rb_define_method(cNode, "pointer", node_pointer, 0);
|
223
|
+
|
224
|
+
/* Document */
|
175
225
|
cDocument = rb_define_class_under(mTeius, "Document", cNode);
|
176
|
-
|
226
|
+
rb_define_singleton_method(cDocument, "parse_file", parse_file, 1);
|
227
|
+
rb_define_singleton_method(cDocument, "parse_string", parse_string, 1);
|
228
|
+
rb_define_method(cNode, "to_s", document_to_s, 0);
|
177
229
|
}
|
data/ext/teius.o
ADDED
Binary file
|
data/ext/teius.so
ADDED
Binary file
|
data/lib/teius.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require 'teius.so'
|
2
|
+
|
3
|
+
module Teius
|
4
|
+
class Node
|
5
|
+
def fetch(xpath)
|
6
|
+
node = find(:unique, xpath, :required => true)
|
7
|
+
return node ? node.value : nil
|
8
|
+
end
|
9
|
+
|
10
|
+
def ==(other)
|
11
|
+
self.pointer == other.pointer
|
12
|
+
end
|
13
|
+
|
14
|
+
def eql?(other)
|
15
|
+
self.pointer == other.pointer
|
16
|
+
end
|
17
|
+
|
18
|
+
def hash
|
19
|
+
self.pointer
|
20
|
+
end
|
21
|
+
|
22
|
+
def parent
|
23
|
+
self.find :first, '..'
|
24
|
+
end
|
25
|
+
|
26
|
+
def siblings
|
27
|
+
self.find :all, 'preceding-sibling::*|following-sibling::*'
|
28
|
+
end
|
29
|
+
|
30
|
+
def children
|
31
|
+
self.find :all, 'child::*'
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
end
|
data/lib/teius.so
ADDED
Binary file
|
data/test/teius_test.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
$:.unshift File.join(File.dirname(__FILE__), '..', '
|
2
|
-
require 'rubygems'
|
3
|
-
# need require_gem?
|
1
|
+
$:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
|
4
2
|
require 'test/unit'
|
5
3
|
require 'teius'
|
6
4
|
|
@@ -80,5 +78,61 @@ class TeiusTest < Test::Unit::TestCase
|
|
80
78
|
assert_equal 'en-US', atts['language']
|
81
79
|
assert_equal 8, atts.length
|
82
80
|
end
|
81
|
+
|
82
|
+
def test_unique_find
|
83
|
+
el = @doc.find :unique, '/sports-content/sports-metadata/sports-title'
|
84
|
+
assert_equal 'Score Update: Chicago vs. Green Bay (Final)', el.value
|
85
|
+
assert_raise(NodeNotUnique) { @doc.find :unique, '//sports-content-code' }
|
86
|
+
assert_nil @doc.find(:unique, '/bogus')
|
87
|
+
assert_raise(NodeNotFound) { @doc.find :unique, '/bogus', { :required => true } }
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_fetch
|
91
|
+
assert_equal 'Score Update: Chicago vs. Green Bay (Final)',
|
92
|
+
@doc.fetch('/sports-content/sports-metadata/sports-title')
|
93
|
+
end
|
83
94
|
|
95
|
+
def test_equality
|
96
|
+
n1 = @doc.find :first, '//team[1]'
|
97
|
+
assert_not_nil n1
|
98
|
+
n2 = @doc.find :first, '/sports-content/sports-event/team[1]'
|
99
|
+
assert_not_nil n2
|
100
|
+
assert_equal n1, n2
|
101
|
+
end
|
102
|
+
|
103
|
+
def test_hash
|
104
|
+
n1 = @doc.find :first, '//team[1]'
|
105
|
+
assert_not_nil n1
|
106
|
+
n2 = @doc.find :first, '/sports-content/sports-event/team[1]'
|
107
|
+
assert n1.eql?(n2)
|
108
|
+
hash = Hash.new
|
109
|
+
hash[n1] = 'test'
|
110
|
+
assert_equal 'test', hash[n2]
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_parse_string
|
114
|
+
doc = Document.parse_string '<library><book /></library>'
|
115
|
+
book = doc.find :first, '//book'
|
116
|
+
assert_not_nil book
|
117
|
+
end
|
118
|
+
|
119
|
+
def test_xpath
|
120
|
+
n1 = @doc.find :first, '//team[1]'
|
121
|
+
n2 = @doc.find :first, '/sports-content/sports-event/team[1]'
|
122
|
+
assert_equal '/sports-content/sports-event/team[1]', n1.xpath
|
123
|
+
assert_equal n1, n2
|
124
|
+
end
|
125
|
+
|
126
|
+
def test_to_s
|
127
|
+
txt = @doc.to_s
|
128
|
+
assert_match /<\?xml version=/, txt
|
129
|
+
assert_match /Chicago 3 for 11 yards/, txt
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_siblings
|
133
|
+
e = @doc.find :first, '//sports-content-code[5]'
|
134
|
+
sibs = e.siblings
|
135
|
+
assert_equal 9, sibs.size
|
136
|
+
end
|
137
|
+
|
84
138
|
end
|
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
!ruby/object:Gem::Specification
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
2
|
rubygems_version: 0.8.11
|
3
3
|
specification_version: 1
|
4
4
|
name: teius
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.0
|
7
|
-
date: 2006-
|
6
|
+
version: 0.1.0
|
7
|
+
date: 2006-05-05 00:00:00 +02:00
|
8
8
|
summary: Light-weight Ruby API to LibXML.
|
9
9
|
require_paths:
|
10
10
|
- dll
|
@@ -29,7 +29,12 @@ authors:
|
|
29
29
|
- Joshua Harvey
|
30
30
|
files:
|
31
31
|
- ext/extconf.rb
|
32
|
+
- ext/Makefile
|
32
33
|
- ext/teius.c
|
34
|
+
- ext/teius.o
|
35
|
+
- ext/teius.so
|
36
|
+
- lib/teius.rb
|
37
|
+
- lib/teius.so
|
33
38
|
- test/teius_test.rb
|
34
39
|
- xml/xt.3608774-update-mid-event.xml
|
35
40
|
- xml/xt.3608787-update-post-event.xml
|