<?xml version="1.0"?>
<vsl:stylesheet version="1.0" xmlns:vsl="http://www.ninetjer.org/2002/VSL/Transform"
    name="widen"
>
    <vsl:engine name="msil"/>

    <vsl:template match="msil:br">
        <vsl:graft select="next"/>
    </vsl:template>

    <vsl:template match="msil:br.s">
        <vsl:graft select="next"/>
    </vsl:template>

    <vsl:template match="msil:beq">
        <vsl:op type="msil:brtrue" name="branch" stack="1:0">
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:op type="msil:ceq" name="compare" stack="2:1">
            <vsl:link name="next" select="$branch"/>
        </vsl:op>
        <vsl:graft select="$compare"/>
    </vsl:template>

    <vsl:template match="msil:bge">
        <vsl:op type="msil:brfalse" name="branch" stack="1:0">
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:op type="msil:clt" name="compare" stack="2:1">
            <vsl:link name="next" select="$branch"/>
        </vsl:op>
        <vsl:graft select="$compare"/>
    </vsl:template>

    <vsl:template match="msil:bgt">
        <vsl:op type="msil:brtrue" name="branch" stack="1:0">
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:op type="msil:cgt" name="compare" stack="2:1">
            <vsl:link name="next" select="$branch"/>
        </vsl:op>
        <vsl:graft select="$compare"/>
    </vsl:template>

    <vsl:template match="msil:ble">
        <vsl:op type="msil:brfalse" name="branch" stack="1:0">
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:op type="msil:cgt" name="compare" stack="2:1">
            <vsl:link name="next" select="$branch"/>
        </vsl:op>
        <vsl:graft select="$compare"/>
    </vsl:template>

    <vsl:template match="msil:blt">
        <vsl:op type="msil:brtrue" name="branch" stack="1:0">
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:op type="msil:clt" name="compare" stack="2:1">
            <vsl:link name="next" select="$branch"/>
        </vsl:op>
        <vsl:graft select="$compare"/>
    </vsl:template>

    <vsl:template match="msil:beq.s">
        <vsl:clone name="branch" type="msil:beq" select="."/>
        <vsl:graft select="$branch"/>
    </vsl:template>

    <vsl:template match="msil:bge.s">
        <vsl:clone name="branch" type="msil:bge" select="."/>
        <vsl:graft select="$branch"/>
    </vsl:template>

    <vsl:template match="msil:bgt.s">
        <vsl:clone name="branch" type="msil:bgt" select="."/>
        <vsl:graft select="$branch"/>
    </vsl:template>

    <vsl:template match="msil:ble.s">
        <vsl:clone name="branch" type="msil:ble" select="."/>
        <vsl:graft select="$branch"/>
    </vsl:template>

    <vsl:template match="msil:blt.s">
        <vsl:clone name="branch" type="msil:blt" select="."/>
        <vsl:graft select="$branch"/>
    </vsl:template>

    <vsl:template match="msil:brtrue.s">
        <vsl:clone name="branch" type="msil:brtrue" select="."/>
        <vsl:graft select="$branch"/>
    </vsl:template>

    <vsl:template match="msil:brfalse">
        <vsl:op type="msil:brtrue" name="branch" stack="1:0">
            <vsl:link name="next" select="next[1]"/>
            <vsl:link name="next" select="next[0]"/>
        </vsl:op>
        <vsl:graft select="$branch"/>
    </vsl:template>

    <vsl:template match="msil:brfalse.s">
        <vsl:op type="msil:brtrue" name="branch" stack="1:0">
            <vsl:link name="next" select="next[1]"/>
            <vsl:link name="next" select="next[0]"/>
        </vsl:op>
        <vsl:graft select="$branch"/> 
    </vsl:template>

    <vsl:template match="msil:ldarg.0">
        <vsl:op type="msil:ldarg" name="arg" stack="0:1">
            <vsl:value name="num" select="#0"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$arg"/>
    </vsl:template>

    <vsl:template match="msil:ldarg.1">
        <vsl:op type="msil:ldarg" name="arg" stack="0:1">
            <vsl:value name="num" select="#1"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$arg"/>
    </vsl:template>

    <vsl:template match="msil:ldarg.2">
        <vsl:op type="msil:ldarg" name="arg" stack="0:1">
            <vsl:value name="num" select="#2"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$arg"/>
    </vsl:template>

    <vsl:template match="msil:ldarg.3">
        <vsl:op type="msil:ldarg" name="arg" stack="0:1">
            <vsl:value name="num" select="#3"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$arg"/>
    </vsl:template>

    <vsl:template match="msil:ldarg.s">
        <vsl:op type="msil:ldarg" name="arg" stack="0:1">
            <vsl:value name="num" select="@num"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$arg"/>
    </vsl:template>

    <vsl:template match="msil:ldloc.0">
        <vsl:op type="msil:ldloc" name="loc" stack="0:1">
            <vsl:value name="indx" select="#0"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$loc"/>
    </vsl:template>

    <vsl:template match="msil:ldloc.1">
        <vsl:op type="msil:ldloc" name="loc" stack="0:1">
            <vsl:value name="indx" select="#1"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$loc"/>
    </vsl:template>

    <vsl:template match="msil:ldloc.2">
        <vsl:op type="msil:ldloc" name="loc" stack="0:1">
            <vsl:value name="indx" select="#2"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$loc"/>
    </vsl:template>

    <vsl:template match="msil:ldloc.3">
        <vsl:op type="msil:ldloc" name="loc" stack="0:1">
            <vsl:value name="indx" select="#3"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$loc"/>
    </vsl:template>

    <vsl:template match="msil:ldloc.s">
        <vsl:op type="msil:ldloc" name="loc" stack="0:1">
            <vsl:value name="indx" select="@indx"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$loc"/>
    </vsl:template>

    <vsl:template match="msil:ldc.i4.0">
        <vsl:op type="msil:ldc.i4" name="ldc" stack="0:1">
            <vsl:value name="num" select="#0"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$ldc"/>
    </vsl:template>

    <vsl:template match="msil:ldc.i4.1">
        <vsl:op type="msil:ldc.i4" name="ldc" stack="0:1">
            <vsl:value name="num" select="#1"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$ldc"/>
    </vsl:template>

    <vsl:template match="msil:ldc.i4.2">
        <vsl:op type="msil:ldc.i4" name="ldc" stack="0:1">
            <vsl:value name="num" select="#2"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$ldc"/>
    </vsl:template>

    <vsl:template match="msil:ldc.i4.3">
        <vsl:op type="msil:ldc.i4" name="ldc" stack="0:1">
            <vsl:value name="num" select="#3"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$ldc"/>
    </vsl:template>

    <vsl:template match="msil:ldc.i4.4">
        <vsl:op type="msil:ldc.i4" name="ldc" stack="0:1">
            <vsl:value name="num" select="#4"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$ldc"/>
    </vsl:template>

    <vsl:template match="msil:ldc.i4.5">
        <vsl:op type="msil:ldc.i4" name="ldc" stack="0:1">
            <vsl:value name="num" select="#5"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$ldc"/>
    </vsl:template>

    <vsl:template match="msil:ldc.i4.6">
        <vsl:op type="msil:ldc.i4" name="ldc" stack="0:1">
            <vsl:value name="num" select="#6"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$ldc"/>
    </vsl:template>

    <vsl:template match="msil:ldc.i4.7">
        <vsl:op type="msil:ldc.i4" name="ldc" stack="0:1">
            <vsl:value name="num" select="#7"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$ldc"/>
    </vsl:template>

    <vsl:template match="msil:ldc.i4.8">
        <vsl:op type="msil:ldc.i4" name="ldc" stack="0:1">
            <vsl:value name="num" select="#8"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$ldc"/>
    </vsl:template>

    <vsl:template match="msil:ldc.i4.m1">
        <vsl:op type="msil:ldc.i4" name="ldc" stack="0:1">
            <vsl:value name="num" select="#-1"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$ldc"/>
    </vsl:template>

    <vsl:template match="msil:ldc.i4.s">
        <vsl:op type="msil:ldc.i4" name="ldc" stack="0:1">
            <vsl:value name="num" select="@num"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$ldc"/>
    </vsl:template>

    <vsl:template match="msil:stloc.0">
        <vsl:op type="msil:stloc" name="loc" stack="1:0">
            <vsl:value name="indx" select="#0"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$loc"/>
    </vsl:template>

    <vsl:template match="msil:stloc.1">
        <vsl:op type="msil:stloc" name="loc" stack="1:0">
            <vsl:value name="indx" select="#1"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$loc"/>
    </vsl:template>

    <vsl:template match="msil:stloc.2">
        <vsl:op type="msil:stloc" name="loc" stack="1:0">
            <vsl:value name="indx" select="#2"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$loc"/>
    </vsl:template>

    <vsl:template match="msil:stloc.3">
        <vsl:op type="msil:stloc" name="loc" stack="1:0">
            <vsl:value name="indx" select="#3"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$loc"/>
    </vsl:template>

    <vsl:template match="msil:stloc.s">
        <vsl:op type="msil:stloc" name="loc" stack="1:0">
            <vsl:value name="indx" select="@indx"/>
            <vsl:link name="next" select="next"/>
        </vsl:op>
        <vsl:graft select="$loc"/>
    </vsl:template>

</vsl:stylesheet>
