    /**
     * A Provider implementation which saves and retrieves state via the HTML5 localStorage API
     * or IE `userData` storage. For details see `Ext.util.LocalStorage`.
     *
     * If the browser does not support local storage, there will be no attempt to read the state.
     * Before creating this class, check {@link Ext.util.LocalStorage#supported}.
     */
    Ext.define('Ext.state.LocalStorageProvider', {
        extend: 'Ext.state.Provider',
        requires: [
            'Ext.util.LocalStorage'
        ],

        alias: 'state.localstorage',

        constructor: function () {
            var me = this;

            me.callParent(arguments);

            me.store = me.getStorageObject();
            if (me.store) {
                me.state = me.readLocalStorage();
            } else {
                me.state = {};
            }
        },

        readLocalStorage: function () {
            var store = this.store,
                data = {},
                keys = store.getKeys(),
                i = keys.length,
                key;

            while (i--) {
                key = keys[i];
                data[key] = this.decodeValue(store.getItem(key));
            }

            return data;
        },

        set: function (name, value) {
            var me = this;

            me.clear(name);
            if (value != null) { // !== undefined && !== null
                me.store.setItem(name, me.encodeValue(value));
                me.callParent(arguments);
            }
        },

        // private
        clear: function (name) {
            this.store.removeItem(name);
            this.callParent(arguments);
        },

        getStorageObject: function () {
            var prefix = this.prefix,
                id = prefix,
                n = id.length - 1;

            if (id.charAt(n) === '-') {
                id = id.substring(0, n);
            }

            return new Ext.util.LocalStorage({
                id: id,
                prefix: prefix
            });
        }
    });