Best Python code snippet using slash
test_uninstall.py
Source:test_uninstall.py  
...12from pip._internal.utils.misc import rmtree13from tests.lib import assert_all_changes, create_test_package_with_setup14from tests.lib.local_repos import local_checkout, local_repo15@pytest.mark.network16def test_basic_uninstall(script):17    """18    Test basic install and uninstall.19    """20    result = script.pip('install', 'INITools==0.2')21    assert join(script.site_packages, 'initools') in result.files_created, (22        sorted(result.files_created.keys())23    )24    # the import forces the generation of __pycache__ if the version of python25    # supports it26    script.run('python', '-c', "import initools")27    result2 = script.pip('uninstall', 'INITools', '-y')28    assert_all_changes(result, result2, [script.venv / 'build', 'cache'])29def test_basic_uninstall_distutils(script):30    """31    Test basic install and uninstall.32    """33    script.scratch_path.join("distutils_install").mkdir()34    pkg_path = script.scratch_path / 'distutils_install'35    pkg_path.join("setup.py").write(textwrap.dedent("""36        from distutils.core import setup37        setup(38            name='distutils-install',39            version='0.1',40        )41    """))42    result = script.run('python', pkg_path / 'setup.py', 'install')43    result = script.pip('list', '--format=json')44    assert {"name": "distutils-install", "version": "0.1"} \45        in json.loads(result.stdout)46    result = script.pip('uninstall', 'distutils_install', '-y',47                        expect_stderr=True, expect_error=True)48    assert (49        "Cannot uninstall 'distutils-install'. It is a distutils installed "50        "project and thus we cannot accurately determine which files belong "51        "to it which would lead to only a partial uninstall."52    ) in result.stderr53@pytest.mark.network54def test_basic_uninstall_with_scripts(script):55    """56    Uninstall an easy_installed package with scripts.57    """58    result = script.easy_install('PyLogo', expect_stderr=True)59    easy_install_pth = script.site_packages / 'easy-install.pth'60    pylogo = sys.platform == 'win32' and 'pylogo' or 'PyLogo'61    assert(pylogo in result.files_updated[easy_install_pth].bytes)62    result2 = script.pip('uninstall', 'pylogo', '-y')63    assert_all_changes(64        result,65        result2,66        [script.venv / 'build', 'cache', easy_install_pth],67    )68@pytest.mark.network69def test_uninstall_easy_install_after_import(script):70    """71    Uninstall an easy_installed package after it's been imported72    """73    result = script.easy_install('--always-unzip', 'INITools==0.2',74                                 expect_stderr=True)75    # the import forces the generation of __pycache__ if the version of python76    # supports it77    script.run('python', '-c', "import initools")78    result2 = script.pip('uninstall', 'INITools', '-y')79    assert_all_changes(80        result,81        result2,82        [83            script.venv / 'build',84            'cache',85            script.site_packages / 'easy-install.pth',86        ]87    )88@pytest.mark.network89def test_uninstall_trailing_newline(script):90    """91    Uninstall behaves appropriately if easy-install.pth92    lacks a trailing newline93    """94    script.easy_install('INITools==0.2', expect_stderr=True)95    script.easy_install('PyLogo', expect_stderr=True)96    easy_install_pth = script.site_packages_path / 'easy-install.pth'97    # trim trailing newline from easy-install.pth98    with open(easy_install_pth) as f:99        pth_before = f.read()100    with open(easy_install_pth, 'w') as f:101        f.write(pth_before.rstrip())102    # uninstall initools103    script.pip('uninstall', 'INITools', '-y')104    with open(easy_install_pth) as f:105        pth_after = f.read()106    # verify that only initools is removed107    before_without_initools = [108        line for line in pth_before.splitlines()109        if 'initools' not in line.lower()110    ]111    lines_after = pth_after.splitlines()112    assert lines_after == before_without_initools113@pytest.mark.network114def test_basic_uninstall_namespace_package(script):115    """116    Uninstall a distribution with a namespace package without clobbering117    the namespace and everything in it.118    """119    result = script.pip('install', 'pd.requires==0.0.3', expect_error=True)120    assert join(script.site_packages, 'pd') in result.files_created, (121        sorted(result.files_created.keys())122    )123    result2 = script.pip('uninstall', 'pd.find', '-y', expect_error=True)124    assert join(script.site_packages, 'pd') not in result2.files_deleted, (125        sorted(result2.files_deleted.keys())126    )127    assert join(script.site_packages, 'pd', 'find') in result2.files_deleted, (128        sorted(result2.files_deleted.keys())129    )130def test_uninstall_overlapping_package(script, data):131    """132    Uninstalling a distribution that adds modules to a pre-existing package133    should only remove those added modules, not the rest of the existing134    package.135    See: GitHub issue #355 (pip uninstall removes things it didn't install)136    """137    parent_pkg = data.packages.join("parent-0.1.tar.gz")138    child_pkg = data.packages.join("child-0.1.tar.gz")139    result1 = script.pip('install', parent_pkg, expect_error=False)140    assert join(script.site_packages, 'parent') in result1.files_created, (141        sorted(result1.files_created.keys())142    )143    result2 = script.pip('install', child_pkg, expect_error=False)144    assert join(script.site_packages, 'child') in result2.files_created, (145        sorted(result2.files_created.keys())146    )147    assert normpath(148        join(script.site_packages, 'parent/plugins/child_plugin.py')149    ) in result2.files_created, sorted(result2.files_created.keys())150    # The import forces the generation of __pycache__ if the version of python151    #  supports it152    script.run('python', '-c', "import parent.plugins.child_plugin, child")153    result3 = script.pip('uninstall', '-y', 'child', expect_error=False)154    assert join(script.site_packages, 'child') in result3.files_deleted, (155        sorted(result3.files_created.keys())156    )157    assert normpath(158        join(script.site_packages, 'parent/plugins/child_plugin.py')159    ) in result3.files_deleted, sorted(result3.files_deleted.keys())160    assert join(script.site_packages, 'parent') not in result3.files_deleted, (161        sorted(result3.files_deleted.keys())162    )163    # Additional check: uninstalling 'child' should return things to the164    # previous state, without unintended side effects.165    assert_all_changes(result2, result3, [])166@pytest.mark.parametrize("console_scripts",167                         ["test_ = distutils_install",168                          "test_:test_ = distutils_install"])169def test_uninstall_entry_point(script, console_scripts):170    """171    Test uninstall package with two or more entry points in the same section,172    whose name contain a colon.173    """174    pkg_name = 'ep_install'175    pkg_path = create_test_package_with_setup(176        script,177        name=pkg_name,178        version='0.1',179        entry_points={"console_scripts": [console_scripts, ],180                      "pip_test.ep":181                      ["ep:name1 = distutils_install",182                       "ep:name2 = distutils_install"]183                      }184    )185    script_name = script.bin_path.join(console_scripts.split('=')[0].strip())186    if sys.platform == 'win32':187        script_name += '.exe'188    result = script.pip('install', pkg_path)189    assert script_name.exists190    result = script.pip('list', '--format=json')191    assert {"name": "ep-install", "version": "0.1"} \192        in json.loads(result.stdout)193    script.pip('uninstall', 'ep_install', '-y')194    assert not script_name.exists195    result2 = script.pip('list', '--format=json')196    assert {"name": "ep-install", "version": "0.1"} \197        not in json.loads(result2.stdout)198def test_uninstall_gui_scripts(script):199    """200    Make sure that uninstall removes gui scripts201    """202    pkg_name = "gui_pkg"203    pkg_path = create_test_package_with_setup(204        script,205        name=pkg_name,206        version='0.1',207        entry_points={"gui_scripts": ["test_ = distutils_install", ], }208    )209    script_name = script.bin_path.join('test_')210    if sys.platform == 'win32':211        script_name += '.exe'212    script.pip('install', pkg_path)213    assert script_name.exists214    script.pip('uninstall', pkg_name, '-y')215    assert not script_name.exists216@pytest.mark.network217def test_uninstall_console_scripts(script):218    """219    Test uninstalling a package with more files (console_script entry points,220    extra directories).221    """222    args = ['install']223    args.append('discover')224    result = script.pip(*args, **{"expect_error": True})225    assert script.bin / 'discover' + script.exe in result.files_created, (226        sorted(result.files_created.keys())227    )228    result2 = script.pip('uninstall', 'discover', '-y', expect_error=True)229    assert_all_changes(result, result2, [script.venv / 'build', 'cache'])230@pytest.mark.network231def test_uninstall_easy_installed_console_scripts(script):232    """233    Test uninstalling package with console_scripts that is easy_installed.234    """235    result = script.easy_install('discover', expect_error=True)236    assert script.bin / 'discover' + script.exe in result.files_created, (237        sorted(result.files_created.keys())238    )239    result2 = script.pip('uninstall', 'discover', '-y')240    assert_all_changes(241        result,242        result2,243        [244            script.venv / 'build',245            'cache',246            script.site_packages / 'easy-install.pth',247        ]248    )249@pytest.mark.network250def test_uninstall_editable_from_svn(script, tmpdir):251    """252    Test uninstalling an editable installation from svn.253    """254    result = script.pip(255        'install', '-e',256        '%s#egg=initools' % local_checkout(257            'svn+http://svn.colorstudy.com/INITools/trunk',258            tmpdir.join("cache"),259        ),260    )261    result.assert_installed('INITools')262    result2 = script.pip('uninstall', '-y', 'initools')263    assert (script.venv / 'src' / 'initools' in result2.files_after)264    assert_all_changes(265        result,266        result2,267        [268            script.venv / 'src',269            script.venv / 'build',270            script.site_packages / 'easy-install.pth'271        ],272    )273@pytest.mark.network274def test_uninstall_editable_with_source_outside_venv(script, tmpdir):275    """276    Test uninstalling editable install from existing source outside the venv.277    """278    cache_dir = tmpdir.join("cache")279    try:280        temp = mkdtemp()281        tmpdir = join(temp, 'pip-test-package')282        _test_uninstall_editable_with_source_outside_venv(283            script,284            tmpdir,285            cache_dir,286        )287    finally:288        rmtree(temp)289def _test_uninstall_editable_with_source_outside_venv(290        script, tmpdir, cache_dir):291    result = script.run(292        'git', 'clone',293        local_repo(294            'git+git://github.com/pypa/pip-test-package',295            cache_dir,296        ),297        tmpdir,298        expect_stderr=True,299    )300    result2 = script.pip('install', '-e', tmpdir)301    assert join(302        script.site_packages, 'pip-test-package.egg-link'303    ) in result2.files_created, list(result2.files_created.keys())304    result3 = script.pip('uninstall', '-y',305                         'pip-test-package', expect_error=True)306    assert_all_changes(307        result,308        result3,309        [script.venv / 'build', script.site_packages / 'easy-install.pth'],310    )311@pytest.mark.network312@pytest.mark.svn313def test_uninstall_from_reqs_file(script, tmpdir):314    """315    Test uninstall from a requirements file.316    """317    script.scratch_path.join("test-req.txt").write(318        textwrap.dedent("""319            -e %s#egg=initools320            # and something else to test out:321            PyLogo<0.4322        """) %323        local_checkout(324            'svn+http://svn.colorstudy.com/INITools/trunk',325            tmpdir.join("cache")326        )327    )328    result = script.pip('install', '-r', 'test-req.txt')329    script.scratch_path.join("test-req.txt").write(330        textwrap.dedent("""331            # -f, -i, and --extra-index-url should all be ignored by uninstall332            -f http://www.example.com333            -i http://www.example.com334            --extra-index-url http://www.example.com335            -e %s#egg=initools336            # and something else to test out:337            PyLogo<0.4338        """) %339        local_checkout(340            'svn+http://svn.colorstudy.com/INITools/trunk',341            tmpdir.join("cache")342        )343    )344    result2 = script.pip('uninstall', '-r', 'test-req.txt', '-y')345    assert_all_changes(346        result,347        result2,348        [349            script.venv / 'build',350            script.venv / 'src',351            script.scratch / 'test-req.txt',352            script.site_packages / 'easy-install.pth',353        ],354    )355def test_uninstallpathset_no_paths(caplog):356    """357    Test UninstallPathSet logs notification when there are no paths to358    uninstall359    """360    from pip._internal.req.req_uninstall import UninstallPathSet361    from pkg_resources import get_distribution362    caplog.set_level(logging.INFO)363    test_dist = get_distribution('pip')364    uninstall_set = UninstallPathSet(test_dist)365    uninstall_set.remove()  # with no files added to set366    assert (367        "Can't uninstall 'pip'. No files were found to uninstall."368        in caplog.text369    )370def test_uninstall_non_local_distutils(caplog, monkeypatch, tmpdir):371    einfo = tmpdir.join("thing-1.0.egg-info")372    with open(einfo, "wb"):373        pass374    dist = pretend.stub(375        key="thing",376        project_name="thing",377        egg_info=einfo,378        location=einfo,379        _provider=pretend.stub(),380    )381    get_dist = pretend.call_recorder(lambda x: dist)382    monkeypatch.setattr("pip._vendor.pkg_resources.get_distribution", get_dist)383    req = install_req_from_line("thing")384    req.uninstall()385    assert os.path.exists(einfo)386def test_uninstall_wheel(script, data):387    """388    Test uninstalling a wheel389    """390    package = data.packages.join("simple.dist-0.1-py2.py3-none-any.whl")391    result = script.pip('install', package, '--no-index')392    dist_info_folder = script.site_packages / 'simple.dist-0.1.dist-info'393    assert dist_info_folder in result.files_created394    result2 = script.pip('uninstall', 'simple.dist', '-y')395    assert_all_changes(result, result2, [])396def test_uninstall_setuptools_develop_install(script, data):397    """Try uninstall after setup.py develop followed of setup.py install"""398    pkg_path = data.packages.join("FSPkg")...uninstall.js
Source:uninstall.js  
1 Uninstall = {23    product_tabs:[4      "tab-pill-list",5      "tab-pill-product-uninstalling"6    ],7    product_pages:[8      "tab-list",9      "tab-product-uninstalling"10    ],11    product_page4state:{12      "start":[],13      "product_list":[],14      "uninstalling":[0]15    },1617    product_tabs4state:{18      "start":[],19      "product_list":[0],20      "uninstalling":[0,1]21    },22    requested_items: [],23    state: null,24    current_state: null,25    product_uninstall_template: null,26    $product_uninstall_template:  $('#product-uninstall-template'),27    $uninstall_list: $('#uninstall-list'),28    initial_request: function(response){29        var req = {30          requested_products: Uninstall.requested_items,31          command: "product_list"32        };33        Status.show('Getting product to uninstall');34        console.log('initial request: ', req);35        ZooApi.post(ZooApi.Urls.uninstall, req, function(response){36          Uninstall.uninstall_response(response);37        });38    },39    product_master_product_list: function (response) {40          console.log(response);41          Uninstall.state = response.data.items;42          Uninstall.fill_product_list();43    },44    fill_product_list: function () {45      this.$uninstall_list.empty();46      for (var i=0; i<this.state.length; i++){47        var product = this.state[i].product;48        console.log(product);49        var html = this.product_uninstall_template(this.state[i]);50        var $html = $(html);51        $html.addClass('hide-soft');52        $html.appendTo(this.$uninstall_list).slideDown(function(){$html.removeClass('hide-soft');});53      }54    },55    hide_pages_before:function(State){56        console.log("current page hide " + this.current_state);57        for(var i=0; i<this.product_page4state[State].length; i++){58            console.log(" hide " + this.product_pages[i]);59            $("#"+this.product_pages[i]).hide();60        }61    },62    finish: function(TaskObj){63           console.log(" show finish ");64           $("#finish").removeClass("hidden");65           $("#cancel_button").hide();66    },676869    render_up_buttons: function(){70        var i;71        for(i =0; i<this.product_tabs4state[this.current_state].length; i++){72            $("#"+this.product_tabs[i]).removeClass("active");7374        }75        $("#first_tab").removeClass("active");76        if(this.current_state == "product_list"){77                    $("#first_tab").addClass("active");78        }79        if(i>0){80            $("#"+this.product_tabs[i-1]).addClass("active");81        }8283    },84    master2uninstall: function(){85      if (Uninstall.state.length) {86        var req = {87            requested_products: Uninstall.requested_items,88            "command": "uninstall"89        };90        console.log('uninstall request:', req);91        ZooApi.post(ZooApi.Urls.uninstall, req, function(response){92          Uninstall.uninstall_response(response);93        });94      }95    },96     // process mistakes97    product_master_uninstalling: function(response){98       Uninstall.hide_pages_before(response.data.state);99       console.log("uninstalling");100       console.log(response);101       if (response.data.task.id){102           Task.task_id = response.data.task.id;103           Task.init(Uninstall);104           $("#tab-product-uninstalling").show();105       }106    },107    move_away:function(){108            window.location.href="/gallery/";109    },110    master2finish:function(ev){111        var req = {112          "command": "finish"113         };114        console.log(req);115        ZooApi.post(ZooApi.Urls.uninstall, req, Uninstall.uninstall_response);116    },117    next: function(ev){118       var Routes = {119        "product_list": Uninstall.master2uninstall,120        "uninstalling": Uninstall.move_away,121      };122      Routes[Uninstall.current_state](ev)123    },124    uninstall_response: function (response) {125      Status.hide();126      console.log('install response: ');127      console.log(response.data);128129      console.log(" GOT ");130      console.log(response);131      //Install.$response_log.text(JSON.stringify(response.data, null, ' '));132      var Routes = {133        "start": Uninstall.initial_request,134        "product_list": Uninstall.product_master_product_list,135        "uninstalling": Uninstall.product_master_uninstalling,136      };137      Uninstall.current_state = response.data.state;138      Routes[Uninstall.current_state](response)139      Uninstall.render_up_buttons()140141142    },143     product_master_start: function(){144       // check request products145        //we need avoid of this146        var p = Common.get_query_variable('products');147        if (p){148          Uninstall.requested_items = p.split(';');149        }150151        var req = {152          "command": "start",153          "requested_products": Uninstall.requested_items,154        }155156        ZooApi.post(ZooApi.Urls.uninstall, req, function(response){157            Uninstall.uninstall_response(response);158        });159160    },161    init: function () {162163      // check request products164      var p = Common.get_query_variable('products');165      if (p){166        this.requested_items = p.split(';');167      }168      if (this.requested_items.length == 0) {169        alert('No products to uninstall');170        return;171      }172173      // compile templates174      this.product_uninstall_template = Handlebars.compile(this.$product_uninstall_template.html());175      this.product_master_start();176177    }178179180181  };182
...extensionManagementIpc.ts
Source:extensionManagementIpc.ts  
...36			case 'event:onUninstallExtension': return eventToCall(this.onUninstallExtension);37			case 'event:onDidUninstallExtension': return eventToCall(this.onDidUninstallExtension);38			case 'install': return this.service.install(arg);39			case 'installFromGallery': return this.service.installFromGallery(arg[0], arg[1]);40			case 'uninstall': return this.service.uninstall(arg);41			case 'getInstalled': return this.service.getInstalled(arg);42		}43		return undefined;44	}45}46export class ExtensionManagementChannelClient implements IExtensionManagementService {47	_serviceBrand: any;48	constructor(private channel: IExtensionManagementChannel) { }49	private _onInstallExtension = eventFromCall<InstallExtensionEvent>(this.channel, 'event:onInstallExtension');50	get onInstallExtension(): Event<InstallExtensionEvent> { return this._onInstallExtension; }51	private _onDidInstallExtension = eventFromCall<DidInstallExtensionEvent>(this.channel, 'event:onDidInstallExtension');52	get onDidInstallExtension(): Event<DidInstallExtensionEvent> { return this._onDidInstallExtension; }53	private _onUninstallExtension = eventFromCall<string>(this.channel, 'event:onUninstallExtension');54	get onUninstallExtension(): Event<string> { return this._onUninstallExtension; }55	private _onDidUninstallExtension = eventFromCall<DidUninstallExtensionEvent>(this.channel, 'event:onDidUninstallExtension');56	get onDidUninstallExtension(): Event<DidUninstallExtensionEvent> { return this._onDidUninstallExtension; }57	install(zipPath: string): TPromise<void> {58		return this.channel.call('install', zipPath);59	}60	installFromGallery(extension: IGalleryExtension, promptToInstallDependencies: boolean = true): TPromise<void> {61		return this.channel.call('installFromGallery', [extension, promptToInstallDependencies]);62	}63	uninstall(extension: ILocalExtension): TPromise<void> {64		return this.channel.call('uninstall', extension);65	}66	getInstalled(type: LocalExtensionType = null): TPromise<ILocalExtension[]> {67		return this.channel.call('getInstalled', type);68	}...uninstall.app.dialog.spec.js
Source:uninstall.app.dialog.spec.js  
1const chai = require('chai');2const expect = chai.expect;3const assert = chai.assert;4const webDriverHelper = require('../libs/WebDriverHelper');5const AppBrowsePanel = require('../page_objects/applications/applications.browse.panel');6const UninstallAppDialog = require('../page_objects/applications/uninstall.app.dialog');7const InstallAppDialog = require('../page_objects/applications/install.app.dialog');8const studioUtils = require('../libs/studio.utils.js');9describe('Uninstall Application Dialog specification', function () {10    this.timeout(70000);11    webDriverHelper.setupBrowser();12    it(`should display Uninstall Dialog with right content when Uninstall Button has been clicked`, async () => {13        let uninstallAppDialog = new UninstallAppDialog();14        //1. Select 'Chuck Norris app and click on Uninstall button:'15        await openUninstallDialog();16        let dialogMessage = await uninstallAppDialog.getHeader();17        assert.equal(dialogMessage, 'Are you sure you want to uninstall selected application(s)?',18            'Expected message should be in the dialog message');19        //"Yes button should be visible"20        await uninstallAppDialog.isYesButtonDisplayed();21        // "No button should be visible"22        await uninstallAppDialog.isNoButtonDisplayed();23    });24    it(`'GIVEN uninstall dialog is opened WHEN Cancel-top button has been pressed THEN modal dialog closes`, async () => {25        let uninstallAppDialog = new UninstallAppDialog();26        //1. Select 'Chuck Norris app and click on Uninstall button:'27        await openUninstallDialog();28        await uninstallAppDialog.clickOnCancelButtonTop();29        await uninstallAppDialog.waitForClosed();30    });31    it(`should display expected notification message`, async () => {32        let uninstallAppDialog = new UninstallAppDialog();33        let appBrowsePanel = new AppBrowsePanel();34        //1. Select 'Chuck Norris app and click on Uninstall button:'35        await openUninstallDialog();36        await uninstallAppDialog.clickOnYesButton();37        let result = await appBrowsePanel.waitForNotificationMessage();38        studioUtils.saveScreenshot("chuck_norris_uninstalled_message");39        const text = result instanceof Array ? result[result.length - 1] : result;40        assert.equal(text, 'Application \'Chuck Norris\' uninstalled successfully', `Incorrect notification message [${text}]`);41    });42    beforeEach(() => studioUtils.navigateToApplicationsApp());43    afterEach(() => studioUtils.doCloseCurrentBrowserTab());44    before(() => {45        return console.log('specification is starting: ' + this.title);46    })47});48function openUninstallDialog() {49    const chuckName = 'A Chuck Norris fact widget';50    const chuckDisplayName = 'Chuck Norris';51    let appBrowsePanel = new AppBrowsePanel();52    let uninstallAppDialog = new UninstallAppDialog();53    return appBrowsePanel.isItemDisplayed(chuckDisplayName).then(result => {54        if (!result) {55            return installApp(chuckDisplayName);56        }57    }).then(() => {58        return appBrowsePanel.clickOnRowByName(chuckName);59    }).then(() => {60        return appBrowsePanel.clickOnUninstallButton();61    }).then(() => {62        return uninstallAppDialog.waitForOpened();63    });64}65function installApp(displayName) {66    let appBrowsePanel = new AppBrowsePanel();67    let installAppDialog = new InstallAppDialog();68    return appBrowsePanel.clickOnInstallButton().then(() => {69        return installAppDialog.waitForOpened();70    }).then(() => {71        return installAppDialog.typeSearchText(displayName);72    }).then(() => {73        return installAppDialog.pause(1000);74    }).then(() => {75        return installAppDialog.isApplicationPresent(displayName);76    }).then(() => {77        return installAppDialog.clickOnInstallAppLink(displayName);78    }).then(() => {79        return installAppDialog.waitForAppInstalled(displayName);80    }).then(() => {81        return installAppDialog.clickOnCancelButtonTop();82    });...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
