<commit_before>(function() {
    var scrollWidth, widthIncludesScrollBar;
    
    function initScrollWidth () {
        if (!scrollWidth) {
            uki.dom.probe(
                uki.createElement(
                    'div', 
                    'position:absolute;left:-99em;width:100px;height:100px;overflow:scroll;',
                    '<div style="position:absolute;left:0;width:100%;"></div>'
                ),
                function( probe ) {
                    scrollWidth = probe.offsetWidth - probe.clientWidth;
                    widthIncludesScrollBar = probe.firstChild.offsetWidth == 100;
                }
            );
        }
        return scrollWidth;
    }
        
    /**
    * Scroll pane. 
    * Pane with scrollbars with content overflowing the borders.
    * Works consistently across all supported browsers.
    *
    * @author voloko
    * @name uki.view.ScrollPane
    * @class
    * @extends uki.view.Container
    */
    uki.view.declare('uki.view.ScrollPane', uki.view.Container, function(Base) {
        this.typeName = function() {
            return 'uki.view.ScrollPane';
        };
    
        uki.extend(this, {
            _scrollableV: true,
            _scrollableH: false,
            _scrollV: false,
            _scrollH: false,
            _sbV: false,
            _sbH: false
        });
        
        this._setup = function() {
            Base._setup.call(this);

            this._clientRect = this.rect().clone();
            this._rectForChild = this.rect().clone();
        };
    
        /**
        * @function
        * @name uki.view.ScrollPane#scrollableV
        */
        /**
        * @function
        * @name uki.view.ScrollPane#scrollableH
        */
        /**
        * @function
        * @name uki.view.ScrollPane#scrollH
        */
        /**
        * @function
        * @name uki.view.ScrollPane#scrollV
        */
        uki.addProps(this, ['scrollableV', 'scrollableH', 'scrollH', 'scrollV']);
    
        this.rectForChild = function() { return this._rectForChild; };
        this.clientRect = function() { return this._clientRect; };
    
        /**
        * @function
        * @param {Number} dx
        * @param {Number} dy
        * @name uki.view.ScrollPane#scroll
        */
        this.scroll = function(dx, dy) {
            if (dx) this.scrollLeft(this.scrollLeft() + dy);
            if (dy) this.scrollTop(this.scrollTop() + dy);
        };
    
        /**
        * @function
        * @name uki.view.ScrollPane#scrollTop
        */<commit_msg>scroll left<commit_after>(function() {
    var scrollWidth, widthIncludesScrollBar;
    
    function initScrollWidth () {
        if (!scrollWidth) {
            uki.dom.probe(
                uki.createElement(
                    'div', 
                    'position:absolute;left:-99em;width:100px;height:100px;overflow:scroll;',
                    '<div style="position:absolute;left:0;width:100%;"></div>'
                ),
                function( probe ) {
                    scrollWidth = probe.offsetWidth - probe.clientWidth;
                    widthIncludesScrollBar = probe.firstChild.offsetWidth == 100;
                }
            );
        }
        return scrollWidth;
    }
        
    /**
    * Scroll pane. 
    * Pane with scrollbars with content overflowing the borders.
    * Works consistently across all supported browsers.
    *
    * @author voloko
    * @name uki.view.ScrollPane
    * @class
    * @extends uki.view.Container
    */
    uki.view.declare('uki.view.ScrollPane', uki.view.Container, function(Base) {
        this.typeName = function() {
            return 'uki.view.ScrollPane';
        };
    
        uki.extend(this, {
            _scrollableV: true,
            _scrollableH: false,
            _scrollV: false,
            _scrollH: false,
            _sbV: false,
            _sbH: false
        });
        
        this._setup = function() {
            Base._setup.call(this);

            this._clientRect = this.rect().clone();
            this._rectForChild = this.rect().clone();
        };
    
        /**
        * @function
        * @name uki.view.ScrollPane#scrollableV
        */
        /**
        * @function
        * @name uki.view.ScrollPane#scrollableH
        */
        /**
        * @function
        * @name uki.view.ScrollPane#scrollH
        */
        /**
        * @function
        * @name uki.view.ScrollPane#scrollV
        */
        uki.addProps(this, ['scrollableV', 'scrollableH', 'scrollH', 'scrollV']);
    
        this.rectForChild = function() { return this._rectForChild; };
        this.clientRect = function() { return this._clientRect; };
    
        /**
        * @function
        * @param {Number} dx
        * @param {Number} dy
        * @name uki.view.ScrollPane#scroll
        */
        this.scroll = function(dx, dy) {
            if (dx) this.scrollLeft(this.scrollLeft() + dx);
            if (dy) this.scrollTop(this.scrollTop() + dy);
        };
    
        /**
        * @function
        * @name uki.view.ScrollPane#scrollTop
        */
{'fraction_non_alphanumeric': 0.12470680218921032, 'fraction_numerical': 0.005863956215793589, 'mean_word_length': 1.493664717348928, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7566143', 'n_tokens_mistral': 1492, 'n_tokens_neox': 1427, 'n_words': 245}