<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="markdown-here-wrapper" data-md-url="Thunderbird"
      style="">
      <p style="margin: 0px 0px 1.2em !important;">Since we’re already
        discussing one of the consequences of sealed types, let’s put
        the whole story on the table. These are my current thoughts, but
        there’s room in the design space to wander a bit. </p>
      <p style="margin: 0px 0px 1.2em !important;"><strong>Definition.</strong>
        A <em>sealed type</em> is one for which subclassing is
        restricted according to guidance specified with the type’s
        declaration; finality can be considered a degenerate form of
        sealing, where no subclasses at all are permitted. Sealed types
        are a sensible means of modeling <em>algebraic sum types</em>
        in a nominal type hierarchy; they go nicely with records (<em>algebraic
          product types</em>), though are also useful on their own.</p>
      <p style="margin: 0px 0px 1.2em !important;">Sealing serves two
        distinct purposes. The first, and more obvious, is that it
        restricts who can be a subtype. This is largely a
        declaration-site concern, where an API owner wants to defend the
        integrity of their API. The other is that it potentially enables
        exhaustiveness analysis at the use site when switching over
        sealed types (and possibly other features.) This is less
        obvious, and the benefit is contingent on some other things, but
        is valuable as it enables better compile-time type checking. </p>
      <p style="margin: 0px 0px 1.2em !important;"><em>Note:</em> It is
        probably desirable to ship this with records, though it could be
        shipped before or after.</p>
      <p style="margin: 0px 0px 1.2em !important;"><strong>Declaration.</strong>
        We specify that a class is sealed by applying the <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">sealed</code>
        modifier to a class, abstract class, interface, or record:</p>
      <pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;">sealed interface Node { ... }
</code></pre>
      <p style="margin: 0px 0px 1.2em !important;">In this streamlined
        form, <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Node</code>
        may be extended only by its nestmates. This may be suitable for
        many situations, but not for all; in this case, the user may
        specify an explicit <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">permits</code>
        list:</p>
      <pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;">sealed interface Node 
    permits FooNode, BarNode { ... }
</code></pre>
      <p style="margin: 0px 0px 1.2em !important;">The two forms may not
        be combined; if there is a permits list, it must list all the
        permitted subtypes. We can think of the simple form as merely
        inferring the <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">permits</code>
        clause from information in the same compilation unit. </p>
      <p style="margin: 0px 0px 1.2em !important;"><strong>Exhaustiveness.</strong>
        One of the benefits of sealing is that the compiler can
        enumerate the permitted subtypes of a sealed type; this in turn
        lets us perform exhaustiveness analysis when switching over
        patterns involving sealed types. (In the simplified form, the
        compiler computes the permits list by enumerating the subtypes
        in the nest when the nest is declared, since they are in a
        single compilation unit.) Permitted subtypes must belong to the
        same module (or, if not in a module, the same package and
        protection domain.)</p>
      <p style="margin: 0px 0px 1.2em !important;"><em>Note:</em> It is
        superficially tempting to have a relaxed but less explicit form,
        say which allows for a type to be extended by package-mates or
        module-mates without listing them all. However, this would
        undermine the compiler’s ability to reason about exhaustiveness.
        This would achieve the desired subclassing restrictions, but not
        the desired ability to reason about exhaustiveness. </p>
      <p style="margin: 0px 0px 1.2em !important;"><strong>Classfile.</strong>
        In the classfile, a sealed type is identified with an <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">ACC_SEALED</code>
        modifier (we could choose to overload <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">ACC_FINAL</code>
        for bit preservation), and a <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">Sealed</code>
        attribute which contains a list of permitted subtypes (similar
        in structure to the nestmate attributes.)</p>
      <p style="margin: 0px 0px 1.2em !important;"><strong>Transitivity.</strong>
        Sealing is transitive; unless otherwise specified, an abstract
        subtype of a sealed type is implicitly sealed, and a concrete
        subtype of a sealed type is implicitly final. This can be
        reversed by explicitly modifying the subtype with the <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">non-sealed</code>
        or <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">non-final</code>
        modifiers.</p>
      <p style="margin: 0px 0px 1.2em !important;">Unsealing a subtype
        in a hierarchy doesn’t undermine the sealing, because the
        (possibly inferred) set of explicitly permitted subtypes still
        constitutes a total covering. However, users who know about
        unsealed subtypes can use this information to their benefit
        (much like we do with exceptions today; you can catch
        FileNotFoundException separately from IOException if you want,
        but don’t have to.) </p>
      <p style="margin: 0px 0px 1.2em !important;"><em>Note:</em> Scala
        made the opposite choice with respect to transitivity, requiring
        sealing to be opted into at all levels. This is widely believed
        to be a source of bugs; it is rare that one actually wants a
        subtype of a sealed type to not be sealed. I suspect the
        reasoning in Scala was, at least partially, the desire to not
        make up a new keyword for “not sealed”. This is understandable,
        but I’d rather not add to the list of “things for which Java got
        the defaults wrong.”</p>
      <p style="margin: 0px 0px 1.2em !important;">An example of where
        explicit unsealing (and private subtypes) is useful can be found
        in the JEP-334 API:</p>
      <pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;">sealed interface ConstantDesc
    permits String, Integer, Float, Long, Double, 
            ClassDesc, MethodTypeDesc, MethodHandleDesc, 
            DynamicConstantDesc { }

sealed interface ClassDesc extends ConstantDesc
    permits PrimitiveClassDescImpl, ReferenceClassDescImpl { }

private class PrimitiveClassDescImpl implements ClassDesc { }
 private class ReferenceClassDescImpl implements ClassDesc { }

sealed interface MethodTypeDesc extends ConstantDesc
     permits MethodTypeDescImpl { }

 sealed interface MethodHandleDesc extends ConstantDesc
     permits DirectMethodHandleDesc, MethodHandleDescImpl { }

sealed interface DirectMethodHandleDesc extends MethodHandleDesc
    permits DirectMethodHandleDescImpl

// designed for subclassing
non-sealed class DynamicConstantDesc extends ConstantDesc { ... }
</code></pre>
      <p style="margin: 0px 0px 1.2em !important;"><strong>Enforcement.</strong>
        Both the compiler and JVM should enforce sealing.</p>
      <p style="margin: 0px 0px 1.2em !important;"><em>Note:</em> It
        might be allowable for VM support to follow in a later version,
        rather than delaying the feature entirely.</p>
      <p style="margin: 0px 0px 1.2em !important;"><strong>Accessibility.</strong>
        Subtypes need not be as accessible as the sealed parent. In this
        case, clients are not going to get the chance to exhaustively
        switch over them; they’ll have to make these switches exhaustive
        with a <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">default</code>
        clause or other total pattern. When compiling a switch over such
        a sealed type, the compiler can provide a useful error message
        (“I know this is a sealed type, but I can’t provide full
        exhaustiveness checking here because you can’t see all the
        subtypes, so you still need a default.”) </p>
      <p style="margin: 0px 0px 1.2em !important;"><strong>Javadoc.</strong>
        The list of permitted subtypes should probably be considered
        part of the spec, and incorporated into the Javadoc. Note that
        this is not exactly the same as the current “All implementing
        classes” list that Javadoc currently includes, so a list like
        “All permitted subtypes” might be added (possibly with some
        indication if the subtype is less accessible than the parent.)</p>
      <p style="margin: 0px 0px 1.2em !important;"><em>Open question:</em>
        With the advent of records, which allow us to define classes in
        a single line, the “one class per file” rule starts to seem both
        a little silly, and constrain the user’s ability to put related
        definitions together (which may be more readable) while
        exporting a flat namespace in the public API. I think it is
        worth considering relaxing this rule to permit for sealed
        classes, say: allowing public auxilliary subtypes of the primary
        type, if the primary type is public and sealed.<br>
        ​<br>
        <em>Syntactic alternative:</em> Rather than inventing a new
        modifier (which then needs a negation modifier), we could
        generalize the meaning of <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">final</code>,
        such as:</p>
      <pre style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;font-size: 1em; line-height: 1.2em;margin: 1.2em 0px;"><code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;white-space: pre; overflow: auto; border-radius: 3px; border: 1px solid rgb(204, 204, 204); padding: 0.5em 0.7em; display: block !important;"> final class C { }                          // truly final

 final interface Node                       // explicit version
     permits ANode, BNode { }

 non-final class ANode implements Node { }  // opt-out of transitivity

 final interface Node                       // inferred version
     permits <bikeshed> { }
</code></pre>
      <p style="margin: 0px 0px 1.2em !important;"> This eliminates both
        <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">sealed</code>
        and <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">non-sealed</code>
        as modifiers. The downside is, of course, that it will engender
        some “who moved my cheese” reactions. (We currently have
        separate spellings for <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">extends</code>
        and <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">implements</code>;
        some think this was a mistake, and it surely complicated things
        when we got to generics, as we created an asymmetry with <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;"><T  extends U></code>.
        The move of retconning <code style="font-size: 0.85em; font-family: Consolas, Inconsolata, Courier, monospace;margin: 0px 0.15em; padding: 0px 0.3em; white-space: pre-wrap; border: 1px solid rgb(234, 234, 234); background-color: rgb(248, 248, 248); border-radius: 3px; display: inline;">final</code>
        avoids replicating this mistake.) This is in line with the
        suggested retcon at the classfile level as well.</p>
      <div
title="MDH:PHR0PlNpbmNlIHdlJ3JlIGFscmVhZHkgZGlzY3Vzc2luZyBvbmUgb2YgdGhlIGNvbnNlcXVlbmNl&#xA;cyBvZiBzZWFsZWQgdHlwZXMsIGxldCdzIHB1dCB0aGUgd2hvbGUgc3Rvcnkgb24gdGhlIHRhYmxl&#xA;LiZuYnNwOyBUaGVzZSBhcmUgbXkgY3VycmVudCB0aG91Z2h0cywgYnV0IHRoZXJlJ3Mgcm9vbSBp&#xA;biB0aGUgZGVzaWduIHNwYWNlIHRvIHdhbmRlciBhIGJpdC4mbmJzcDsgPGJyPjwvdHQ+PHR0Pjxi&#xA;cj48YnI+KipEZWZpbml0aW9uLioqJm5ic3A7IEEgX3NlYWxlZCB0eXBlXyBpcyBvbmUgZm9yIHdo&#xA;aWNoIHN1YmNsYXNzaW5nIGlzIHJlc3RyaWN0ZWQgYWNjb3JkaW5nIHRvIGd1aWRhbmNlIHNwZWNp&#xA;ZmllZCB3aXRoIHRoZSB0eXBl4oCZcyBkZWNsYXJhdGlvbjsgZmluYWxpdHkgY2FuIGJlIGNvbnNp&#xA;ZGVyZWQgYSBkZWdlbmVyYXRlIGZvcm0gb2Ygc2VhbGluZywgd2hlcmUgbm8gc3ViY2xhc3NlcyBh&#xA;dCBhbGwgYXJlIHBlcm1pdHRlZC4gU2VhbGVkIHR5cGVzIGFyZSBhIHNlbnNpYmxlIG1lYW5zIG9m&#xA;IG1vZGVsaW5nIF9hbGdlYnJhaWMgc3VtIHR5cGVzXyBpbiBhIG5vbWluYWwgdHlwZSBoaWVyYXJj&#xA;aHk7IHRoZXkgZ28gbmljZWx5IHdpdGggcmVjb3JkcyAoX2FsZ2VicmFpYyBwcm9kdWN0IHR5cGVz&#xA;XyksIHRob3VnaCBhcmUgYWxzbyB1c2VmdWwgb24gdGhlaXIgb3duLjxicj48YnI+U2VhbGluZyBz&#xA;ZXJ2ZXMgdHdvIGRpc3RpbmN0IHB1cnBvc2VzLiZuYnNwOyBUaGUgZmlyc3QsIGFuZCBtb3JlIG9i&#xA;dmlvdXMsIGlzIHRoYXQgaXQgcmVzdHJpY3RzIHdobyBjYW4gYmUgYSBzdWJ0eXBlLiZuYnNwOyBU&#xA;aGlzIGlzIGxhcmdlbHkgYSBkZWNsYXJhdGlvbi1zaXRlIGNvbmNlcm4sIHdoZXJlIGFuIEFQSSBv&#xA;d25lciB3YW50cyB0byBkZWZlbmQgdGhlIGludGVncml0eSBvZiB0aGVpciBBUEkuJm5ic3A7IFRo&#xA;ZSBvdGhlciBpcyB0aGF0IGl0IHBvdGVudGlhbGx5IGVuYWJsZXMgZXhoYXVzdGl2ZW5lc3MgYW5h&#xA;bHlzaXMgYXQgdGhlIHVzZSBzaXRlIHdoZW4gc3dpdGNoaW5nIG92ZXIgc2VhbGVkIHR5cGVzIChh&#xA;bmQgcG9zc2libHkgb3RoZXIgZmVhdHVyZXMuKSZuYnNwOyBUaGlzIGlzIGxlc3Mgb2J2aW91cywg&#xA;YW5kIHRoZSBiZW5lZml0IGlzIGNvbnRpbmdlbnQgb24gc29tZSBvdGhlciB0aGluZ3MsIGJ1dCBp&#xA;cyB2YWx1YWJsZSBhcyBpdCBlbmFibGVzIGJldHRlciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2lu&#xA;Zy4mbmJzcDsgPGJyPjxicj5fTm90ZTpfIEl0IGlzIHByb2JhYmx5IGRlc2lyYWJsZSB0byBzaGlw&#xA;IHRoaXMgd2l0aCByZWNvcmRzLCB0aG91Z2ggaXQgY291bGQgYmUgc2hpcHBlZCBiZWZvcmUgb3Ig&#xA;YWZ0ZXIuPGJyPjxicj4qKkRlY2xhcmF0aW9uLioqJm5ic3A7IFdlIHNwZWNpZnkgdGhhdCBhIGNs&#xA;YXNzIGlzIHNlYWxlZCBieSBhcHBseWluZyB0aGUgYHNlYWxlZGAgbW9kaWZpZXIgdG8gYSBjbGFz&#xA;cywgYWJzdHJhY3QgY2xhc3MsIGludGVyZmFjZSwgb3IgcmVjb3JkOjxicj48YnI+Jm5ic3A7Jm5i&#xA;c3A7Jm5ic3A7IHNlYWxlZCBpbnRlcmZhY2UgTm9kZSB7IC4uLiB9PGJyPjxicj5JbiB0aGlzIHN0&#xA;cmVhbWxpbmVkIGZvcm0sIGBOb2RlYCBtYXkgYmUgZXh0ZW5kZWQgb25seSBieSBpdHMgbmVzdG1h&#xA;dGVzLiBUaGlzIG1heSBiZSBzdWl0YWJsZSBmb3IgbWFueSBzaXR1YXRpb25zLCBidXQgbm90IGZv&#xA;ciBhbGw7IGluIHRoaXMgY2FzZSwgdGhlIHVzZXIgbWF5IHNwZWNpZnkgYW4gZXhwbGljaXQgYHBl&#xA;cm1pdHNgIGxpc3Q6PGJyPjxicj4mbmJzcDsmbmJzcDsmbmJzcDsgc2VhbGVkIGludGVyZmFjZSBO&#xA;b2RlIDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcGVybWl0&#xA;cyBGb29Ob2RlLCBCYXJOb2RlIHsgLi4uIH08YnI+PGJyPlRoZSB0d28gZm9ybXMgbWF5IG5vdCBi&#xA;ZSBjb21iaW5lZDsgaWYgdGhlcmUgaXMgYSBwZXJtaXRzIGxpc3QsIGl0IG11c3QgbGlzdCBhbGwg&#xA;dGhlIHBlcm1pdHRlZCBzdWJ0eXBlcy4mbmJzcDsgV2UgY2FuIHRoaW5rIG9mIHRoZSBzaW1wbGUg&#xA;Zm9ybSBhcyBtZXJlbHkgaW5mZXJyaW5nIHRoZSBgcGVybWl0c2AgY2xhdXNlIGZyb20gaW5mb3Jt&#xA;YXRpb24gaW4gdGhlIHNhbWUgY29tcGlsYXRpb24gdW5pdC4mbmJzcDsgPGJyPjxicj4qKkV4aGF1&#xA;c3RpdmVuZXNzLioqJm5ic3A7IE9uZSBvZiB0aGUgYmVuZWZpdHMgb2Ygc2VhbGluZyBpcyB0aGF0&#xA;IHRoZSBjb21waWxlciBjYW4gZW51bWVyYXRlIHRoZSBwZXJtaXR0ZWQgc3VidHlwZXMgb2YgYSBz&#xA;ZWFsZWQgdHlwZTsgdGhpcyBpbiB0dXJuIGxldHMgdXMgcGVyZm9ybSBleGhhdXN0aXZlbmVzcyBh&#xA;bmFseXNpcyB3aGVuIHN3aXRjaGluZyBvdmVyIHBhdHRlcm5zIGludm9sdmluZyBzZWFsZWQgdHlw&#xA;ZXMuIChJbiB0aGUgc2ltcGxpZmllZCBmb3JtLCB0aGUgY29tcGlsZXIgY29tcHV0ZXMgdGhlIHBl&#xA;cm1pdHMgbGlzdCBieSBlbnVtZXJhdGluZyB0aGUgc3VidHlwZXMgaW4gdGhlIG5lc3Qgd2hlbiB0&#xA;aGUgbmVzdCBpcyBkZWNsYXJlZCwgc2luY2UgdGhleSBhcmUgaW4gYSBzaW5nbGUgY29tcGlsYXRp&#xA;b24gdW5pdC4pJm5ic3A7IFBlcm1pdHRlZCBzdWJ0eXBlcyBtdXN0IGJlbG9uZyB0byB0aGUgc2Ft&#xA;ZSBtb2R1bGUgKG9yLCBpZiBub3QgaW4gYSBtb2R1bGUsIHRoZSBzYW1lIHBhY2thZ2UgYW5kIHBy&#xA;b3RlY3Rpb24gZG9tYWluLik8YnI+PGJyPl9Ob3RlOl8gSXQgaXMgc3VwZXJmaWNpYWxseSB0ZW1w&#xA;dGluZyB0byBoYXZlIGEgcmVsYXhlZCBidXQgbGVzcyBleHBsaWNpdCBmb3JtLCBzYXkgd2hpY2gg&#xA;YWxsb3dzIGZvciBhIHR5cGUgdG8gYmUgZXh0ZW5kZWQgYnkgcGFja2FnZS1tYXRlcyBvciBtb2R1&#xA;bGUtbWF0ZXMgd2l0aG91dCBsaXN0aW5nIHRoZW0gYWxsLiBIb3dldmVyLCB0aGlzIHdvdWxkIHVu&#xA;ZGVybWluZSB0aGUgY29tcGlsZXLigJlzIGFiaWxpdHkgdG8gcmVhc29uIGFib3V0IGV4aGF1c3Rp&#xA;dmVuZXNzLiZuYnNwOyBUaGlzIHdvdWxkIGFjaGlldmUgdGhlIGRlc2lyZWQgc3ViY2xhc3Npbmcg&#xA;cmVzdHJpY3Rpb25zLCBidXQgbm90IHRoZSBkZXNpcmVkIGFiaWxpdHkgdG8gcmVhc29uIGFib3V0&#xA;IGV4aGF1c3RpdmVuZXNzLiZuYnNwOyA8YnI+PGJyPioqQ2xhc3NmaWxlLioqJm5ic3A7IEluIHRo&#xA;ZSBjbGFzc2ZpbGUsIGEgc2VhbGVkIHR5cGUgaXMgaWRlbnRpZmllZCB3aXRoIGFuIGBBQ0NfU0VB&#xA;TEVEYCBtb2RpZmllciAod2UgY291bGQgY2hvb3NlIHRvIG92ZXJsb2FkIGBBQ0NfRklOQUxgIGZv&#xA;ciBiaXQgcHJlc2VydmF0aW9uKSwgYW5kIGEgYFNlYWxlZGAgYXR0cmlidXRlIHdoaWNoIGNvbnRh&#xA;aW5zIGEgbGlzdCBvZiBwZXJtaXR0ZWQgc3VidHlwZXMgKHNpbWlsYXIgaW4gc3RydWN0dXJlIHRv&#xA;IHRoZSBuZXN0bWF0ZSBhdHRyaWJ1dGVzLik8YnI+PGJyPioqVHJhbnNpdGl2aXR5LioqJm5ic3A7&#xA;IFNlYWxpbmcgaXMgdHJhbnNpdGl2ZTsgdW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIGFuIGFi&#xA;c3RyYWN0IHN1YnR5cGUgb2YgYSBzZWFsZWQgdHlwZSBpcyBpbXBsaWNpdGx5IHNlYWxlZCwgYW5k&#xA;IGEgY29uY3JldGUgc3VidHlwZSBvZiBhIHNlYWxlZCB0eXBlIGlzIGltcGxpY2l0bHkgZmluYWwu&#xA;IFRoaXMgY2FuIGJlIHJldmVyc2VkIGJ5IGV4cGxpY2l0bHkgbW9kaWZ5aW5nIHRoZSBzdWJ0eXBl&#xA;IHdpdGggdGhlIGBub24tc2VhbGVkYCBvciBgbm9uLWZpbmFsYCBtb2RpZmllcnMuPGJyPjxicj5V&#xA;bnNlYWxpbmcgYSBzdWJ0eXBlIGluIGEgaGllcmFyY2h5IGRvZXNuJ3QgdW5kZXJtaW5lIHRoZSBz&#xA;ZWFsaW5nLCBiZWNhdXNlIHRoZSAocG9zc2libHkgaW5mZXJyZWQpIHNldCBvZiBleHBsaWNpdGx5&#xA;IHBlcm1pdHRlZCBzdWJ0eXBlcyBzdGlsbCBjb25zdGl0dXRlcyBhIHRvdGFsIGNvdmVyaW5nLiZu&#xA;YnNwOyBIb3dldmVyLCB1c2VycyB3aG8ga25vdyBhYm91dCB1bnNlYWxlZCBzdWJ0eXBlcyBjYW4g&#xA;dXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gdGhlaXIgYmVuZWZpdCAobXVjaCBsaWtlIHdlIGRvIHdp&#xA;dGggZXhjZXB0aW9ucyB0b2RheTsgeW91IGNhbiBjYXRjaCBGaWxlTm90Rm91bmRFeGNlcHRpb24g&#xA;c2VwYXJhdGVseSBmcm9tIElPRXhjZXB0aW9uIGlmIHlvdSB3YW50LCBidXQgZG9uJ3QgaGF2ZSB0&#xA;by4pJm5ic3A7IDxicj48YnI+X05vdGU6XyBTY2FsYSBtYWRlIHRoZSBvcHBvc2l0ZSBjaG9pY2Ug&#xA;d2l0aCByZXNwZWN0IHRvIHRyYW5zaXRpdml0eSwgcmVxdWlyaW5nIHNlYWxpbmcgdG8gYmUgb3B0&#xA;ZWQgaW50byBhdCBhbGwgbGV2ZWxzLiBUaGlzIGlzIHdpZGVseSBiZWxpZXZlZCB0byBiZSBhIHNv&#xA;dXJjZSBvZiBidWdzOyBpdCBpcyByYXJlIHRoYXQgb25lIGFjdHVhbGx5IHdhbnRzIGEgc3VidHlw&#xA;ZSBvZiBhIHNlYWxlZCB0eXBlIHRvIG5vdCBiZSBzZWFsZWQuJm5ic3A7IEkgc3VzcGVjdCB0aGUg&#xA;cmVhc29uaW5nIGluIFNjYWxhIHdhcywgYXQgbGVhc3QgcGFydGlhbGx5LCB0aGUgZGVzaXJlIHRv&#xA;IG5vdCBtYWtlIHVwIGEgbmV3IGtleXdvcmQgZm9yIOKAnG5vdCBzZWFsZWTigJ0uJm5ic3A7IFRo&#xA;aXMgaXMgdW5kZXJzdGFuZGFibGUsIGJ1dCBJJ2QgcmF0aGVyIG5vdCBhZGQgdG8gdGhlIGxpc3Qg&#xA;b2YgInRoaW5ncyBmb3Igd2hpY2ggSmF2YSBnb3QgdGhlIGRlZmF1bHRzIHdyb25nLiI8YnI+PGJy&#xA;PkFuIGV4YW1wbGUgb2Ygd2hlcmUgZXhwbGljaXQgdW5zZWFsaW5nIChhbmQgcHJpdmF0ZSBzdWJ0&#xA;eXBlcykgaXMgdXNlZnVsIGNhbiBiZSBmb3VuZCBpbiB0aGUgSkVQLTMzNCBBUEk6PGJyPjxicj4m&#xA;bmJzcDsmbmJzcDsmbmJzcDsgc2VhbGVkIGludGVyZmFjZSBDb25zdGFudERlc2M8YnI+Jm5ic3A7&#xA;Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBlcm1pdHMgU3RyaW5nLCBJbnRl&#xA;Z2VyLCBGbG9hdCwgTG9uZywgRG91YmxlLCA8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i&#xA;c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7&#xA;Jm5ic3A7IENsYXNzRGVzYywgTWV0aG9kVHlwZURlc2MsIE1ldGhvZEhhbmRsZURlc2MsIDxicj4m&#xA;bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz&#xA;cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgRHluYW1pY0NvbnN0YW50RGVzYyB7IH08&#xA;YnI+PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyBzZWFsZWQgaW50ZXJmYWNlIENsYXNzRGVzYyBleHRl&#xA;bmRzIENvbnN0YW50RGVzYzxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm&#xA;bmJzcDsgcGVybWl0cyBQcmltaXRpdmVDbGFzc0Rlc2NJbXBsLCBSZWZlcmVuY2VDbGFzc0Rlc2NJ&#xA;bXBsIHsgfTwvdHQ+PGJyPjxicj48dHQ+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwcml2YXRlIGNs&#xA;YXNzIFByaW1pdGl2ZUNsYXNzRGVzY0ltcGwgaW1wbGVtZW50cyBDbGFzc0Rlc2MgeyB9PGJyPgo8&#xA;L3R0PjwvdHQ+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBwcml2YXRlIGNsYXNzIFJlZmVyZW5jZUNs&#xA;YXNzRGVzY0ltcGwgaW1wbGVtZW50cyBDbGFzc0Rlc2MgeyB9PGJyPgo8L3R0Pjx0dD48dHQ+PGJy&#xA;PiZuYnNwOyZuYnNwOyZuYnNwOyBzZWFsZWQgaW50ZXJmYWNlIE1ldGhvZFR5cGVEZXNjIGV4dGVu&#xA;ZHMgQ29uc3RhbnREZXNjPGJyPgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm&#xA;bmJzcDsgcGVybWl0cyBNZXRob2RUeXBlRGVzY0ltcGwgeyB9PGJyPgogIDxicj4KPC90dD48L3R0&#xA;Pjx0dD48dHQ+PHR0PiZuYnNwOyZuYnNwOyZuYnNwOyBzZWFsZWQgaW50ZXJmYWNlIE1ldGhvZEhh&#xA;bmRsZURlc2MgZXh0ZW5kcyBDb25zdGFudERlc2M8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw&#xA;OyZuYnNwOyZuYnNwOyZuYnNwOyBwZXJtaXRzIERpcmVjdE1ldGhvZEhhbmRsZURlc2MsIE1ldGhv&#xA;ZEhhbmRsZURlc2NJbXBsIHsgfTxicj48YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IHNlYWxlZCBpbnRl&#xA;cmZhY2UgRGlyZWN0TWV0aG9kSGFuZGxlRGVzYyBleHRlbmRzIE1ldGhvZEhhbmRsZURlc2M8YnI+&#xA;Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7IHBlcm1pdHMgRGlyZWN0&#xA;TWV0aG9kSGFuZGxlRGVzY0ltcGw8YnI+PGJyPiZuYnNwOyZuYnNwOyZuYnNwOyAvLyBkZXNpZ25l&#xA;ZCBmb3Igc3ViY2xhc3Npbmc8YnI+Jm5ic3A7Jm5ic3A7Jm5ic3A7IG5vbi1zZWFsZWQgY2xhc3Mg&#xA;RHluYW1pY0NvbnN0YW50RGVzYyBleHRlbmRzIENvbnN0YW50RGVzYyB7IC4uLiB9PGJyPgogIDxi&#xA;cj4KPC90dD48L3R0Pjxicj4qKkVuZm9yY2VtZW50LioqJm5ic3A7IEJvdGggdGhlIGNvbXBpbGVy&#xA;IGFuZCBKVk0gc2hvdWxkIGVuZm9yY2Ugc2VhbGluZy48YnI+PGJyPl9Ob3RlOl8gSXQgbWlnaHQg&#xA;YmUgYWxsb3dhYmxlIGZvciBWTSBzdXBwb3J0IHRvIGZvbGxvdyBpbiBhIGxhdGVyIHZlcnNpb24s&#xA;IHJhdGhlciB0aGFuIGRlbGF5aW5nIHRoZSBmZWF0dXJlIGVudGlyZWx5Ljxicj48YnI+KipBY2Nl&#xA;c3NpYmlsaXR5LioqIFN1YnR5cGVzIG5lZWQgbm90IGJlIGFzIGFjY2Vzc2libGUgYXMgdGhlIHNl&#xA;YWxlZCBwYXJlbnQuJm5ic3A7IEluIHRoaXMgY2FzZSwgY2xpZW50cyBhcmUgbm90IGdvaW5nIHRv&#xA;IGdldCB0aGUgY2hhbmNlIHRvIGV4aGF1c3RpdmVseSBzd2l0Y2ggb3ZlciB0aGVtOyB0aGV5J2xs&#xA;IGhhdmUgdG8gbWFrZSB0aGVzZSBzd2l0Y2hlcyBleGhhdXN0aXZlIHdpdGggYSBgZGVmYXVsdGAg&#xA;Y2xhdXNlIG9yIG90aGVyIHRvdGFsIHBhdHRlcm4uJm5ic3A7IFdoZW4gY29tcGlsaW5nIGEgc3dp&#xA;dGNoIG92ZXIgc3VjaCBhIHNlYWxlZCB0eXBlLCB0aGUgY29tcGlsZXIgY2FuIHByb3ZpZGUgYSB1&#xA;c2VmdWwgZXJyb3IgbWVzc2FnZSAoIkkga25vdyB0aGlzIGlzIGEgc2VhbGVkIHR5cGUsIGJ1dCBJ&#xA;IGNhbid0IHByb3ZpZGUgZnVsbCBleGhhdXN0aXZlbmVzcyBjaGVja2luZyBoZXJlIGJlY2F1c2Ug&#xA;eW91IGNhbid0IHNlZSBhbGwgdGhlIHN1YnR5cGVzLCBzbyB5b3Ugc3RpbGwgbmVlZCBhIGRlZmF1&#xA;bHQuIikmbmJzcDsgPGJyPjwvdHQ+PGJyPjx0dD48dHQ+KipKYXZhZG9jLioqIFRoZSBsaXN0IG9m&#xA;IHBlcm1pdHRlZCBzdWJ0eXBlcyBzaG91bGQgcHJvYmFibHkgYmUgCmNvbnNpZGVyZWQgcGFydCBv&#xA;ZiB0aGUgc3BlYywgYW5kIGluY29ycG9yYXRlZCBpbnRvIHRoZSBKYXZhZG9jLiZuYnNwOyBOb3Rl&#xA;IAp0aGF0IHRoaXMgaXMgbm90IGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgIkFsbCBp&#xA;bXBsZW1lbnRpbmcgCmNsYXNzZXMiIGxpc3QgdGhhdCBKYXZhZG9jIGN1cnJlbnRseSBpbmNsdWRl&#xA;cywgc28gYSBsaXN0IGxpa2UgIkFsbCAKcGVybWl0dGVkIHN1YnR5cGVzIiBtaWdodCBiZSBhZGRl&#xA;ZCAocG9zc2libHkgd2l0aCBzb21lIGluZGljYXRpb24gaWYgdGhlCiBzdWJ0eXBlIGlzIGxlc3Mg&#xA;YWNjZXNzaWJsZSB0aGFuIHRoZSBwYXJlbnQuKTxicj4KPC90dD48YnI+PGJyPjxicj48L3R0Pjxi&#xA;cj48dHQ+PHR0Pjx0dD5fT3BlbiBxdWVzdGlvbjpfIFdpdGggdGhlIGFkdmVudCBvZiByZWNvcmRz&#xA;LCB3aGljaCBhbGxvdyB1cyB0byAKZGVmaW5lIGNsYXNzZXMgaW4gYSBzaW5nbGUgbGluZSwgdGhl&#xA;ICJvbmUgY2xhc3MgcGVyIGZpbGUiIHJ1bGUgc3RhcnRzIHRvCiBzZWVtIGJvdGggYSBsaXR0bGUg&#xA;c2lsbHksIGFuZCBjb25zdHJhaW4gdGhlIHVzZXIncyBhYmlsaXR5IHRvIHB1dCAKcmVsYXRlZCBk&#xA;ZWZpbml0aW9ucyB0b2dldGhlciAod2hpY2ggbWF5IGJlIG1vcmUgcmVhZGFibGUpIHdoaWxlIApl&#xA;eHBvcnRpbmcgYSBmbGF0IG5hbWVzcGFjZSBpbiB0aGUgcHVibGljIEFQSS4mbmJzcDsgSSB0aGlu&#xA;ayBpdCBpcyB3b3J0aCAKY29uc2lkZXJpbmcgcmVsYXhpbmcgdGhpcyBydWxlIHRvIHBlcm1pdCBm&#xA;b3Igc2VhbGVkIGNsYXNzZXMsIHNheTogCmFsbG93aW5nIHB1YmxpYyBhdXhpbGxpYXJ5IHN1YnR5&#xA;cGVzIG9mIHRoZSBwcmltYXJ5IHR5cGUsIGlmIHRoZSBwcmltYXJ5IAp0eXBlIGlzIHB1YmxpYyBh&#xA;bmQgc2VhbGVkLiZuYnNwOyA8YnI+CuKAizxicj48L3R0Pl9TeW50YWN0aWMgYWx0ZXJuYXRpdmU6&#xA;XyZuYnNwOyBSYXRoZXIgdGhhbiBpbnZlbnRpbmcgYSBuZXcgbW9kaWZpZXIgCih3aGljaCB0aGVu&#xA;IG5lZWRzIGEgbmVnYXRpb24gbW9kaWZpZXIpLCB3ZSBjb3VsZCBnZW5lcmFsaXplIHRoZSBtZWFu&#xA;aW5nIApvZiBgZmluYWxgLCBzdWNoIGFzOjxicj4KICA8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBm&#xA;aW5hbCBjbGFzcyBDIHsgfSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw&#xA;OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu&#xA;YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyB0&#xA;cnVseSBmaW5hbDxicj4KICA8YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyBmaW5hbCBpbnRlcmZhY2Ug&#xA;Tm9kZSZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw&#xA;OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu&#xA;YnNwOyZuYnNwOyZuYnNwOyZuYnNwOyAvLyBleHBsaWNpdCB2ZXJzaW9uPGJyPgombmJzcDsmbmJz&#xA;cDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsgcGVybWl0cyBBTm9kZSwgQk5vZGUgeyB9&#xA;PGJyPgogIDxicj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IG5vbi1maW5hbCBjbGFzcyBBTm9kZSBpbXBs&#xA;ZW1lbnRzIE5vZGUgeyB9Jm5ic3A7IC8vIG9wdC1vdXQgb2YgdHJhbnNpdGl2aXR5PGJyPgogIDxi&#xA;cj4KJm5ic3A7Jm5ic3A7Jm5ic3A7IGZpbmFsIGludGVyZmFjZSBOb2RlJm5ic3A7Jm5ic3A7Jm5i&#xA;c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7&#xA;Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i&#xA;c3A7IC8vIGluZmVycmVkIHZlcnNpb248YnI+CiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw&#xA;OyZuYnNwOyZuYnNwOyBwZXJtaXRzICZsdDtiaWtlc2hlZCZndDsgeyB9PGJyPgogIDxicj4KVGhp&#xA;cyBlbGltaW5hdGVzIGJvdGggYHNlYWxlZGAgYW5kIGBub24tc2VhbGVkYCBhcyBtb2RpZmllcnMu&#xA;Jm5ic3A7IFRoZSAKZG93bnNpZGUgaXMsIG9mIGNvdXJzZSwgdGhhdCBpdCB3aWxsIGVuZ2VuZGVy&#xA;IHNvbWUgIndobyBtb3ZlZCBteSBjaGVlc2UiCiByZWFjdGlvbnMuJm5ic3A7IChXZSBjdXJyZW50&#xA;bHkgaGF2ZSBzZXBhcmF0ZSBzcGVsbGluZ3MgZm9yIGBleHRlbmRzYCBhbmQgCmBpbXBsZW1lbnRz&#xA;YDsgc29tZSB0aGluayB0aGlzIHdhcyBhIG1pc3Rha2UsIGFuZCBpdCBzdXJlbHkgY29tcGxpY2F0&#xA;ZWQgCnRoaW5ncyB3aGVuIHdlIGdvdCB0byBnZW5lcmljcywgYXMgd2UgY3JlYXRlZCBhbiBhc3lt&#xA;bWV0cnkgd2l0aCBgJmx0O1QgCmV4dGVuZHMgVSZndDtgLiZuYnNwOyBUaGUgbW92ZSBvZiByZXRj&#xA;b25uaW5nIGBmaW5hbGAgYXZvaWRzIHJlcGxpY2F0aW5nIHRoaXMgCm1pc3Rha2UuKSZuYnNwOyBU&#xA;aGlzIGlzIGluIGxpbmUgd2l0aCB0aGUgc3VnZ2VzdGVkIHJldGNvbiBhdCB0aGUgY2xhc3NmaWxl&#xA;IGxldmVsIGFzIHdlbGwuPGJyPgogIDxicj4KPC90dD48L3R0Pg=="
style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0;">​</div>
    </div>
  </body>
</html>