Inactive [MECH] SignLift v1.22 - Elevators with signs [1.2.5 R1.0] (Permissions)

Discussion in 'Inactive/Unsupported Plugins' started by freman, Jan 30, 2011.

  1. Offline

    freman

    SignLift - Elevators with signs:
    Version: v1.22

    Based on CraftBook's elevator system, SignLift works very much the same way - with two small improvements:
    1. Before transporting you it checks to make sure that you won't warp into a wall
    2. Prevents accidental block placement on transport
    Create signs on top of each other with [Lift up]/[Lift down]/[Lift] on the second line to use.

    Create signs on top of each other with {Lift up}/{Lift down}/{Lift} on the second line to create a private lift

    Example:
    Create a sign on ground level with the second line set to [Lift Down]
    Dig down under that sign (place a block in the top of the hole)
    Create a sign with the second line set to [Lift Up]

    Right click the sign to use



    Features:
    • Customizable strings
    • Safety checks to prevent into wall "lifting"
    • Brick placement prevention
    • First line can be the floor name
    • Hide signs on the back of blocks and use buttons!
    • Private lifts
    • Permissions
    Download SignLift


    Configuration (config.yml)
    Show Spoiler

    Code:
    string:
        lift: LIFT
            - String users will use when placing lifts that go neither up nore down
     
        down:
            lift: LIFT DOWN
            - String users will use when placing lifts that go down
     
            default: Going Down
            - What is messaged to the user when going down
     
            format: Going to %s
            - Message format for going down to a named floor (%s gets replaced with name)
     
        normal:
            open: '['
            - Open for normal lifts
            close: ']'
            - Close for normal lifts
        private:
            open: '{'
            - Open for private lifts
            close: '}'
            - Close for private lifts
        up:
            lift: LIFT UP
            - String users will use when placing lifts that go up
     
            default: Going Up
            - What is messaged to the user when going up
     
            format: Going to %s
            - Message format for going up to a named floor (%s gets replaced with name)
     
        message:
            destroy:
                denied: You don't have permission to destroy that sign lift
                - Message to display when someone attempts to destroy a lift they don't have permission to
            lift:
                denied: You don't have permission to use this lift
                - Message to display when someone attempts to use a lift they don't have permission to
            create:
                denied: You don't have permission to create that sign lift
                - Message to display when someone attempts to create a lift they don't have permission to
     
    check:
        destination:
            paranoid: true
            - true: Uses original algorithm, gaurenteed not transport you into a block
            - false: Uses new one, may end up being partially in a block (never wholely)
    


    Permissions (PermissionsBukkit)
    Show Spoiler

    Code:
    signlift.*:
    - Gives access to all SignLift privileges
    signlift.create.*:
    - Gives access to all SignLift create privileges
    signlift.create.normal:
    - Permits the creation of a normal sign lifts for anyone to use
    signlift.create.private.own:
    - Permits the creation of private sign lifts with the PRIVATE tag
    signlift.create.private.others:
    - Permits the creation of private sign lifts for other users
    signlift.use.normal:
    - Permits the use of any normal sign lift
    signlift.use.private.own:
    - Permits the use of any private sign lift made for this user
    signlift.use.private.others:
    - Permits the use of other users private lifts
    
    If no permissions manager is installed then the default's are that every player can do everything with exception to signlift.use.private.others which only ops can use.


    Changelog:
    Version 1.22
    • Changed the whitespace checks
    • Fixed the parameters error.
    Version 1.21
    • Added more whitespace checks to pervent crashing on empty signs
    Show Spoiler


    Version 1.2
    • Updated for 1.2.3 R0.2
    • Added a whitespace check to pervent crashing on empty signs
    Version 1.1
    • Fixed block placing bug introduced in 1.0
    Version 1.0
    • Private signs are now done by encapsulating the "LIFT UP", "LIFT DOWN" and "LIFT" in {} instead of []
    • Saves owner to disk
    • Delete your configuration file
    Version 0.9
    • Permissions
    • Basic block protection
    • Might be a good idea to delete your config, it won't break but you'll have old unused values
    Version 0.8
    • Introduction of private lifts
    • Updated deprecated code
    Version 0.7
    • Updated build for latest bukkit - Will not work on older builds.
    • Re-factored the entire codebase, buttons will now respond to left clicks as well as right clicks.
    Version 0.6

    • Updated build for latest bukkit - might work on older builds but not too old...
    • Changed the sign seek code on the button will only look for wall signs on the opposite side of the block directly behind the button.
    Version 0.5

    • Made it so you can hide signs on the back of blocks and use buttons
    Version 0.4

    • Add configuration file
    • Make strings used customizable
    • Make it possible to switch to a less paranoid block detection algorithm
    • Cleaned up accidental block place prevention code.
    Version 0.3

    • Added ladders to the list of safe things
    • Fixed rounding issues
    Version 0.2

    • Bug fixes...
    Version 0.1

    • Releasing my awesome plugin




    Support:
    Alcohol makes coding in Java more fun, Caffeine makes it possible to do after a day of coding in other languages at work - both of these habits are expensive - Want to help me feed my addictions and make more, better plugins faster? Consider hitting the button below.
    [​IMG]
     
  2. Offline

    freman

    Skera likes this.
  3. Offline

    Skera

  4. Offline

    alfskan

    Code:
    2011-07-22 09:32:49 [SEVERE] Could not pass event PLAYER_INTERACT to SignLift
    java.lang.NullPointerException
        at org.bukkit.craftbukkit.block.CraftBlock.getState(CraftBlock.java:311)
        at au.net.fremnet.bukkit.SignLift.LiftSign.<init>(LiftSign.java:43)
        at au.net.fremnet.bukkit.SignLift.SignLiftPlayerListener.onPlayerInteract(SignLiftPlayerListener.java:57)
        at org.bukkit.plugin.java.JavaPluginLoader$10.execute(JavaPluginLoader.java:307)
        at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.java:58)
        at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.java:321)
        at org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent(CraftEventFactory.java:168)
        at net.minecraft.server.ItemInWorldManager.interact(ItemInWorldManager.java:210)
        at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:552)
        at net.minecraft.server.Packet15Place.a(SourceFile:57)
        at net.minecraft.server.NetworkManager.b(NetworkManager.java:226)
        at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:84)
        at net.minecraft.server.NetworkListenThread.a(SourceFile:105)
        at net.minecraft.server.MinecraftServer.h(MinecraftServer.java:457)
        at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:367)
        at net.minecraft.server.ThreadServerApplication.run(SourceFile:422)
    
    I got this error when I interact with MOD`s items.
     
  5. Offline

    freman

    What's a "MOD`s items"?
    What version of SignLift are you using?
     
  6. Offline

    Peter110

    It won't work :(
    I only get the message that I am the protectionowner, crash here?
    But do I need to do something with the config file?
    I just pasted that spioler under the download link into the configfile.
    Do I need to do something special? I'm new with plug ins :/
     
  7. Offline

    freman

    If the error is in minecraft, try showing a screenshot here.
    If the error is on the server copy the error message out and paste it here.
    The error you describe doesn't sound like any message I wrote into the plugin.
     
  8. Offline

    Peter110

    It just don't do anything.
    That is all. :(
    But it is another essentials plug in that makes the protection owner thing.But do I need to do anything after the innstallasjon and that the server gets 'em?
    Config?
     
  9. Offline

    Stephen304

    I have a lift that says
    1. Spawn Shop
    2. [Lift Down]
    3.
    4. To Public Mines

    And I am OP and admin in permissions and it won't let me use the lift, however a similar lift with the 4th line blank lets me use it. I think this is due to it trying to match my name to "To Public Mines". Is there a way to make it so that the third line has to say [Private] and 4th gets the name automatically so that when I need to add extra description on the sign I don't inadvertently make it private?

    Or maybe when someone adds [Private] to the 4th line it gets changed to [P] <name>? Sometimes I really need to use the 3rd and 4th lines of the sign to describe things or tell people where it goes.
     
  10. Offline

    freman

    Hmmm interesting conflict...
    You should be able to use the signlift.* permission or set signlift.use.private.other: true

    I'd just assumed the 3rd line was being used for description...

    Not sure how I'll fix that...
     
  11. Offline

    Stephen304

    Sometimes I use 3rd and 4th like one elevator in my mine says

    Public Tunnels
    [Lift Up]
    To Spawn Shop
    To Surface

    I think maybe use 4th line but have it so it ends up being [P] <name> or something so it can't be confused with normal text on 4th line, I'm also wondering what happens to users with extremely long names.
     
  12. Offline

    freman

    Which is why I'm non-to-keen to prefix names, as it stands if you have a 20 character name it just checks the first 15 (max per sign line)
     
  13. Offline

    Stephen304

    How about
    [Lift] [Lift Up] [Lift Down]
    [PLift Up] [PLift Down]
    ?
    then 4th line is replaced with name, that way public lifts can still use 3rd and 4th line.
    (No need for [PLift] since you cant operate that end of a lift)
    Instead of checking 4th line for name first, check if it's plift then check the 4th line.
     
  14. Offline

    Peter110

    Found out that it is my EssentialsProtect, it's telling that I set ip the sign.
    But do I just need to install the plug in in the plugins folder and paste the name in the properties? Do I need to do something else?

    I found this in my console. Highlighted the first line that has with SignLift to do.
    151 recipes
    16 achievements
    20:54:04 [INFO] Starting minecraft server version Beta 1.7.2
    20:54:04 [INFO] Loading properties
    20:54:04 [INFO] Starting Minecraft server on 5.67.181.252:25565
    20:54:04 [WARNING] **** SERVER IS RUNNING IN OFFLINE/INSECURE MODE!
    20:54:04 [WARNING] The server will make no attempt to authenticate usernames. Be
    ware.
    20:54:04 [WARNING] While this makes the game possible to play without internet a
    ccess, it also opens up the ability for hackers to connect with any username the
    y choose.
    20:54:04 [WARNING] To change this, set "online-mode" to "true" in the server.set
    tings file.
    20:54:04 [INFO] This server is running Craftbukkit version git-Bukkit-0.0.0-904-
    g9277096-b953jnks (MC: 1.7.2)
    20:54:05 [SEVERE] Could not load 'plugins\SignLift.jar' in folder 'plugins':
    while parsing a block mapping
    in "<reader>", line 2, column 5:
    lift: '[LIFT]'
    ^
    expected <block end>, but found BlockSequenceStart
    in "<reader>", line 3, column 9:
    - String users will use when pla ...
    ^

    at org.yaml.snakeyaml.parser.ParserImpl$ParseBlockMappingKey.produce(Par
    serImpl.java:576)
    at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:163)
    at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:148)
    at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java
    :228)
    at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:160)
    at org.yaml.snakeyaml.composer.Composer.composeMappingNode(Composer.java
    :230)
    at org.yaml.snakeyaml.composer.Composer.composeNode(Composer.java:160)
    at org.yaml.snakeyaml.composer.Composer.composeDocument(Composer.java:12
    2)
    at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:105)

    at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseCons
    tructor.java:124)
    at org.yaml.snakeyaml.Yaml.load(Yaml.java:264)
    at org.bukkit.util.config.Configuration.load(Configuration.java:82)
    at org.bukkit.plugin.java.JavaPlugin.initialize(JavaPlugin.java:157)
    at org.bukkit.plugin.java.JavaPluginLoader.loadPlugin(JavaPluginLoader.j
    ava:175)
    at org.bukkit.plugin.SimplePluginManager.loadPlugin(SimplePluginManager.
    java:199)
    at org.bukkit.plugin.SimplePluginManager.loadPlugins(SimplePluginManager
    .java:122)
    at org.bukkit.craftbukkit.CraftServer.loadPlugins(CraftServer.java:118)
    at org.bukkit.craftbukkit.CraftServer.<init>(CraftServer.java:89)
    at net.minecraft.server.ServerConfigurationManager.<init>(ServerConfigur
    ationManager.java:51)
    at net.minecraft.server.MinecraftServer.init(MinecraftServer.java:132)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:335)
    at net.minecraft.server.ThreadServerApplication.run(SourceFile:422)
    20:54:05 [INFO] Preparing level "┼sgard"
    20:54:05 [INFO] Preparing start region for level 0 (Seed: -701042014551032794)
    20:54:06 [INFO] Preparing spawn area: 48%
    20:54:07 [INFO] Preparing start region for level 1 (Seed: -2560447639217350901)
    20:54:22 [INFO] Preparing spawn area: 0%
    20:54:23 [INFO] Preparing spawn area: 77%
    20:54:24 [INFO] Loaded Essentials build 2.4.2 by Zenexer, ementalo, Aelux, Brett
    flan, KimKandor, snowleo, ceulemans and Xeology
    20:54:24 [INFO] [Essentials] Payment method found (iConomy version: 5)
    20:54:24 [INFO] Loaded EssentialsChat build 2.4.2 by Zenexer, ementalo, Aelux, B
    rettflan, KimKandor, snowleo, ceulemans and Xeology
    20:54:24 [INFO] Loaded EssentialsGeoIP build 2.4.2 by Zenexer, ementalo, Aelux,
    Brettflan, KimKandor, snowleo, ceulemans and Xeology
    20:54:24 [INFO] This product includes GeoLite data created by MaxMind, available
    from http://www.maxmind.com/.
    20:54:24 [INFO] GroupManager - INFO - Scheduled Data Saving is set for every 10
    minutes!
    20:54:24 [INFO] GroupManager version 1.0(alpha-5) [Zombie-Version, please switch
    to Permissions 3] is enabled!
    20:54:24 [INFO] Loaded EssentialsProtect build 2.4.2 by Zenexer, ementalo, Aelux
    , Brettflan, KimKandor, snowleo, ceulemans and Xeology
    20:54:24 [INFO] Loaded EssentialsSpawn build 2.4.2 by Zenexer, ementalo, Aelux,
    Brettflan, KimKandor, snowleo, ceulemans and Xeology
    20:54:25 [INFO] [iConomy] Logging is currently disabled.
    20:54:25 [INFO] [iConomy] v5.01 (Eruanna) loaded.
    20:54:25 [INFO] [iConomy] Developed by: [Nijikokun]
    20:54:25 [INFO] PCD loaded.
    20:54:25 [INFO] Fake Permissions version 2.7.2 is enabled!
    20:54:25 [INFO] [iConomy] hooked into Permissions.
    20:54:25 [INFO] Done (2.017s)! For help, type "help" or "?"
    >











    And I pasted this into the config, it feeled right :D

    tring:
    lift: '[LIFT]'
    - String users will use when placing lifts that go neither up nore down

    down:
    lift: '[LIFT DOWN]'
    - String users will use when placing lifts that go down

    default: Going Down
    - What is messaged to the user when going down

    format: Going to %s
    - Message format for going down to a named floor (%s gets replaced with name)

    up:
    lift: '[LIFT UP]'
    - String users will use when placing lifts that go up

    default: Going Up
    - What is messaged to the user when going up

    format: Going to %s
    - Message format for going up to a named floor (%s gets replaced with name)

    private: '[PRIVATE]'
    - Identify a private lift (gets replaced by the player name)

    message:
    destroy:
    denied: You don't have permission to destroy that sign lift
    - Message to display when someone attempts to destroy a lift they don't have permission to
    lift:
    denied: You don't have permission to use this lift
    - Message to display when someone attempts to use a lift they don't have permission to
    create:
    denied: You don't have permission to create that sign lift
    - Message to display when someone attempts to create a lift they don't have permission to

    check:
    destination:
    paranoid: true
    - true: Uses original algorithm, gaurenteed not transport you into a block
    - false: Uses new one, may end up being partially in a block (never wholely)

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 7, 2016
  15. Offline

    freman

    You might need to disable something in EssentialsProtect.

    Try removing the lines starting with -
     
  16. Offline

    Peter110

    Ok, I will try, but I'm not good at this :D
    But I downloaded right?
    Downloading, placing in the plugins, add SignLift to the properties, and change the config to the text that I just posted and is written under the spoiler?
     
  17. Offline

    freman

    Try deleting the config and let the plugin create it's own (delete SignLift/config.yml) - When you understand more then you can edit it.
     
  18. Offline

    Stephen304

    What do you think about this idea?
     
  19. Offline

    freman

    Well, I've thought about it, and I think I'll make lifts private with {} instead of [], it'll write the name of the owner to a file on disk - downside is now I have to work out how to make it possible for "create.others"...
     
  20. Offline

    Stephen304

    That sounds great! I can't wait for an update! (mainly because almost all lifts in my server use the 4th line, though I manually fixed the essential ones)
     
  21. Offline

    freman

    awwww... but it can wait till next weekend, I just opened eclipse to look at it now and realized that I have to change the configuration format and what it checks for to see if it's a lift or not... and I'm wondering if it's not easier for you to just put a sign besides lifts that need more room ;)
     
  22. Offline

    Stephen304

    Haha that's fine, I find using multiple signs ineffective with a server full of people at or below my age. They simply do not pay attention to it if it's on another sign. I have lots of trouble getting them to read.
     
  23. Offline

    kalvinleung

    Code:
    14:48:39 [嚴重] Could not pass event BLOCK_BREAK to SignLift
    java.lang.NullPointerException
            at org.bukkit.craftbukkit.block.CraftBlock.getState(CraftBlock.java:199)
    
            at au.net.fremnet.bukkit.SignLift.SignLiftBlockListener.onBlockBreak(Sig
    nLiftBlockListener.java:29)
            at org.bukkit.plugin.java.JavaPluginLoader$36.execute(JavaPluginLoader.j
    ava:490)
            at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:58)
            at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:332)
            at net.minecraft.server.ItemInWorldManager.c(ItemInWorldManager.java:157
    )
            at net.minecraft.server.ItemInWorldManager.dig(ItemInWorldManager.java:1
    02)
            at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:458)
            at net.minecraft.server.Packet14BlockDig.a(SourceFile:42)
            at net.minecraft.server.NetworkManager.b(NetworkManager.java:226)
            at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:85)
            at net.minecraft.server.NetworkListenThread.a(SourceFile:105)
            at net.minecraft.server.MinecraftServer.h(MinecraftServer.java:457)
            at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:367)
            at net.minecraft.server.ThreadServerApplication.run(SourceFile:422)
    14:48:39 [嚴重] Could not pass event BLOCK_BREAK to WirelessRedstone
    I got this error in my server what does it mean?
     
  24. Offline

    Xertez

    I seem to be getting this error. any ideas?
    Show Spoiler

    18:01:13 [SEVERE] Could not pass event PLAYER_INTERACT to SignLift
    java.lang.NoSuchMethodError: org.bukkit.entity.Player.hasPermission(Ljava/lang/S
    tring;)Z
    at au.net.fremnet.bukkit.SignLift.LiftSign.checkOwner(LiftSign.java:91)
    at au.net.fremnet.bukkit.SignLift.LiftSign.activate(LiftSign.java:139)
    at au.net.fremnet.bukkit.SignLift.SignLiftPlayerListener.onPlayerInterac
    t(SignLiftPlayerListener.java:65)
    at org.bukkit.plugin.java.JavaPluginLoader$10.execute(JavaPluginLoader.j
    ava:307)
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:58)
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:321)
    at org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEven
    t(CraftEventFactory.java:168)
    at net.minecraft.server.ItemInWorldManager.interact(ItemInWorldManager.j
    ava:210)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:552)
    at net.minecraft.server.Packet15Place.a(SourceFile:57)
    at net.minecraft.server.NetworkManager.b(NetworkManager.java:226)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:84)
    at net.minecraft.server.NetworkListenThread.a(SourceFile:105)
    at net.minecraft.server.MinecraftServer.h(MinecraftServer.java:451)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:361)
    at net.minecraft.server.ThreadServerApplication.run(SourceFile:422)
    18:01:13 [SEVERE] Could not pass event PLAYER_INTERACT to SignLift
    java.lang.NoSuchMethodError: org.bukkit.entity.Player.hasPermission(Ljava/lang/S
    tring;)Z
    at au.net.fremnet.bukkit.SignLift.LiftSign.checkOwner(LiftSign.java:91)
    at au.net.fremnet.bukkit.SignLift.LiftSign.activate(LiftSign.java:139)
    at au.net.fremnet.bukkit.SignLift.SignLiftPlayerListener.onPlayerInterac
    t(SignLiftPlayerListener.java:65)
    at org.bukkit.plugin.java.JavaPluginLoader$10.execute(JavaPluginLoader.j
    ava:307)
    at org.bukkit.plugin.RegisteredListener.callEvent(RegisteredListener.jav
    a:58)
    at org.bukkit.plugin.SimplePluginManager.callEvent(SimplePluginManager.j
    ava:321)
    at org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEven
    t(CraftEventFactory.java:168)
    at net.minecraft.server.ItemInWorldManager.interact(ItemInWorldManager.j
    ava:210)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:552)
    at net.minecraft.server.Packet15Place.a(SourceFile:57)
    at net.minecraft.server.NetworkManager.b(NetworkManager.java:226)
    at net.minecraft.server.NetServerHandler.a(NetServerHandler.java:84)
    at net.minecraft.server.NetworkListenThread.a(SourceFile:105)
    at net.minecraft.server.MinecraftServer.h(MinecraftServer.java:451)
    at net.minecraft.server.MinecraftServer.run(MinecraftServer.java:361)
    at net.minecraft.server.ThreadServerApplication.run(SourceFile:422)
     
  25. Offline

    Raz0r.

    This seems like an awesome plugin, i've tried it on several servers, and figured out i want it to my own one too. But i got one question, does it require permissions? 'Cause i'm not running the permissions plugin as it just screws up on me, and it won't work even though i've fixed the config to my likings.
     
  26. Offline

    Trollkemada

    I dont really get what "[Lift]" is used to.

    I just use [lift up] and [lift down]. Could someone tell me how [Lift] works?
     
  27. Offline

    freman

    Permissions are entirely optional

    It is used to create 1 way lifts - it's just a target - something for a lift up or a lift down to point to
     
  28. Offline

    Raz0r.

    Well, if it is optional, why won't it work for me at my server? I am not running permissions as i constantly fail setting it up properly. I've set the config as you posted, but no matter what the lifts just won't work.
     
  29. Offline

    Boom1001000

    I need help i got it but when ever i try to do it there is a error code in console any help?
     
  30. Offline

    Buckethead

    this only works up and down right i dont want people t use thhis as a tele

    LOVE IT!!!!!!!! very simple well done easy config. trying to make custom elevator with pistons redsones and diodes fuk that THIS WORKS!!!!!!!

    EDIT by Moderator: merged posts, please use the edit button instead of double posting.
     
    Last edited by a moderator: May 7, 2016
  31. Offline

    Kane

    @freman I love the idea of the update but it went bad on our server. Most people on our server 10000's of [Lift] have used all the lines. Caused lifts to lock up and everything haha. So we went back to 7. Though I feel like were out of date now haha. I was wondering future version you can add a turn off switch for the private system completely from configs. So it can act like vanilla more.
     

Share This Page