BasicTestIterator.java revision 293
6ee667aeeb284b652e256ad1d792b0fb6c28fabaLennart Poettering/*
643a14a5271ed19ec30a9882d4b9e9ae1c357fb1Lennart Poettering * reserved comment block
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering * DO NOT REMOVE OR ALTER!
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering */
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sievers/*
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sievers * Copyright 1999-2004 The Apache Software Foundation.
91e8651b6e3acf77c0fc51febe70b94afcd81b7dZbigniew Jędrzejewski-Szmek *
912b54ad47e1597c1744ccd936368b0eb1468b16David Strauss * Licensed under the Apache License, Version 2.0 (the "License");
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering * you may not use this file except in compliance with the License.
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering * You may obtain a copy of the License at
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering *
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering * http://www.apache.org/licenses/LICENSE-2.0
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering *
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering * Unless required by applicable law or agreed to in writing, software
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering * distributed under the License is distributed on an "AS IS" BASIS,
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering * See the License for the specific language governing permissions and
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering * limitations under the License.
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering */
5430f7f2bc7330f3088b894166bf3524a067e3d8Lennart Poettering/*
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering * $Id: BasicTestIterator.java,v 1.2.4.1 2005/09/14 19:45:20 jeffsuttor Exp $
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering */
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sieverspackage com.sun.org.apache.xpath.internal.axes;
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sievers
b5a223bfcf2ebcf374973b29870a5e80fb42b8beZbigniew Jędrzejewski-Szmekimport com.sun.org.apache.xml.internal.dtm.DTM;
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poetteringimport com.sun.org.apache.xml.internal.dtm.DTMFilter;
f44541bc934c6e2b02155559e9eeb17a13a09558Michal Schmidtimport com.sun.org.apache.xml.internal.dtm.DTMIterator;
f44541bc934c6e2b02155559e9eeb17a13a09558Michal Schmidtimport com.sun.org.apache.xml.internal.utils.PrefixResolver;
f44541bc934c6e2b02155559e9eeb17a13a09558Michal Schmidtimport com.sun.org.apache.xpath.internal.compiler.Compiler;
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sieversimport com.sun.org.apache.xpath.internal.compiler.OpMap;
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sievers
96bd03d5b8d5d04fc8037c03a43bb5b148cc1e29Zbigniew Jędrzejewski-Szmek/**
96bd03d5b8d5d04fc8037c03a43bb5b148cc1e29Zbigniew Jędrzejewski-Szmek * Base for iterators that handle predicates. Does the basic next
96bd03d5b8d5d04fc8037c03a43bb5b148cc1e29Zbigniew Jędrzejewski-Szmek * node logic, so all the derived iterator has to do is get the
652e737517bbbae692923246aeb687e2d1f314efZbigniew Jędrzejewski-Szmek * next node.
652e737517bbbae692923246aeb687e2d1f314efZbigniew Jędrzejewski-Szmek */
652e737517bbbae692923246aeb687e2d1f314efZbigniew Jędrzejewski-Szmekpublic abstract class BasicTestIterator extends LocPathIterator
c2654883624885696edccd2a202873998ec208f1Holger Hans Peter Freyther{
e7c431d3bcfdeeec5dcae0707145edb9a3f749aaHolger Hans Peter Freyther static final long serialVersionUID = 3505378079378096623L;
c2654883624885696edccd2a202873998ec208f1Holger Hans Peter Freyther /**
d5a169aaee81246262a83cef2a0295ea5d1e7e40Lennart Poettering * Create a LocPathIterator object.
cfc59d713d6d8e4536c4103368a9a48ca6cea833Lennart Poettering *
d5a169aaee81246262a83cef2a0295ea5d1e7e40Lennart Poettering * @param nscontext The namespace context for this iterator,
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sievers * should be OK if null.
62ca29b81b5f19007889439b744a16776607a55eLennart Poettering */
62ca29b81b5f19007889439b744a16776607a55eLennart Poettering protected BasicTestIterator()
62ca29b81b5f19007889439b744a16776607a55eLennart Poettering {
1c7dde3e475978c569a982d65fd86d4b4e3caad8Bastien Nocera }
cfc59d713d6d8e4536c4103368a9a48ca6cea833Lennart Poettering
d5a169aaee81246262a83cef2a0295ea5d1e7e40Lennart Poettering
cfc59d713d6d8e4536c4103368a9a48ca6cea833Lennart Poettering /**
42a04ee69c7242377cd9eb39444352cd4deb4bb1Lennart Poettering * Create a LocPathIterator object.
42a04ee69c7242377cd9eb39444352cd4deb4bb1Lennart Poettering *
42a04ee69c7242377cd9eb39444352cd4deb4bb1Lennart Poettering * @param nscontext The namespace context for this iterator,
4f0be680b5323e037314cfbd3dba34f03e637c8fLennart Poettering * should be OK if null.
62ca29b81b5f19007889439b744a16776607a55eLennart Poettering */
4f0be680b5323e037314cfbd3dba34f03e637c8fLennart Poettering protected BasicTestIterator(PrefixResolver nscontext)
74b91131ed09850ed487a2f7849147ff6f80194dLennart Poettering {
114a50f898a89bd7784c215ac5df95ec8c45a905Lennart Poettering
62ca29b81b5f19007889439b744a16776607a55eLennart Poettering super(nscontext);
114a50f898a89bd7784c215ac5df95ec8c45a905Lennart Poettering }
114a50f898a89bd7784c215ac5df95ec8c45a905Lennart Poettering
4b2d99d9f4258a29f0bf8b1a78d17836e75bc378Lennart Poettering /**
62ca29b81b5f19007889439b744a16776607a55eLennart Poettering * Create a LocPathIterator object, including creation
4b2d99d9f4258a29f0bf8b1a78d17836e75bc378Lennart Poettering * of step walkers from the opcode list, and call back
4b2d99d9f4258a29f0bf8b1a78d17836e75bc378Lennart Poettering * into the Compiler to create predicate expressions.
c01995635d14840074c2ff17a153b76edd0bf1b9Lennart Poettering *
62ca29b81b5f19007889439b744a16776607a55eLennart Poettering * @param compiler The Compiler which is creating
c01995635d14840074c2ff17a153b76edd0bf1b9Lennart Poettering * this expression.
4b2d99d9f4258a29f0bf8b1a78d17836e75bc378Lennart Poettering * @param opPos The position of this iterator in the
8c4a3079a7f358c179430d1aec59de8b670b5f6eLennart Poettering * opcode list from the compiler.
d122948d6fbaac4505cf14a08f1237daa89efdd0Lennart Poettering *
d122948d6fbaac4505cf14a08f1237daa89efdd0Lennart Poettering * @throws javax.xml.transform.TransformerException
d122948d6fbaac4505cf14a08f1237daa89efdd0Lennart Poettering */
8c6db8336536916d0476ff8233e0abf40a2f6aabLennart Poettering protected BasicTestIterator(Compiler compiler, int opPos, int analysis)
5c390a4ae0d383b2003074ed011d47876c7e630cZbigniew Jędrzejewski-Szmek throws javax.xml.transform.TransformerException
8c6db8336536916d0476ff8233e0abf40a2f6aabLennart Poettering {
02f130cbd943c5c177cb0e711db0447cac685d67Lennart Poettering super(compiler, opPos, analysis, false);
490aed584944b684026a3fd01f8d81f2881e38d6Lennart Poettering
db059f1b031a92ed45b62d1036877abd9c128d1bMichael Biebl int firstStepPos = OpMap.getFirstChildPos(opPos);
4f87c47b35cf9c1f58872559ae67a2656712fdd6William Giokas int whatToShow = compiler.getWhatToShow(firstStepPos);
460c589a92ae58c5cfb4d36dba073220ccdc565fFedora systemd team
0ce8860a15fb08ac358fb9c5347bd20c0bcdebcdLennart Poettering if ((0 == (whatToShow
dee4c244254bb49d1ffa8bd7171ae9cce596d2d0Lennart Poettering & (DTMFilter.SHOW_ATTRIBUTE
0ce8860a15fb08ac358fb9c5347bd20c0bcdebcdLennart Poettering | DTMFilter.SHOW_NAMESPACE
4ec24515daa780118709e04cd78dae93f25a8428Zbigniew Jędrzejewski-Szmek | DTMFilter.SHOW_ELEMENT
4ec24515daa780118709e04cd78dae93f25a8428Zbigniew Jędrzejewski-Szmek | DTMFilter.SHOW_PROCESSING_INSTRUCTION)))
036643a247c659db8e1b3df1778d51553a816ec9Lennart Poettering || (whatToShow == DTMFilter.SHOW_ALL))
8c4a3079a7f358c179430d1aec59de8b670b5f6eLennart Poettering initNodeTest(whatToShow);
d1ab0ca07372649dad70a0348d75e394f254e1b6Lennart Poettering else
32d0463d5c9982cc0c98a6e2867f94c764a496c2Lennart Poettering {
a1d41e17a5c3861becd66f1c9dba7eb39ae4c478Lennart Poettering initNodeTest(whatToShow, compiler.getStepNS(firstStepPos),
772f83719e3c2262d948a4c4e70fe9babc4c4610Kay Sievers compiler.getStepLocalName(firstStepPos));
1b99214789101976d6bbf75c351279584b071998Lennart Poettering }
f5e04665ebf7124f3ea17dcf258793ed73a95fe1Lennart Poettering initPredicateInfo(compiler, firstStepPos);
d4e85aac0bed39c8341da2614609c3d62825f1bfLennart Poettering }
d4e85aac0bed39c8341da2614609c3d62825f1bfLennart Poettering
74fae4240f670fe5a39a82a71abad367d18caefaSamuli Suominen /**
74b91131ed09850ed487a2f7849147ff6f80194dLennart Poettering * Create a LocPathIterator object, including creation
8ece4cab426cce6759ff240504dc876502f4c483Kay Sievers * of step walkers from the opcode list, and call back
d267e69da42f51ed0b34b59c0e3bc988127b95a5Zbigniew Jędrzejewski-Szmek * into the Compiler to create predicate expressions.
8ece4cab426cce6759ff240504dc876502f4c483Kay Sievers *
6edd7d0a09171ea5ae8e01b7b1cbcb0bdfbfeb16Lennart Poettering * @param compiler The Compiler which is creating
8ece4cab426cce6759ff240504dc876502f4c483Kay Sievers * this expression.
a1d41e17a5c3861becd66f1c9dba7eb39ae4c478Lennart Poettering * @param opPos The position of this iterator in the
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sievers * opcode list from the compiler.
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * @param shouldLoadWalkers True if walkers should be
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * loaded, or false if this is a derived iterator and
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering * it doesn't wish to load child walkers.
d4205751d4643c272059a3728045929dd0e5e800Lennart Poettering *
8f51399e75e5d0d0741ecb18c549a57840bd1cc3Harald Hoyer * @throws javax.xml.transform.TransformerException
94a15ffa14b8272e827f4cf95244910839a9d907Kay Sievers */
94a15ffa14b8272e827f4cf95244910839a9d907Kay Sievers protected BasicTestIterator(
8c4a3079a7f358c179430d1aec59de8b670b5f6eLennart Poettering Compiler compiler, int opPos, int analysis, boolean shouldLoadWalkers)
8c4a3079a7f358c179430d1aec59de8b670b5f6eLennart Poettering throws javax.xml.transform.TransformerException
b8079ae19b41c9b61850c796dddc601b826850e0Kay Sievers {
b8079ae19b41c9b61850c796dddc601b826850e0Kay Sievers super(compiler, opPos, analysis, shouldLoadWalkers);
b8079ae19b41c9b61850c796dddc601b826850e0Kay Sievers }
70fcff314feff469a8e61dbe5017ed74f5e0a09dLennart Poettering
1d57af45cfcccd87aa8308bdc636f15eab2231a2Kay Sievers
1a13e31d275430ffba713c8a68ee7f22093c29e0Zbigniew Jędrzejewski-Szmek /**
2a018e83ded29c9719b2478a65ee6245c829c0f5Kay Sievers * Get the next node via getNextXXX. Bottlenecked for derived class override.
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sievers * @return The next node on the axis, or DTM.NULL.
2a018e83ded29c9719b2478a65ee6245c829c0f5Kay Sievers */
2a018e83ded29c9719b2478a65ee6245c829c0f5Kay Sievers protected abstract int getNextNode();
2a018e83ded29c9719b2478a65ee6245c829c0f5Kay Sievers
4ec24515daa780118709e04cd78dae93f25a8428Zbigniew Jędrzejewski-Szmek /**
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sievers * Returns the next node in the set and advances the position of the
9b2810721d63c6c5daedd4f86c963eb69f7ab120Zbigniew Jędrzejewski-Szmek * iterator in the set. After a NodeIterator is created, the first call
48d437bbf10aa80d37b280ed946a51dee5bc69b8Kay Sievers * to nextNode() returns the first node in the set.
04a9d3a00a9290cbf254d0b0ba2ce4521be632aeKay Sievers *
0237edf7d24a53792122ec1c8225babf2ad3e227Kay Sievers * @return The next <code>Node</code> in the set being iterated over, or
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sievers * <code>null</code> if there are no more members in that set.
87cfe600c7a5c0632f8dcc7713b0b1e3825b75ccZbigniew Jędrzejewski-Szmek */
0237edf7d24a53792122ec1c8225babf2ad3e227Kay Sievers public int nextNode()
46ba8aae2b82bc5c87ba347e6bf914ecd5e9d51eLennart Poettering {
2a018e83ded29c9719b2478a65ee6245c829c0f5Kay Sievers if(m_foundLast)
299031ca8b05ede06e3c03c436429eec854cc75cBryan Kadzban {
131a4dcfd4375f235a1f512339c0909e8bcc730bKay Sievers m_lastFetched = DTM.NULL;
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sievers return DTM.NULL;
90ccc3fca7e53a60a9e67b9d5812e1d4a27fc07dKay Sievers }
ad95fd1d2b9c6344864857c2ba7634fd87753f8eZbigniew Jędrzejewski-Szmek
ac7019f33f1618f5b69ed44a8623e2596f1e3856Lennart Poettering if(DTM.NULL == m_lastFetched)
90ccc3fca7e53a60a9e67b9d5812e1d4a27fc07dKay Sievers {
90ccc3fca7e53a60a9e67b9d5812e1d4a27fc07dKay Sievers resetProximityPositions();
36e46fe9b625b7a63a6b38f43dc55298c8a0ac89Michael Biebl }
6cbf079f10ba998e4d8debb7f5b7dab4efaae3d0Kay Sievers
9b80f05fb727edc70a305d912ab6cf1c3bdbf67eKay Sievers int next;
cee22bd3cb253734a8a0183751d786128e2ea5e4Henrik Grindal Bakken
cee22bd3cb253734a8a0183751d786128e2ea5e4Henrik Grindal Bakken com.sun.org.apache.xpath.internal.VariableStack vars;
cee22bd3cb253734a8a0183751d786128e2ea5e4Henrik Grindal Bakken int savedStart;
cee22bd3cb253734a8a0183751d786128e2ea5e4Henrik Grindal Bakken if (-1 != m_stackFrame)
cee22bd3cb253734a8a0183751d786128e2ea5e4Henrik Grindal Bakken {
cee22bd3cb253734a8a0183751d786128e2ea5e4Henrik Grindal Bakken vars = m_execContext.getVarStack();
cee22bd3cb253734a8a0183751d786128e2ea5e4Henrik Grindal Bakken
cee22bd3cb253734a8a0183751d786128e2ea5e4Henrik Grindal Bakken // These three statements need to be combined into one operation.
cee22bd3cb253734a8a0183751d786128e2ea5e4Henrik Grindal Bakken savedStart = vars.getStackFrame();
f13b388f97bc3ba8db844bd3413d510e2466a0b6Kay Sievers
2a018e83ded29c9719b2478a65ee6245c829c0f5Kay Sievers vars.setStackFrame(m_stackFrame);
9f70075586839e8f1c097874fea2223a3d76230cZbigniew Jędrzejewski-Szmek }
9f70075586839e8f1c097874fea2223a3d76230cZbigniew Jędrzejewski-Szmek else
9f70075586839e8f1c097874fea2223a3d76230cZbigniew Jędrzejewski-Szmek {
9f70075586839e8f1c097874fea2223a3d76230cZbigniew Jędrzejewski-Szmek // Yuck. Just to shut up the compiler!
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering vars = null;
d3f09cf39637de2441288b5e4c93eecbd1fb872dKay Sievers savedStart = 0;
19adb8a3204fefd91411b5f0f350c8bc6bcf75feZbigniew Jędrzejewski-Szmek }
036643a247c659db8e1b3df1778d51553a816ec9Lennart Poettering
70fcff314feff469a8e61dbe5017ed74f5e0a09dLennart Poettering try
0571e0111d76cf96aa4069d9c7a6e24d97aa7e48Lennart Poettering {
061978fa4d10851d18786432688a32984732c376Lennart Poettering do
af2d49f70bcff20efaf2d69aecaf4b3e898ff1faLennart Poettering {
af2d49f70bcff20efaf2d69aecaf4b3e898ff1faLennart Poettering next = getNextNode();
ad95fd1d2b9c6344864857c2ba7634fd87753f8eZbigniew Jędrzejewski-Szmek
844ec79b3c2f246114ea316ebe1f36044bdb688eZbigniew Jędrzejewski-Szmek if (DTM.NULL != next)
91901329245f070b621a24577393fb8f4ce9bffcLennart Poettering {
05d02d8db0b3a7fd7634f7a0bd35ad96da469fb4Lennart Poettering if(DTMIterator.FILTER_ACCEPT == acceptNode(next))
b1b2a107d15a370d40b200172837bdd82ff3c3b2Fabiano Fidêncio break;
6edd7d0a09171ea5ae8e01b7b1cbcb0bdfbfeb16Lennart Poettering else
2cb1a60d14f869023652482a380ca7b659dcf78fLennart Poettering continue;
501fc174c22aebd3181af08a4cfa65cc92bbe233Lennart Poettering }
5b754353282e3ba3cf9c4ffc50579aff4b7d72dbKay Sievers else
b8079ae19b41c9b61850c796dddc601b826850e0Kay Sievers break;
952d97ed2b44f58b973a78c87d09b20c36f61460Zbigniew Jędrzejewski-Szmek }
ef5bfcf668e6029faa78534dfeb2591df854cdefLennart Poettering while (next != DTM.NULL);
e23a0ce8badd09aefa961a3a576bfe85f6ebbad7Lennart Poettering
5a1e99375d03bc88795d68c66bf3933dd04c1015Lennart Poettering if (DTM.NULL != next)
af2d49f70bcff20efaf2d69aecaf4b3e898ff1faLennart Poettering {
83cc030fadf71d63d488cf9015275f9e5a02e2ccLennart Poettering m_pos++;
ddcbc8737873ca1904562d7d3ca3de9946e2f889Matthias Clasen return next;
baa5ad26fd5da7bc3d7253904ac30112c94a64c2Kay Sievers }
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sievers else
8e8eb8fbafcaa841fa5393e396acde27b26edf2fKay Sievers {
f33d3ec1d7521c91da8b30ad5cb345d6416bb07dKay Sievers m_foundLast = true;
83374163014eb50ed0ecd4f18ab45e5280ce7081Lennart Poettering
7801356442578ff6e1c65844eb9e65c819af4660Zbigniew Jędrzejewski-Szmek return DTM.NULL;
9a00f57a5ba7ed431e6bac8d8b36518708503b4eLennart Poettering }
9a00f57a5ba7ed431e6bac8d8b36518708503b4eLennart Poettering }
0d8c31ff7237149b505290652864b4e7e866b2a7Zbigniew Jędrzejewski-Szmek finally
e5e83e8362e946890ac991fc86a2c5869f9befdfLennart Poettering {
780896a4f1ec7e36c8f72c866ba9693d790f9741Lennart Poettering if (-1 != m_stackFrame)
d7832d2c6e0ef5f2839a2296c1cc2fc85c7d9632Kay Sievers {
f579559b3a14c1f1ef96c372e7626c4733e6ef7dTom Gundersen // These two statements need to be combined into one operation.
86aa7ba4f9969bbfc75ebd51f944313695f1a0a1Lennart Poettering vars.setStackFrame(savedStart);
3bdf9c1d0a241eff2d17591854172725682b27cdKay Sievers }
bcdbbd7ee1b7dc6ec19261c957ed11e5e1ed1aafKay Sievers }
687ed1237b20a6db174fd0b372df20fa9a3a23c2Kay Sievers }
ffcf82d250e95ea0a06a95d7adc72bfad6db51e3Kay Sievers
7263f72499e962b3fd54cdb7c79d49ca72121edeZbigniew Jędrzejewski-Szmek /**
3e2147858f21943d5f4a781c60f33ac22c6096edKay Sievers * Get a cloned Iterator that is reset to the beginning
95769b329eb15ac5495fe98000a583e4614a6109Kay Sievers * of the query.
b30e2f4c18ad81b04e4314fd191a5d458553773cKay Sievers *
0b87a07761dcad31583142a3a454c42833e65a09Kay Sievers * @return A cloned NodeIterator set of the start of the query.
5a45a93627609451784a04366cfa1150d32611d1Lennart Poettering *
af6f0d422c521374ee6a2dd92df5935a5a476ae5Tom Gundersen * @throws CloneNotSupportedException
9d7d42bc406a2ac04639674281ce3ff6beeda790Kay Sievers */
607553f9306286fdccf0b356bc3d1087adfe21c4Tom Gundersen public DTMIterator cloneWithReset() throws CloneNotSupportedException
607553f9306286fdccf0b356bc3d1087adfe21c4Tom Gundersen {
607553f9306286fdccf0b356bc3d1087adfe21c4Tom Gundersen
91d3efedddd8d65ea5d8afb5499d925c98205ffdLennart Poettering ChildTestIterator clone = (ChildTestIterator) super.cloneWithReset();
fe8db0c5ee3365a2fc80ee7ebffa238f9a0a2ae2Tom Gundersen
84da4a3022bc599b26d9601cf1b7bf51d1d9f915David Herrmann clone.resetProximityPositions();
5a45a93627609451784a04366cfa1150d32611d1Lennart Poettering
47be870bd83fb3719dffc3ee9348a409ab762a14Lennart Poettering return clone;
3984d657ffcfd2b4958be9714caef414f2c1fb9eLennart Poettering }
5a45a93627609451784a04366cfa1150d32611d1Lennart Poettering
eb2e280f9c59b66965c9316eadc4c113a13ca744Lucas De Marchi
24fdc2300451372bd098a7cab39f3a417d46605bZbigniew Jędrzejewski-Szmek}
d7ae18eea511caa6f1af63b7f07abebf2436fdedMichael Biebl