From 9cf5e33ecdb78592e332ceba4ede85539baa4c61 Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sat, 27 Apr 2019 20:50:53 -0700 Subject: [PATCH 01/35] Add nvmrc file --- .nvmrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .nvmrc diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000..348076b --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +10.15.3 From 105c888e737cf331131b1836dd5ca4c1e27bcd01 Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sat, 27 Apr 2019 20:51:13 -0700 Subject: [PATCH 02/35] Add node engine req to package.json --- package.json | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index ae4ec49..f182103 100644 --- a/package.json +++ b/package.json @@ -21,23 +21,27 @@ "type": "git", "url": "https://github.com/lokesh/color-thief.git" }, - "bugs": { - "url": "https://github.com/lokesh/color-thief/issues" - }, "licenses": [ { "type": "MIT", "url": "https://raw.githubusercontent.com/lokesh/color-thief/master/LICENSE/" } ], + "scripts": { + "dev": "echo 'coming soon'", + "test": "./node_modules/.bin/cypress open" + }, "main": "dist/color-thief.min.js", "devDependencies": { + "cypress": "^3.2.0", "grunt": "~1.0.1", - "grunt-contrib-watch": "^1.0.0", "grunt-contrib-connect": "^1.0.2", + "grunt-contrib-jshint": "^0.11.2", "grunt-contrib-uglify": "~2.0.0", - "grunt-contrib-jshint": "~1.0.0", - "grunt-jscs": "^1.8.0", - "grunt-contrib-jshint": "^0.11.2" + "grunt-contrib-watch": "^1.0.0", + "grunt-jscs": "^1.8.0" + }, + "engines": { + "node": ">=10.15.3" } } From f319e54b190f57d3765c6c4a430d5e8af08002c0 Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sat, 27 Apr 2019 20:52:10 -0700 Subject: [PATCH 03/35] Add Cypress dep for testing --- README.md | 10 + cypress.json | 1 + cypress/fixtures/example.json | 5 + cypress/integration/examples/actions.spec.js | 272 ++ cypress/integration/examples/aliasing.spec.js | 42 + .../integration/examples/assertions.spec.js | 168 + .../integration/examples/connectors.spec.js | 56 + cypress/integration/examples/cookies.spec.js | 78 + .../integration/examples/cypress_api.spec.js | 222 + cypress/integration/examples/files.spec.js | 86 + .../examples/local_storage.spec.js | 52 + cypress/integration/examples/location.spec.js | 32 + cypress/integration/examples/misc.spec.js | 83 + .../integration/examples/navigation.spec.js | 56 + .../examples/network_requests.spec.js | 140 + cypress/integration/examples/querying.spec.js | 87 + .../examples/spies_stubs_clocks.spec.js | 69 + .../integration/examples/traversal.spec.js | 121 + .../integration/examples/utilities.spec.js | 117 + cypress/integration/examples/viewport.spec.js | 59 + cypress/integration/examples/waiting.spec.js | 34 + cypress/integration/examples/window.spec.js | 22 + cypress/integration/sample_spec.js | 0 cypress/plugins/index.js | 17 + cypress/support/commands.js | 25 + cypress/support/index.js | 20 + package-lock.json | 3573 +++++++++++++++++ 27 files changed, 5447 insertions(+) create mode 100644 cypress.json create mode 100644 cypress/fixtures/example.json create mode 100644 cypress/integration/examples/actions.spec.js create mode 100644 cypress/integration/examples/aliasing.spec.js create mode 100644 cypress/integration/examples/assertions.spec.js create mode 100644 cypress/integration/examples/connectors.spec.js create mode 100644 cypress/integration/examples/cookies.spec.js create mode 100644 cypress/integration/examples/cypress_api.spec.js create mode 100644 cypress/integration/examples/files.spec.js create mode 100644 cypress/integration/examples/local_storage.spec.js create mode 100644 cypress/integration/examples/location.spec.js create mode 100644 cypress/integration/examples/misc.spec.js create mode 100644 cypress/integration/examples/navigation.spec.js create mode 100644 cypress/integration/examples/network_requests.spec.js create mode 100644 cypress/integration/examples/querying.spec.js create mode 100644 cypress/integration/examples/spies_stubs_clocks.spec.js create mode 100644 cypress/integration/examples/traversal.spec.js create mode 100644 cypress/integration/examples/utilities.spec.js create mode 100644 cypress/integration/examples/viewport.spec.js create mode 100644 cypress/integration/examples/waiting.spec.js create mode 100644 cypress/integration/examples/window.spec.js create mode 100644 cypress/integration/sample_spec.js create mode 100644 cypress/plugins/index.js create mode 100644 cypress/support/commands.js create mode 100644 cypress/support/index.js create mode 100644 package-lock.json diff --git a/README.md b/README.md index 8b206b5..b226d77 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,13 @@ colorThief.getPalette(sourceImage, 8); getPalette(sourceImage[, colorCount, quality]) returns [ [num, num, num], [num, num, num], ... ] ``` + + +## Contributing + +### Testing + +``` +npm run test // Run Cypress acceptance tests +``` + diff --git a/cypress.json b/cypress.json new file mode 100644 index 0000000..0967ef4 --- /dev/null +++ b/cypress.json @@ -0,0 +1 @@ +{} diff --git a/cypress/fixtures/example.json b/cypress/fixtures/example.json new file mode 100644 index 0000000..da18d93 --- /dev/null +++ b/cypress/fixtures/example.json @@ -0,0 +1,5 @@ +{ + "name": "Using fixtures to represent data", + "email": "hello@cypress.io", + "body": "Fixtures are a great way to mock data for responses to routes" +} \ No newline at end of file diff --git a/cypress/integration/examples/actions.spec.js b/cypress/integration/examples/actions.spec.js new file mode 100644 index 0000000..20e12cc --- /dev/null +++ b/cypress/integration/examples/actions.spec.js @@ -0,0 +1,272 @@ +/// + +context('Actions', () => { + beforeEach(() => { + cy.visit('https://example.cypress.io/commands/actions') + }) + + // https://on.cypress.io/interacting-with-elements + + it('.type() - type into a DOM element', () => { + // https://on.cypress.io/type + cy.get('.action-email') + .type('fake@email.com').should('have.value', 'fake@email.com') + + // .type() with special character sequences + .type('{leftarrow}{rightarrow}{uparrow}{downarrow}') + .type('{del}{selectall}{backspace}') + + // .type() with key modifiers + .type('{alt}{option}') //these are equivalent + .type('{ctrl}{control}') //these are equivalent + .type('{meta}{command}{cmd}') //these are equivalent + .type('{shift}') + + // Delay each keypress by 0.1 sec + .type('slow.typing@email.com', { delay: 100 }) + .should('have.value', 'slow.typing@email.com') + + cy.get('.action-disabled') + // Ignore error checking prior to type + // like whether the input is visible or disabled + .type('disabled error checking', { force: true }) + .should('have.value', 'disabled error checking') + }) + + it('.focus() - focus on a DOM element', () => { + // https://on.cypress.io/focus + cy.get('.action-focus').focus() + .should('have.class', 'focus') + .prev().should('have.attr', 'style', 'color: orange;') + }) + + it('.blur() - blur off a DOM element', () => { + // https://on.cypress.io/blur + cy.get('.action-blur').type('About to blur').blur() + .should('have.class', 'error') + .prev().should('have.attr', 'style', 'color: red;') + }) + + it('.clear() - clears an input or textarea element', () => { + // https://on.cypress.io/clear + cy.get('.action-clear').type('Clear this text') + .should('have.value', 'Clear this text') + .clear() + .should('have.value', '') + }) + + it('.submit() - submit a form', () => { + // https://on.cypress.io/submit + cy.get('.action-form') + .find('[type="text"]').type('HALFOFF') + cy.get('.action-form').submit() + .next().should('contain', 'Your form has been submitted!') + }) + + it('.click() - click on a DOM element', () => { + // https://on.cypress.io/click + cy.get('.action-btn').click() + + // You can click on 9 specific positions of an element: + // ----------------------------------- + // | topLeft top topRight | + // | | + // | | + // | | + // | left center right | + // | | + // | | + // | | + // | bottomLeft bottom bottomRight | + // ----------------------------------- + + // clicking in the center of the element is the default + cy.get('#action-canvas').click() + + cy.get('#action-canvas').click('topLeft') + cy.get('#action-canvas').click('top') + cy.get('#action-canvas').click('topRight') + cy.get('#action-canvas').click('left') + cy.get('#action-canvas').click('right') + cy.get('#action-canvas').click('bottomLeft') + cy.get('#action-canvas').click('bottom') + cy.get('#action-canvas').click('bottomRight') + + // .click() accepts an x and y coordinate + // that controls where the click occurs :) + + cy.get('#action-canvas') + .click(80, 75) // click 80px on x coord and 75px on y coord + .click(170, 75) + .click(80, 165) + .click(100, 185) + .click(125, 190) + .click(150, 185) + .click(170, 165) + + // click multiple elements by passing multiple: true + cy.get('.action-labels>.label').click({ multiple: true }) + + // Ignore error checking prior to clicking + cy.get('.action-opacity>.btn').click({ force: true }) + }) + + it('.dblclick() - double click on a DOM element', () => { + // https://on.cypress.io/dblclick + + // Our app has a listener on 'dblclick' event in our 'scripts.js' + // that hides the div and shows an input on double click + cy.get('.action-div').dblclick().should('not.be.visible') + cy.get('.action-input-hidden').should('be.visible') + }) + + it('.check() - check a checkbox or radio element', () => { + // https://on.cypress.io/check + + // By default, .check() will check all + // matching checkbox or radio elements in succession, one after another + cy.get('.action-checkboxes [type="checkbox"]').not('[disabled]') + .check().should('be.checked') + + cy.get('.action-radios [type="radio"]').not('[disabled]') + .check().should('be.checked') + + // .check() accepts a value argument + cy.get('.action-radios [type="radio"]') + .check('radio1').should('be.checked') + + // .check() accepts an array of values + cy.get('.action-multiple-checkboxes [type="checkbox"]') + .check(['checkbox1', 'checkbox2']).should('be.checked') + + // Ignore error checking prior to checking + cy.get('.action-checkboxes [disabled]') + .check({ force: true }).should('be.checked') + + cy.get('.action-radios [type="radio"]') + .check('radio3', { force: true }).should('be.checked') + }) + + it('.uncheck() - uncheck a checkbox element', () => { + // https://on.cypress.io/uncheck + + // By default, .uncheck() will uncheck all matching + // checkbox elements in succession, one after another + cy.get('.action-check [type="checkbox"]') + .not('[disabled]') + .uncheck().should('not.be.checked') + + // .uncheck() accepts a value argument + cy.get('.action-check [type="checkbox"]') + .check('checkbox1') + .uncheck('checkbox1').should('not.be.checked') + + // .uncheck() accepts an array of values + cy.get('.action-check [type="checkbox"]') + .check(['checkbox1', 'checkbox3']) + .uncheck(['checkbox1', 'checkbox3']).should('not.be.checked') + + // Ignore error checking prior to unchecking + cy.get('.action-check [disabled]') + .uncheck({ force: true }).should('not.be.checked') + }) + + it('.select() - select an option in a element', () => { - // https://on.cypress.io/select - - // Select option(s) with matching text content - cy.get('.action-select').select('apples') - - cy.get('.action-select-multiple') - .select(['apples', 'oranges', 'bananas']) - - // Select option(s) with matching value - cy.get('.action-select').select('fr-bananas') - - cy.get('.action-select-multiple') - .select(['fr-apples', 'fr-oranges', 'fr-bananas']) - }) - - it('.scrollIntoView() - scroll an element into view', () => { - // https://on.cypress.io/scrollintoview - - // normally all of these buttons are hidden, - // because they're not within - // the viewable area of their parent - // (we need to scroll to see them) - cy.get('#scroll-horizontal button') - .should('not.be.visible') - - // scroll the button into view, as if the user had scrolled - cy.get('#scroll-horizontal button').scrollIntoView() - .should('be.visible') - - cy.get('#scroll-vertical button') - .should('not.be.visible') - - // Cypress handles the scroll direction needed - cy.get('#scroll-vertical button').scrollIntoView() - .should('be.visible') - - cy.get('#scroll-both button') - .should('not.be.visible') - - // Cypress knows to scroll to the right and down - cy.get('#scroll-both button').scrollIntoView() - .should('be.visible') - }) - - it('.trigger() - trigger an event on a DOM element', () => { - // https://on.cypress.io/trigger - - // To interact with a range input (slider) - // we need to set its value & trigger the - // event to signal it changed - - // Here, we invoke jQuery's val() method to set - // the value and trigger the 'change' event - cy.get('.trigger-input-range') - .invoke('val', 25) - .trigger('change') - .get('input[type=range]').siblings('p') - .should('have.text', '25') - }) - - it('cy.scrollTo() - scroll the window or element to a position', () => { - - // https://on.cypress.io/scrollTo - - // You can scroll to 9 specific positions of an element: - // ----------------------------------- - // | topLeft top topRight | - // | | - // | | - // | | - // | left center right | - // | | - // | | - // | | - // | bottomLeft bottom bottomRight | - // ----------------------------------- - - // if you chain .scrollTo() off of cy, we will - // scroll the entire window - cy.scrollTo('bottom') - - cy.get('#scrollable-horizontal').scrollTo('right') - - // or you can scroll to a specific coordinate: - // (x axis, y axis) in pixels - cy.get('#scrollable-vertical').scrollTo(250, 250) - - // or you can scroll to a specific percentage - // of the (width, height) of the element - cy.get('#scrollable-both').scrollTo('75%', '25%') - - // control the easing of the scroll (default is 'swing') - cy.get('#scrollable-vertical').scrollTo('center', { easing: 'linear' }) - - // control the duration of the scroll (in ms) - cy.get('#scrollable-both').scrollTo('center', { duration: 2000 }) - }) -}) diff --git a/cypress/integration/examples/aliasing.spec.js b/cypress/integration/examples/aliasing.spec.js deleted file mode 100644 index 95bac73..0000000 --- a/cypress/integration/examples/aliasing.spec.js +++ /dev/null @@ -1,42 +0,0 @@ -/// - -context('Aliasing', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/aliasing') - }) - - it('.as() - alias a DOM element for later use', () => { - // https://on.cypress.io/as - - // Alias a DOM element for use later - // We don't have to traverse to the element - // later in our code, we reference it with @ - - cy.get('.as-table').find('tbody>tr') - .first().find('td').first() - .find('button').as('firstBtn') - - // when we reference the alias, we place an - // @ in front of its name - cy.get('@firstBtn').click() - - cy.get('@firstBtn') - .should('have.class', 'btn-success') - .and('contain', 'Changed') - }) - - it('.as() - alias a route for later use', () => { - - // Alias the route to wait for its response - cy.server() - cy.route('GET', 'comments/*').as('getComment') - - // we have code that gets a comment when - // the button is clicked in scripts.js - cy.get('.network-btn').click() - - // https://on.cypress.io/wait - cy.wait('@getComment').its('status').should('eq', 200) - - }) -}) diff --git a/cypress/integration/examples/assertions.spec.js b/cypress/integration/examples/assertions.spec.js deleted file mode 100644 index 791383b..0000000 --- a/cypress/integration/examples/assertions.spec.js +++ /dev/null @@ -1,168 +0,0 @@ -/// - -context('Assertions', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/assertions') - }) - - describe('Implicit Assertions', () => { - it('.should() - make an assertion about the current subject', () => { - // https://on.cypress.io/should - cy.get('.assertion-table') - .find('tbody tr:last') - .should('have.class', 'success') - .find('td') - .first() - // checking the text of the element in various ways - .should('have.text', 'Column content') - .should('contain', 'Column content') - .should('have.html', 'Column content') - // chai-jquery uses "is()" to check if element matches selector - .should('match', 'td') - // to match text content against a regular expression - // first need to invoke jQuery method text() - // and then match using regular expression - .invoke('text') - .should('match', /column content/i) - - // a better way to check element's text content against a regular expression - // is to use "cy.contains" - // https://on.cypress.io/contains - cy.get('.assertion-table') - .find('tbody tr:last') - // finds first element with text content matching regular expression - .contains('td', /column content/i) - .should('be.visible') - - // for more information about asserting element's text - // see https://on.cypress.io/using-cypress-faq#How-do-I-get-an-element’s-text-contents - }) - - it('.and() - chain multiple assertions together', () => { - // https://on.cypress.io/and - cy.get('.assertions-link') - .should('have.class', 'active') - .and('have.attr', 'href') - .and('include', 'cypress.io') - }) - }) - - describe('Explicit Assertions', () => { - // https://on.cypress.io/assertions - it('expect - make an assertion about a specified subject', () => { - // We can use Chai's BDD style assertions - expect(true).to.be.true - const o = { foo: 'bar' } - - expect(o).to.equal(o) - expect(o).to.deep.equal({ foo: 'bar' }) - // matching text using regular expression - expect('FooBar').to.match(/bar$/i) - }) - - it('pass your own callback function to should()', () => { - // Pass a function to should that can have any number - // of explicit assertions within it. - // The ".should(cb)" function will be retried - // automatically until it passes all your explicit assertions or times out. - cy.get('.assertions-p') - .find('p') - .should(($p) => { - // https://on.cypress.io/$ - // return an array of texts from all of the p's - // @ts-ignore TS6133 unused variable - const texts = $p.map((i, el) => Cypress.$(el).text()) - - // jquery map returns jquery object - // and .get() convert this to simple array - const paragraphs = texts.get() - - // array should have length of 3 - expect(paragraphs, 'has 3 paragraphs').to.have.length(3) - - // use second argument to expect(...) to provide clear - // message with each assertion - expect(paragraphs, 'has expected text in each paragraph').to.deep.eq([ - 'Some text from first p', - 'More text from second p', - 'And even more text from third p', - ]) - }) - }) - - it('finds element by class name regex', () => { - cy.get('.docs-header') - .find('div') - // .should(cb) callback function will be retried - .should(($div) => { - expect($div).to.have.length(1) - - const className = $div[0].className - - expect(className).to.match(/heading-/) - }) - // .then(cb) callback is not retried, - // it either passes or fails - .then(($div) => { - expect($div, 'text content').to.have.text('Introduction') - }) - }) - - it('can throw any error', () => { - cy.get('.docs-header') - .find('div') - .should(($div) => { - if ($div.length !== 1) { - // you can throw your own errors - throw new Error('Did not find 1 element') - } - - const className = $div[0].className - - if (!className.match(/heading-/)) { - throw new Error(`Could not find class "heading-" in ${className}`) - } - }) - }) - - it('matches unknown text between two elements', () => { - /** - * Text from the first element. - * @type {string} - */ - let text - - /** - * Normalizes passed text, - * useful before comparing text with spaces and different capitalization. - * @param {string} s Text to normalize - */ - const normalizeText = (s) => s.replace(/\s/g, '').toLowerCase() - - cy.get('.two-elements') - .find('.first') - .then(($first) => { - // save text from the first element - text = normalizeText($first.text()) - }) - - cy.get('.two-elements') - .find('.second') - .should(($div) => { - // we can massage text before comparing - const secondText = normalizeText($div.text()) - - expect(secondText, 'second text').to.equal(text) - }) - }) - - it('assert - assert shape of an object', () => { - const person = { - name: 'Joe', - age: 20, - } - - assert.isObject(person, 'value is object') - }) - }) -}) diff --git a/cypress/integration/examples/connectors.spec.js b/cypress/integration/examples/connectors.spec.js deleted file mode 100644 index 26deb7a..0000000 --- a/cypress/integration/examples/connectors.spec.js +++ /dev/null @@ -1,56 +0,0 @@ -/// - -context('Connectors', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/connectors') - }) - - it('.each() - iterate over an array of elements', () => { - // https://on.cypress.io/each - cy.get('.connectors-each-ul>li') - .each(($el, index, $list) => { - console.log($el, index, $list) - }) - }) - - it('.its() - get properties on the current subject', () => { - // https://on.cypress.io/its - cy.get('.connectors-its-ul>li') - // calls the 'length' property yielding that value - .its('length') - .should('be.gt', 2) - }) - - it('.invoke() - invoke a function on the current subject', () => { - // our div is hidden in our script.js - // $('.connectors-div').hide() - - // https://on.cypress.io/invoke - cy.get('.connectors-div').should('be.hidden') - // call the jquery method 'show' on the 'div.container' - .invoke('show') - .should('be.visible') - }) - - it('.spread() - spread an array as individual args to callback function', () => { - // https://on.cypress.io/spread - const arr = ['foo', 'bar', 'baz'] - - cy.wrap(arr).spread((foo, bar, baz) => { - expect(foo).to.eq('foo') - expect(bar).to.eq('bar') - expect(baz).to.eq('baz') - }) - }) - - it('.then() - invoke a callback function with the current subject', () => { - // https://on.cypress.io/then - cy.get('.connectors-list > li') - .then(($lis) => { - expect($lis, '3 items').to.have.length(3) - expect($lis.eq(0), 'first item').to.contain('Walk the dog') - expect($lis.eq(1), 'second item').to.contain('Feed the cat') - expect($lis.eq(2), 'third item').to.contain('Write JavaScript') - }) - }) -}) diff --git a/cypress/integration/examples/cookies.spec.js b/cypress/integration/examples/cookies.spec.js deleted file mode 100644 index bb540e9..0000000 --- a/cypress/integration/examples/cookies.spec.js +++ /dev/null @@ -1,78 +0,0 @@ -/// - -context('Cookies', () => { - beforeEach(() => { - Cypress.Cookies.debug(true) - - cy.visit('https://example.cypress.io/commands/cookies') - - // clear cookies again after visiting to remove - // any 3rd party cookies picked up such as cloudflare - cy.clearCookies() - }) - - it('cy.getCookie() - get a browser cookie', () => { - // https://on.cypress.io/getcookie - cy.get('#getCookie .set-a-cookie').click() - - // cy.getCookie() yields a cookie object - cy.getCookie('token').should('have.property', 'value', '123ABC') - }) - - it('cy.getCookies() - get browser cookies', () => { - // https://on.cypress.io/getcookies - cy.getCookies().should('be.empty') - - cy.get('#getCookies .set-a-cookie').click() - - // cy.getCookies() yields an array of cookies - cy.getCookies().should('have.length', 1).should((cookies) => { - - // each cookie has these properties - expect(cookies[0]).to.have.property('name', 'token') - expect(cookies[0]).to.have.property('value', '123ABC') - expect(cookies[0]).to.have.property('httpOnly', false) - expect(cookies[0]).to.have.property('secure', false) - expect(cookies[0]).to.have.property('domain') - expect(cookies[0]).to.have.property('path') - }) - }) - - it('cy.setCookie() - set a browser cookie', () => { - // https://on.cypress.io/setcookie - cy.getCookies().should('be.empty') - - cy.setCookie('foo', 'bar') - - // cy.getCookie() yields a cookie object - cy.getCookie('foo').should('have.property', 'value', 'bar') - }) - - it('cy.clearCookie() - clear a browser cookie', () => { - // https://on.cypress.io/clearcookie - cy.getCookie('token').should('be.null') - - cy.get('#clearCookie .set-a-cookie').click() - - cy.getCookie('token').should('have.property', 'value', '123ABC') - - // cy.clearCookies() yields null - cy.clearCookie('token').should('be.null') - - cy.getCookie('token').should('be.null') - }) - - it('cy.clearCookies() - clear browser cookies', () => { - // https://on.cypress.io/clearcookies - cy.getCookies().should('be.empty') - - cy.get('#clearCookies .set-a-cookie').click() - - cy.getCookies().should('have.length', 1) - - // cy.clearCookies() yields null - cy.clearCookies() - - cy.getCookies().should('be.empty') - }) -}) diff --git a/cypress/integration/examples/cypress_api.spec.js b/cypress/integration/examples/cypress_api.spec.js deleted file mode 100644 index 0e46520..0000000 --- a/cypress/integration/examples/cypress_api.spec.js +++ /dev/null @@ -1,222 +0,0 @@ -/// - -context('Cypress.Commands', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api') - }) - - // https://on.cypress.io/custom-commands - - it('.add() - create a custom command', () => { - Cypress.Commands.add('console', { - prevSubject: true, - }, (subject, method) => { - // the previous subject is automatically received - // and the commands arguments are shifted - - // allow us to change the console method used - method = method || 'log' - - // log the subject to the console - // @ts-ignore TS7017 - console[method]('The subject is', subject) - - // whatever we return becomes the new subject - // we don't want to change the subject so - // we return whatever was passed in - return subject - }) - - // @ts-ignore TS2339 - cy.get('button').console('info').then(($button) => { - // subject is still $button - }) - }) -}) - - -context('Cypress.Cookies', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api') - }) - - // https://on.cypress.io/cookies - it('.debug() - enable or disable debugging', () => { - Cypress.Cookies.debug(true) - - // Cypress will now log in the console when - // cookies are set or cleared - cy.setCookie('fakeCookie', '123ABC') - cy.clearCookie('fakeCookie') - cy.setCookie('fakeCookie', '123ABC') - cy.clearCookie('fakeCookie') - cy.setCookie('fakeCookie', '123ABC') - }) - - it('.preserveOnce() - preserve cookies by key', () => { - // normally cookies are reset after each test - cy.getCookie('fakeCookie').should('not.be.ok') - - // preserving a cookie will not clear it when - // the next test starts - cy.setCookie('lastCookie', '789XYZ') - Cypress.Cookies.preserveOnce('lastCookie') - }) - - it('.defaults() - set defaults for all cookies', () => { - // now any cookie with the name 'session_id' will - // not be cleared before each new test runs - Cypress.Cookies.defaults({ - whitelist: 'session_id', - }) - }) -}) - - -context('Cypress.Server', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api') - }) - - // Permanently override server options for - // all instances of cy.server() - - // https://on.cypress.io/cypress-server - it('.defaults() - change default config of server', () => { - Cypress.Server.defaults({ - delay: 0, - force404: false, - }) - }) -}) - -context('Cypress.arch', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api') - }) - - it('Get CPU architecture name of underlying OS', () => { - // https://on.cypress.io/arch - expect(Cypress.arch).to.exist - }) -}) - -context('Cypress.config()', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api') - }) - - it('Get and set configuration options', () => { - // https://on.cypress.io/config - let myConfig = Cypress.config() - - expect(myConfig).to.have.property('animationDistanceThreshold', 5) - expect(myConfig).to.have.property('baseUrl', null) - expect(myConfig).to.have.property('defaultCommandTimeout', 4000) - expect(myConfig).to.have.property('requestTimeout', 5000) - expect(myConfig).to.have.property('responseTimeout', 30000) - expect(myConfig).to.have.property('viewportHeight', 660) - expect(myConfig).to.have.property('viewportWidth', 1000) - expect(myConfig).to.have.property('pageLoadTimeout', 60000) - expect(myConfig).to.have.property('waitForAnimations', true) - - expect(Cypress.config('pageLoadTimeout')).to.eq(60000) - - // this will change the config for the rest of your tests! - Cypress.config('pageLoadTimeout', 20000) - - expect(Cypress.config('pageLoadTimeout')).to.eq(20000) - - Cypress.config('pageLoadTimeout', 60000) - }) -}) - -context('Cypress.dom', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api') - }) - - // https://on.cypress.io/dom - it('.isHidden() - determine if a DOM element is hidden', () => { - let hiddenP = Cypress.$('.dom-p p.hidden').get(0) - let visibleP = Cypress.$('.dom-p p.visible').get(0) - - // our first paragraph has css class 'hidden' - expect(Cypress.dom.isHidden(hiddenP)).to.be.true - expect(Cypress.dom.isHidden(visibleP)).to.be.false - }) -}) - -context('Cypress.env()', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api') - }) - - // We can set environment variables for highly dynamic values - - // https://on.cypress.io/environment-variables - it('Get environment variables', () => { - // https://on.cypress.io/env - // set multiple environment variables - Cypress.env({ - host: 'veronica.dev.local', - api_server: 'http://localhost:8888/v1/', - }) - - // get environment variable - expect(Cypress.env('host')).to.eq('veronica.dev.local') - - // set environment variable - Cypress.env('api_server', 'http://localhost:8888/v2/') - expect(Cypress.env('api_server')).to.eq('http://localhost:8888/v2/') - - // get all environment variable - expect(Cypress.env()).to.have.property('host', 'veronica.dev.local') - expect(Cypress.env()).to.have.property('api_server', 'http://localhost:8888/v2/') - }) -}) - -context('Cypress.log', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api') - }) - - it('Control what is printed to the Command Log', () => { - // https://on.cypress.io/cypress-log - }) -}) - - -context('Cypress.platform', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api') - }) - - it('Get underlying OS name', () => { - // https://on.cypress.io/platform - expect(Cypress.platform).to.be.exist - }) -}) - -context('Cypress.version', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api') - }) - - it('Get current version of Cypress being run', () => { - // https://on.cypress.io/version - expect(Cypress.version).to.be.exist - }) -}) - -context('Cypress.spec', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/cypress-api') - }) - - it('Get current spec information', () => { - // https://on.cypress.io/spec - // wrap the object so we can inspect it easily by clicking in the command log - cy.wrap(Cypress.spec).should('have.keys', ['name', 'relative', 'absolute']) - }) -}) diff --git a/cypress/integration/examples/files.spec.js b/cypress/integration/examples/files.spec.js deleted file mode 100644 index 016588b..0000000 --- a/cypress/integration/examples/files.spec.js +++ /dev/null @@ -1,86 +0,0 @@ -/// - -context('Files', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/files') - }) - it('cy.fixture() - load a fixture', () => { - // https://on.cypress.io/fixture - - // Instead of writing a response inline you can - // use a fixture file's content. - - cy.server() - cy.fixture('example.json').as('comment') - cy.route('GET', 'comments/*', '@comment').as('getComment') - - // we have code that gets a comment when - // the button is clicked in scripts.js - cy.get('.fixture-btn').click() - - cy.wait('@getComment').its('responseBody') - .should('have.property', 'name') - .and('include', 'Using fixtures to represent data') - - // you can also just write the fixture in the route - cy.route('GET', 'comments/*', 'fixture:example.json').as('getComment') - - // we have code that gets a comment when - // the button is clicked in scripts.js - cy.get('.fixture-btn').click() - - cy.wait('@getComment').its('responseBody') - .should('have.property', 'name') - .and('include', 'Using fixtures to represent data') - - // or write fx to represent fixture - // by default it assumes it's .json - cy.route('GET', 'comments/*', 'fx:example').as('getComment') - - // we have code that gets a comment when - // the button is clicked in scripts.js - cy.get('.fixture-btn').click() - - cy.wait('@getComment').its('responseBody') - .should('have.property', 'name') - .and('include', 'Using fixtures to represent data') - }) - - it('cy.readFile() - read a files contents', () => { - // https://on.cypress.io/readfile - - // You can read a file and yield its contents - // The filePath is relative to your project's root. - cy.readFile('cypress.json').then((json) => { - expect(json).to.be.an('object') - }) - }) - - it('cy.writeFile() - write to a file', () => { - // https://on.cypress.io/writefile - - // You can write to a file - - // Use a response from a request to automatically - // generate a fixture file for use later - cy.request('https://jsonplaceholder.cypress.io/users') - .then((response) => { - cy.writeFile('cypress/fixtures/users.json', response.body) - }) - cy.fixture('users').should((users) => { - expect(users[0].name).to.exist - }) - - // JavaScript arrays and objects are stringified - // and formatted into text. - cy.writeFile('cypress/fixtures/profile.json', { - id: 8739, - name: 'Jane', - email: 'jane@example.com', - }) - - cy.fixture('profile').should((profile) => { - expect(profile.name).to.eq('Jane') - }) - }) -}) diff --git a/cypress/integration/examples/local_storage.spec.js b/cypress/integration/examples/local_storage.spec.js deleted file mode 100644 index 076b096..0000000 --- a/cypress/integration/examples/local_storage.spec.js +++ /dev/null @@ -1,52 +0,0 @@ -/// - -context('Local Storage', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/local-storage') - }) - // Although local storage is automatically cleared - // in between tests to maintain a clean state - // sometimes we need to clear the local storage manually - - it('cy.clearLocalStorage() - clear all data in local storage', () => { - // https://on.cypress.io/clearlocalstorage - cy.get('.ls-btn').click().should(() => { - expect(localStorage.getItem('prop1')).to.eq('red') - expect(localStorage.getItem('prop2')).to.eq('blue') - expect(localStorage.getItem('prop3')).to.eq('magenta') - }) - - // clearLocalStorage() yields the localStorage object - cy.clearLocalStorage().should((ls) => { - expect(ls.getItem('prop1')).to.be.null - expect(ls.getItem('prop2')).to.be.null - expect(ls.getItem('prop3')).to.be.null - }) - - // Clear key matching string in Local Storage - cy.get('.ls-btn').click().should(() => { - expect(localStorage.getItem('prop1')).to.eq('red') - expect(localStorage.getItem('prop2')).to.eq('blue') - expect(localStorage.getItem('prop3')).to.eq('magenta') - }) - - cy.clearLocalStorage('prop1').should((ls) => { - expect(ls.getItem('prop1')).to.be.null - expect(ls.getItem('prop2')).to.eq('blue') - expect(ls.getItem('prop3')).to.eq('magenta') - }) - - // Clear keys matching regex in Local Storage - cy.get('.ls-btn').click().should(() => { - expect(localStorage.getItem('prop1')).to.eq('red') - expect(localStorage.getItem('prop2')).to.eq('blue') - expect(localStorage.getItem('prop3')).to.eq('magenta') - }) - - cy.clearLocalStorage(/prop1|2/).should((ls) => { - expect(ls.getItem('prop1')).to.be.null - expect(ls.getItem('prop2')).to.be.null - expect(ls.getItem('prop3')).to.eq('magenta') - }) - }) -}) diff --git a/cypress/integration/examples/location.spec.js b/cypress/integration/examples/location.spec.js deleted file mode 100644 index 68e755c..0000000 --- a/cypress/integration/examples/location.spec.js +++ /dev/null @@ -1,32 +0,0 @@ -/// - -context('Location', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/location') - }) - - it('cy.hash() - get the current URL hash', () => { - // https://on.cypress.io/hash - cy.hash().should('be.empty') - }) - - it('cy.location() - get window.location', () => { - // https://on.cypress.io/location - cy.location().should((location) => { - expect(location.hash).to.be.empty - expect(location.href).to.eq('https://example.cypress.io/commands/location') - expect(location.host).to.eq('example.cypress.io') - expect(location.hostname).to.eq('example.cypress.io') - expect(location.origin).to.eq('https://example.cypress.io') - expect(location.pathname).to.eq('/commands/location') - expect(location.port).to.eq('') - expect(location.protocol).to.eq('https:') - expect(location.search).to.be.empty - }) - }) - - it('cy.url() - get the current URL', () => { - // https://on.cypress.io/url - cy.url().should('eq', 'https://example.cypress.io/commands/location') - }) -}) diff --git a/cypress/integration/examples/misc.spec.js b/cypress/integration/examples/misc.spec.js deleted file mode 100644 index 97edd8b..0000000 --- a/cypress/integration/examples/misc.spec.js +++ /dev/null @@ -1,83 +0,0 @@ -/// - -context('Misc', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/misc') - }) - - it('.end() - end the command chain', () => { - // https://on.cypress.io/end - - // cy.end is useful when you want to end a chain of commands - // and force Cypress to re-query from the root element - cy.get('.misc-table').within(() => { - // ends the current chain and yields null - cy.contains('Cheryl').click().end() - - // queries the entire table again - cy.contains('Charles').click() - }) - }) - - it('cy.exec() - execute a system command', () => { - // https://on.cypress.io/exec - - // execute a system command. - // so you can take actions necessary for - // your test outside the scope of Cypress. - cy.exec('echo Jane Lane') - .its('stdout').should('contain', 'Jane Lane') - - // we can use Cypress.platform string to - // select appropriate command - // https://on.cypress/io/platform - cy.log(`Platform ${Cypress.platform} architecture ${Cypress.arch}`) - - if (Cypress.platform === 'win32') { - cy.exec('print cypress.json') - .its('stderr').should('be.empty') - } else { - cy.exec('cat cypress.json') - .its('stderr').should('be.empty') - - cy.exec('pwd') - .its('code').should('eq', 0) - } - }) - - it('cy.focused() - get the DOM element that has focus', () => { - // https://on.cypress.io/focused - cy.get('.misc-form').find('#name').click() - cy.focused().should('have.id', 'name') - - cy.get('.misc-form').find('#description').click() - cy.focused().should('have.id', 'description') - }) - - context('Cypress.Screenshot', function () { - it('cy.screenshot() - take a screenshot', () => { - // https://on.cypress.io/screenshot - cy.screenshot('my-image') - }) - - it('Cypress.Screenshot.defaults() - change default config of screenshots', function () { - Cypress.Screenshot.defaults({ - blackout: ['.foo'], - capture: 'viewport', - clip: { x: 0, y: 0, width: 200, height: 200 }, - scale: false, - disableTimersAndAnimations: true, - screenshotOnRunFailure: true, - beforeScreenshot () { }, - afterScreenshot () { }, - }) - }) - }) - - it('cy.wrap() - wrap an object', () => { - // https://on.cypress.io/wrap - cy.wrap({ foo: 'bar' }) - .should('have.property', 'foo') - .and('include', 'bar') - }) -}) diff --git a/cypress/integration/examples/navigation.spec.js b/cypress/integration/examples/navigation.spec.js deleted file mode 100644 index bbd9d47..0000000 --- a/cypress/integration/examples/navigation.spec.js +++ /dev/null @@ -1,56 +0,0 @@ -/// - -context('Navigation', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io') - cy.get('.navbar-nav').contains('Commands').click() - cy.get('.dropdown-menu').contains('Navigation').click() - }) - - it('cy.go() - go back or forward in the browser\'s history', () => { - // https://on.cypress.io/go - - cy.location('pathname').should('include', 'navigation') - - cy.go('back') - cy.location('pathname').should('not.include', 'navigation') - - cy.go('forward') - cy.location('pathname').should('include', 'navigation') - - // clicking back - cy.go(-1) - cy.location('pathname').should('not.include', 'navigation') - - // clicking forward - cy.go(1) - cy.location('pathname').should('include', 'navigation') - }) - - it('cy.reload() - reload the page', () => { - // https://on.cypress.io/reload - cy.reload() - - // reload the page without using the cache - cy.reload(true) - }) - - it('cy.visit() - visit a remote url', () => { - // https://on.cypress.io/visit - - // Visit any sub-domain of your current domain - - // Pass options to the visit - cy.visit('https://example.cypress.io/commands/navigation', { - timeout: 50000, // increase total time for the visit to resolve - onBeforeLoad (contentWindow) { - // contentWindow is the remote page's window object - expect(typeof contentWindow === 'object').to.be.true - }, - onLoad (contentWindow) { - // contentWindow is the remote page's window object - expect(typeof contentWindow === 'object').to.be.true - }, - }) - }) -}) diff --git a/cypress/integration/examples/network_requests.spec.js b/cypress/integration/examples/network_requests.spec.js deleted file mode 100644 index 259e9ee..0000000 --- a/cypress/integration/examples/network_requests.spec.js +++ /dev/null @@ -1,140 +0,0 @@ -/// - -context('Network Requests', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/network-requests') - }) - - // Manage AJAX / XHR requests in your app - - it('cy.server() - control behavior of network requests and responses', () => { - // https://on.cypress.io/server - - cy.server().should((server) => { - // the default options on server - // you can override any of these options - expect(server.delay).to.eq(0) - expect(server.method).to.eq('GET') - expect(server.status).to.eq(200) - expect(server.headers).to.be.null - expect(server.response).to.be.null - expect(server.onRequest).to.be.undefined - expect(server.onResponse).to.be.undefined - expect(server.onAbort).to.be.undefined - - // These options control the server behavior - // affecting all requests - - // pass false to disable existing route stubs - expect(server.enable).to.be.true - // forces requests that don't match your routes to 404 - expect(server.force404).to.be.false - // whitelists requests from ever being logged or stubbed - expect(server.whitelist).to.be.a('function') - }) - - cy.server({ - method: 'POST', - delay: 1000, - status: 422, - response: {}, - }) - - // any route commands will now inherit the above options - // from the server. anything we pass specifically - // to route will override the defaults though. - }) - - it('cy.request() - make an XHR request', () => { - // https://on.cypress.io/request - cy.request('https://jsonplaceholder.cypress.io/comments') - .should((response) => { - expect(response.status).to.eq(200) - expect(response.body).to.have.length(500) - expect(response).to.have.property('headers') - expect(response).to.have.property('duration') - }) - }) - - - it('cy.request() - verify response using BDD syntax', () => { - cy.request('https://jsonplaceholder.cypress.io/comments') - .then((response) => { - // https://on.cypress.io/assertions - expect(response).property('status').to.equal(200) - expect(response).property('body').to.have.length(500) - expect(response).to.include.keys('headers', 'duration') - }) - }) - - it('cy.request() with query parameters', () => { - // will execute request - // https://jsonplaceholder.cypress.io/comments?postId=1&id=3 - cy.request({ - url: 'https://jsonplaceholder.cypress.io/comments', - qs: { - postId: 1, - id: 3, - }, - }) - .its('body') - .should('be.an', 'array') - .and('have.length', 1) - .its('0') // yields first element of the array - .should('contain', { - postId: 1, - id: 3, - }) - }) - - it('cy.route() - route responses to matching requests', () => { - // https://on.cypress.io/route - - let message = 'whoa, this comment does not exist' - - cy.server() - - // Listen to GET to comments/1 - cy.route('GET', 'comments/*').as('getComment') - - // we have code that gets a comment when - // the button is clicked in scripts.js - cy.get('.network-btn').click() - - // https://on.cypress.io/wait - cy.wait('@getComment').its('status').should('eq', 200) - - // Listen to POST to comments - cy.route('POST', '/comments').as('postComment') - - // we have code that posts a comment when - // the button is clicked in scripts.js - cy.get('.network-post').click() - cy.wait('@postComment') - - // get the route - cy.get('@postComment').should((xhr) => { - expect(xhr.requestBody).to.include('email') - expect(xhr.requestHeaders).to.have.property('Content-Type') - expect(xhr.responseBody).to.have.property('name', 'Using POST in cy.route()') - }) - - // Stub a response to PUT comments/ **** - cy.route({ - method: 'PUT', - url: 'comments/*', - status: 404, - response: { error: message }, - delay: 500, - }).as('putComment') - - // we have code that puts a comment when - // the button is clicked in scripts.js - cy.get('.network-put').click() - - cy.wait('@putComment') - - // our 404 statusCode logic in scripts.js executed - cy.get('.network-put-comment').should('contain', message) - }) -}) diff --git a/cypress/integration/examples/querying.spec.js b/cypress/integration/examples/querying.spec.js deleted file mode 100644 index 484a8ec..0000000 --- a/cypress/integration/examples/querying.spec.js +++ /dev/null @@ -1,87 +0,0 @@ -/// - -context('Querying', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/querying') - }) - - // The most commonly used query is 'cy.get()', you can - // think of this like the '$' in jQuery - - it('cy.get() - query DOM elements', () => { - // https://on.cypress.io/get - - cy.get('#query-btn').should('contain', 'Button') - - cy.get('.query-btn').should('contain', 'Button') - - cy.get('#querying .well>button:first').should('contain', 'Button') - // ↲ - // Use CSS selectors just like jQuery - - cy.get('[data-test-id="test-example"]').should('have.class', 'example') - - // 'cy.get()' yields jQuery object, you can get its attribute - // by invoking `.attr()` method - cy.get('[data-test-id="test-example"]') - .invoke('attr', 'data-test-id') - .should('equal', 'test-example') - - // or you can get element's CSS property - cy.get('[data-test-id="test-example"]') - .invoke('css', 'position') - .should('equal', 'static') - - // or use assertions directly during 'cy.get()' - // https://on.cypress.io/assertions - cy.get('[data-test-id="test-example"]') - .should('have.attr', 'data-test-id', 'test-example') - .and('have.css', 'position', 'static') - }) - - it('cy.contains() - query DOM elements with matching content', () => { - // https://on.cypress.io/contains - cy.get('.query-list') - .contains('bananas') - .should('have.class', 'third') - - // we can pass a regexp to `.contains()` - cy.get('.query-list') - .contains(/^b\w+/) - .should('have.class', 'third') - - cy.get('.query-list') - .contains('apples') - .should('have.class', 'first') - - // passing a selector to contains will - // yield the selector containing the text - cy.get('#querying') - .contains('ul', 'oranges') - .should('have.class', 'query-list') - - cy.get('.query-button') - .contains('Save Form') - .should('have.class', 'btn') - }) - - it('.within() - query DOM elements within a specific element', () => { - // https://on.cypress.io/within - cy.get('.query-form').within(() => { - cy.get('input:first').should('have.attr', 'placeholder', 'Email') - cy.get('input:last').should('have.attr', 'placeholder', 'Password') - }) - }) - - it('cy.root() - query the root DOM element', () => { - // https://on.cypress.io/root - - // By default, root is the document - cy.root().should('match', 'html') - - cy.get('.query-ul').within(() => { - // In this within, the root is now the ul DOM element - cy.root().should('have.class', 'query-ul') - }) - }) -}) diff --git a/cypress/integration/examples/spies_stubs_clocks.spec.js b/cypress/integration/examples/spies_stubs_clocks.spec.js deleted file mode 100644 index 6ba9397..0000000 --- a/cypress/integration/examples/spies_stubs_clocks.spec.js +++ /dev/null @@ -1,69 +0,0 @@ -/// - -context('Spies, Stubs, and Clock', () => { - it('cy.spy() - wrap a method in a spy', () => { - // https://on.cypress.io/spy - cy.visit('https://example.cypress.io/commands/spies-stubs-clocks') - - let obj = { - foo () {}, - } - - let spy = cy.spy(obj, 'foo').as('anyArgs') - - obj.foo() - - expect(spy).to.be.called - }) - - it('cy.stub() - create a stub and/or replace a function with stub', () => { - // https://on.cypress.io/stub - cy.visit('https://example.cypress.io/commands/spies-stubs-clocks') - - let obj = { - /** - * prints both arguments to the console - * @param a {string} - * @param b {string} - */ - foo (a, b) { - console.log('a', a, 'b', b) - }, - } - - let stub = cy.stub(obj, 'foo').as('foo') - - obj.foo('foo', 'bar') - - expect(stub).to.be.called - }) - - it('cy.clock() - control time in the browser', () => { - // https://on.cypress.io/clock - - // create the date in UTC so its always the same - // no matter what local timezone the browser is running in - let now = new Date(Date.UTC(2017, 2, 14)).getTime() - - cy.clock(now) - cy.visit('https://example.cypress.io/commands/spies-stubs-clocks') - cy.get('#clock-div').click() - .should('have.text', '1489449600') - }) - - it('cy.tick() - move time in the browser', () => { - // https://on.cypress.io/tick - - // create the date in UTC so its always the same - // no matter what local timezone the browser is running in - let now = new Date(Date.UTC(2017, 2, 14)).getTime() - - cy.clock(now) - cy.visit('https://example.cypress.io/commands/spies-stubs-clocks') - cy.get('#tick-div').click() - .should('have.text', '1489449600') - cy.tick(10000) // 10 seconds passed - cy.get('#tick-div').click() - .should('have.text', '1489449610') - }) -}) diff --git a/cypress/integration/examples/traversal.spec.js b/cypress/integration/examples/traversal.spec.js deleted file mode 100644 index 1082eca..0000000 --- a/cypress/integration/examples/traversal.spec.js +++ /dev/null @@ -1,121 +0,0 @@ -/// - -context('Traversal', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/traversal') - }) - - it('.children() - get child DOM elements', () => { - // https://on.cypress.io/children - cy.get('.traversal-breadcrumb') - .children('.active') - .should('contain', 'Data') - }) - - it('.closest() - get closest ancestor DOM element', () => { - // https://on.cypress.io/closest - cy.get('.traversal-badge') - .closest('ul') - .should('have.class', 'list-group') - }) - - it('.eq() - get a DOM element at a specific index', () => { - // https://on.cypress.io/eq - cy.get('.traversal-list>li') - .eq(1).should('contain', 'siamese') - }) - - it('.filter() - get DOM elements that match the selector', () => { - // https://on.cypress.io/filter - cy.get('.traversal-nav>li') - .filter('.active').should('contain', 'About') - }) - - it('.find() - get descendant DOM elements of the selector', () => { - // https://on.cypress.io/find - cy.get('.traversal-pagination') - .find('li').find('a') - .should('have.length', 7) - }) - - it('.first() - get first DOM element', () => { - // https://on.cypress.io/first - cy.get('.traversal-table td') - .first().should('contain', '1') - }) - - it('.last() - get last DOM element', () => { - // https://on.cypress.io/last - cy.get('.traversal-buttons .btn') - .last().should('contain', 'Submit') - }) - - it('.next() - get next sibling DOM element', () => { - // https://on.cypress.io/next - cy.get('.traversal-ul') - .contains('apples').next().should('contain', 'oranges') - }) - - it('.nextAll() - get all next sibling DOM elements', () => { - // https://on.cypress.io/nextall - cy.get('.traversal-next-all') - .contains('oranges') - .nextAll().should('have.length', 3) - }) - - it('.nextUntil() - get next sibling DOM elements until next el', () => { - // https://on.cypress.io/nextuntil - cy.get('#veggies') - .nextUntil('#nuts').should('have.length', 3) - }) - - it('.not() - remove DOM elements from set of DOM elements', () => { - // https://on.cypress.io/not - cy.get('.traversal-disabled .btn') - .not('[disabled]').should('not.contain', 'Disabled') - }) - - it('.parent() - get parent DOM element from DOM elements', () => { - // https://on.cypress.io/parent - cy.get('.traversal-mark') - .parent().should('contain', 'Morbi leo risus') - }) - - it('.parents() - get parent DOM elements from DOM elements', () => { - // https://on.cypress.io/parents - cy.get('.traversal-cite') - .parents().should('match', 'blockquote') - }) - - it('.parentsUntil() - get parent DOM elements from DOM elements until el', () => { - // https://on.cypress.io/parentsuntil - cy.get('.clothes-nav') - .find('.active') - .parentsUntil('.clothes-nav') - .should('have.length', 2) - }) - - it('.prev() - get previous sibling DOM element', () => { - // https://on.cypress.io/prev - cy.get('.birds').find('.active') - .prev().should('contain', 'Lorikeets') - }) - - it('.prevAll() - get all previous sibling DOM elements', () => { - // https://on.cypress.io/prevAll - cy.get('.fruits-list').find('.third') - .prevAll().should('have.length', 2) - }) - - it('.prevUntil() - get all previous sibling DOM elements until el', () => { - // https://on.cypress.io/prevUntil - cy.get('.foods-list').find('#nuts') - .prevUntil('#veggies').should('have.length', 3) - }) - - it('.siblings() - get all sibling DOM elements', () => { - // https://on.cypress.io/siblings - cy.get('.traversal-pills .active') - .siblings().should('have.length', 2) - }) -}) diff --git a/cypress/integration/examples/utilities.spec.js b/cypress/integration/examples/utilities.spec.js deleted file mode 100644 index c3e2076..0000000 --- a/cypress/integration/examples/utilities.spec.js +++ /dev/null @@ -1,117 +0,0 @@ -/// - -context('Utilities', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/utilities') - }) - - it('Cypress._ - call a lodash method', () => { - // https://on.cypress.io/_ - cy.request('https://jsonplaceholder.cypress.io/users') - .then((response) => { - let ids = Cypress._.chain(response.body).map('id').take(3).value() - - expect(ids).to.deep.eq([1, 2, 3]) - }) - }) - - it('Cypress.$ - call a jQuery method', () => { - // https://on.cypress.io/$ - let $li = Cypress.$('.utility-jquery li:first') - - cy.wrap($li) - .should('not.have.class', 'active') - .click() - .should('have.class', 'active') - }) - - it('Cypress.Blob - blob utilities and base64 string conversion', () => { - // https://on.cypress.io/blob - cy.get('.utility-blob').then(($div) => - // https://github.com/nolanlawson/blob-util#imgSrcToDataURL - // get the dataUrl string for the javascript-logo - Cypress.Blob.imgSrcToDataURL('https://example.cypress.io/assets/img/javascript-logo.png', undefined, 'anonymous') - .then((dataUrl) => { - // create an element and set its src to the dataUrl - let img = Cypress.$('', { src: dataUrl }) - - // need to explicitly return cy here since we are initially returning - // the Cypress.Blob.imgSrcToDataURL promise to our test - // append the image - $div.append(img) - - cy.get('.utility-blob img').click() - .should('have.attr', 'src', dataUrl) - })) - }) - - it('Cypress.minimatch - test out glob patterns against strings', () => { - // https://on.cypress.io/minimatch - let matching = Cypress.minimatch('/users/1/comments', '/users/*/comments', { - matchBase: true, - }) - - expect(matching, 'matching wildcard').to.be.true - - matching = Cypress.minimatch('/users/1/comments/2', '/users/*/comments', { - matchBase: true, - }) - expect(matching, 'comments').to.be.false - - // ** matches against all downstream path segments - matching = Cypress.minimatch('/foo/bar/baz/123/quux?a=b&c=2', '/foo/**', { - matchBase: true, - }) - expect(matching, 'comments').to.be.true - - // whereas * matches only the next path segment - - matching = Cypress.minimatch('/foo/bar/baz/123/quux?a=b&c=2', '/foo/*', { - matchBase: false, - }) - expect(matching, 'comments').to.be.false - }) - - - it('Cypress.moment() - format or parse dates using a moment method', () => { - // https://on.cypress.io/moment - const time = Cypress.moment().utc('2014-04-25T19:38:53.196Z').format('h:mm A') - - expect(time).to.be.a('string') - - cy.get('.utility-moment').contains('3:38 PM') - .should('have.class', 'badge') - }) - - - it('Cypress.Promise - instantiate a bluebird promise', () => { - // https://on.cypress.io/promise - let waited = false - - /** - * @return Bluebird - */ - function waitOneSecond () { - // return a promise that resolves after 1 second - // @ts-ignore TS2351 (new Cypress.Promise) - return new Cypress.Promise((resolve, reject) => { - setTimeout(() => { - // set waited to true - waited = true - - // resolve with 'foo' string - resolve('foo') - }, 1000) - }) - } - - cy.then(() => - // return a promise to cy.then() that - // is awaited until it resolves - // @ts-ignore TS7006 - waitOneSecond().then((str) => { - expect(str).to.eq('foo') - expect(waited).to.be.true - })) - }) -}) diff --git a/cypress/integration/examples/viewport.spec.js b/cypress/integration/examples/viewport.spec.js deleted file mode 100644 index 711fe74..0000000 --- a/cypress/integration/examples/viewport.spec.js +++ /dev/null @@ -1,59 +0,0 @@ -/// - -context('Viewport', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/viewport') - }) - - it('cy.viewport() - set the viewport size and dimension', () => { - // https://on.cypress.io/viewport - - cy.get('#navbar').should('be.visible') - cy.viewport(320, 480) - - // the navbar should have collapse since our screen is smaller - cy.get('#navbar').should('not.be.visible') - cy.get('.navbar-toggle').should('be.visible').click() - cy.get('.nav').find('a').should('be.visible') - - // lets see what our app looks like on a super large screen - cy.viewport(2999, 2999) - - // cy.viewport() accepts a set of preset sizes - // to easily set the screen to a device's width and height - - // We added a cy.wait() between each viewport change so you can see - // the change otherwise it is a little too fast to see :) - - cy.viewport('macbook-15') - cy.wait(200) - cy.viewport('macbook-13') - cy.wait(200) - cy.viewport('macbook-11') - cy.wait(200) - cy.viewport('ipad-2') - cy.wait(200) - cy.viewport('ipad-mini') - cy.wait(200) - cy.viewport('iphone-6+') - cy.wait(200) - cy.viewport('iphone-6') - cy.wait(200) - cy.viewport('iphone-5') - cy.wait(200) - cy.viewport('iphone-4') - cy.wait(200) - cy.viewport('iphone-3') - cy.wait(200) - - // cy.viewport() accepts an orientation for all presets - // the default orientation is 'portrait' - cy.viewport('ipad-2', 'portrait') - cy.wait(200) - cy.viewport('iphone-4', 'landscape') - cy.wait(200) - - // The viewport will be reset back to the default dimensions - // in between tests (the default can be set in cypress.json) - }) -}) diff --git a/cypress/integration/examples/waiting.spec.js b/cypress/integration/examples/waiting.spec.js deleted file mode 100644 index e11d9ca..0000000 --- a/cypress/integration/examples/waiting.spec.js +++ /dev/null @@ -1,34 +0,0 @@ -/// - -context('Waiting', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/waiting') - }) - // BE CAREFUL of adding unnecessary wait times. - // https://on.cypress.io/best-practices#Unnecessary-Waiting - - // https://on.cypress.io/wait - it('cy.wait() - wait for a specific amount of time', () => { - cy.get('.wait-input1').type('Wait 1000ms after typing') - cy.wait(1000) - cy.get('.wait-input2').type('Wait 1000ms after typing') - cy.wait(1000) - cy.get('.wait-input3').type('Wait 1000ms after typing') - cy.wait(1000) - }) - - it('cy.wait() - wait for a specific route', () => { - cy.server() - - // Listen to GET to comments/1 - cy.route('GET', 'comments/*').as('getComment') - - // we have code that gets a comment when - // the button is clicked in scripts.js - cy.get('.network-btn').click() - - // wait for GET comments/1 - cy.wait('@getComment').its('status').should('eq', 200) - }) - -}) diff --git a/cypress/integration/examples/window.spec.js b/cypress/integration/examples/window.spec.js deleted file mode 100644 index 00bff9f..0000000 --- a/cypress/integration/examples/window.spec.js +++ /dev/null @@ -1,22 +0,0 @@ -/// - -context('Window', () => { - beforeEach(() => { - cy.visit('https://example.cypress.io/commands/window') - }) - - it('cy.window() - get the global window object', () => { - // https://on.cypress.io/window - cy.window().should('have.property', 'top') - }) - - it('cy.document() - get the document object', () => { - // https://on.cypress.io/document - cy.document().should('have.property', 'charset').and('eq', 'UTF-8') - }) - - it('cy.title() - get the title', () => { - // https://on.cypress.io/title - cy.title().should('include', 'Kitchen Sink') - }) -}) diff --git a/cypress/integration/sample_spec.js b/cypress/integration/sample_spec.js index e69de29..f59dc91 100644 --- a/cypress/integration/sample_spec.js +++ b/cypress/integration/sample_spec.js @@ -0,0 +1,7 @@ +describe('My First Test', function() { + it('Does not do much!', function() { + cy.visit('https://lokeshdhakar.com'); + cy.get('.nav__item').contains('Blog').click(); + cy.url().should('contain', 'blog'); + }) +}) \ No newline at end of file From 9a4443097ceb4970794fc1584ac9ff38ea16611c Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sun, 28 Apr 2019 13:58:49 -0700 Subject: [PATCH 06/35] Replace Grunt w/node deps: http-server, node-minify, uglify --- Gruntfile.js | 50 -- README.md | 10 - build/build.js | 20 + package-lock.json | 2081 +++++---------------------------------------- package.json | 86 +- 5 files changed, 271 insertions(+), 1976 deletions(-) delete mode 100644 Gruntfile.js create mode 100644 build/build.js diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index 7ebb08a..0000000 --- a/Gruntfile.js +++ /dev/null @@ -1,50 +0,0 @@ -module.exports = function(grunt) { - - grunt.initConfig({ - connect: { - server: { - options: { - port: 8000 - } - } - }, - jshint: { - files: ['src/color-thief.js'] - }, - jscs: { - src: [ - 'src/color-thief.js' - ], - options: { - config: ".jscsrc" - } - }, - uglify: { - options: { - preserveComments: 'some', - sourceMap: false - }, - dist: { - files: { - 'dist/color-thief.min.js': ['src/color-thief.js'] - } - } - }, - watch: { - test: { - files: ['src/color-thief.js'], - tasks: ['jshint', 'jscs'] - } - } - }); - - grunt.loadNpmTasks('grunt-contrib-connect'); - grunt.loadNpmTasks('grunt-contrib-jshint'); - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-watch'); - grunt.loadNpmTasks('grunt-jscs'); - - grunt.registerTask('default', ['connect', 'watch']); - grunt.registerTask('test', ['jshint', 'jscs']); - grunt.registerTask('build', ['uglify']); -}; diff --git a/README.md b/README.md index b226d77..8b206b5 100644 --- a/README.md +++ b/README.md @@ -31,13 +31,3 @@ colorThief.getPalette(sourceImage, 8); getPalette(sourceImage[, colorCount, quality]) returns [ [num, num, num], [num, num, num], ... ] ``` - - -## Contributing - -### Testing - -``` -npm run test // Run Cypress acceptance tests -``` - diff --git a/build/build.js b/build/build.js new file mode 100644 index 0000000..1bdb399 --- /dev/null +++ b/build/build.js @@ -0,0 +1,20 @@ +const minify = require('@node-minify/core'); +const uglify = require('@node-minify/uglify-es'); + +minify({ + compressor: uglify, + input: './src/color-thief.js', + output: './dist/color-thief.min.js', + options: { + output: { + comments: 'some' + } + }, + callback: function(err, min) { + if (err) { + console.log('⚠️ERROR:' + err); + } else { + console.log('✅ Minification completed'); + } + } +}); diff --git a/package-lock.json b/package-lock.json index 7d14e97..c70b4f7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70,20 +70,62 @@ } } }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=", - "dev": true + "@node-minify/core": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@node-minify/core/-/core-4.0.5.tgz", + "integrity": "sha512-CXenCpcEF/fDR7nwKIB8GZgcWS98cTwMka4PEQmBDZ0CGN7hOq7BvfpI72CqjJDzk+KC1vfXYwYjuv/5pp/+gw==", + "dev": true, + "requires": { + "@node-minify/utils": "^4.0.5", + "glob": "7.1.3", + "mkdirp": "0.5.1" + } }, - "accepts": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", - "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", + "@node-minify/uglify-es": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@node-minify/uglify-es/-/uglify-es-4.0.5.tgz", + "integrity": "sha512-NDkJnu1k8V1B5i67aRPkhEVUwRy+DVYRQYVxAEbQobGfvC+H+HDIBz2bQYzLcoN5CSXf1CjOBcaU1FOvjk/uOA==", + "dev": true, + "requires": { + "@node-minify/utils": "^4.0.5", + "uglify-es": "3.3.9" + } + }, + "@node-minify/uglify-js": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@node-minify/uglify-js/-/uglify-js-4.0.5.tgz", + "integrity": "sha512-0cLq5XvA8MkWkShynYaWypsKaeFpmW9mSal9mTHA/SR1d8RwKYn9dY2g+qaEayVM0LiSZBNPYdzxdT+xu7d9Tg==", + "dev": true, + "requires": { + "@node-minify/utils": "^4.0.5", + "uglify-js": "3.4.9" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "requires": { + "commander": "~2.17.1", + "source-map": "~0.6.1" + } + } + } + }, + "@node-minify/utils": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@node-minify/utils/-/utils-4.0.5.tgz", + "integrity": "sha512-uJCVg1YBRK0peWGdqbyAaUEAzGGpPYpeppJOPZbExtcnUDsMegSX77tb+rcCbN/n7lx5Ov8nZQ4B5AFt1DsOcQ==", "dev": true, "requires": { - "mime-types": "~2.1.18", - "negotiator": "0.6.1" + "gzip-size": "5.0.0" } }, "ajv": { @@ -98,17 +140,6 @@ "uri-js": "^4.2.2" } }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - } - }, "ansi-escapes": { "version": "1.4.0", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/ansi-escapes/-/ansi-escapes-1.4.0.tgz", @@ -130,29 +161,6 @@ "color-convert": "^1.9.0" } }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - }, - "dependencies": { - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - } - } - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", - "dev": true - }, "asn1": { "version": "0.2.4", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/asn1/-/asn1-0.2.4.tgz", @@ -198,21 +206,6 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, - "basic-auth": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", - "integrity": "sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo=", - "dev": true, - "requires": { - "safe-buffer": "5.1.2" - } - }, - "batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", - "dev": true - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -228,18 +221,6 @@ "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", "dev": true }, - "body": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/body/-/body-5.1.0.tgz", - "integrity": "sha1-5LoM5BCkaTYyM2dgnstOZVMSUGk=", - "dev": true, - "requires": { - "continuable-cache": "^0.3.1", - "error": "^7.0.0", - "raw-body": "~1.1.0", - "safe-json-parse": "~1.0.1" - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -250,15 +231,6 @@ "concat-map": "0.0.1" } }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true, - "requires": { - "pako": "~0.2.0" - } - }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -271,12 +243,6 @@ "integrity": "sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8=", "dev": true }, - "bytes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", - "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", - "dev": true - }, "cachedir": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-1.3.0.tgz", @@ -286,38 +252,12 @@ "os-homedir": "^1.0.1" } }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "dev": true, - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } - }, "caseless": { "version": "0.12.0", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -341,38 +281,6 @@ "integrity": "sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc=", "dev": true }, - "cli": { - "version": "0.6.6", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/cli/-/cli-0.6.6.tgz", - "integrity": "sha1-Aq1Eo4Cr8nraxebwzdewQ9dMU+M=", - "dev": true, - "requires": { - "exit": "0.1.2", - "glob": "~ 3.2.1" - }, - "dependencies": { - "glob": { - "version": "3.2.11", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "requires": { - "inherits": "2", - "minimatch": "0.3" - } - }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, "cli-cursor": { "version": "1.0.2", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/cli-cursor/-/cli-cursor-1.0.2.tgz", @@ -388,23 +296,6 @@ "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", "dev": true }, - "cli-table": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.1.tgz", - "integrity": "sha1-9TsFJmqLGguTSz0IIebi3FkUriM=", - "dev": true, - "requires": { - "colors": "1.0.3" - }, - "dependencies": { - "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", - "dev": true - } - } - }, "cli-truncate": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", @@ -415,29 +306,12 @@ "string-width": "^1.0.1" } }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" - } - }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, - "coffeescript": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", - "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", - "dev": true - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -453,12 +327,6 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, "combined-stream": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", @@ -469,9 +337,9 @@ } }, "commander": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", - "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", + "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", "dev": true }, "common-tags": { @@ -530,45 +398,18 @@ } } }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" - } - }, - "connect-livereload": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/connect-livereload/-/connect-livereload-0.5.4.tgz", - "integrity": "sha1-gBV9E3HJ83zBQDmrGJWXDRGdw7w=", - "dev": true - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "^0.1.4" - } - }, - "continuable-cache": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/continuable-cache/-/continuable-cache-0.3.1.tgz", - "integrity": "sha1-vXJ6f67XfnH/OYWskzUakSczrQ8=", - "dev": true - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", "dev": true }, + "corser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz", + "integrity": "sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c=", + "dev": true + }, "cross-spawn": { "version": "6.0.5", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/cross-spawn/-/cross-spawn-6.0.5.tgz", @@ -582,21 +423,6 @@ "which": "^1.2.9" } }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "dev": true, - "requires": { - "array-find-index": "^1.0.1" - } - }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", - "dev": true - }, "cypress": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/cypress/-/cypress-3.2.0.tgz", @@ -681,22 +507,6 @@ "integrity": "sha1-LnG/CxGRU9u0zE6I2epaz7UNwFw=", "dev": true }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "dateformat": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", - "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.3.0" - } - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -706,79 +516,18 @@ "ms": "2.0.0" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", - "dev": true - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true - }, - "dom-serializer": { + "duplexer": { "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", - "integrity": "sha1-HsQFnihLq+027sKUHUqXChic58A=", - "dev": true, - "requires": { - "domelementtype": "^1.3.0", - "entities": "^1.1.1" - }, - "dependencies": { - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha1-vfpzUplmTfr9NFKe1PhSKidf6lY=", - "dev": true - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha1-0EjESzew0Qp/Kj1f7j9DM9eQSB8=", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", "dev": true }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", - "dev": true, - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -789,11 +538,25 @@ "safer-buffer": "^2.1.0" } }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", - "dev": true + "ecstatic": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/ecstatic/-/ecstatic-3.3.1.tgz", + "integrity": "sha512-/rrctvxZ78HMI/tPIsqdvFKHHscxR3IJuKrZI2ZoUgkt2SiufyLFBmcco+aqQBIu6P1qBsUNG3drAAGLx80vTQ==", + "dev": true, + "requires": { + "he": "^1.1.1", + "mime": "^1.6.0", + "minimist": "^1.1.0", + "url-join": "^2.0.5" + }, + "dependencies": { + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + } + } }, "elegant-spinner": { "version": "1.0.1", @@ -801,77 +564,16 @@ "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", "dev": true }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true - }, - "entities": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", - "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", - "dev": true - }, - "error": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", - "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", - "dev": true, - "requires": { - "string-template": "~0.2.1", - "xtend": "~4.0.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha1-tKxAZIEH/c3PriQvQovqihTU8b8=", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", - "dev": true - }, - "esprima-harmony-jscs": { - "version": "1.1.0-bin", - "resolved": "https://registry.npmjs.org/esprima-harmony-jscs/-/esprima-harmony-jscs-1.1.0-bin.tgz", - "integrity": "sha1-B8sFcdlD7tS8e/6ecmN8Zj/hUe0=", - "dev": true - }, - "estraverse": { - "version": "1.9.3", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", - "dev": true - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true - }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", "dev": true }, "execa": { @@ -898,12 +600,6 @@ "pify": "^2.2.0" } }, - "exit": { - "version": "0.1.2", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, "exit-hook": { "version": "1.1.1", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/exit-hook/-/exit-hook-1.1.1.tgz", @@ -945,12 +641,6 @@ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true - }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", @@ -963,15 +653,6 @@ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", "dev": true }, - "faye-websocket": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", - "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", - "dev": true, - "requires": { - "websocket-driver": ">=0.5.1" - } - }, "fd-slicer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", @@ -991,52 +672,29 @@ "object-assign": "^4.1.0" } }, - "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.1", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.3.1", - "unpipe": "~1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "findup-sync": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", - "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "follow-redirects": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", "dev": true, "requires": { - "glob": "~5.0.0" + "debug": "^3.2.6" }, "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "ms": "^2.1.1" } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true } } }, @@ -1057,12 +715,6 @@ "mime-types": "^2.1.12" } }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true - }, "fs-extra": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.1.tgz", @@ -1080,33 +732,12 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "gaze": { - "version": "1.1.3", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/gaze/-/gaze-1.1.3.tgz", - "integrity": "sha1-xEFzPhO5J6yMD/C0w7Az8ogSkko=", - "dev": true, - "requires": { - "globule": "^1.0.0" - } - }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", - "dev": true - }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", "dev": true }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", - "dev": true - }, "getos": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/getos/-/getos-3.1.0.tgz", @@ -1137,15 +768,15 @@ } }, "glob": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", - "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.0.2", + "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } @@ -1159,247 +790,30 @@ "ini": "^1.3.4" } }, - "globule": { - "version": "1.2.1", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/globule/-/globule-1.2.1.tgz", - "integrity": "sha1-Xf+xsZHyLSB5epNptJ6rTpg5aW0=", - "dev": true, - "requires": { - "glob": "~7.1.1", - "lodash": "~4.17.10", - "minimatch": "~3.0.2" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, "graceful-fs": { "version": "4.1.15", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", "integrity": "sha1-/7cD4QZuig7qpMi4C6klPu77+wA=", "dev": true }, - "grunt": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.4.tgz", - "integrity": "sha1-x5mIOUWlOj0HYi4HN8j3C/4Z6zg=", - "dev": true, - "requires": { - "coffeescript": "~1.10.0", - "dateformat": "~1.0.12", - "eventemitter2": "~0.4.13", - "exit": "~0.1.1", - "findup-sync": "~0.3.0", - "glob": "~7.0.0", - "grunt-cli": "~1.2.0", - "grunt-known-options": "~1.1.0", - "grunt-legacy-log": "~2.0.0", - "grunt-legacy-util": "~1.1.1", - "iconv-lite": "~0.4.13", - "js-yaml": "~3.13.0", - "minimatch": "~3.0.2", - "mkdirp": "~0.5.1", - "nopt": "~3.0.6", - "path-is-absolute": "~1.0.0", - "rimraf": "~2.6.2" - }, - "dependencies": { - "grunt-cli": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", - "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", - "dev": true, - "requires": { - "findup-sync": "~0.3.0", - "grunt-known-options": "~1.1.0", - "nopt": "~3.0.6", - "resolve": "~1.1.0" - } - }, - "resolve": { - "version": "1.1.7", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } - } - }, - "grunt-contrib-connect": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-1.0.2.tgz", - "integrity": "sha1-XPkzuRpnOGBEJzwLJERgPNmIebo=", - "dev": true, - "requires": { - "async": "^1.5.2", - "connect": "^3.4.0", - "connect-livereload": "^0.5.0", - "http2": "^3.3.4", - "morgan": "^1.6.1", - "opn": "^4.0.0", - "portscanner": "^1.0.0", - "serve-index": "^1.7.1", - "serve-static": "^1.10.0" - } - }, - "grunt-contrib-jshint": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.11.3.tgz", - "integrity": "sha1-gDaBgdzNVRGG5bg4XAEc7iTWQKA=", - "dev": true, - "requires": { - "hooker": "^0.2.3", - "jshint": "~2.8.0" - } - }, - "grunt-contrib-uglify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-2.0.0.tgz", - "integrity": "sha1-jJlw1pCTbN5tJaoRk1Sb2SkBaTA=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "lodash.assign": "^4.0.9", - "maxmin": "^1.1.0", - "uglify-js": "~2.7.0", - "uri-path": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "grunt-contrib-watch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.1.0.tgz", - "integrity": "sha1-wUPKW4JLKIoCS4VmOaU0Wu23jtQ=", - "dev": true, - "requires": { - "async": "^2.6.0", - "gaze": "^1.1.0", - "lodash": "^4.17.10", - "tiny-lr": "^1.1.1" - }, - "dependencies": { - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha1-GDMOp+bjE4h/XS8qkEusb+TdU4E=", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - } - } - }, - "grunt-jscs": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/grunt-jscs/-/grunt-jscs-1.8.0.tgz", - "integrity": "sha1-3pbfnN1zfuFcErMbtGo72R2UiYE=", + "gzip-size": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.0.0.tgz", + "integrity": "sha512-5iI7omclyqrnWw4XbXAmGhPsABkSIDQonv2K0h61lybgofWa6iZyvrI3r2zsJH4P8Nb64fFVzlvfhs0g7BBxAA==", "dev": true, "requires": { - "hooker": "~0.2.3", - "jscs": "~1.13.0", - "lodash": "~2.4.1", - "vow": "~0.4.1" + "duplexer": "^0.1.1", + "pify": "^3.0.0" }, "dependencies": { - "lodash": { - "version": "2.4.2", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } }, - "grunt-known-options": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", - "integrity": "sha1-bMCIEHvQIZ3F0+V9kZI/RpBZgE0=", - "dev": true - }, - "grunt-legacy-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-2.0.0.tgz", - "integrity": "sha1-yM0sbIGkRlubvy2HTZY/73pZ/7k=", - "dev": true, - "requires": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.0.0", - "hooker": "~0.2.3", - "lodash": "~4.17.5" - } - }, - "grunt-legacy-log-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.0.1.tgz", - "integrity": "sha1-0vRCx8AVAGXZAEsI/XQQ03UZGU4=", - "dev": true, - "requires": { - "chalk": "~2.4.1", - "lodash": "~4.17.10" - } - }, - "grunt-legacy-util": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.1.1.tgz", - "integrity": "sha1-4QYk58hgNOW4cMioYWdD8KCEXkI=", - "dev": true, - "requires": { - "async": "~1.5.2", - "exit": "~0.1.1", - "getobject": "~0.1.0", - "hooker": "~0.2.3", - "lodash": "~4.17.10", - "underscore.string": "~3.3.4", - "which": "~1.3.0" - } - }, - "gzip-size": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", - "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=", - "dev": true, - "requires": { - "browserify-zlib": "^0.1.4", - "concat-stream": "^1.4.1" - } - }, "har-schema": { "version": "2.0.0", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/har-schema/-/har-schema-2.0.0.tgz", @@ -1431,57 +845,47 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha1-l/I2l3vW4SVAiTD/bePuxigewEc=", + "he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "http-proxy": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", + "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", "dev": true, "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" + "eventemitter3": "^3.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" } }, - "http-errors": { - "version": "1.6.3", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", - "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "http-server": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/http-server/-/http-server-0.11.1.tgz", + "integrity": "sha512-6JeGDGoujJLmhjiRGlt8yK8Z9Kl0vnl/dQoQZlc4oeqaUoAKQg94NILLfrY3oWzSyFaQCVNTcKE5PZ3cH8VP9w==", "dev": true, "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.0", - "statuses": ">= 1.4.0 < 2" + "colors": "1.0.3", + "corser": "~2.0.0", + "ecstatic": "^3.0.0", + "http-proxy": "^1.8.1", + "opener": "~1.4.0", + "optimist": "0.6.x", + "portfinder": "^1.0.13", + "union": "~0.4.3" }, "dependencies": { - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", "dev": true } } }, - "http-parser-js": { - "version": "0.5.0", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/http-parser-js/-/http-parser-js-0.5.0.tgz", - "integrity": "sha1-1l7b7ehDSdDcMDIIFaFdOcw8u9g=", - "dev": true - }, "http-signature": { "version": "1.2.0", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/http-signature/-/http-signature-1.2.0.tgz", @@ -1493,27 +897,6 @@ "sshpk": "^1.7.0" } }, - "http2": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/http2/-/http2-3.3.7.tgz", - "integrity": "sha1-eDluseC80dsfSxONmXxoLiNBT7w=", - "dev": true - }, - "i": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", - "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha1-ICK0sl+93CHS9SSXSkdKr+czkIs=", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, "indent-string": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", @@ -1545,18 +928,6 @@ "integrity": "sha1-7uJfVtscnsYIXgwid4CD9Zar+Sc=", "dev": true }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=", - "dev": true - }, "is-ci": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", @@ -1621,18 +992,6 @@ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -1645,169 +1004,12 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, - "js-yaml": { - "version": "3.13.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", - "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, "jsbn": { "version": "0.1.1", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, - "jscs": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/jscs/-/jscs-1.13.1.tgz", - "integrity": "sha1-fdRuGG8PzgcSzQMerMCkXvfc/rA=", - "dev": true, - "requires": { - "chalk": "~1.0.0", - "cli-table": "~0.3.1", - "commander": "~2.6.0", - "esprima": "^1.2.5", - "esprima-harmony-jscs": "1.1.0-bin", - "estraverse": "^1.9.3", - "exit": "~0.1.2", - "glob": "^5.0.1", - "lodash.assign": "~3.0.0", - "minimatch": "~2.0.1", - "pathval": "~0.1.1", - "prompt": "~0.2.14", - "strip-json-comments": "~1.0.2", - "vow": "~0.4.8", - "vow-fs": "~0.3.4", - "xmlbuilder": "^2.6.1" - }, - "dependencies": { - "ansi-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-1.1.1.tgz", - "integrity": "sha1-QchHGUZGN15qGl0Qw8oFTvn8mA0=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.0.0.tgz", - "integrity": "sha1-s89O0P9Tl8mcdbj2edsvUoMfltw=", - "dev": true, - "requires": { - "ansi-styles": "^2.0.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^1.0.3", - "strip-ansi": "^2.0.1", - "supports-color": "^1.3.0" - } - }, - "esprima": { - "version": "1.2.5", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/esprima/-/esprima-1.2.5.tgz", - "integrity": "sha1-CZNQL+r2aBODJXVvMPmlH+7sEek=", - "dev": true - }, - "glob": { - "version": "5.0.15", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-ansi": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-1.0.3.tgz", - "integrity": "sha1-wLWxYV2eOCsP9nFp2We0JeSMpTg=", - "dev": true, - "requires": { - "ansi-regex": "^1.1.0", - "get-stdin": "^4.0.1" - } - }, - "lodash.assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-3.0.0.tgz", - "integrity": "sha1-93SdFYCkEgJzo3H1SmaxTJ1yJvo=", - "dev": true, - "requires": { - "lodash._baseassign": "^3.0.0", - "lodash._createassigner": "^3.0.0" - } - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - }, - "strip-ansi": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-2.0.1.tgz", - "integrity": "sha1-32LBqpTtLxFOHQ8h/R1QSCt5pg4=", - "dev": true, - "requires": { - "ansi-regex": "^1.0.0" - } - }, - "supports-color": { - "version": "1.3.1", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/supports-color/-/supports-color-1.3.1.tgz", - "integrity": "sha1-FXWN8J2P87SswwdTn6vicJXhBC0=", - "dev": true - } - } - }, - "jshint": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.8.0.tgz", - "integrity": "sha1-HQmjvZE8TK36gb8Y1YK9hb/+DUQ=", - "dev": true, - "requires": { - "cli": "0.6.x", - "console-browserify": "1.1.x", - "exit": "0.1.x", - "htmlparser2": "3.8.x", - "lodash": "3.7.x", - "minimatch": "2.0.x", - "shelljs": "0.3.x", - "strip-json-comments": "1.0.x" - }, - "dependencies": { - "lodash": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", - "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=", - "dev": true - }, - "minimatch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", - "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", - "dev": true, - "requires": { - "brace-expansion": "^1.0.0" - } - } - } - }, "json-schema": { "version": "0.2.3", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/json-schema/-/json-schema-0.2.3.tgz", @@ -1847,27 +1049,12 @@ "verror": "1.10.0" } }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, "lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", "integrity": "sha1-eZllXoZGwX8In90YfRUNMyTVRRM=", "dev": true }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, "listr": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz", @@ -2031,117 +1218,18 @@ } } }, - "livereload-js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.4.0.tgz", - "integrity": "sha1-RHwxzx6pq1L8INthXF3fZ494AJw=", - "dev": true - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, "lodash": { "version": "4.17.11", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha1-s56mIp72B+zYniyN8SU2iRysm40=", "dev": true }, - "lodash._baseassign": { - "version": "3.2.0", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", - "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", - "dev": true, - "requires": { - "lodash._basecopy": "^3.0.0", - "lodash.keys": "^3.0.0" - } - }, - "lodash._basecopy": { - "version": "3.0.1", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", - "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", - "dev": true - }, - "lodash._bindcallback": { - "version": "3.0.1", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", - "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=", - "dev": true - }, - "lodash._createassigner": { - "version": "3.1.1", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", - "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", - "dev": true, - "requires": { - "lodash._bindcallback": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash.restparam": "^3.0.0" - } - }, - "lodash._getnative": { - "version": "3.9.1", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/lodash._getnative/-/lodash._getnative-3.9.1.tgz", - "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", - "dev": true - }, - "lodash._isiterateecall": { - "version": "3.0.9", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", - "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", - "dev": true - }, - "lodash.assign": { - "version": "4.2.0", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/lodash.assign/-/lodash.assign-4.2.0.tgz", - "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=", - "dev": true - }, - "lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", - "dev": true - }, - "lodash.isarray": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", - "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", - "dev": true - }, - "lodash.keys": { - "version": "3.1.2", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/lodash.keys/-/lodash.keys-3.1.2.tgz", - "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", - "dev": true, - "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" - } - }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=", "dev": true }, - "lodash.restparam": { - "version": "3.6.1", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/lodash.restparam/-/lodash.restparam-3.6.1.tgz", - "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", - "dev": true - }, "log-symbols": { "version": "2.2.0", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/log-symbols/-/log-symbols-2.2.0.tgz", @@ -2161,101 +1249,10 @@ "cli-cursor": "^1.0.2" } }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "dev": true, - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" - } - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "maxmin": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", - "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "figures": "^1.0.1", - "gzip-size": "^1.0.0", - "pretty-bytes": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha1-Eh+evEnjdm8xGnbh+hyAA8SwOqY=", - "dev": true - }, - "mime-db": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", - "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI=", + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha1-plBX6ZjbCQ9zKmj2wnbTh9QSbDI=", "dev": true }, "mime-types": { @@ -2305,43 +1302,12 @@ "integrity": "sha1-DQVdU/UFKqZTyfbraLtdEr9cK1s=", "dev": true }, - "morgan": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", - "integrity": "sha1-Co0Wc0odmvvIJLmd+H5zjlji2lk=", - "dev": true, - "requires": { - "basic-auth": "~2.0.0", - "debug": "2.6.9", - "depd": "~1.1.2", - "on-finished": "~2.3.0", - "on-headers": "~1.0.1" - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha1-FjDEKyJR/4HiooPelqVJfqkuXg0=", - "dev": true - }, - "ncp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", - "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=", - "dev": true - }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, "nice-try": { "version": "1.0.5", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/nice-try/-/nice-try-1.0.5.tgz", @@ -2354,27 +1320,6 @@ "integrity": "sha1-QGYQmzk3HHYccrfr2pqeoKXeEh8=", "dev": true }, - "nopt": { - "version": "3.0.6", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg=", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -2402,21 +1347,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8=", - "dev": true - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2432,14 +1362,28 @@ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, - "opn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", - "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "opener": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.4.3.tgz", + "integrity": "sha1-XG2ixdflgx6P+jlklQ+NZnSskLg=", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } } }, "ora": { @@ -2505,36 +1449,6 @@ "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", "dev": true }, - "pako": { - "version": "0.2.9", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -2553,29 +1467,6 @@ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=", - "dev": true - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "pathval": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-0.1.1.tgz", - "integrity": "sha1-CPkRzcqczllCiA2ngXvAtyO2bYI=", - "dev": true - }, "pend": { "version": "1.2.0", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/pend/-/pend-1.2.0.tgz", @@ -2594,44 +1485,15 @@ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "portfinder": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.20.tgz", + "integrity": "sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw==", "dev": true, "requires": { - "pinkie": "^2.0.0" - } - }, - "pkginfo": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", - "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=", - "dev": true - }, - "portscanner": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-1.2.0.tgz", - "integrity": "sha1-sUu9olfRTDEPqcwJaCrwLUCWGAI=", - "dev": true, - "requires": { - "async": "1.5.2" - } - }, - "pretty-bytes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", - "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.1.0" + "async": "^1.5.2", + "debug": "^2.2.0", + "mkdirp": "0.5.x" } }, "process-nextick-args": { @@ -2640,19 +1502,6 @@ "integrity": "sha1-o31zL0JxtKsa0HDTVQjoKQeI/6o=", "dev": true }, - "prompt": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/prompt/-/prompt-0.2.14.tgz", - "integrity": "sha1-V3VPZPVD/XsIRXB8gY7OYY8F/9w=", - "dev": true, - "requires": { - "pkginfo": "0.x.x", - "read": "1.0.x", - "revalidator": "0.1.x", - "utile": "0.2.x", - "winston": "0.8.x" - } - }, "psl": { "version": "1.1.31", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", @@ -2665,12 +1514,6 @@ "integrity": "sha1-tYsBCsQMIsVldhbI0sLALHv0eew=", "dev": true }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha1-QdwaAV49WB8WIXdr4xr7KHapsbw=", - "dev": true - }, "querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", @@ -2683,80 +1526,6 @@ "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=", "dev": true }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", - "dev": true - }, - "raw-body": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.7.tgz", - "integrity": "sha1-HQJ8K/oRasxmI7yo8AAWVyqH1CU=", - "dev": true, - "requires": { - "bytes": "1", - "string_decoder": "0.10" - } - }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", - "dev": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "dev": true, - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "repeating": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", @@ -2818,14 +1587,11 @@ "throttleit": "^0.0.2" } }, - "resolve": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", - "integrity": "sha1-ZkhCrJYHlbvnWCIc3M2mH7ZLXxg=", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true }, "restore-cursor": { "version": "1.0.1", @@ -2837,46 +1603,6 @@ "onetime": "^1.0.0" } }, - "revalidator": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", - "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "^0.1.1" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha1-stEE/g2Psnz54KHNqCYt04M8bKs=", - "dev": true, - "requires": { - "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, "rxjs": { "version": "5.5.12", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz", @@ -2892,12 +1618,6 @@ "integrity": "sha1-mR7GnSluAxN0fVm9/St0XDX4go0=", "dev": true }, - "safe-json-parse": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/safe-json-parse/-/safe-json-parse-1.0.1.tgz", - "integrity": "sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=", - "dev": true - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -2910,68 +1630,6 @@ "integrity": "sha1-eQp89v6lRZuslhELKbYEEtyP+Ws=", "dev": true }, - "send": { - "version": "0.16.2", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", - "integrity": "sha1-bsyh4PjBVtFBWXVZhI32RzCmu8E=", - "dev": true, - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "~2.3.0", - "range-parser": "~1.2.0", - "statuses": "~1.4.0" - }, - "dependencies": { - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha1-u3PURtonlhBu/MG2AaJT1sRr0Ic=", - "dev": true - } - } - }, - "serve-index": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", - "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.6.2", - "mime-types": "~2.1.17", - "parseurl": "~1.3.2" - } - }, - "serve-static": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", - "integrity": "sha1-CV6Ecv1bRiN9tQzkhqQ/S4bGzsE=", - "dev": true, - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.2", - "send": "0.16.2" - } - }, - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha1-0L2FU2iHtv58DYGMuWLZ2RxU5lY=", - "dev": true - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -2987,18 +1645,6 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, - "shelljs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", - "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -3012,47 +1658,9 @@ "dev": true }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha1-+4PlBERSaPFUsHTiGMh8ADzTHfQ=", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha1-LqRQrudPKom/uUUZwH/Nb0EyKXc=", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha1-meEZt6XaAOBUkcn6M4t5BII7QdA=", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", - "integrity": "sha1-dezRqI3owYTvAV6vtRtbSL/RG7E=", - "dev": true - }, - "sprintf-js": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", - "integrity": "sha1-2hdlJiv4wPVxdJ8q1sJjACB65nM=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "sshpk": { @@ -3072,30 +1680,12 @@ "tweetnacl": "~0.14.0" } }, - "stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", - "dev": true - }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", - "dev": true - }, "stream-to-observable": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.1.0.tgz", "integrity": "sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=", "dev": true }, - "string-template": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", - "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=", - "dev": true - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -3107,12 +1697,6 @@ "strip-ansi": "^3.0.0" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -3122,36 +1706,12 @@ "ansi-regex": "^2.0.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "^4.0.1" - } - }, - "strip-json-comments": { - "version": "1.0.4", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/strip-json-comments/-/strip-json-comments-1.0.4.tgz", - "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -3173,37 +1733,6 @@ "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", "dev": true }, - "tiny-lr": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-1.1.1.tgz", - "integrity": "sha1-n6VHQS8jj+2waO4pWvi2gsmLKqs=", - "dev": true, - "requires": { - "body": "^5.1.0", - "debug": "^3.1.0", - "faye-websocket": "~0.10.0", - "livereload-js": "^2.3.0", - "object-assign": "^4.1.0", - "qs": "^6.4.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/debug/-/debug-3.2.6.tgz", - "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", - "dev": true - } - } - }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", @@ -3231,12 +1760,6 @@ } } }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -3258,40 +1781,31 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "uglify-js": { - "version": "2.7.5", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/uglify-js/-/uglify-js-2.7.5.tgz", - "integrity": "sha1-RhLAx7qu4rp8SH3kkErhIgefLKg=", + "uglify-es": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.9.tgz", + "integrity": "sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==", "dev": true, "requires": { - "async": "~0.2.6", - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - } + "commander": "~2.13.0", + "source-map": "~0.6.1" } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true - }, - "underscore.string": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.5.tgz", - "integrity": "sha1-/CrSVbi9MJ4jnLxYFv0jqbfqQCM=", + "union": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/union/-/union-0.4.6.tgz", + "integrity": "sha1-GY+9rrolTniLDvy2MLwR8kopWeA=", "dev": true, "requires": { - "sprintf-js": "^1.0.3", - "util-deprecate": "^1.0.2" + "qs": "~2.3.3" + }, + "dependencies": { + "qs": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-2.3.3.tgz", + "integrity": "sha1-6eha2+ddoLvkyOBHaghikPhjtAQ=", + "dev": true + } } }, "universalify": { @@ -3300,12 +1814,6 @@ "integrity": "sha1-tkb2m+OULavOzJ1mOcgNwQXvqmY=", "dev": true }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", - "dev": true - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -3315,12 +1823,6 @@ "punycode": "^2.1.0" } }, - "uri-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", - "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", - "dev": true - }, "url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", @@ -3339,56 +1841,18 @@ } } }, + "url-join": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-2.0.5.tgz", + "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "utile": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/utile/-/utile-0.2.1.tgz", - "integrity": "sha1-kwyI6ZCY1iIINMNWy9mncFItkNc=", - "dev": true, - "requires": { - "async": "~0.2.9", - "deep-equal": "*", - "i": "0.3.x", - "mkdirp": "0.x.x", - "ncp": "0.4.x", - "rimraf": "2.x.x" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - } - } - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", - "dev": true - }, - "uuid": { - "version": "2.0.3", - "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha1-/JH2uce6FchX9MssXe/uw51PQQo=", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "verror": { "version": "1.10.0", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/verror/-/verror-1.10.0.tgz", @@ -3400,49 +1864,6 @@ "extsprintf": "^1.2.0" } }, - "vow": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/vow/-/vow-0.4.19.tgz", - "integrity": "sha1-zF701rtpctgwgwp8ns+K2DSnxSU=", - "dev": true - }, - "vow-fs": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/vow-fs/-/vow-fs-0.3.6.tgz", - "integrity": "sha1-LUxZviLivyYY3fWXq0uqkjvnIA0=", - "dev": true, - "requires": { - "glob": "^7.0.5", - "uuid": "^2.0.2", - "vow": "^0.4.7", - "vow-queue": "^0.4.1" - } - }, - "vow-queue": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/vow-queue/-/vow-queue-0.4.3.tgz", - "integrity": "sha1-S6j2S1bpISwNvlfxQFruvVTM540=", - "dev": true, - "requires": { - "vow": "^0.4.17" - } - }, - "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", - "dev": true, - "requires": { - "http-parser-js": ">=0.4.0", - "websocket-extensions": ">=0.1.1" - } - }, - "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha1-XS/yKXcAPsaHpLhwc9+7rBRszyk=", - "dev": true - }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -3452,47 +1873,6 @@ "isexe": "^2.0.0" } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "winston": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-0.8.3.tgz", - "integrity": "sha1-ZLar9M0Brcrv1QCTk7HY6L7BnbA=", - "dev": true, - "requires": { - "async": "0.2.x", - "colors": "0.6.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "pkginfo": "0.3.x", - "stack-trace": "0.0.x" - }, - "dependencies": { - "async": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", - "dev": true - }, - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=", - "dev": true - } - } - }, "wordwrap": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", @@ -3505,49 +1885,6 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, - "xmlbuilder": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-2.6.5.tgz", - "integrity": "sha1-b/etYPty0idk8AehZLd/K/FABSY=", - "dev": true, - "requires": { - "lodash": "^3.5.0" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - }, - "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - } - } - }, "yauzl": { "version": "2.10.0", "resolved": "https://artifactory.intern.weebly.net:443/artifactory/api/npm/weebly-npm/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index f182103..7dfff22 100644 --- a/package.json +++ b/package.json @@ -1,47 +1,45 @@ { - "name": "color-thief", - "version": "2.0.2", - "author": { - "name": "Lokesh Dhakar", - "email": "lokesh.dhakar@gmail.com", - "url": "http://lokeshdhakar.com/" - }, - "description": "Get the dominant color or color palette from an image.", - "keywords": [ - "color", - "palette", - "sampling", - "image", - "picture", - "photo", - "canvas" - ], - "homepage": "http://lokeshdhakar.com/projects/color-thief/", - "repository": { - "type": "git", - "url": "https://github.com/lokesh/color-thief.git" - }, - "licenses": [ - { - "type": "MIT", - "url": "https://raw.githubusercontent.com/lokesh/color-thief/master/LICENSE/" + "name": "color-thief", + "version": "2.0.2", + "author": { + "name": "Lokesh Dhakar", + "email": "lokesh.dhakar@gmail.com", + "url": "http://lokeshdhakar.com/" + }, + "description": "Get the dominant color or color palette from an image.", + "keywords": [ + "color", + "palette", + "sampling", + "image", + "picture", + "photo", + "canvas" + ], + "homepage": "http://lokeshdhakar.com/projects/color-thief/", + "repository": { + "type": "git", + "url": "https://github.com/lokesh/color-thief.git" + }, + "licenses": [ + { + "type": "MIT", + "url": "https://raw.githubusercontent.com/lokesh/color-thief/master/LICENSE/" + } + ], + "scripts": { + "build": "node ./build/build.js", + "dev": "http-server ./", + "test": "./node_modules/.bin/cypress open" + }, + "main": "dist/color-thief.min.js", + "devDependencies": { + "@node-minify/core": "^4.0.5", + "@node-minify/uglify-es": "^4.0.5", + "cypress": "^3.2.0", + "http-server": "^0.11.1" + }, + "engines": { + "node": ">=10.15.3" } - ], - "scripts": { - "dev": "echo 'coming soon'", - "test": "./node_modules/.bin/cypress open" - }, - "main": "dist/color-thief.min.js", - "devDependencies": { - "cypress": "^3.2.0", - "grunt": "~1.0.1", - "grunt-contrib-connect": "^1.0.2", - "grunt-contrib-jshint": "^0.11.2", - "grunt-contrib-uglify": "~2.0.0", - "grunt-contrib-watch": "^1.0.0", - "grunt-jscs": "^1.8.0" - }, - "engines": { - "node": ">=10.15.3" - } } From e0ff746a2dd313791faf48b3342b12a99ebc6a79 Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sun, 28 Apr 2019 13:59:49 -0700 Subject: [PATCH 07/35] Switch to uglify-es for minification --- dist/color-thief.min.js | 7 ++++--- src/color-thief.js | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dist/color-thief.min.js b/dist/color-thief.min.js index 7cbd667..bbca77b 100644 --- a/dist/color-thief.min.js +++ b/dist/color-thief.min.js @@ -10,13 +10,14 @@ * * License * ------- - * Copyright 2011, 2015 Lokesh Dhakar + * Copyright Lokesh Dhakar * Released under the MIT license * https://raw.githubusercontent.com/lokesh/color-thief/master/LICENSE * * @license */ -var CanvasImage=function(a){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),document.body.appendChild(this.canvas),this.width=this.canvas.width=a.width,this.height=this.canvas.height=a.height,this.context.drawImage(a,0,0,this.width,this.height)};CanvasImage.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)},CanvasImage.prototype.update=function(a){this.context.putImageData(a,0,0)},CanvasImage.prototype.getPixelCount=function(){return this.width*this.height},CanvasImage.prototype.getImageData=function(){return this.context.getImageData(0,0,this.width,this.height)},CanvasImage.prototype.removeCanvas=function(){this.canvas.parentNode.removeChild(this.canvas)};var ColorThief=function(){};/*! +var CanvasImage=function(t){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),document.body.appendChild(this.canvas),this.width=this.canvas.width=t.width,this.height=this.canvas.height=t.height,this.context.drawImage(t,0,0,this.width,this.height)};CanvasImage.prototype.clear=function(){this.context.clearRect(0,0,this.width,this.height)},CanvasImage.prototype.update=function(t){this.context.putImageData(t,0,0)},CanvasImage.prototype.getPixelCount=function(){return this.width*this.height},CanvasImage.prototype.getImageData=function(){return this.context.getImageData(0,0,this.width,this.height)},CanvasImage.prototype.removeCanvas=function(){this.canvas.parentNode.removeChild(this.canvas)};var ColorThief=function(){}; +/*! * quantize.js Copyright 2008 Nick Rabinowitz. * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php * @license @@ -27,4 +28,4 @@ var CanvasImage=function(a){this.canvas=document.createElement("canvas"),this.co * Licensed under the BSD License: http://www.opensource.org/licenses/bsd-license.php * @license */ -if(ColorThief.prototype.getColor=function(a,b){var c=this.getPalette(a,5,b),d=c[0];return d},ColorThief.prototype.getPalette=function(a,b,c){"undefined"==typeof b&&(b=10),("undefined"==typeof c||c<1)&&(c=10);for(var d,e,f,g,h,i=new CanvasImage(a),j=i.getImageData(),k=j.data,l=i.getPixelCount(),m=[],n=0;n=125&&(e>250&&f>250&&g>250||m.push([e,f,g]));var o=MMCQ.quantize(m,b),p=o?o.palette():null;return i.removeCanvas(),p},!pv)var pv={map:function(a,b){var c={};return b?a.map(function(a,d){return c.index=d,b.call(c,a)}):a.slice()},naturalOrder:function(a,b){return ab?1:0},sum:function(a,b){var c={};return a.reduce(b?function(a,d,e){return c.index=e,a+b.call(c,d)}:function(a,b){return a+b},0)},max:function(a,b){return Math.max.apply(null,b?pv.map(a,b):a)}};var MMCQ=function(){function a(a,b,c){return(a<<2*i)+(b<>j,e=b[1]>>j,f=b[2]>>j,c=a(d,e,f),h[c]=(h[c]||0)+1}),h}function f(a,b){var d,e,f,g=1e6,h=0,i=1e6,k=0,l=1e6,m=0;return a.forEach(function(a){d=a[0]>>j,e=a[1]>>j,f=a[2]>>j,dh&&(h=d),ek&&(k=e),fm&&(m=f)}),new c(g,h,i,k,l,m,b)}function g(b,c){function d(a){var b,d,e,f,g,h=a+"1",j=a+"2",k=0;for(i=c[h];i<=c[j];i++)if(o[i]>n/2){for(e=c.copy(),f=c.copy(),b=i-c[h],d=c[j]-i,g=b<=d?Math.min(c[j]-1,~~(i+d/2)):Math.max(c[h],~~(i-1-b/2));!o[g];)g++;for(k=p[g];!k&&o[g-1];)k=p[--g];return e[j]=g,f[h]=e[j]+1,[e,f]}}if(c.count()){var e=c.r2-c.r1+1,f=c.g2-c.g1+1,g=c.b2-c.b1+1,h=pv.max([e,f,g]);if(1==c.count())return[c.copy()];var i,j,k,l,m,n=0,o=[],p=[];if(h==e)for(i=c.r1;i<=c.r2;i++){for(l=0,j=c.g1;j<=c.g2;j++)for(k=c.b1;k<=c.b2;k++)m=a(i,j,k),l+=b[m]||0;n+=l,o[i]=n}else if(h==f)for(i=c.g1;i<=c.g2;i++){for(l=0,j=c.r1;j<=c.r2;j++)for(k=c.b1;k<=c.b2;k++)m=a(j,i,k),l+=b[m]||0;n+=l,o[i]=n}else for(i=c.b1;i<=c.b2;i++){for(l=0,j=c.r1;j<=c.r2;j++)for(k=c.g1;k<=c.g2;k++)m=a(j,k,i),l+=b[m]||0;n+=l,o[i]=n}return o.forEach(function(a,b){p[b]=n-a}),d(h==e?"r":h==f?"g":"b")}}function h(a,c){function h(a,b){for(var c,d=1,e=0;e=b)return;if(e++>k)return}else a.push(c),e++}if(!a.length||c<2||c>256)return!1;var i=e(a),j=0;i.forEach(function(){j++});var m=f(a,i),n=new b(function(a,b){return pv.naturalOrder(a.count(),b.count())});n.push(m),h(n,l*c);for(var o=new b(function(a,b){return pv.naturalOrder(a.count()*a.volume(),b.count()*b.volume())});n.size();)o.push(n.pop());h(o,c-o.size());for(var p=new d;o.size();)p.push(o.pop());return p}var i=5,j=8-i,k=1e3,l=.75;return c.prototype={volume:function(a){var b=this;return b._volume&&!a||(b._volume=(b.r2-b.r1+1)*(b.g2-b.g1+1)*(b.b2-b.b1+1)),b._volume},count:function(b){var c=this,d=c.histo;if(!c._count_set||b){var e,f,g,h=0;for(e=c.r1;e<=c.r2;e++)for(f=c.g1;f<=c.g2;f++)for(g=c.b1;g<=c.b2;g++)index=a(e,f,g),h+=d[index]||0;c._count=h,c._count_set=!0}return c._count},copy:function(){var a=this;return new c(a.r1,a.r2,a.g1,a.g2,a.b1,a.b2,a.histo)},avg:function(b){var c=this,d=c.histo;if(!c._avg||b){var e,f,g,h,j,k=0,l=1<<8-i,m=0,n=0,o=0;for(f=c.r1;f<=c.r2;f++)for(g=c.g1;g<=c.g2;g++)for(h=c.b1;h<=c.b2;h++)j=a(f,g,h),e=d[j]||0,k+=e,m+=e*(f+.5)*l,n+=e*(g+.5)*l,o+=e*(h+.5)*l;k?c._avg=[~~(m/k),~~(n/k),~~(o/k)]:c._avg=[~~(l*(c.r1+c.r2+1)/2),~~(l*(c.g1+c.g2+1)/2),~~(l*(c.b1+c.b2+1)/2)]}return c._avg},contains:function(a){var b=this,c=a[0]>>j;return gval=a[1]>>j,bval=a[2]>>j,c>=b.r1&&c<=b.r2&&gval>=b.g1&&gval<=b.g2&&bval>=b.b1&&bval<=b.b2}},d.prototype={push:function(a){this.vboxes.push({vbox:a,color:a.avg()})},palette:function(){return this.vboxes.map(function(a){return a.color})},size:function(){return this.vboxes.size()},map:function(a){for(var b=this.vboxes,c=0;c251&&d[1]>251&&d[2]>251&&(a[c].color=[255,255,255])}},{quantize:h}}(); \ No newline at end of file +if(ColorThief.prototype.getColor=function(t,r){return this.getPalette(t,5,r)[0]},ColorThief.prototype.getPalette=function(t,r,n){(void 0===r||r<2||r>256)&&(r=10),(void 0===n||n<1)&&(n=10);for(var e,o,i,a,s=new CanvasImage(t),u=s.getImageData().data,h=s.getPixelCount(),c=[],f=0;f=125&&(o>250&&i>250&&a>250||c.push([o,i,a]));var v=MMCQ.quantize(c,r),p=v?v.palette():null;return s.removeCanvas(),p},ColorThief.prototype.getColorFromUrl=function(t,r,n){sourceImage=document.createElement("img");var e=this;sourceImage.addEventListener("load",function(){var o=e.getPalette(sourceImage,5,n)[0];r(o,t)}),sourceImage.src=t},ColorThief.prototype.getImageData=function(t,r){xhr=new XMLHttpRequest,xhr.open("GET",t,!0),xhr.responseType="arraybuffer",xhr.onload=function(t){if(200==this.status){uInt8Array=new Uint8Array(this.response),n=uInt8Array.length,binaryString=new Array(n);for(var n=0;nr?1:0},sum:function(t,r){var n={};return t.reduce(r?function(t,e,o){return n.index=o,t+r.call(n,e)}:function(t,r){return t+r},0)},max:function(t,r){return Math.max.apply(null,r?pv.map(t,r):t)}};var MMCQ=function(){var t=5,r=8-t,n=1e3,e=.75;function o(r,n,e){return(r<<2*t)+(n<f/2){for(o=r.copy(),i=r.copy(),a=(n=s-r[u])<=(e=r[h]-s)?Math.min(r[h]-1,~~(s+e/2)):Math.max(r[u],~~(s-1-n/2));!v[a];)a++;for(c=p[a];!c&&v[a-1];)c=p[--a];return o[h]=a,i[u]=o[h]+1,[o,i]}}}return a.prototype={volume:function(t){return this._volume&&!t||(this._volume=(this.r2-this.r1+1)*(this.g2-this.g1+1)*(this.b2-this.b1+1)),this._volume},count:function(t){var r=this.histo;if(!this._count_set||t){var n,e,i,a=0;for(n=this.r1;n<=this.r2;n++)for(e=this.g1;e<=this.g2;e++)for(i=this.b1;i<=this.b2;i++)a+=r[o(n,e,i)]||0;this._count=a,this._count_set=!0}return this._count},copy:function(){return new a(this.r1,this.r2,this.g1,this.g2,this.b1,this.b2,this.histo)},avg:function(r){var n=this.histo;if(!this._avg||r){var e,i,a,s,u=0,h=1<<8-t,c=0,f=0,v=0;for(i=this.r1;i<=this.r2;i++)for(a=this.g1;a<=this.g2;a++)for(s=this.b1;s<=this.b2;s++)u+=e=n[o(i,a,s)]||0,c+=e*(i+.5)*h,f+=e*(a+.5)*h,v+=e*(s+.5)*h;this._avg=u?[~~(c/u),~~(f/u),~~(v/u)]:[~~(h*(this.r1+this.r2+1)/2),~~(h*(this.g1+this.g2+1)/2),~~(h*(this.b1+this.b2+1)/2)]}return this._avg},contains:function(t){var n=t[0]>>r,e=t[1]>>r,o=t[2]>>r;return n>=this.r1&&n<=this.r2&&e>=this.g1&&e<=this.g2&&o>=this.b1&&o<=this.b2}},s.prototype={push:function(t){this.vboxes.push({vbox:t,color:t.avg()})},palette:function(){return this.vboxes.map(function(t){return t.color})},size:function(){return this.vboxes.size()},map:function(t){for(var r=this.vboxes,n=0;n251&&e[1]>251&&e[2]>251&&(t[n].color=[255,255,255])}},{quantize:function(h,c){if(!h.length||c<2||c>256)return!1;var f=function(n){var e,i,a,s,u=new Array(1<<3*t);return n.forEach(function(t){i=t[0]>>r,a=t[1]>>r,s=t[2]>>r,e=o(i,a,s),u[e]=(u[e]||0)+1}),u}(h);f.forEach(function(){});var v=function(t,n){var e,o,i,s=1e6,u=0,h=1e6,c=0,f=1e6,v=0;return t.forEach(function(t){e=t[0]>>r,o=t[1]>>r,i=t[2]>>r,eu&&(u=e),oc&&(c=o),iv&&(v=i)}),new a(s,u,h,c,f,v,n)}(h,f),p=new i(function(t,r){return pv.naturalOrder(t.count(),r.count())});function g(t,r){for(var e,o=1,i=0;i=r)return;if(i++>n)return}else t.push(e),i++}p.push(v),g(p,e*c);for(var l=new i(function(t,r){return pv.naturalOrder(t.count()*t.volume(),r.count()*r.volume())});p.size();)l.push(p.pop());g(l,c-l.size());for(var m=new s;l.size();)m.push(l.pop());return m}}}(); \ No newline at end of file diff --git a/src/color-thief.js b/src/color-thief.js index f4ed41a..d5bc5da 100644 --- a/src/color-thief.js +++ b/src/color-thief.js @@ -10,7 +10,7 @@ * * License * ------- - * Copyright 2011, 2015 Lokesh Dhakar + * Copyright Lokesh Dhakar * Released under the MIT license * https://raw.githubusercontent.com/lokesh/color-thief/master/LICENSE * @@ -179,7 +179,7 @@ ColorThief.prototype.getColorAsync = function(imageUrl, callback, quality) { var dominantColor = palette[0]; callback(dominantColor, this); }); - sourceImage.src = imageData; + sourceImage.src = imageData; }); }; From b94c175a7a895b28d4c2997f0e733c754de44c40 Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sun, 28 Apr 2019 14:05:23 -0700 Subject: [PATCH 08/35] Move deploy notes to contributing.md --- CONTRIBUTING.md | 6 ++++++ DEPLOY.md | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..2585dc5 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,6 @@ +## How to make a release and deploy + +- Update version number in `src/color-thief.js` and `package.json` +- Run `npm run build` +- Push to Github repo +- Create a new Github release along with tag. Naming convention for both ```v2.8.1``` diff --git a/DEPLOY.md b/DEPLOY.md index 5a1bf4f..2585dc5 100644 --- a/DEPLOY.md +++ b/DEPLOY.md @@ -1,6 +1,6 @@ ## How to make a release and deploy - Update version number in `src/color-thief.js` and `package.json` -- Run `grunt build` +- Run `npm run build` - Push to Github repo - Create a new Github release along with tag. Naming convention for both ```v2.8.1``` From e2db15e67ac83ea69681c46d0c7623e842bc660d Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sun, 28 Apr 2019 14:05:38 -0700 Subject: [PATCH 09/35] remove DEPLOY.md --- DEPLOY.md | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 DEPLOY.md diff --git a/DEPLOY.md b/DEPLOY.md deleted file mode 100644 index 2585dc5..0000000 --- a/DEPLOY.md +++ /dev/null @@ -1,6 +0,0 @@ -## How to make a release and deploy - -- Update version number in `src/color-thief.js` and `package.json` -- Run `npm run build` -- Push to Github repo -- Create a new Github release along with tag. Naming convention for both ```v2.8.1``` From 7fb3680a924c52eb0ffecec88e7e95f5071359c3 Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sun, 28 Apr 2019 14:07:30 -0700 Subject: [PATCH 10/35] Remove unused lint config files --- .jscsrc | 75 ------------------------------------------------------- .jshintrc | 35 -------------------------- 2 files changed, 110 deletions(-) delete mode 100644 .jscsrc delete mode 100644 .jshintrc diff --git a/.jscsrc b/.jscsrc deleted file mode 100644 index b1ee028..0000000 --- a/.jscsrc +++ /dev/null @@ -1,75 +0,0 @@ -{ - "requireSpaceAfterLineComment": true, - "requireSpaceAfterKeywords": [ - "do", - "for", - "if", - "else", - "switch", - "case", - "try", - "catch", - "void", - "while", - "with", - "return", - "typeof" - ], - "requireSpaceBeforeBlockStatements": true, - "requireParenthesesAroundIIFE": true, - "requireSpacesInConditionalExpression": true, - "disallowMultipleVarDecl": true, - "requireBlocksOnNewline": true, - "disallowEmptyBlocks": true, - "disallowSpacesInsideParentheses": true, - "disallowSpaceAfterObjectKeys": true, - "requireSpaceBeforeObjectValues": true, - "requireCommaBeforeLineBreak": true, - "requireOperatorBeforeLineBreak": [ - "?", - "=", - "+", - "-", - "/", - "*", - "==", - "===", - "!=", - "!==", - ">", - ">=", - "<", - "<=" - ], - "disallowSpaceAfterPrefixUnaryOperators": ["++", "--", "+", "-", "~", "!"], - "disallowSpaceBeforePostfixUnaryOperators": ["++", "--"], - "requireSpaceBeforeBinaryOperators": [ - "=", - "+", - "-", - "/", - "*", - "==", - "===", - "!=", - "!==" - ], - "requireSpaceAfterBinaryOperators": [ - "=", - ",", - "+", - "-", - "/", - "*", - "==", - "===", - "!=", - "!==" - ], - "disallowMixedSpacesAndTabs" : true, - "disallowTrailingWhitespace": true, - "disallowTrailingComma": true, - "requireLineFeedAtFileEnd": true, - "requireCapitalizedConstructors": true -} - diff --git a/.jshintrc b/.jshintrc deleted file mode 100644 index 1bc8f85..0000000 --- a/.jshintrc +++ /dev/null @@ -1,35 +0,0 @@ -{ - "bitwise":true, - "browser":true, - "camelcase":true, - "curly":true, - "eqeqeq":true, - "forin":true, - "freeze":true, - "indent":2, - "latedef":true, - "maxdepth": 6, - "maxparams": 6, - "maxstatements": 50, - "newcap": true, - "noarg":true, - "noempty":true, - "nonbsp":true, - "nonew":true, - "quotmark":"single", - "trailing":true, - "undef":true, - "unused":"vars", - "immed":true, - "browser": true, - "jquery":true, - "predef": [ - "alert", - "confirm", - "console", - "escape", - "define", - "module", - "require" - ] -} From 5fbe83db15903e7d1a37c32b8ea90034657288d6 Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sun, 28 Apr 2019 14:07:39 -0700 Subject: [PATCH 11/35] Discontinue support for Bower --- bower.json | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 bower.json diff --git a/bower.json b/bower.json deleted file mode 100644 index a69040e..0000000 --- a/bower.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "name": "color-thief", - "homepage": "http://lokeshdhakar.com/projects/color-thief/", - "authors": [ - "Lokesh Dhakar" - ], - "description": "Grab the dominant color or color palette from an image.", - "main": "src/color-thief.js", - "keywords": [ - "color", - "palette", - "sampling", - "image", - "picture", - "photo", - "canvas" - ], - "license": "MIT", - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "test", - "tests" - ] -} From 42da5347b2757f348f460e315447f408e08aae9a Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sun, 28 Apr 2019 14:07:51 -0700 Subject: [PATCH 12/35] Fix color-thief version. Accidentally bumped prev --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7dfff22..f9fc5f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "color-thief", - "version": "2.0.2", + "version": "2.0.1", "author": { "name": "Lokesh Dhakar", "email": "lokesh.dhakar@gmail.com", From f63d533d656fb4c48662ca3b518693f208465803 Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sun, 28 Apr 2019 19:36:28 -0700 Subject: [PATCH 13/35] Add more example images for testing --- examples/img/black.png | Bin 0 -> 3682 bytes examples/img/{photo1.jpg => image-1.jpg} | Bin examples/img/{photo3.jpg => image-3.jpg} | Bin examples/img/{photo2.jpg => image2.jpg} | Bin examples/img/rainbow-horizontal.png | Bin 0 -> 141597 bytes examples/img/rainbow-vertical.png | Bin 0 -> 141597 bytes examples/img/red.png | Bin 0 -> 3681 bytes examples/img/transparent.png | Bin 0 -> 2886 bytes examples/img/white.png | Bin 0 -> 3678 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 examples/img/black.png rename examples/img/{photo1.jpg => image-1.jpg} (100%) rename examples/img/{photo3.jpg => image-3.jpg} (100%) rename examples/img/{photo2.jpg => image2.jpg} (100%) create mode 100644 examples/img/rainbow-horizontal.png create mode 100644 examples/img/rainbow-vertical.png create mode 100644 examples/img/red.png create mode 100644 examples/img/transparent.png create mode 100644 examples/img/white.png diff --git a/examples/img/black.png b/examples/img/black.png new file mode 100644 index 0000000000000000000000000000000000000000..5b01c5f353e6bb8bb1525241ea52c827dc46053e GIT binary patch literal 3682 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prw85sCvJY5_^ zDj45h-N@VEz{BGB`R{igmirCnaw?nlr=(=gpIQ0;zIy`$BNIy)Q~K9i$xJL90tyAJ zEJrj26dW2HgajrWNpk_oGd*Gh$~Y)+a(E;eD>(p#7z>#}iYKtJsBDxJ1gdUm*a0+$ zL%@THY0`}zkZK2qJ0PPuR2UgObKF3x6%_KowoPhiP%%>msTL402bsp?>EIwVTM(q0 zqeB{K8bhOsf>rZ^IZS{ literal 0 HcmV?d00001 diff --git a/examples/img/photo1.jpg b/examples/img/image-1.jpg similarity index 100% rename from examples/img/photo1.jpg rename to examples/img/image-1.jpg diff --git a/examples/img/photo3.jpg b/examples/img/image-3.jpg similarity index 100% rename from examples/img/photo3.jpg rename to examples/img/image-3.jpg diff --git a/examples/img/photo2.jpg b/examples/img/image2.jpg similarity index 100% rename from examples/img/photo2.jpg rename to examples/img/image2.jpg diff --git a/examples/img/rainbow-horizontal.png b/examples/img/rainbow-horizontal.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd9196863cfb0aa5325ea6be318ec52a305881e GIT binary patch literal 141597 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

&$)9*c#)?-R>DBHy1#g5-8-%PH@ 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 TKmSqS*Rip1xKwlTX5wD}cM(}@ literal 0 HcmV?d00001 diff --git a/examples/img/rainbow-vertical.png b/examples/img/rainbow-vertical.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd9196863cfb0aa5325ea6be318ec52a305881e GIT binary patch literal 141597 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

&$)9*c#)?-R>DBHy1#g5-8-%PH@ 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 TKmSqS*Rip1xKwlTX5wD}cM(}@ literal 0 HcmV?d00001 diff --git a/examples/img/red.png b/examples/img/red.png new file mode 100644 index 0000000000000000000000000000000000000000..fd802362d8734a819b7260f43a77581a427673a6 GIT binary patch literal 3681 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prw85sDaJzX3_ zDj45h-N?zHD8lNv_5Zxk4NT_q9y`Sw)!f*5e8>KN21X_pjz64h_CJpkR&Z!wXjE5F z&}#&VPHJdSF;fQ03J3_817#SQJRKZ_W($HeaCAt66{{#Hbe`=1sb)FCD*zO75E7Vh zB+Uh+n&}Z62T(|Xlfxs)SP5hRV<9upG=&K)EGio%1%av?8g_t86YyYSnslQFq}svZ z4#+eP6-GwS95;|^1%*72X`{{=4V}@nGn%tT%bn3ud9;!ktwKi|7{IpLX!C2daXQ*o k9_>khdQPPEvmP)A=(5Vq-l4$)>@zZWy85}Sb4q9e0I96=>Hq)$ literal 0 HcmV?d00001 diff --git a/examples/img/transparent.png b/examples/img/transparent.png new file mode 100644 index 0000000000000000000000000000000000000000..94f4607cf0d9a848b76a381b76671c2872157251 GIT binary patch literal 2886 zcmeAS@N?(olHy`uVBq!ia0y~yV4MKL9Be?5hW%z|fD~hKkh>GZx^prw85p=3JY5_^ zDj45hXaveI9A5AjHZOqTripoMsvYvE*Q-Pqq$%- f7Yv(R@IYSTm^cID!}GZx^prw85sB^JY5_^ zDj45hJ;=)-Aj0bS<-YME=4!e0|3;N3&(+@lz#*XE&~RY+fnR^#TQf4Ta0pZ|F(q*T zX@v|=q^bi05 literal 0 HcmV?d00001 From 43d8a74e6d3284d4696d1f720a1f42cfdf373b26 Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sun, 28 Apr 2019 21:10:58 -0700 Subject: [PATCH 14/35] wip tests: api spec stub, add test image --- cypress/integration/api_spec.js | 12 ++++++++++++ cypress/integration/sample_spec.js | 7 ------- examples/img/rainbow-horizontal.png | Bin 141597 -> 42879 bytes 3 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 cypress/integration/api_spec.js delete mode 100644 cypress/integration/sample_spec.js diff --git a/cypress/integration/api_spec.js b/cypress/integration/api_spec.js new file mode 100644 index 0000000..688b447 --- /dev/null +++ b/cypress/integration/api_spec.js @@ -0,0 +1,12 @@ +describe('API', function() { + beforeEach(function() { + cy.visit('http://localhost:8080'); + }) + + it('Does not do much!', function() { + // console.log(colorThief); + expect(true).to.equal(true); + // cy.get('.nav__item').contains('Blog').click(); + // cy.url().should('contain', 'blog'); + }) +}) diff --git a/cypress/integration/sample_spec.js b/cypress/integration/sample_spec.js deleted file mode 100644 index f59dc91..0000000 --- a/cypress/integration/sample_spec.js +++ /dev/null @@ -1,7 +0,0 @@ -describe('My First Test', function() { - it('Does not do much!', function() { - cy.visit('https://lokeshdhakar.com'); - cy.get('.nav__item').contains('Blog').click(); - cy.url().should('contain', 'blog'); - }) -}) \ No newline at end of file diff --git a/examples/img/rainbow-horizontal.png b/examples/img/rainbow-horizontal.png index cfd9196863cfb0aa5325ea6be318ec52a305881e..90dfdee9cc515bb1ef32801e0ad08190445f71be 100644 GIT binary patch literal 42879 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

&$)9*c#)?-R>DBHy1#g5-8-%PH@ zZ01?slsW{{7sc9>TaP*jgCOfrOjh@m6-RmH*uf|SKhc$CLtu6kR}-;{wR)4UP@A0928AUO)q}@XsVNys!YUb<%j8RazG>Se zdgwOVUrQjpR~{wFcbyPGS>wCvkt<|lbw<5`yD*sxeqi1_q!8K4VSL9Gk`;Vb-0tEx zP5aVFpCDFJs%)Zy+3#Dw+)7UZ^G8jjrXSrp0H~{SDX*j^^Pz$vmJX4b3LKbj0W+=>Nk&1O4RR^@PSlA?$xb* zdsQF>;=7S!2Ad}@yd7ycd(drz&J6Tn#70%+QiGzGHWu@@w|Jkwlw-fLkO@Q`Lg~h2 zt|#dIXcfkj>L%7GF{rb9arrw`MAJvAq)yGsps22QDnB|+_*WK&F+ugb^--G;^$FL@ zVq`XChLo0HrtO!}7q4R4gT&dAk8I&(%O+qAsb=|C<{k0$j)O<7f0rug+@Mi`t{0xK zdBK-#xfDCA0cevCsUYe{DmXsP6MCypZ<}-yz*JxzjznAOFe#fmB@%rT;f3{~3%DfV z4I4+%^k=xG`uy*f)zSUQq-$%Kb-lec8VBkEv4CWc{0-^ogg$U_A}$GdLhriJZ{DWx zx_}$@2kU!n|A5FG=ok$^%1%~d1zHvD4kyQ&TE_-B&(D>TKVq#7K?>4@E?3&dbU1wR zXQW$GaX!0@3^R>+E6n@t#SvQVwC0re&kBCW>zk6$plhS!qjmw;^S2bFRd)w^)d0!& zn=H{v8h$j1WRi|Y(uORNei_Hxv8XC7w&i43;!1ZbbKYw3DZL$r^DlW0enrC%2ZPi= zPIO(pejf8t-RGW!hKWBS`b{Ehew~yH17uGB9%A>Rk1~wXHC383E;UyCn8X48~Ji15I>9dm^Kq zq`3@mhh{O4IPUZ^O3vR}b}^9M>kI4QX#HTA$fb-kX9?Juzyfz(o8Y{Uf5f#eVEUq< ziOb@aj1kysx&;K9usW-l10f&t0w%UC$95)`^W+O(aspF3mEyRk<9BOQzQrB$eun}wO zSVMO={XD%BoX^@Ezd~J%H0QVv9{C93JW4lw6bomc%pBpf{&-<_!!0EK9ezR~& zBJouE(ma0o?e#;e9R4HF?dE$3G^V zyJ}2zn3u|{mOlrO8H$j;#)&DygmGhf8NEJJ6*q$*v8ITFJ4wdG`h^(~m4AFzw}hvT zD}0%)-x(1E9JwTLv_=&y^%`Qv7b|D8#{KJfGsgUvI)?B=5O6V-dX)Fow2U8>bpDemv3DdUW0bUu0atniszQ>g3H#i-m0zw27~D zqF;CofjZZ@Ie=`vpntq8IHYv>nc?FAzZtE$ju;UhJG#8<*Z;@Yo1^mk!usgLJe%15 zkFSr=rT|hlRXBtB`8{OU^|u7a!U+}ahCzlBL)Xg>`kmy0wOcJ&MV>0iuSK!B$_7p~#xXQvzX(kM;VEyr*=rUcO`J?8@CCA4WJYegt8*ENV*5yYnD6Z@5Tl`fgH06(VrR7+JH4Ag zn=|TsAWJjD%wjxICG_PgiqyQbIHHxzJZ2Tpt#aQEFWhpmaq)@5S$1a@Kyl4nwEkUN z%rl&LHeck(U^6(4`Rj1m26W0eswTeF+dj?uE_{S3)b@NQCC0;5Y8&riHbQkHT#1gB zb6)M`NM_frGjw21p%oRivrkpVHz7Ea7&Oy%^`$u^Lw7Y8rVgK|kM>0>O&ODek_UR@ zGN<}DP4D5Az&PpTi$eGjk28y|NzA4F_jQ_}BN#Ryw9 z;IIzqi)KVTm~Vg4sqt_fFJUxDD7-wO{2L_1wo~f?=UhynFf6z?1+_FN`;(3>x<4}j zuaO4XCzBg4cVO*#zmdK04}@JZT`44}h{{K`k126FMv>>fU}~vs1Cr04bZ|qUdLVDT z$_JolM8EvWtPWR$Dg1S*iC<9)fMKNiY_+u~Xsa0lPxw20(I4SWpbNZMHC6gcMe)hV z_#08GT_qqg=_EUuzDRvV_>+JIg%h=9bwyQud|<|Y(Tx~{Lk2d}T<=Q0^C%K7@`wTb z9=&v;Tpdfr!-Ff%^GR{sa(eS0>sIGy{(g^WSkw=)WPRpo1$AlZ3U_!=|*#$s&SeBi(myI_vzu)cttn0q7dv zDfzoF)vm!BW-Aq*_esd;y?JUihxqB2zqfZ|Un|U1*O#!#E_@y1st5eCepdbUTHcz1r1~5rxTa ze-#$l@|rd6H&@|Ot-(ezF0U7VyNjvCcZFo5QTNp38`~t-ji?Nxmu?Z1shDsHus7Tv zQ#C#L2Bxrj5whwmet!9-!5sUXBf{W`XRx9-02AQk7`^Y0GWkc{!(B5(x+XbZZ`PPv z{qEZ#gf0^uEV)0|e)+xd|5$hLKkGiw_-Eb1M{CzwEP&!j&ggL;n5A(~x)T7ta~!zZ zx+dTQd-5?)>LhB{9b#F1X;gq_@oa-QmB8FlY@n$7v8CsTO_SrePK8RfCH0m&IvoSb zKFSjea@{2!XT4^wdMhlt*9yZ3$0IrQER%8I;`=+u@-7#;{Ko2o&xmb~$1_2yG-r$N z?TNlzD|+N>kpzc*ceq+x3q%shW6sS(7Jm>}+(B@>uozJ?C&9@YSA~tfO|4JG;;eE< zOH)`4IJvb$Mp##IKF_!*P~I~tO#gHV>bu!e7k9xljknQd99wA-Js21XZQ##-I z!Zpoc98+IHh0K32>X&{J^kQK=D%JxDdgQBlre=9qg;EwCJm2w)!(PLiM?OIVEQ{tw zsNQyNDkV6c#f<_~dR>?p`rM+0;J<%iFJhU>Kge%2D#ZU?rgV~zg9`lmHzC-M=six5 z#4bQ_yeUg68=PYBEiymHg+-1KNTg{Ys1@*bri00J$ zomD-J%iNh^+09&~eJyUGYHJvmrGVOl(>Iumo%DKIT3Akd3Y5o)51su-j=%P20K>w0 z7Zy{J#_@)4Bn!KS{|C$Djc>0E!_#11&yg3w+%Z_WX1xrOLS}0reCK|qF4!#8ae5eouTvvSst9Inbs|c0G67w#$Q~7l)F++ouYGrMqXQZaY~yMzWkWE#Q=N z-hkEC`nZFC+_zJR`>dGc`*}TayYWeVymKsdW`r?pp&{<@`tyFF&C3XXRNDAneJUwV zr51H${8w4DqlbJKO0XnMUC(_%oWiZ1B@}H#*azk(q0w2djmsY3lWEiP^c9vBs!@@l z_3qHuTa|LMQHdIx79wvUsidOT$(EC%?YFyl^J`zVsWFdz{19!Y|#EkW%(hX&3d@);wRJ>;HEBMNHYjY3SRZy5-n7fLdB zQyHBD70w=c22MZb3=cuzamJ2>X-A|#UIIsN+wDmUHmTu%2ZE-KRR(rIBIt* z!HO<^{>XdkJe}S^OW6Jpcv?(*lU08`?Z9T$!r_Fb_RXJEbNU_mx%+HvQfDs@9!72_ z1Wz~kznEk=UKLikWqlFp^`5|60=xJ|nvOdRpKsqs32NT-%c<%C7 zC_(mQ+VH%62K$0jNW*JfxBJul9s7f$W(}GXjD^+W{Ur#B#J{kD)qweW(bW+Mg+MET zJAP}2K+tdB7Wp7D&3b;Ti_>=h4Qal!XYTkWxVt}bZ>rYjcS36*Y$`<3r!Ztp^kC1e z-g^1nJhHRt+%t8Zz!sw6R~!IyGl^syY&1T)J#4y6I_`iqgCloH85F4W9g&YHolW9J z;X#X@hH%vZ{e;^H;m1ib#cug+G#1a#o^?@YA0&FO%TUx*y_ugm4m3n?4dU$_?POhH1d6bVBpXyoPd z+D6=~D$9^RQ}f9`e7uF2;e?s>^O)-+7phk=!3U+4Yo=FMnqG$XtL0xAjvnS5ZR>vt;21#kaoaX<9~^6t5BO zIvDnL^+kYBqeOR`Clbw)rUF=(lL0O0thRGo>xLF-Q;^r%t08}dI`Iic22Du6u%CIR zY=IvdTNhyp|LtB2{bt0g{m+;yaOr1gYCK8d8-`(G;_E9n0ZNr?XAqJ$_kS_-%IN^z zz43~I7aC(nDS>sHAjnxhsJfk!7kcq;X&&A@xJl6O{j&eVKh<~k%hnhql}Z5ijN_+} z7W~~oey*oQaQF6+=}KDy1s}g}g+~F5Nw2-!g^P@gW}XdSS`{X5xrQTIAcPSB_UfyQ zgbO(>tQ+RaXSW=a&14Y`ko%-XUp}%h%%()J3w=52jdIapiWZBj70vs#8G{$8JT^n2 zKf44T_xXAs^6goC8NtN`z`o zVo$3MRQdRX8j0Yrk{I#9@jRWmJizZmZB_1($MCWm;mdH(2BCjB*hl4em#-zSaRcx2S^*@XWY?%h+*yl6C>aK{ zvg%4*_bj6xQE}!ZrOMw4I;Gywsq0DdSyi(<*c%B>Q?z!d?nTPiVT^G*9M7KZUV0BO z&2C9}&7k&BNPxh0J|3;RTq--bZzIEZbPR+)jYN6Pe*?$zyf=_Wq7M z;XUPHgB_)aIqaE^DDed*Dr8Y+Md`r~J1!X*urNN~&LxhS^@KJ@A0v_vyEcu>FZ zv>_aR9uw|Ak;dAxoeOzBAx`T{ikRu#R+^l=EDQPOeDbYT_dolIsn?rc5RG6C<#aSO zKC!gxFmyG$Kk`*YWJyio!-+s1&I2vZaeb_maP#Kg4MOC7!64^{i~V+K*-|Eyh-0&RMemSM-&`85g=TBmHpd3eif|u51Wg__ZE5FK^ zR}LwOKe~0of-Z_9=Tc)_8 zJs}ZclCj;OXSWU_3`llAq+NdJhFa`(yINA5OBf`SCyEoQx0k-te%@^6Pv>9WnPD1N z^VVd_!R_{`F$0}WEt?&mKy60vEz*%r?i2+a;9w*Wb@dcl$nCIRueI?jr}^2Yp%eqW@>V4UU)3Lh!d) zU^v>j$hXefZ7``FYpS&Vx&hqxz4}XKv(b!GG&^Eqyt%L9Xe<<*#E{kh z=JTl>0Gfdj>=PvnPTGwF*M-4{QJ=83y`q&c{I51TOpEh)@8BEP;?~EV5$KcBx;oOz z9{~GWerO+HJOuEBQXU(<54~eo{lCGoM+2?N&P%< zH#0wSr03t|zyTMY>!Ks|fpW)Gvv17mC-fr8T3~_cd3ctuN3NsKQJ^ISom76jjP<>FF}l{ORh!f(o$p|c4d_qP+wk6cIaMW1BO{^@VH(uMi*ap6PEbj)~y>k$S^ z-%h>xktFN=OjU3VmTx)@NEZOZs2jzaDAY>x<0a=CxBaT^xqb(Whdd08Q&lV`*kU4e zBj~YpmfC>=qB8>6wAmznr4(iVXYC#qHSW1H(|2kd{|Lub>yGq z;{5xBh6_WK8g1#&Txs7A>OW#St4Xqb0D-kLLa3flMQr_2TNzVlkU8=Kgtj|Q2uJ;5 z_jR{0Im@2!(3sW$5#ONJ1!QGB0)bX(R;RlgA_FtGbyCBqhoBcf`rJL+dE`C22ZrAM z`mEy`H|YH=yZ>iV6sze^woOd|M9blWgfa+5MM1iM-%+xs^KeiOo2tp^Flb;*KKzk) zTYh<}$Zd7fsXC2DpXkT!)D7KvgfC?(d)f?YN-4W&<^O5r`S?VX=)heeom3J7BSeuRq#ZYAj`Xni~QW z4p@^^`Ehzq_lVQ_3N5RxG>Q#;t~+mhIH<|bdk?;}PQ+C2>?bTYZn!^nOYQJ&Yv@D5 z-le4~i3mZqoj&eyaqwPsS!Yxt?euw5+Lh#f{LwYx))3Q~DW z$^%mM2XM(6x|4zFHBRo?(b#k<#VdsP=+X?~NxjM&w=}w2&b1Z}IhH||E}Dcn&>bmh z)xxV12ZNrcSc0whcmKtAKZO4vh@`3M(- zkTr89%kP_^Xaw5tQ)O-W;!k=b^B%hS{}^sX`YxzBKR_|s+^5}`DmrpcMi9#k^!$>J zK%Mpnh@Jk9?(871+}3yR+rM(L`p}}84bF?0`j6pW8p-0Y)wxuE_&*V8_SvQfI-=A0 z%x{0JRQ^>g<9fum@~S8n=r_Gi>H=Y&`R-$@hkOkRGu_NDz2rgW8=Crx8Ak`7c|xo8 zYG z$^R8x?PvA3HX4L&NHX3=Hx#AhJ`s=smu~NG?xp-)wEqv{R{6WIer_RMgmvc6<*SDd zYxO^`P(ry9?)D^xw|#8}ihtd1;p}Ihw9y9J3TjmUgIrBx4&98h@W`<=V>g~TS7cK7f~ zxVbgM%d@=#lV6SG>rTPwDEIpJ)snwB?vba9J%sAH%GP#**T+d%XP$|3#gt)(d0twQB->SH-uK zw=}uYmkKK7Xt_OE(6+6MuUhNN6QVALV=W8L`<3~hhdq41 zWjCAqk?Q|7;HE6@3h@y0_DS0ZI}rceMAKI?nV3~P_*&O7G(v0p5R`cGXxdWw8SyYi zmOwp(b|e=ya0Hi29ecGm9u*byAG(7S60JDz-m;W11CtM$t!#PhAXfH+niDm(yT+Ko zLzXMplM?mk^yJ}?+-+Y-*X;)o#O;L(u!xaZRRijEgEW3$`>NsKc! zso}zECCkyPx$2luD6@yg5-Tp96IZ>wIfGMCZFC0PX)g|f|E6tB(Wmh*3VHtdjdN~m zG~N%L_KP073IDsG0UE3{e*C1GW1-pL_qkK}je|>pUMrxDS4u+Bs6Xm_LMT!Kh9XeYmMOBWhEML%Xez>SK`la?|)er2Y`G0f8sUq7sV2vW?2bdij^V;bm9y8bEnGeHaR@1ZN1s%~bP1jH`s?SdY%g8{ppB5@ zoW_V1K#AW*`sGi6ux6Ha<%xbU`3_K-TVJ^0XVg@a4zg1Uw8};YIsEZyXx@qvuvHz3JHC_&5&>u`6E%P z7#be(Rh4v=T0LP4tUlr!_N~Tu^K|1!|6aju(ZXBT4#*U!t%mh$tv*U(j?86A@s7zJ7EF#~@d=Re0w9XByM^?YxEkqFAw9+nT1|l`cgb1xlr}&{u={t{L*Z2Pm1={%N>LEm(bS5+@6;}#9Cu< z5!j}$&~Ukut9us3W5_>$Y#TjNN~i7yvIH0Of#AXn^jRE7{hd#C{o;w)MlPt2KFNg3 zJBbHm`q}rd8n-eLLt|epp6{hl(OtIOo2*)cs{@1tg&@nWoU7hZZ+#(QK5{A~6;~<^ z_4c+`-yWqfACqN^=T#2Dmu&;Uj`saqx-&e#jYn{I1}AO@KPsh}-+}QezY5W8U%#fo zF>%y?3*{A$U8lbn*lV=*mA>QN)op9&DMdMK7|ch0rZZ6eMtcqs#71-`l6DXmslL6P zb*rmhp*~Z!nPJkN2%bPzx(8<`x?;7>j1EIhymDHVCO7%=Efjm6{Fc(MkX12wqLIby zZFSyF`=`Pji|1 zwl324+cPSzMMA*nhEgQcdY&R!Vk~nUPZ&`lUYtzZ%<_9U5MHr{4akh#r0_nzPqa@7 z0sAS3UV#FC+s~+dSRBZTxx6g~Kc5N>nh$w@P@Kfx@XEmP zK~{?R>_Me?&jmAf;L$x{ZEJk|b;GsOjBcb4lVCQOb8j)XFc_m#c`Wo}Z1Ta$?(1Hd z%-cr?{n?s>`-z0XQbH;clhcNfl!)zO6;9cWu~ga%lg6CC(ea}>oM1|=PgLa)z4LJp z^SIC4EtuRvy~n}+c3pgR>sN6o-}kgRr|1ONO_yxO)c{IbUF%MfW?8EeY6`xdSx$PF z&rQx@AAHyzqf%sZLjN;a+s`=dr^ZFZ+TCVCSe3bgg=NmaZjES$>yGza{R=5eg%|Kl z2Sg!9_~G2!ldpA)0lfUy&i^`+64q@ze>+94%4 zg}UO=LdF`r>t>c}!%6(b!8aLea+8LtvekEZGmpX;_;NkPSHlIAhZ$DLe??Em1T28~`4mjlWUi~iYBGj!}0?|nR`8%tv z(nr>q>&fcRv~Ae?!=6syr^&j3>ud0N_Fql8jRATQk!@3z9Yf>UK#}vKGq!8F?{ZHs z>99$f_RW(DR&xd1_~`DRt|i|oA(~0(+68l_K>hKfmf$^RbwhzK?R-*ZVH(AZA=}z1 z+X#5mSpO`IivmAmTYr+u&F-3)&yZPp$(@j&cw{y;?ti?hM|UpHBP9r`{o&EYvaCJ2#Er1wX^KHV!6TXtg%B-#ab3R&X|drK=hZ#j?I zTA3pcjlN>lq@WC^j_{;j?{<m`4sq+^PGi z%K8+&7gD&js7M#i$7iY~qU%n$QM zUZc4llpx%xx0px0e(=+#Hg@9(>$`LL%M?P#nGf`J$f5Ta1!n7+ z`5KVAQjd}}WTNr(sUTjLHnjwE$cdmjw2lioLxw6R3~fm{I`D&ED+Kh)JXB|e)yvn` z>E8HPe^E(SraxL{8U+A=sLIaYeiO^~Ryed z7@Ya-83#;qYMykIs{ZFh(XK!X{)c|gdWKGL2+_rhHlv0R8h7fs_$h?YwrCh5y zPr5USYq~wMX+wJVyhBpvx#|oywZC?}+>z4U>Ru3t7Ma73yp3DRPym$;H?Bvp0_TqE z2eBKK;+D>$YU*nZG>{w`lac?2z59M^x?8kGPm!WjMLH5YfTCu?aE(k(^t{q2oZd%IjCBzkkqqKbo$M zB3$ebq>GtP(?0i|b=Zb`f1hBTrHbt0&4zqChEsR_l0>%TK&VH@g)0WkNB2FTqnCjv z9~&eSZyeiA79ALCSt`Zf^ng}A)H7(I|1}EvETmae`nrmF?6Tm#Q8^Qpn9J4+^zD^T zl6=XXkv3A|suz zCKcl8XpuZ>>a%@5flsEh@a_FaBLn99h9J4&^nA%u6WskP!XElBw{4IBEg!&ivO4jP z9}?mN-Nmn_->8RRhnD*>H!gkx3aVvVDPxbAxJEIdmf)LyYmnN_g)T%5nlpk zo-Hggl#k?&v=gn`PPec-Qto%3xT#jMoEmu(!R&|gxSe-H>C?5}z&aBFX*cxb=C^;kKCq6tgcBxi=O~RZ1!^{fjhl&scE`%47tR zw0a-DK4uvhWhSEpGiBO2mLFT!Wt{Akdm-HDCN)gH<^NY`!i>50>0XP>xlyB0aCct%H;}4`r`gkSZeZ5YT|SH?iT^@#^aLU z5yR`hozU0djwRc-mn^fiXruX+2qEjn9lAQg0be;yM^E1vH(>quOx7kzJ)oxx(TsqT z-2ElTC5UdC{w4&IGy|z9!9BhoV09$<>78OL)to1DaF)nO^w=;-gm$_5AS@q)?z-=A z{1p;Xw(GZ7No931T3J$AwE%v4hj}28qYOtfo|aa|i@$R-GGVp$Nxc18P~ z@3aD$c&-*#NpTLcw~~5+crEy~H9CQJK$UhziJrq4hxGi>&f6HII%Nl_?_MoUS?PnIOSQ!oe1Hzq%0O!END>>am;S$J}{rafhs~i1E zu$2#9qF!rNB+5$>V3RKn*fPm6L>2 z?VKPMa8t{@0uhnjL$k@C2k0nz%ik*xuHEny(Mp>M+d}Xt($U`V=Dc&bgc^2~US)8F z8R+@qTZ{nQoc`Gnt*E18`e6{nJ*+eWce>{q91lCe_qB4*E@MlV-P|+!lRL4*muSM^ z3V|Ulmnt{87#QASH>puIha**uY&Jk<{Pk?9uml_G>aJoc{kWEf(xuli6MnEuxHY67 z91Hqq_{6qScan;B3~q?!+%5h4Wk{{WblYGKtzJxQT4 zm6Ff}SCxppIFKV)ynw@|kS||cmXvMyh+*_&!>@t>?GA<=S=gwr*1f0!o;TN0zROmE z=}NtM(+3Pfx_}5wnt#Bo!qQ=3F^>(7(qnw_5&2Me1ftjCRgTN#X0zw=Ei|^j+5K`jy^$um)y9! z!LqdD+z@DiVGm7}d^qU|rKtL(oOQuoRJAH)JCx~0Z4EGFQCT$h`;ob$v9s-rY_w-H zUM`+?9p=4y{6q7!CE4}C*vKs0RNyN8t}v|MET$)KP!_hp|Ljz+dg@SC&gL?qHm4gM zJ}pl-iyMr(7a94ffD9>knRMG|hgg7`Ec&YNe5D$pmqMENYw<&bx#a!JD% z$l0`qXGgP2Zd=qM@R~rg+NdAeU7)}K=SSs+f2#GwpYe3OH5cA&v&mhG(*8&XAuU)n zd(M%Y6?Vg0tAfhpWSuo0vn9arg@xQushuTlWZ)yGNZUgUV^FE0_|=kR)o-3}@Wk)0 zAh&X%CCvVHuP@7U-cOt>>+oTg%yU0Ko9rsC=V$5rfKHvm^Xe^3d%I&TCEFF-atW8S;&Wtl*(u91SYq>g7`#~7VT44MJFMi}(ooZ|{xJT+0Qi~Xhj z2O)ub?vHPWlSFwm34Ivm-kjM(MHr*;>s$(^xqzt&crwQCCW0+^<9&oXH^P&+6@P#Z z#-+aWby+*~{22eK^u&YuDTGBhm8SFAmjj-F_OH1px%RybWj+ zG(cz5Y%4XeJcmO5d}(dtdGA;yEWkN#9_A`)Ff=Q>i09muzR~!?ZTr0PRup4idZH39Hp= zgoehLU2Vfg=x@^p?w@s|K3qv;?!;C~hp??phUXKE`2dFI^^LW+8de+{c)ZfXpHqTf zzG~Xv+#5*U;{SxK9n1{pxZKQmC`G?u3WQZ{+%r1s=OMkY9t1AKiCYz!2vc|yY3%E^ zfN6g>@AhJ)?bjmvw6hLi>Ursx!Id!my2sKdwf_@>nDO_$nt0W^2dL^$|NW4gN@#26 z(Ybx=0>ptPhDq)>`rAadnn*)oVsz1`CoLzT`%*cpiXh1fBP$&A*Bz-5N&dM%C5Vst zDFs@gU+gcd0e9!Mc`fO%J|I%*GO@!)=9ic~@y25+Sl3S$j`Q*Qemq~6T#9lI;+EgH zyz!h$F=`NDmJR+g-Egs96y02G(Z?q6)k1Ct-dp*>%C>YwBXJn}xcHJw3-}KWA}(dP zrB+JWQ6gveyHLtpeAQLQAD?3-xxDMlw5;I9WD~=V$e*Djg%Yh=MTUY0zu}r)k~vtG z+P(4U+$1h$A2(ZxObvZEmI&~m@{pNGN>fA^RvOgb)b&oEX9N3Vnuel28l}Lp3fG`O zO?~+w+~Q*S$-Ul2@PnR}?VeHLGEtxFWUq2F37FIU<0X)o;6rlfz!>6B!xY5U!?n4c zb~d7HVsA8YrnY9}2(eK!?; z^s{wZ5s`VgKZQ&#p4+umR~@oHs62&vNSa@gT*yrn-wUEl0ZgUoosYZ>`oTcgPKbO( zYWIKb@*}kP9W2>JyEr+ngGs&<8NFL$`xuMF-&TZoroDS0Dwduq{fMQ-%=U9Y@%I&w zS4ZaNshS-2wfb!VMDD?MBew>Kw0ZkbEWeh~=~cP-d8-4;a0I{Al4;6zbp_n-R;g4B z#+b{KY$@UFI|P$_hUD2VI<-sBzx~G>W4;g1x`1o~RYR|~lH|UfUg~jQ<}7pkaRP8# zaNaD4Gk<7s*YZOtvCR+lWv~jWNf^X%C&8!pUh4TmvyrwA%7*G81 z3W@;aEnbsPzRS;8s9fZ8Fiu`zR7Ke1HMm8`64|}MYl<7$o488wVF3CX+d^Ve8%>YR zOf2({Ml;JrSuTpHF+lR<;qB-LINM&vKGjIOueRfS0($lLx_egc-y(bv`RTsO%aU*& zbyTEFT}ga4>Y>Ruqk!8KOt?SVyT1qkL>fO7hxgU%$2#jX28^{44Ora zk1O0{!Y1ztrDgw4D}NbhynxkS-#8j`3~+a?jahP)Wfbewj3Pp=7H>p(Q^C7G?uPzG z{d`3I10o3+{!@0a4)w65D&Z2Gv?yfvoGeUDI=@|3S1DR*ol{ZT^m4(3`JP2~VP=Q< zZRv}%+F^_c`oL2|6bUZd95qc_wJfW^S(Hj#h0v|}QO~#5xTvnUh<>E}_!{okhJo`P z0RzR^@&hk>&sn{YNS=t|f%OP_CBXG+!x1H0io9p%mx{g>^+-+lwUhR;i><(<3zA63 zWohJc08}ZJ7F=DX$sr%;RSj~Os%811u%5&{aQ-LwuJ5wLmS%JYs}$(QEpYKBfrYMC zTcs==kx-~xP3xfi=5?y1ZNazP&$kn1PDAIZDl0FvQq2%;$?0(&dlTQx@u{j3bmu{9 zW&R_8CmtLFiXrO9`+$_({biOx^AT(NeJY}YWt*`L=c$bey%2&s&DOP zF#QZgg@>xtCx4!cce-8BSDrKdTrB7MXBIe-1{B zq6CBgX;4RaTK9VUawQc>rZBqh_8f=&*K~%@Ci*FGWJe*Tja?P9`)0Z9r|Adt{?(#;4pLS~`{{A$>ef-~@;lJ$+ z|8dRa!<@7*7+xj9;!+`}=69Sxw4u&9W%d@ov~9zJm|k#3qjFg# z|4Ki!vV3#kCNiAP=>l}>dmAS8qwV?vT=m7ymD+AHM5)kBH*T=y`O&ZcHm?p%pZoss z7gEBS%yn-af5ce)zCxoDKuv@lvdm1^Un!0wd|E2(g0xJ(@0J?U5HTs$;_9Q0)!xqw z#FS#UzQu5c>GN-RjYr9J$Q<0qp?`Zc77~+J@QaY(m ziXXKwzzJ~_2Ws>8o|*k>C{2kjy|uU*x^ywXYpxXS<$rjE8DJq|-e`N`dR0@_@Radf z`}^;Qu77028ZT%yOO!a`pda-Zt}sV6Pr?Tu9Dbq6wsBbH9lm0WYVaJ9wz?rQW1T_U z%Z+`i6=crpL0Yc4Cl{M-vMD}EBLhzViIl`Xc_;I{^Eqd|+ijinbnaSTM>i4`^9&XG z%q!lAgPI1u1Hw+6f>{9JsG5i|FzNelXA&-o9IhR>4W5EO^5HLg6dtF%chscQDr)KiP;hgUe_f2-|)Fhto}IBD8y>GriE2EN6H4!A3@LBngR}cgk)n z*8Z>crNmGd^zVGP`s|CKqXERf7CyrLZ z46$%mgmS*&9_2Rjzcb?h$cz{i;Cixf{&2~W@UynQWd}sr<9G!vu#QP-uA3*H{ELhj zw&`V2PLvw*OuWRUJ*eN!9lzK9*b!=x?So;t;!(fknTi~M zXn*flJtG;sY4DmfSvd^FV}(>TwrO4`#A_*R_1J;;xu@*}yHQAPB{8uDX{_l19kASl zGq><{ZcV1!?&7E!>o25)N8y)rZ(7wC@UndBv6n+GWvss!%G)vXqAuT)+&U7Fq#Tyx zQ$b(9Fq_og_qLK;`(XM64SX>jE$OlR^mqm*;8V7cZ71=tzA>i1=G(A$czrvhWFCRN z**78#YTgM)${I%Hb_Px+rn8-2n|fz5D&)uGVz{^#EdL8}Z^8L3`B+!lpb-WGJYj(V zb>Z~wX)nxenWNbZHtSZNA3Yd?WMQD^LmKEh1-82Vp7xFP@Y7(!bhP4=V5j+OpLX!Q zPTEZT$@ebv?EsOg>_1|)o5sM@1dg~+NByZ7&6Hrxoeb4k8SxQOg&z;%D0v93cif^3Bk=w$4 zpce3T$6(WfxVBoq+boPw$=HOJ)NTBS#>cx+ncIcgO)KS4uRM8ONAsHHS8~RSMS0UG zC@5u1sZsnh9{FcR-0Vx-M_-((#MyhUU_a7#|Cteg&ib}ec-^8(DY?zZJy6HZH&YxV zhid~t3*uaJ-S_@(M!eMFMY_YMNW9KFbr%}gF|l&)qKX7S#iB91w#kbR#!-~IPnW+W zb*o9M6VYiDdZ+96jVHGq*(JE47ems|Z7gimde98kZ>L&3e&#wIE~4PjK)m-|#y5Ba z1%EvL$ditis2L`Iaz9NXP2)2}%H`HJYs*0t5@Gg0phqI-DY9=DcSu1TxKfkC_~3Ll zPwC`HgdYj<|Exj~|9ff#>~A#UwZCM_I_aM>;zh()chz@sr@F^`ReP0!&k7GKv8Ziv zqcOtuFHPkqJWt!;79l&bbjr_@96B5wV4T#R6URS>ArNaW$)LeXB6$(7Mss z`0w4)o0r4wG#GyQ!GyPYuM)Z2r0;3S%cjO&5`g|{78l_&e#B@v%;lUR@uYnDdK&lwyJn@fKQ%Y9-e;&eywu!+Lyt4b_e5k1 z`hRdnthYzV2m{rcr=sJEutYlEGoZL*CW3Vd02^(#eJR|dFZ%-GK~yV$$5C{{r(Ev{ z9?d!HNh;b+G33aWJoiY#-qRMzY`!ifmt9Kr5v+ueJveOf>)A9gk?dKfUaaU2CvBSC z>qq{7WyGKm-|0|Tx+LPwRc!kO)8(f&5iZdsdGKIj*1-~a3HZ%V|4#1pt<*)T2!h&4 z+W9L1op%YqM6l|k=vO^9ol9}2@5c=&9=#K{DwPQoWPteW1X?1DHNpyk%6HP`#@k@c zch+{X zVvEW^32il-dm)Mjj4q?}?id2)usT(w(ARdZ5r<|Lsp#41=5wE@+hqo)1B&gdl7q1K z(S-SRO`an1$hUO{@dN6!m-S`_p#dK0!B>CQ5FhwR3T3Nfi7^2(2L|J>C$K9C&leX` zZp#DwxA}rG;01iNTTpRrRmZM&p=!~QtlI^A4TVpjx(miB!&11=cu7}yCOJHn)aHXY z*1byvNtTh%o+73*13$se%kC;xpgm*dpEspo*n-=%9Ucx^tzejy4)%o|F}`Nd_X;vN z005WHKt5WE1TmIuhK_XGn+T<35Zl0JeLIyQK-lpTucd}WCCqjuU^AK0y-z|Yo$V(! zmr4Gv?186uKdLJGS6y&9W4L6qXWoMt4GK(PYJLw}8-tuq#TRNpKM@i0HpRQ{{%0_v zf%ZnpEn3MeKA`T-Fgr|EGu)VFzL3hUC9&jd~iAMi$U!sxL_KC)Ng3=*=% zX%4co4E3x5`E(v*%l!ndZo~JEDWTc>zb}6}_Gi<_%}R!BM|E=yOON3-wa_@AD|Ia; zAb%zWC$AhiZ^(jfo9W1V{_Y2j6uDIM--(R?*Ow^rWq)Xd6$*@9Jn6=8Y`Q9`vmk#B zfmA~Uk%aM(@ynCV*tiF%t;-qL0!srX#Bs85i=I>;%r1(GEO^Gw1XWCPyFueGV6>*7 zA|5ZqYR!$0i6dM-*zF)As?(rI~1!&{ebz&fxBGe#QmgGAG(U+L$G7b&^NYX7J2(Cbwf? zU!TmfB;#AJzZw+Mrmmcf8Tn2cFuiE#R$?OVIM#lRj&&$N`k{2kcny1z-~8Lln%IeW zKMs%HjVk}{PsfdUdOw)(>(33h7oW%TaE;O0#dJu(^&g7|R&ZEr)ee@^W{cDm+V|?N z|5x>dkss7-Pj>`EnczVKMITd9!^R;WBUsYc!S3#a?$3W=BRJPPHO$~hBX9#lsGz^) zGg$qww%CSJqX6^a7J;!UcbnAb#1tp3E0*%C5V1*)FWmi<#|^4V`?$@}Ph43pQh)Ll zf6-j#4qBTL2OO>RWaD>|B-+#~R@t8UY8!lHu7$sd!CL+bak5OImez98uJ8DR8+wI~ zjO_Po2b!vyCE7 z-Q1Z6QFVWr^y+Ui;y>PeKM`0=ij4ogdjCixeX#kDnlROCEnhOVOJlLw!GOk!L;F3U zqh}PMRKh+^#yBLLGme?1*}dxho{Va>Z1aOU?kmtMk`xI3xmjVgEHsV(-%}%i)DQ-p zCwS8zka^=~&AqTTq7q1_`_XGL0|hSq5X0@YN^&Q6w9?QH(B`M9iT-d<{!v+6H3kD6 z->BrivgdmZ@^YeC@!CU-AZOTS`Fk+!n6lTuf?A&FX+$se?Ns;?R@ z*d6Y5EmmX3H$&5~8Ipc>tKn0TXf=;tPIlGKd|PgtBS6MK8NQUV>oi*B;Z$j?6Ov*Y zODo|#vCDU}b}wdNFe$7}aMAYp9N)-t^f&)u9uUkJf<&56L%0l#Y;NsO=4efdzbu$fHEQ~X_oc`9-4g#C zwE2x^#>0Y=*NjQ>P^>PJ0w!dQSD9V!G(J4)-8I`k<9{)8brw^L+8}uy3@1aO!@aheLKI1z;q;p?~EqwV@(5+b=kh0(Z9<7 zg8u!twuDik75)H{m`EjoO&NGT=czz*G`+{d5N=2UbG_CtBwF>mF6Xc7-H>l*@Na}f zSB;^7=gM~sAqocnwmgk=%*1}tR~sv#FT1a#o0_w%3FkT5nmKm(>{53^%w`rR{C?oN zr+MIqaSD`XWRf}Wir!=@-!Nj&m|*bKHTyaTQVRGy`5H-TsWMMQnZdf%2WO3BlLex_ zdOYp-1~uZX=F=WJnc7~!fwt+@r-!EGzqPf`Zj8UOTOZ_O4I-S-Md~)_22f>(C+1tb zLPz#=VqxF3_P^{3r~5J67ct6KCNA#OS$}gDms`3N%gS z%bZ7ipiKFEsj%3+UijN2{8g=;Yh% z!^&XxT_jP%(cNusV|JUQSP(6qya8x#@|HIS;BKJ|K4OBK*yEjZl1!`3Q}3tH@gY{8 z6X0OXjJM0eBsS)#yR=&J{e*1fs$*S6-Ecj%a8{q&;dTK7<@&Ul`X#1AJ-a=9>P zX?0kIS)rCY_M-1DZ6~?7$Z2Z%E50^FA+y~ zXc8XGsel7euEqT{N~#j~L#BQHL+n%|IG2DfIpNSGt~Bcpp(Y_^EkoMwicytv!$=q!65nFWELM%F8aZz))WGXp{vw*xZYcy?Sr zo{CeHbk$H18X3SZgK+*dGNpIYurPGgk)k3?eXs)hX1ty zD&Jetr!+s&20jI{RqW!&rm?Ww&oyU!WX@LdvW>LA7Kh!a0+8>-|HTb1kT2(4f5;-x zco*}#{^HD`Zg#ic$A?+%mfp)OGpK_w%8t%kqxZa=113oOlYBERJ7(LzA9>FLn0)J% zIt@&ze)tupe+5*HygpAx^Ff zLj|`omRaeMYBLzLDVK{)h3xfx#Y7luN=D}h<*(g?oA#c}K_tP?YMcGKjx)IeOePsN zCtU7yhXJG(Vv)|^d>Y8n>=ij$_?h^Vsp2rTMpK0H@6m~iwJe=%6Nt*I275_{y|BaS z!%nsh)Yx96yLZSOj4EMFE=_wBAsOV^PChyc!Ml0%Dq-MhSh;Vc->WSz-JhS6+0;=2 z3V83%B)PNfG!|_ha}KIE;vedrke7Jb4t8>0ZT%u-f!0yCzrkbBR zn@+F*ks0I8Pp3yzHTlc3pG0B%=D+!Q$P0>kFvhN@GuN;}Yq{h&xvlL$mFF!Jk@om<3ot76JcR5X z+IW->{@TdxxY!%NkHl(kS#+um*uC}g4FpkwQ;X3QeGab1X2=G7jxH zLang8z@^~^rkWzXJ&DP(t`SO~GLTWn1U>m6*QLbw?8yDVk2cRyxcFZ7TVpRDmq5vH z&w=c%&>V~k;`9=g4@<1}WIXOuO6h0C3uuPSl-t0w-=#I=R7%Cp> zXF6NEH%Dis^lir1GLoSAsf*BeLC=ixhJ^`2ui*Yv^Y0NkQ{Auqkaj8huG%^c+0+b;Q8#OT za_(A@62MWNl^K`h_&hbe$QNLK%0};C>ZyGlJsNOsg2XmsvIh-Ds*F<9z5EyRbu+uy z{G#SLAI%u31q@i7uITvWj5fOTwRwH-GJ4*WbPAQ23i5>r?f#LZW3~eSmy$5pc$BdC zcS^#XmWA4dQH0KSCsUX?=Xw1Pv(dJI9aMu|D2LAP1S46!D7vD-D&rKmxTX4OTwpb(l{^v{5}x+ zP<7cfMFz<*1(Nhj4h(b+&H<&U`xa!!*<3U+ovDwV`U_Ej&2CT$;F%!8rlFMuy% zPnKpV1jvWGsiER6eHd`x+`Mw8cpQe1pN9K3fa8?WrgZf$r;jEyMf@Q?VALj04UTkkc?5=2z`!W>GaZ|7CQ-(LcGE$hfRS(>Y%bt% zUD3oE%XzvT`hfBpQBwVEqb}^Ia1r-_0p`{ul@2h%5Ll$pqxcx)#cMr(F4W~2Clq^p zMK9vxESZE2)wV1Pw-mX7Em)$_f@JwURY&@Fc7w~k&?}9j&R(iun(N3wCC|0Z5M07U zX|+Q_A6=JCJj>}sjbR3CDt#tvgz6>wa5*|53TKE%%_xn*zJA$)QSCO;k>wnfXwE`( z_S)X~9@Z%?v*(JGgvaYBG77BzmxVg%ZW>lx+@UO+++nQ29{3(I`W;tW0xA{-IAO0W zrFh2(=`eT4zu-V`%@TepRV7|900-;Hc~^v!1D_8wbeoOq$|m+GbbJ z{^T*DM#cE{0w(P-O|rpIfMO6aWDvuLZb;f6dVR&{73@y9>%SY|Jrn9JmesLf_{~TYadINFeDdhjB(no(V+tw>Pu*k z7Ud`(M7R<{w;W!oent~`kKEQuD>kb!1A^IIoswFwmG-A)DGLEe(mf>TnSuTH5rBP))O!Lxh;c~mgPA~+bA{|m+1suVf;|_ONj@B zaAbYT9E2K7+DA$MOtiBl_x2zC7N?$1v41Hi5P{L=eXZ}YhF!}@a#Sn#q_pB@b_~So zgz_X&zzI^ip9S7=dSzIP(!JO-HEnzspg+G)EIwZf|7E7Z=%6BNo-><&m*nwJ!tZTVsBO7i?%!dk(;!h#-L6cY6*y5%9Tico@>E3 zxp+w?tC-H#UaNdM?b)G0sMHzI%8K6JjsvL6{XZ6fhq3~vorkgPh=&J<*R{hJEQ=+5 znK;o;<(J1K=+suL1aBT3+%8&fb)=f%j2F&xE!j;@NyCDtY2B!mUYylIe1b2vm-DBE zBV(RtGlnrZk-*8d6`a>&9u|2q`)EqWg~S}Yt*ld@eRkCv<}59XW>hnLkzS;#wVcwq zSmpr4vc7B-NxE>j=p__|&7pOO#o&*F^9KCpG!&8l!GMHEZS8wS%!~zfj(5KhUeR7> ze}lR|#w|{IsmJg8>{RZNvU7ch!$*+48v?OBF7Wm1@AEt6IqE^;ZLGd;6lC@Q`^CI* z9f-dg!Y90-6Y0vkBfC3@KLCl7Ayd4kOXhYf7zWAh?mS@`q&b14-|@SIT1C&svI?kU z2~7bjQ3+{%H+Ke%6mY^Twx$iEZq+PfwyRAtj^^ssW0J%nm_$(nt@n-@Xeqm1iTld} zX!5o>vb96x!iY@)$fkp`5 zTTq#AUDHdMy{%uA;P0$`dy!`dM`ucK>KM{s440P?PwBsPx0dcF&^}{TgtO0FW$`cj zagXjY9eTdnrlK(Guz`nrVQvL4xoCEASV)U@%S=^V?kW%!Clu*%qWuhSWh|vEn8UeoEt4kgKA7TijyaF8h0wr92$&y4nW>VPG$@8iEzWkm%f7y>? zRHX1p*4wHY%p&)5hgTl~R?{W~lhXp>qez_Xy;FQm>MzvSd9kvvcJ$5Y5jsAofAnWh z`{s!r|K-n(za^9$U-h20+5O(hAv>f&C0C422IO?LNN0!czbp&~onMl{{oBk4XtKU* zI==EvX@j^}xy?bgb97Jcs$atL`X|LK14`G||C|sGOkQLNCj>z=K80^sm-yZiV+h2ho=O8^ zmTEMbcBEtMm@h$xUmX;HKAbJ;1WOLyOh%t%v*(D;&i9Y za3ztbts`3=_mMmP6=Vd`E9Y)nQw&p*f?K_u)J`J1%V0c{GkI03snWjj6C0Gu&eSVz z6>r|edwT*!=q}U-9<6|eh zjn#e|X14MpS=sxw z?d*JUD}g~KkU>UTD!v?a?7qw0Ox&!bR0`x1nYnHbBMfx_z-S-|ptRcr^A2F1@@rwf zqD0j_bM%k~8~u2{0TAFYofz@5AbYnDwtR5G&HT9xhMdN^9pKOJB_5^VV#1*203toV z4Wjs++>6lju>_9(bw$qmM)PK_YJB1KFqNqGwO&AT(mDfmbeu+!(aP_`>eJOa+2)YB zhUu#CwH6T1j#p4@Y3;d)?TT}aWZHS_hlLFvVw}^$MkcRyo;#4iFAYx4^M@&PJM{9j zh&*q5CfeLcq-a^Ilub$K7+FbrV&UMH)!t}$@dd-(@j{(Jzl+ZcM-z5VOobXHYgc%e zDU9vQg`lXnXxX^;(cl+Fv+`=_?WIr#_9cAqX;XFFf)B;Q#Kju{>8}Mw_syHc^|pNv zw<(ge->2S6ezID5|EZ*VSHgZZgzacA5TZJIX0Y*wjmGksH8#1n$j4vA?)WxXn^JuN z^V#fgA_Ik_Vvky5^nafVPWz0Z+Ck}aIfGwz_On;G^*>15CTX@G>P;BpeCw1#z8BZra0A2& zRD&Q7N*00TU&tFxn{fial1i7@7S^cR$mi~qddnb+K#s@D@5$TS)Vp(wUxMI@vKVjm z)2gA6{P`?;x8Ip(tlio?61c!W>t{4^0Q~ydcQ>rykc^VPy*8)a1isTb^P`S^Z&|Gs zjulRRb~Im;&Epc8`FosnXxdyAd+TJI#znW!lXkTOVOx2bvzQPPGpz{n>RL_2IFnQn ziUSXM=T=3>*k{GrBT_`Zo0ndgOmQFF#D&{ETY;KjMdH{hR^A& zyRphf-3bPBNVB0y3$%XQ^2jHC;-g*30;@0#VzMsrN~=` zcKH}{Sdo*2tIY8okDDwm=NnL4uq_^QxP(i-`4N}OUQkb^+ET4l`0`bKP*tIKZO)TS z%zJ0n5AL2x9#RjIisrf$NZKPtK}w?uSNWEKV_8!2M!QOl#{#UwwaajowBjTB>QjN{ zn#EHJSY#2UN4^sC!g8|0ef)^b3o6&3wgQBGc^_+4(-Y&I3vfk4)fUHMKZGgks$<;MFwRW9_fKUr^feZwx>r-`Z$%8*~%V zgOAsKZhS;B1|&gW)1==S`f~eJsuMFoy`$zc=^%FQAT;}UW2V8E2w&B^w1oM4Vg$L4 zXZFCSWGt7fHqQI2vG1Hy9yw{nk9*Jc-o)2>KDYSA5O@0H%;tB;=bkEdC@c=I32%^| z#tHT{(VJ^ie=2?NntvIsKNTuEjTRAIxNhQ9i={yzMTO)SM75iLMVV3-maBXpPkW>= zW;&zQ)2@=r$fX##M?F>*ott5N_yky6bi&}U319Da&G$Tshkfec=2kk?UPX=dU~*)N ze`DZ4B*xkd8)b3WvE_J^Dc}vw4=f+WW3vM8()?31#$M-j23|BJ4E|A9Ft>=(=H(H-7&PSTcsKPn{f7Fm_!TocMKM@2! zs9^3G0sl?KiXm<>8W~wnko}R{NKAjRH*PoFOR{h>z$}Wj>?g*dMp+asc#c`4Fy*dS zSltcf=)#VKFg%5vwZgiGjdB*btLA>bZgrh+Sd2|ElS8A$g+Ej?faLybtClOnj;GW& zS&`NEN6@bvOF-1vs%Nb%FeXup=T_fC2CufKM7co)U*7LiT4k~(u1#y5@HhL17`-$z zo!@MzJ)w~WUXQTPrVESit&?zva@NBf_W8J?hs`p6B>{Cyr@jIkPtEk^=BOb-)}|{l z*J*(>>o;`BY3=OI*U?8PB;_;G=7KaGBsdj;OlfNmc?jW0;B;lN8rfK&8~j3=ZFMsr zRkk~D_e6s_o{)2}u|1>C@gq^0FVCOtJE4%pY6B zQHAesJh=(Jq$r8j25pQ5RCl3)$1`-HR1fiv3C%Oe3)=?W*ia7AtiQ7yr~-}yIHeWu z^1^OBOn?!MPEwv%-7#5ulHR=wXy-95i=AxOp9&B&55^EGI~*;IqDNU72fp?tpUU|b zPpm{YUr>P(0+)v;sIh`IVCRuLsVpB*w*kjBuI0+)dU@pILYlm^%|32HPHg$knXy$u zej++WJ~!{jLh>FByl@t%-*rnC_O#qG;T21zBr-eH!sGi23_X{+0t>J9769^KSPUbIj;PI_x@7;H1)jL6ni{TSz% zvJtq__0n+{2Y8HKgT<3hdH+w8FZ^#P~+>=uBEk5lRJ|bB>TUBXC8z+miX~VqL8-(^1jSRe}kd zxng-kBG+()N26w|t^slB{uKxIh|&w+^D`%|QwO-|$F)C&1nOx^}HwRQ_Tk82=nB z?GQpm7OizIeMM%R z;e5)P+f(#YT#y<4vgJs&7x&X$wU>>$L@USEZfUIHvh>eO&z7paYKm9WamY`4!!}b{-@48BtCp~Sqv0#Ww zf67(JB17Egx{DnQtoeMsB_@0=9k*+DCFHT?tl z_A`gvwn?D3`pF++1j8@Mxl@+f-RjpPYQW4w_R73Tc}m6$-zUrM`^f(03UUhgjuD}r z1+MXBJnfRL7v6iABGCVBXboSa9OugE-$8?$8PkN7ug!U$M?^Xj#JV||aVJFOTP)+< zrn?q~G?q<;7!m+-|5&r_AK#D@h@Y5#D{40#ot!y-=VHw8z0`%T>PfeZxUb~g1Pq4B zhy*Q!h`l1fy&WtPXS$7JBNtL3&5B`{I#QD1#DyErHS9VnjmCP)`y3w7IC#kN^nZ8m z^!zZ}Bdw|d=3vhKkoq{x^JS`d;@WdZBGEqml;rOW++wOJCklr@SpH)Fk$kox2Q7cr zA}%Wi)d@)UwNu6yEr%L6)iWDMI_aP_Ti9=e@j6vm#s+xf#OAI@`A98)?tOV!mE;hJ z3ZZfGk{tepTD(m~%>OXQ7E%gu9G?;I^ck4Q7*zu)xRUrp01Bz34SeV-^2)fHAOmdGS-0WNcX zN!O$2z%NUmxGM3WT$B9gTzLlgZW8m_*7RUkyNy(i&Izp!!R+9Jsh}qTdhy?E){uNd z5z7CAz5DQL`b`u5PZLx`R0O05C<=l?sL~S<0TmDx=}3@b5Ri_vkbsDYG!X?t3q?SB z3B83PAT6Qy-a>DoBoLCHv(MRc_BYR&*`1x4^L%HQKO*a<`>rS-017<;#EZi-B>^v=3$OxshVjy}Bt0oYyh~EY{t%-R=O)o>QJ8 z9W(s8nSTBZaQ&d8ftf z23yuLkoDo>67`yPbGM%sxjp_}kZY9O7w-+}^SmiYqU)|$;_2J2{fv*k;!U(eLm?L6 zkq3%vI%dWF(IiYafVq9em+(7Hxu`=`dm~mLksxvXSC|e~r%y3tdhwJ5XV2po<{>wb z-^%<;`Fi=LED}3Y`hYk9*(*BEhms$dWNCc$MfLUiMuOIxxHw5K+wp4nYK~sj!UjG< zzH{D=p|(wO0H=i7o)D9ozELArF7vY(qUYxT=+t(P{6HbB>A8#@AJPta8;N=x-@N@W z0J30}bmvR^O_ibJt=WiR*Rw^=2%%0&4gW1K9goeg=h*{Lkf4-2O;_dJg-zZYkJlfs zp9$qL&iGPG)a%fZ8*__FEbdxC6?|jA~1e*uW3kHL^^N% z`cD8H;6vEuadb5U2L7OKqHL{eY%>2_LJqvdj6C$~wVqrkv$$_J>4W-m%~RSAY zYtb61+@)$bv|oI6?OY~nBRT!ACFH{O+?4X-;>rlh$i09c16q2>(|h#Wuus**36fHsgw$uWv8VlVuOiQ|<5e27txh=I z56~ru^Gf5S?|>ClbXZaqFEcBD$JW$s66qlZiQX99+&s0a|HujI56B3jW<^ zybRj9$C-P=7C9qYPh7b{&Xd!S_!%r8Uez5a>A$kpS>J3DfM<6iusJ!{3s}N;=Vm3L z#4!jhlpt$br&dGW$qWP4C4fmF=&TQAWuLnW?{`%mO7{i58F&`M5whd~+V8IsxtR4_ zV=kW3xym|Slj@X2kpoN~>?$t3I)qxhI+yO62w~j9JqF7`kUB3`vnE? zMAl-ze&>>_92s$6+;?iG+nW^eN-468ExaE_O4EW-l}I8$IU7ICav7Bpw(=G2R@I?n zI$;6^YG;GlLIw~ZC}4=4{t9o5A*#D{{moIIt1FbY$)nbedB7hoHNAYu4R$_rVaoc9 zCxz)}+k1VFYg}Wpj5(F6;b&Hye}n3k%}Qszz6``l`@Km0kZ1w*B2xPeKwPDS!g6{5 zk@fx4_d~pju779KFE&W|j=!F&pC>ePQ2G3~y3r%kNnO%wp+|~7ljzFB%7OlF*x(VK zFxA1pF5JFNedP0ow{?@MrJP@VUw-{@?sBa+BztmuZHihHd09qNBC;3q@{8^4XQAac zSb>cNA|^Cv&KMw(Z%*^)NwhB5iv~2s*7@YXro_jNZE3f1XmE3J4 z?PSnr%)aWRX`{?-+&n6^#~7otx-8qjwh)mBEZ`naP{ja(FASt771f66v*#YZFI}X&|?bJsk7Sv<++_P8snTI5``5AJrcQhvXgn{8?nKT`B@Nm~7SXqQQ=+pKnRx1pu2({$#&}w;S|8Zb=ROhS7%2?slNxxpvClI9c0EM+g7gcUS~J!P z>ACM?IOd*&Zlwr)#dQEi0|it_Tqvg_4_JJ`hp^clxKS<2zQt`wg&=v&yY;#iO@9KA z*E#z1COkhsf80kDVR&KiTqSTbmFwfT0%!E^kJIGA89o=br&Q=W4gv|stxP+U9HKbJ?y_ol{kXJsoTfeMQrv2c=u5*jd{&Vd? zyrIO?{zJUkz}tW?(gR&{%iM+B@$rJ6wJBEaOfaz{3Gv%Bv)YVj(rqS)B?-LLT^`-H zFvR=Hj4CgpRdkR#0=By$HR9g-*_(2Hp)c@^_TG2R6DO{7ty^mYa1ib7V%|yezNfO}=DAJO9j=yQNFg%X}-x z`8(Ytv^8j6IA|VUnR}l*K-}Bwr93~)Z=zAlbH4MPb+6i)%fPQ zOpoxTq(q%~RZztJ2e8*hxTu25B5Gh(>YTkc?z)ho}*+JvLl0Jz5--2@ES8qGwdTvX4`X;lj?#W`BI5| zG;>Nn*VE?+DD#Q$pa&x5zkl%ZWJL_;eU(8T6$zu9puW-FqcZ+it%<%3DbYiH%3W{7Ja zz6nQ`GfYQpR18?1USZJK8$o+)6O{ULZnPsgPMIBBf-mx1)AepLD)G)g<}8NUwp?Z& zDrhFKRXah+uG00Zo2CUi;!eD)4@$QhN1jjsJ$Q-vDZ{dd?sC%tZM1V2c2#|u_Rf6q z4)yw#HDEG)9L1v>=X0?piT(zdb?TW=LS7YvWliD>ix#!AVJ9pj5N`SWZHr|Rw1~Zu zM&B~n1|=8dnO|8K|1~7|E{B*mVV)u1jzdSKbS=`%$>@N+e^hBGYU&woUyyPmOi}{6 zhU|?g_=ePWHZDaffnmtDDhzwWTG+(U1I~Rq#`jn`s!vtVCCzk?s;|V34YFqd75JNe zEJr1sYHY!^Vb6xHn_#OjgW>R-DYExXjO#H+c3x9dGuSJ2FO5dqM%=#2Za3{GB2qvX zr@inbJj*l&OLHNiEzMDQD~ReH!T#CV34LL)9sY5QCt@NE^K<6hhWzLT!Y|suRcALk zGwk`x)1JW~Jf8IIaRGi?Gq{C~r;P*7;*NKHuj55jNS{ab{6HKx4Cg1cS^F)E@W$lv zde=+sUSmUAPRaAl7P_53yQ!BXtq*WA$yoDpuYcTEyR$Xz5^;*Rq#~&@Gta~zFiaUt zPEqY`?#>!IWO%>_d-F0ov1!m0PLHume8)@Xw5U&Qv7t>@`6SIgLwfeZJkGb5>lb05 zHhy0Tx<`ZhQC0DC%)|MB(Z%fkg+6uWvm6N5*Rv#1H%kAKoYjbo0YVht!= zctr|zcToNw#!JG06eFuD%t(d?&pdHG_rfxC`V7XD;+4_Jsk;}f~D zc*$p?7|WU8fR-sG(xQrT<|m$qw3pO(-OR&}#|59h$O*jaZXoMK@`4b&{;=wMIwR2r+G%xNVYlv$8ywfENtpa zeQ&wHjfad^dkVPWVXd=ZD2%^ikfa5q#Bc;Ap1IxOL5aZ{E#NE)FnPyY*h;^fx=9K^ z=^ZLK`iE!I0dDPE-CVqF6>}+y_^T!BF?qPccVFkzCcE$CrPqj1kSiOjm6`VD-tIQT zBao}?rdhAfn7dWraSC_cn;7P`N((2H`bQrObF%)W2hXpGwEWP=`xd^WJJ`SZnfq2t zctp=9|V|9&&HfDY-U(;MF0$B)OJ_0TQwl2>d$Aeo@VKETuklT^g9r0SF% z_S{FijHk;9d_d5fVWYMzWKMut{?%s8sZeX#-0ehFCR!}^ zh36e@M%{tKno6Im?*?I7AGAC(?c?T7AIkXLKNMdW$53zv3f3x1uB&W;*t#Uay}0U` z2oH`26Q-yiU2gSu;vwHv50khoT1bRj&$gR=lsa3~D>p7aph$mrr75L=nNX83ZGni6 zZ}l4$HJ|*XLhE4!Mn>H6n}%6|0f~0=}20e>db%M+64cT8N8|EI)kkYtYd&5CngH;Zh{`L zuOZ!2=O5n5R0vSGmvAc)cd(HHc;<39s$K)K-C3R-@4Rl@Gy*h@Pd}K=^%5E}8`{#L z^b~Gz_BVJOe~nloP13Kd2y- zT$d1seP_E|UCG{Inzl%34dbU!kg!pWyh2?cx zKyl~*#JM-7J8ka8i!woI6&WemNdSn;w6sIdIfH$??w)B?49%Ke0}9Ie_y4SMX%b0?RFWQ}(atu63Wqo~_%! z{Q4O^5K$&BjLg72jVsXH|7doqX2kbDR^zO{0Js+qi2jdwilZuL8w$_<^fo{qgD~d1 zh!1cf{>9Pa)D6wrAm0*S*nS5LD`#afzT;A%T)8&ZqY_)L8LG%Yn|ySr^Z&XU$MpT% z@&AizT)^+c;9EqhC{*i{fUD2bIUTvc@Ltr}gRQ=ST1c9acf>DS`{cuYF)Q#nu8Sm> ztS9*DS1`O?9S(T8vvjPD@aXh%X^y%z8a-K=kH3!M$jJ?#{NXNlB{$amVm zd)IWQetBiM-bBCRq0Zfs<4l=7Ovd)3$AmM<&OJ&Qb3WH_BI3I{Log!dXI*im=PBs~%YwUXF(;uLOYzcpvXitiDRfno9)dluY7(>Px70BOdXO-hILdNGsYL6h z4?ZUv>5}{UO73vHYih-YNfEdIx}Mwqz>Kb4VkKZ#%K64wy9z_5!x90ie0KMIFnOD; z-c@;l*)D{iitj>Gi=~!bEAmcW5#dh2$MtKbPTPMm8plg|k{#Xf zw?yMKRrezrio@a9?(AFDZY1$~3gq`FId81zFcx4`_X$eBmKSR;Svz06H~PLuahh;H zqWys6P0n}a!T}v?bYP`!eTH5h7tqxAnh7;z#7pNPT#gQ{|WgBbjuR^`zDW2$loq_(STgj<|p zpG6({ci#xPPoy|(BXS71zp*O!d&b_|G}7@^@Sb?)*BAut+)q6pQSW}=?p?$Z3UJNo zV4Cn#Ne=M4X)=;FU2`G(_0CQKNbkiZ9wcHttARf%@Et9AK}IsR^;Gz6UYOV-Kb;x; z$6;>GgTd!A5t**_F7^&d%6E^W2BZlMYcat_7cV#(Ke(l~ipg9cowlh9PBOi#@r;~@lLackoY@0_DNPaMEmYM*I* zNp=yjMMbf0Hs!!+RKn~w9{wEhjxZmC&-!RiGH=EF;^d22nGRl`}Mt06r%K~r7)^sBviNqOR&_HW>pDgj7{oZSLamuh0 z`be%ud;ILBgq}53xc*g&L0~OGu_lG&Vkr;59L@ua4BKD@0q5Shy*qt9j`_OSr0Tet zd^m`4Q2Q{T-zEObWX2qJE?4EU)%wL7QKe_&&Y?fnKc?AtersAu^LpYyyYPCZ%%&>XaFJtzu)&Im|g+M`@j0;rP1tmB`@&^mlk6g#g1>K}T7FtzH>|!^-qG6@`PMj+?IYGQHgfZosZ|KmLCrK?M%@~sxY)+-6M5TQI{M?? zc-N1(xYg>1m9aKa)M-IFu<5Gk?aR+Qc$QDaxTBK?H!71z(emXWqTuU<$Qet@*E(n( z$^KJc_VF5V=SXYNz3%iY$F(~3-a6WcHHPxbNzT(o!H(82Zy>ga`(=K zyFeY7zPbIB_n>>(Thi?_&DTbIY2HqPJC5j2!&|nPI(i>tGSYqq^OkLPo;wbv!p7r} zNGcB)o8Pn+kFTyji0;BqNYt~XvS6DCuOjdYQB}bb*#lTAk|_)3e;l)3}&>r~1~SCY4(XHYQ3o zXL8tM)drexPS%A~1Acj3RMFy6x@BdBNe{+XcOUDf;p)x5Z_qT?K@r~T0=_fro7rcX zd1Y7m=k7UP7WX8Y@%kU)?&NQ=I@f{8OinwFyl6RD+Hn$TfLrwZWqCXy0og7G=2U|F zR6Z^%V6;& z24&u=K?QW_kLIAo2|?nQr7UOI;Y;)+O6@JIhXTBE`9dQ&ZTFb0=Lx=vWHu%Qtd=g5 zetBcyh0bLyj-;^DPs!VmbvyNeRQqrI?gFjw%XT&m@-FNq?wf6%)Ic1Tvmn@7+*noY ze$-va{_1q8Lz?8F@CD)m9--^VoRB#VE7eQ02P%ukLzkxNnrV(#H%M%GY{@QVGLY}4 z39XI4g{?|5f3q8f&v-g%0Tuf8^`XFA|u`gNGaoix{m4+&wE-{UiSL-(uwDvJ({O!y=o4@r{iu zXx{c;Nbd+SDGtdm%TXEfy284p$~veyCCXd7ym5^fa{H>cjmk`ixnqDBW^c!!1M@{1 z>b9@xAsQ3mU;5%Y*J0bj$SPd>5Y~7qv1a=*&`!NQuEk4|r4r$!dP?>P^3B8z6=7nT z7#G>19^ieP7sOz3=3WNL;(Las9r9Z8?0L|AWu1&eBkb;Ya@x9Sm6G>-akXvRFX3Ri z8qfnr%eYCrE`PlA-OZpd3*8rU7dI9Z;{@3e*;%7f9}()#yT3`3l520BU*JJ0$L#9wW+7fk3PMw@o4xkZZv4H8aVZhUv zu>q;YtUWkmhis&0q4zg|ieT2;>1Jb5XDVBENz?|w`0d?GO*7{)p#pAgXE&&~H92jn zI@D0?7m1`rhAQ@v?neQ~ro+`#%D?A2xN8%xXUr?PSc*>#Yimh7F28fC*tSy(X!jdK zK5Gevl^yRiOBuzk1R{4ZAj~WWBl@r7!T-mL_@}H3|3Rk3nzvdJ;QIVCoACOu^3oij z_n8-Yv1$vGXUv}@FNAB`k%#cJJu?k5`T9?JT7TVbmANI8)>M#2Ki$XAU9<3@zfyS< z(6^Gu0@vSi_fQuo%Y~JMJtayhMf5^n6l?4XPj_v^_@hqUx&alPk#rV8Ywi4HFydcJ z4+adL@f6T#VYUUZFf*M-4nUve7!0Z0j$~>_oT;$*?i7%x-|1Z7U?x!0w1{b``GRP# z+kY13C|Bqgmj8j%2Qhx%55y_~y}q?)DRShqND%er>W{;1nHDpk+Kf{`1!b_s5mOytLLvnE}q)zn0?ha0w3qw^u@6YIks@h;cpyo5~CD`x1UOJ zUVAaAzBKl1rAl>TR?=V_>-uGJC7KsZXqw{AZSJ!KI&@%y>Gm9&MC`sPGRfR=aj(C+ zrW3t=xAAucF8=o9pQ>j;s2Cxg_ZE+Z0Fn$X!8!Y;yFZSSmnC~3;Cs^>4coy!E@sd0 zrNtTzUe})Y%`brA*;O|bfs$jo0U82~rx-{bj<3Wb7`Y9AB=b&<(>3HLdq!T7xmgZ8 zIyk?D;c-QO`$NGTyRCo`01N6m-(<<>C!YorbvlR_yP*tWvk5wMB^UawId*r6R;lXf zUtDRB^ur|DU&GSq`V0u|;D|_ZkJ;d^3vBQ*;3%?MI-38`W;}P#Sla>^b;AXQx~FGQ ze|mTj@=aK)yx?u=`Ju}~yGBJ!G!hOQ&oBZ@U!=Jat&}YJ9BgacrT0yw1>^o#g10Aw z3@CK(IETigKBD$`8p61i^uz>hjbIj#{S<=ZkcB!) z1`7gFZ;q%#9yrd8AJ9>>i zVEy11Ly!bv0SmkGyy&ks_A`+Q+cHmOKpKRvF=*XKK(4U35#G@C6@)2$?BtH~$YBbD zmMX8sw%mRm?e+7Txa2Lf1tZHnnsV#*Bm;&usfpXn%%TT|TPh)|2%pg^cfH}$y9>PX zH(s1e^v;9((ajFAWsJ(%ckMx@YX*e~GX>Y^@7RXkeZu+O(Dfn)5O_9YM6lLB6g*M= zdaB6)AQqAxqFLk1?g9Rczy2=vuJ@B)zY;WAa2_c~nd(^oh6fX;KKT+Q_C~c28^@;f zSb2a>gBmS?lea9kc4~n%dsrjWncK5aG>L0^ehLV4b)v5z5_9BCxo^2GZp(qbxzJCezY-CZuSjP?*$w26LHD$8{psCu&aDA_jVHbv*yq- z2}fl11G?pT!0eueFn3k!?A+|pog?iw!D=BPYot_)uh=cV_h|LyqvM>dx<^3Xk}ZZI zyFOy%UIN8@&OU64z;!W|G>07>3e8p<5!P7I3a8u}?0)AyFIu)T8MRFV#UQ24SUN09 zKA3+Lc!OCRYOtG7hwSR{?R4NIGbedubt;c-bJRzmex`Sc-DuyCQ-?znL=j^Vj2AVfH9a1CO?aV1iA>% z);$#Ui-nh95#2=|HD4$e#Q*xba7e1zgN^p2_M+#D;`xdQC>bDmR)Ix7dXo%5qS~>| zW{D<8Ge}oz%?w2ksO>y8x$dv63j+>oZuUxWz!&cb|Eh_bTwR`H{t8=knymefEL;6` z_DEF@Iws0H?Akp2D(u2R0c zX(L6K_UQL4t!H`bI`Mziy6_*_i>Ui2gTen;FXGR@;6G|Tj@>|hxBFdVOv5Do%Y@a1 zg6PDXc7&z1m<>}=URt~A`*(MvI#5HDxZUITjPhP{iO|8&uhL=oR{}1QGat@6?PG<@ zmtOIfx5!KLhlSDa9hxvR|Ge~Gi+ECxJE|=7p!O4;lfbH0;V#v?$Ou?57RJX~B{&$J zwHk;;KnJts(5x+WB>SUZ^g&Pm{o1e#*kP~Gr zms`;jKg|SKWBf(#ycKwv3!L8Sv&>D<#82oCN*2ryWNaHTT5j;F_kEB#HkjMZQNfNz z3?giIejl_mes1?*2-&Q}^RDQAq4k(2;gV>-7c7$$KQ2c*1K-_CRmS2W?X@iR$;us9 z;|ECvxaPE`07uijRK@VfH{p&?9Mprr8cg+>8nT`pkw0AhC&3v5CW7SL>D7%;EqkM5 z8?LmS*WNto#44+ZCB6FiiT{|7gCXYsG8pl%B?kYo^KmC)FoXQxn~ysYga3`lVT3g^;nr0!MKgmssv_qzvGHAC`ek+>UO10tZh ztsu0VVMt~xbUZqd<;=>&2a`czFHQ%;`4vBfVdR~;H}8K};A9MH{!~3qfd0ib)vij-pC0nvq={{h?_F6j}k?wfY95)l+#cYS1p^v%;j#E#M*U61u^m^ zzx83~Bp-Lh5fT&Y94T^l9RChGb>&;)cB~+HO)cMV!0`I$Z^S&wE`L*C!6H?gK9mPY z^j|e@(S0J~^PSyv@c5l^HO_m-WM!N@kNobe{vqO6_i(3l2PO14XCH;@*pxIHB3_TJ zEjr?S*py`Mza__@{4~b4#m*MaPU|{$*w_z&SY46!?L{dM6BLO?{zbm4MnfZ`+XXi+ z2ia&c4tv2xHo5pn98EHJG!^9H!!HTKhU+9HcLiw_9h2ZNnsK5L)jLVAUF}ok3(6Oe z+K*Dk9-UH$y&vNMpnUofvIz|@G{%%zx_4|hf+u%MB8AUU1GXWsByjt(I}j$+Gu+58 zH|Ln@01Mv|0>CrBLho`)qd-^21|%!biPbL574NAs$9@3*oON9@VYts7jZvAYZAZ1N zoO0;+s#I`(_;r;550B|a(R2XYkmNy$`)YRK#ib6A+k>hr@_WVhvQbU z^??^wk9wn3=QbvB!8GiEh;K;ne8F z-|QxTj+BcLz--<-&yLiWj0=bS4{7zcg5OFD(o_3!H(j8Qe0+DISW@}i8c z>`$N^YlS8K@uXsElX-pW9F6ITA(!fw^%_vH*WQ#O7SBuNyJWmc8cb#5jq^axYo=zl z5SN3Fy|HW~L^aBh`4i>S@UY&4BZC>=Z&0Ak40HZa2A+Raj?&OF!inCNxqhG6iYzVQ z&7jnPR!=d6Uw-V=eXb zN`~oMQ}S>@tnVo?D_P0?Pfan!PH!2og8Nye&npgT-uGrjDUopOYPFxozbSpQ%<8l> z^^zcxz^^X970A6abqoeVz9BW`2{BA8l?lgM-*-N^1sIQgx)^X=djn6~So1sY7{U8@Y*$ZGH z?o&e-=d}$vke~5GzNdjDSJI5T4jMjO93P8Oc1gaXG3rwwop%?t$=xCch9*7?*h5#j z`M%76P5*vUziR8Glh1PDJs}#jl&^06d^rK_%$!LU9&t@U!C*$WDIr#?7gLli3w%tsb|_jq=A8RATGjACb;fe*?q|)$cMV2B#sM1T4}v3gtj$Ec0-(tH<^4W(V67?6^ohik z%SYySKwEMKT=vIv8EQ$2o4sxpd1A7tBe=->SkM$z{3=ICG z7UKZ(ZKk)yTv;y@u3t=;;DFgt^BAm9FCAdm7IX! zxNY4I4q_cuSA+v5`~Ce-yfc9Tv!tJ56bmHt{p84`gs1|OqtDDv-#%RIpw#XrKqO*+;B@$Da_@%84_xf1Dv86WxUL9PkB`iv7 zVz{Q&Xy{u%li6x07qeKMmkTj#%h8@gv9*kYLNk~g4+~nB4FZx%dGjO(=6@fwjnvEU zNfOS_6s|79vUEoQDclekb+teZg<58EF#mArrdz26+czIUKNbIIg}Zq~Fg8RZh+(S2 zSj~%@e~f!7c|7zyI-Ju_C&Fnfn*S+|rWUQ0Q~sD_)G#!`ffz16?76GH(6_7j2=Cs; z)05*TQ~e*4aU_YhzYIqFYl*>if9Pb~i5Sf6R`+)%<4(lj|DqWDH-QoVFfkbY-vlFG zoHjhz$bR~@ntb_{4<__YrDv(g*LCAJpA;hMLu6#hj@H($ycAR*{nH#oHt^yK)9mqO z4}3Mz2WoA@2QS?k?oIbnES!?3tC>bnPCtR)z|8gs)*fZI5sdFm0u6bJG}y^2TA7fk znJwzY*=D;k3Vq|(fB~%XliUY(lzl|Zz=;@qA_o626@&j$GLF6XQ4Qgq-VtSii)C*s zbMlX$jN8<)rTO75`!PZ7ay=j<{tSfT98hzR2>xEfVK?6ywTs5-Y?!xd^w_+2^WsWz z)XZ8v?;e6RZ3bZ<#^sp6pfk*H*FrX(2x5hZg5ah8YNqmBy&b9X!e0Z_9)%#Ima)^6 zy-bIE&p)|zJQ%YK#fzWh(rY@ouL$Oky7r`P1Y}_EBYn^KS2MH>6t4IfV;+ zq8%0Udv$o_%NC*2UWbVXapyAk766TCP!x4CC2j?X^IqFJR2_gUs1;{ac_}8+Mq9e# z>57+;x%myuuh3eZpZq-g?%fkI_5h0DG?ejIr9Qa=FLvL15@X%nhl>j4JihK2n)GeO z=RBX~5Q!!}iOCRB{!87*sIP-)q+7G5u`y^EzLe&S8nlxRCTe~8MeI7O_kx<=+ytqY zEjCd%Iv{VV`@I{|eE0OPib_qn_+-sNCo3LG=1MM**Y44U^Y|FMr}2rop1fwqET?Tv zU3IQw27Tzp$ShMPJ1{@={XweA=e$AAcrBhQBwKDFf0?Q6YhEFHXbC-|0l^fc8eUHoDgE`hocGX z%$r&L&(oo=cn?u41hnv4Gj4`y;UpRNcO>IZmA=L9&6oFA9=CxW&V`=iJ<8l&uv>uW zCg`t2urX7R;(WZCn2+Uw^p_7x4Ky>Z=lxPe2SSJX$)fa&WqW~HSj;am+r#e=|H5sr z9Tbh_(I6@xRXPWLc}q-Uu`ff_C?Q}-uG+%vjnj~4PVyIR=iR-mX@F>cwwAd(N+c)dEP_maOm z2EO#!P26pzluUi;BiJO?7FQ@eg!IQ7XHEy9KU^vNAwH`7`m;rsnk@RVaO^AOF1-ZI zeKW(C8C+X`CtFl>d;i6_uL>sQw8iL>$~AshQSF4Ozzrm)5(7QIJNvEug^qqZnPo;t zxPhK0q27p>gWWsrV?)Qm;pu)5#5u6wBmQ{D(Ju;qMCfYZm|nycEIK(ScOzPHq~{o7 z?-G$QA(JK(kp~E>w;9(goxzh!2iB`0Q{H;7XmCVp+Ol7HH2M+s)ddT0!^XVem+&iS zuOu9Z>ae?Xl9;C^0+iYWw#D4n3B&g>AMGWH6yrn42Mx)77s#CHn+FArN5VvCcO$Q9 zfi_NK(3KnzhLVQOIo|)c69KXVOJ=iK=Wu69%8}CyRT&2(tB13FbXpjpu>uUK>gsu+j77s5u zFtam$^J+>i)U}QvA4R_kcV9ki)H<$5II0W{OedKN@}1rmfp@$ zNxpo9db;a70;%LBk6+MmS39d0BX>Fg#*&<-3V( zZnmp{+vHV<)#Ur|B zQwlf_GmDPKj~M`{cO|AW*-GrzeuE+G5sJh8Y)gZ-s6YRxw|Vs7<<+ibE4Z``|Mo2N z3=|$iJ6ow7)z_XC9fe9}EQ;~w^LTSUF(NWFy&^+S_ECZMwX6b}m(t8;EQGpPdlg^T zFl_(4B4y{UAJcTc+lCO8d`mwHIDrwn%rau*~*4XWt*B z3g+GNl51#|5Rr+XE`3p7bB(>8b@jt1KRqA0pyXNi%IAfGnYu=bGSW|6p)ErU_roxZ z;1%LO84r$WYSvrxBGYq;N{yAx3f1<0x&8R4B-=W83XgV+DEsGE0xhZ{F;V|NT(V<_H zPDGK5XqShH5w_-wL3|5DB(xHKMVo7K7aZ1CK(Ay6GKOTg{XS^l)ApVrTF-ueE8lti zEVBfBPYy$(d8_S7p>?Rqd$HG}xn$dXNBH0|RRE2MhrKZ#ox~n-p1IDs^wW;4dYN3E zN+rit*i~sNB+tyWh(;>rls6oq@0dtHy(_4elqj;^OM4UAp1JJxb#e8JQmO&9<6HE9 z%*R=O0n2u7;%UDrS_!%~2fSqcxR(z+f+sXANizLw>A}8#=zQFX9?Y`@{X6qBYP!6Lms9D_QJTtmYe9sR=OO|BFg+N? zN<24gB0loUyUlvF^h}yp{dO?Vw@u<6=>_gC#&^;aNwPIbt4NHBt&6@LubHRNeSP#C zgpyx%p>ShDFYT7cu~6rJ0>_xkwynvnvC`4Y9z6c+j!vYh_Vz^}8N$evsxPVMd%d6Q z=aJCHq6hwf(B7>~ww)V+Vr;d3C>CV{kT)taE`E!)H&Iz0btV$Km5Q$l8I}$)khY0 zZub;M2+hCaMTKJgwr?RQ;e($l59Pju(d2Nlk3m2!dql0h@so{UTQOn6j!sF&1J9du3h5K z&MS{_ibqr%c-q)+drLa1mbRzqf*xl;AlCe-T=T$t9VxLAn?KBw4@l;-)(K464Sb63 zVjH^m{O$qp0fs`{($m~#y^JF)^|xQH0r=k5Rq1wR<;C{kTu73^7Ke3BDSHIoF7NAa zM7Xn#2^t6zl?_A!u0Ii6Ysl^`JM+S8a4?KehUC=F|8)712wRRMoM4s@I41@aEqaw= zH#WAPiTfQl{jljh#FI@+v8nIdldGG(#8=mGX^YJDG3rd-#=W~`&TRUwLEJ3;bJH=J zt|2~`cW&f}+fh~DXHsY;?Cj7|7)xuD-kePkVUfov3QNEq7QNf#mP5xdi$4E4N4tM83Jjm34t3NBU2`8z zH0<-)!#uB@8$r{W0)-r+t*)nI8*dDd|1ZRPWa$5oSj$>H@*YD4`*_t!^4mcRj>7KQ zX@rYTPRdLtwtaNS~uG z=Gv4*@JI?iG-%MV-a2l;Kg~ga&aj-6yyS}Rw z4ZjeV+&Vx#yuEkhwd;9bvd}k;^=@6esZ2p8lVt0oE6xo2KID2*?vvix-#b_@UQ$9u z9!ox$$P3h{F-0nm4vt-{U~Xj@L!$T$c47=W;ro;Ott@LDLp#CF?*21yny*9h2|9yF zX7@6ukJCqRT^43>wR&LO1sI1acP}>}aOgqeOl<=5Hh75^&&2 zdM8@oGqg0$!|zga5l=!8I_zoMxj;sHG8j=&%zi!WUas4D4=w2k|FA=+rBzxWK(N9v zV_{J|xr{MZW}c?PV&cigLR$dt!t)x@n6vxyZo(nB40_veEaA}aM~~NxrqYQRd?E&) zh{0{&PQ>67F&J(PL8HyaLVTLu+<|wz{4Dp%cpmLvQhXu?N3`sWrJE7r)ukBDfL02< z2Y4U2u=ObUKRVpyjmz9!WbQQ^uzHO+1hh(BfATr&$3PxAq+p+-(JE>ncy6wGM84EN z_-$FX+=U_0`G7$0{AD9C#e?oUOM3?#yeP;6x9y^=AH3dRZCorf!Cbc z;(kIr0V9y7_vp7_pQ?!yB&9kDsn2L*Py6LwMV?{Dt2Aa?op8Dzpi2=vt#81j5q-!PQVC&p!@bz zj5G6AP44>Pzk?B=6EXNi3_cNqt4ViCWIg@XI+D~zR9zY9Nm_vlM`8(537X#^cO7nS zUZ~#-K_g$N2)0XQJVbYGl$+jWA4pssce6wp z#&39;bH9WAC`bXSJc|%#mMisUtcLemK5_-T8|w3$&zUt54n*l4n4gHjCt~o47|Y6^lmp+N&qNb9Rc-oc>tG6PqsG?CmN)0%jV0P(x6aJrRS^4fI;8 z$$DEpy~#@>49Q$GJdW+(@HP$AI-CBZZeau0;l0y9P!~$)!NXFP=~}IChp#?d+oJPw zng=bJ$nb=LtmCF?Eu`j8#Ne1gpsI57RoF+rB&|JE(sHGW##p7B&+ad4kAW|ddY8_4 z!aq;8NY&yp)$iKbPcm~gXH>QDk9T-U>4-|`>6X5}AQ?8hbkmIVT6Jxjw9!iWomeBB zXD|^6gMWW8&5R&4Tz}astV4?$4;v^U_n2NZbjml8v>R%^#&Ds}N9LYP%SbtEuGj4Q z%UZaxC@(gb&b3nSwl9Y@KlB=z2&+#GH|L*5ab6jsw+U;JO43)8gch?|X;<_X(Wi-) z=e+LJU8S)7f9&1YQxkyGFMK*G0xHt04OB|#9Ri4=(v&J4X`xD&PADQOP3bkEBhq^( zbVMMb_ufK>5L!q`&hNQ+X5Nc)b!Ogko{RhwyE{9(pKr4JLzLy&b4@n}euKAd^?VE- zF*_LY@<7S;ohM(rIWt)`x8oTX$k$TDN4!#^>;Ml>FvIj-fa;tiDxw%n6oYjN2IEVk z>2%}icT_l1+EGerm4OIZ3E{yb8^Qh_)UenxMCGRSu!c4s_3QT&@%7nKr_C9=x@SSrSz?q2Z3$Fo1cpBnN^EPW4ij7Ij3#1uC)%mG{N zl8&fBz}ju4W!yFO-+Q4^>4cbgoJ4+Rgf_Q$#j(LG=Shsvm%pyLIfj-V8qhJsrR(0%l`1)#?=;eU^Z+9P!NMp}IMt-(9f&N;#j^)WIVl+B()+P& zZgha1i2a)@Ny6tuFoFn1m}~8>!2s)AD}F}vXa5aGfQe!-Q4Ic{EC$0`JkbAb0TA`z z&xHK`#4U4*iXzeh!`=qHTcDD|PNE)6)Psq7Fi{UC>cK=kI2s`nd@cD6|mzVO! zHvN4wu;TBqgEq8Y$bwzi-aNe^>cK=k_;0#ffi>+bvrmTOsYO!+L4kGEwa#7r^c7x% z(nNn3ZQc#GaWu6l#<_1?{dT0Bv{?Gc6aGf(9)Lskju7*(x#|WwgL~WD<^?}3Q4c2S z!TE1fo*1!m7Cz=4i;xxyS`QWdh=F)JS|%?K7{`8J&j7V6MBM93PlMprAH7$%@2fGI z{#P~Zs7&eTA;UIO>(cM}bLF4ZD|HJdx}u*MFC#qlGQ^U1-#g)O4q4ZDe;2?ZZ9^4K zFj9Fd)!`R`YV03T4_0IwbWQPJb!8jnc#Qkqy{ixA88A}4pm@GB4z`DkWdL6X=qD7| z?!q|6zbPpf<{C6y0ovyX+?*|@S;Emrc6$?4ymPaEwv2K3j1L1Jjyg87?C-bHOIiBP^c(t&uz4JvAkm>#2Bln;4nibIN$$Gu5uYoy#cJ;9BWo+9)qnsdTl!&6mSZu-!~JfzF*hN7$ZTU$>kE=; z06zFLW!BU2RNiaJe#AWav6|08#5%=?1+p2)E z!gMgL5m3VVN95kLRbZ5vv?8I2ZRO0Te7cCGG0r>R*mu?WHz8%)kM+b=U_QT@!!2PW z)cwX)PW#s@iZ=><@*5Mog8TS4anFX^ZkTJ6$5;GtExr#oSPUoX!T(=9m?#Dl#bBZs zOcaBOVzBS0-E+@h3Gtn0V`IpQzD7Cl(cr!9Bcd2g6oY?CtiJ7Mi*8;hFBH)(Bba>X z``!~iSt8!4S^DAG*&IaUuS6k|zVT!>x+sN(&d1G8JV)KYjsBa(n9{hJPg zug~Vp7uY{pV@&A6heXC75@_?2h+=S{c=EE)S=X|7uFUJp_mPt&c%}H7Z-+Pa#)=3d z@&!`hpXYyg)dwfQGKF_T!!%x&eLAxUtRnzrKR3yKWLX}bDyG$_tUp=g=21x;C5fph$@U=#?s2&&Lt&HPdavXXF5y_8sBJ3)?OD$ zoxuxHZ?!IOX1k9n6s`w6KnjYSo=gX0;63ftzkFw)tv1Din5-O_{L_+)RlvGv29WeL z-ZI^5ZSWh9l%fJq6D<&y!Ti@=Rn9w9Fh0;=j%q6Gb$DQuw`immHWPM`E@2;V4nKf;$)80;jsAb`8V2^E~Dya+w$#ZaG5_ee;>@z%o9ok55` zX>*&f)Z|Mx{CbVyfXl@mz3HB9)52Lw>0??*Qi5Og>*pyHW*6O2KwkK>o<7?`VFEff zdqZKdO;^_RHXOqFwO(kLbTkD9{wZB2SH~ypZ=d$|e9KS}xcOmR_(PQxQq_I2!Agc~ zzGQp9q`PQJ*3)9!VeR$(DYq)NQwL2FQ^2k%47V;Af(-e`J;kI(qQvtxrayHm7HDK_ zjXF9aUtNK(dYE2SPHlE-8X%u)L*v1-A5^Q?@Yv^8u$E!wX(sgdiXScaLS3{ z6*^>{LE-r_dJoeAcge)Iq7*Tc^{?FJ_(XyP4JA{IeX?KHvcmCZ-VZDnTS{KNKfKaS zJ&+Nr-&~ule^>8R_v}!f46w9v2}?>E4#FXr*i_5x{#>d4mil&~yD)sTb%aXF3B^rz zS*xdPp*n*1?i`1K@Q;+Pe@RE_GM^uo@UA=E^ut>E^>CS8mWX9Rf+D-AQ=^zGX7TJd zbmb!Go@)mYYQ2nK~Wzi{&NDZjFF z?%B+^JrN?aE?-=XpizM@k7XtBXw5GI$tgeQ;)oj z(np!_dcpnlY;f^bl*=+6!2oX4-%tCg_mAp=IAG)~%dsr8d$n>^g%`V7#s2*@VCu#| zodtmb)wj@yH-EmrD9mqA$Y@MK%86C?T{JI0t^K^Qy><{pzLXX%9oawsWc^+TZtZEF zD`8W&%Dt8TQ|%Zp$wp})oiDeF>^!}n=gsBP%ml=bS57j(vZD2OH7UT)SFIkFo^&#> z$0~X${(a|?ie<)Rj&z~N0jJmdLlLV6ycv&FmaQ?=IXC@HIYT%twBsd_BS@%@-vpgP z-FcAzSS6)#ecW9iOBj-V2yyF)ARJRO#dwaGSrZSRSTy$S89ck0@6yH@iglB(x|X5w zcmn?3ivu0GfaN>e0|lWhhRiH@J|(}hZj8;f(YTZ$?mwYj-{|@J_tEhV&UG4x|-{Qra&i7_48$#g~D{??Xei(u-!8uV>CH?TR`yk&v8NMJT68tAU8s? zYuvh=zXSCAj)a+gn>k~n#CrZbl72LEL?O;V{r~`1t5KB8+H9b}Pg=#JqnMm7yhygB zKO+ytqoCZDBl;uqrab`YL)LNqMcu?Q9m_cL8-JXxi-R#aIzi~NK57iFXAjrNtL7UYCd)95j=Gtfc@1Xk^Jb&exdZt zSkp=|;ju?>jf%cu$BmgOP||aahKkR1bkp~rof=iql8Jsg)PeJE$4hXe^%II^OA!6( z_r7%FHjRm31QCqD%-%23$IhZRFVaf)0`Cqj%>>2df7Gs2y38cc{;e*tE>Q=I3T<); z`nX#oCK{ctxMRfQ90qMB~KFu zYo-b5r`KO-Wc}8&0;i%AC1TKaydGk!UvIgcBc3;G+i^Ga$x1wmiJ>~XGNGsMx%Wi_ z)B9SJ2uApjh6t^TB3?8j?{#=c@!HT-W~AC=elogcGntweIQ2&c#@N@6bH;8)IaCWz z(f~KJz?r>bOu^s>aYI+Dx>W4)*j%GWQYpoCWRLE0%TB}A)=m=mVXCP`RJ^bcK=a)b z-0;<$8H>g!gXh(FL2&%Xi&X{pN*@I1w?fc`tDTc?Yg+uMm+`eT0cskPqB?w8ycr#6 z5wfKw1=3e}*c*4;rR*MTl?twcWMv#%maJM7&g(jD<+*pmQE?*psnTs6^KyPaI(1z5 z>8nCdwB0so<6x;rMH16>BwV_-jqn<|pf#|ufv&}8Nm=jo!xnqYc^Oke1qD9yek@fa zf)PY8!dYDX=&n%=t==-%*L~*hR}?VQ=M%W{v}IiS5eDPT7C74_YP5emI*b49y{>oz zU20*c%6A7`wvtxTBqkE3GJ}gw46Lh10y$O`?{O&~hsTI&B0jCe^DgE4BHb|-b=OB-psXvpm4Cl)rhdrO(~>{hci&y^aO zw+fqIcY_1ZpEn%@Uxzxi38b{(xGx_wN z8TeL>0;sRvv~`Z@-{&&P-Ym71UUm*bLv?ji9AQ=^{P(1WK2Z!l3h?Lh5(`ok5&JqO zgHQ~?;z;al6|TldQrXBla}suDjb{G}@PEh|@pxJ|B=?7TTLGBr%L)p26uzO&8I4W6 zlRYws<1x6UMk^hea;kDpar~AAOB92NV(|Y~3?}?P1S4kO2c-VD1)#tgA``pVBsaW< zq-ODA6sKoK4Hmub^U{~%dYm-w6+Eas&8YuwwPl;iYSU@qf=_~ULY6}n{_xgHO7HNO z8bYJ;5*7~7S&EkM*m`rdjOO#HT+g!?S7~mI8EGh(@Q!Tm1(mNsk&lNb1%d6ykuaGL zQAPcM3&~jwH+L7mnoK?SWBc@BgNR4`PsSsNU<472AO)a6!4QjoJKl=H&qimu9?7h` z<`TgOA{apgBZy!G5sV;$5kk##M3Gq)5@nchMTit>F=Jw-lpIbAG`q`Yd<*0KzYL zQ&#-I0Mg-F&b4nW4&3s+P2;%`xygrpjjj(tL@Q?vAMFkNm*VO{?Z!H6iL9*mBY z9olfBZW|DrL@Lyv7KO!E9=FOgNcB{M^g})YhBUo@eI;D(>wC;!Uy)Dy8wvSbKjD89 z4%)PV2*m$;qC9!YWB+CE2#bj;y3pvasubx)P{UPeXL_N6LFee}VFxQ~$+3H1;p0AVJsMHW??U{(Yg#)ZFB;vm+bds%l(uL#-O-4^o z;DxBR>dzvI5%9mlj#v4h&`OlwNe!7bcB-blrf%Kh%~QJ3WTr|q-grq$=~C>g>xbme z9+I3-v~ZO{AiHgC3g0Dp0*;~)T|+_vI@!*+g?kXfqnMGX(vWm38h4{X%-rtcx0t(h zcuQ=30B`o@CVUtnp+lB0qkGgiC_c~jLj(B- zn$+Z?Edmp`5Y}4V*(_=B;fx&W6``7cZ3f1t+_LK<=lDlio^nqT5)k88K1y%CP z*uKHYy3p9)*g*xe2z)9eELUqT)){O{*Wx1r)KOvq$QwcOE&7UXVm3q)uxA6>IU&th<^j}Mvs%!!^*L%z1$4Q z`&R3sx~T*|wRb0w!=-1OLR26G-3ybHt&r`(W#DU~80=`0*O--%+Mdjxp&F2D6J0d<+s-FPB&p z_$Mzol={jsl#&YUmGDo$V$Q1zQ_wYqzO!))WmO!bYU_4o(~kGhX^(%QGZ_CglfCMw zS1i%{*c?<>;@w#IItTH?<<3uc&lC?y<&@IZzw&tPNuwaesYD)*Ex>fHq?{2-vGt1Y z&P3xDL^ZSQ;zs>7UwgyGH3|58DXB-XBHj8{n!NDkq_hs1Yy0|(6Q*9k*Y=9o^W6Tc z(VRn#GQY+2$Q}D%HM#x(?6rL}_86|WM!+lnge+ou*Nc2&w;@^D883iws;}E?OVI-r z_XS^CFp`#>4REwat%rwo(`5NgrE%j?xKrI*#_D1=>B|Q^wQDI;?mK znnZ#1XQB|@?Ee5#g=n?a?N#R4ZFAJR*wQP$Z#=me9taMLCX~U9{y-WuhsYSo1mQDPI4QIbAf+c z>2ks=pyvy-k*oQurhnvX-1+??Ny;s7*Za3*-xrE#Ub)0V8>m;}4jU(JZtPO4oz230 zP?rkhC6E6>St-r0tu5|yJ<#>-PKV8v#$<*Q&i1(D}*gG<<&=zsy z-g{kl+%@}-02oD!ZY+POf8#B)!aG2|e&_T>5bfE`c>id>zr~X#GuH`Ry6FLTTOm}B zEf|+|o@JIbQ(L!YnOXI{tez_QWQD)8x3pDS8DgkJMJH3sUt3) zBiKrq8wGXGTV*YacFg^J-J1Ht=#5Pg3*%E|C0(zw0fdnUJ678hPS@m*@4)JXC*dER z%7Ns_I;~E6Fs+E?d+XZJF`nM^D7WBedcwnsJG3^q-6c&dSG#|xk)E09+CfVrHY}6* zZcpuKxXP<7({yPV%_303pYHanU7>gTgDJ(+pT?M%@a2Dwk3(w|MTJgZ-3?DUI=lND z3}3rtaTkf*TqfZooTDs$VIXOkN| z)o!OJ_|HH_2jqcMtNO}R`pBnB{{j-tyyA&3MWugW%9EgYA@1O52ct9Jla$S?Ap2#Z z2$eZI@9_I~U}z%oZ;O1RdLR;iU?MOAJA}KAI+8vI1$e&t*Xt*M`;V}-2h`EH0EYT5 zg@dyspkX}7-dmfXK3^dRlQ_$zil%f{cWLgtEz&wahFaV|Q}Hl7*NZI> zjdR}|*g%8R-p`~}RtH{yF`4?oLg%{+bM%Bvnh&CzP3yXk=#MX6_M%&Xpo&w@WxesB z-&wOFKo_ z9XpFiy9yOs4l6I|RA|yty0d12&u(E$dSBp)?^DRUDsgT(@bvok^u%2=A&b7vhpq!z z;U4&^vE5+7c>S_S|IrkdLz)t25+bMgqyZ%Pt}0o-?4&sPXsBD0u-c-1UCfAwvd#RL zDy0?4JYb=s6&P2F&Ro~htJp$QtQ;q#|2$>6stMOt2pXIdGf#m&q=)1B`vZ|(gdo2) z`fw+#rMJgi@(`miK9u#!Jit!LR4nE#k^+Ts=!U=5x;EuJ z^*DI?S;$hL`(w-zhvU2dpj=|hc7INKj>G5@1-6vlLZYIk-4JgxAux&6Nro1u@5(Vx z`v>pKd-qzt)vE>eaQ6cGwe;gk>BnEKWgnsj<~C7ae3;I<*7Vi z`EEbF3YTanwtGK1Jj0Yst@f-#pzPUH#`pl9-WzZ22($M z&#~9(cR9}@@$X$@#}*;!JAc4~v8O$6k#7BZXqK7Z^pWj~D`=0fC|l!CT;z@|A$~7} zLind>|I_TwJ?NBs_dJR%wY7?>eLp#7Z(T-L(0^mgVs4*67wpY-i`*K(Hu!sRRzY#j zqxh}7)8i!P_qK@5t1t;k0*%XoKPR1tZ($hVh8 zij*ooUYIyQKID56zE@Cyu!wQ@!7rse8CeEIMwQHH!gg2 z%QMwzmV*50CkmZPnJ@`d7Z?XfkjmRXStLiceIiQ$#y8_&O_#m-`6#nt31UoxAZyphzxUP9^hc7V_dS z2cY92nb4sILJc)!XSg32ch4%CW)xhkmHIuKHJ?7#CX7}dvQ2dQTqnluUfEd265KL; zuc_Eul)fVFmMz`A-2Sh5f-{+}A6X+6%CNf-S&T8};QnCV+}il0W!tfZ%_}SNJt7^95QDUl?)xlZ(_w=&AFHbU$%|E~^$L88| zR*dG!V41bMS)sJT;+~lH};p_}3lS@Kedc9R;97wUISCc;>0(qy*Qh zIXutL<5zL|AIqkeJ=VH21ix8bmNa|9{-DVMZdzs}h17E(S>@sAi=BKq?#iV-j1oCCsy-yt$ zab5m=ap@Bsjgm@E;)ST%=jp2nbv#a8NwE?v-c4qj)(~StLuE9>cj^*Dhp>zfRXV$M z3TZ!`G!Wcwn>DQ301=MEl_7hTl+qQhJFxuF!WL8UfV;mCuEE&>zi7+EXAlu>G$dZE zDSljI3MnMXEg}z0LKb@-uX_#Z@RaloZPXYHW6FfjH$n3N3yp+`V)M&qN4RwXNYycx z#?NMo9x6JsGRr*7*3_g?#>n#ha-<2*$eaQ-#XRYfmk`GEUZHeSkgikHhh3IGAgSX} zp|gbBE%Zmtn}0Z9&immP{PjEK_pt-m~B@ z%yd7{4Bfb>v;BoH)F!k9(M5={7Bo5L1z(ev-Mo~M$sa~~hgl?4l*WfMwOe2X02e1$;JPE@rhBxrXJEL8m@H1#kwj6U ztJ5S_HH+pHFIu)Fivm$v_<(Gz26xrwS(3EJ(NBk`p9H8@kS*;8vr3zUsB|IkDKbo- z3_garr7k0>pZopQ+WJA={rt|JS8gF~y%AYmde4r(8ok|MoO) zZn}kf%r@kO3%jPU_|Z`*U7SHRJ_RuJW&4TQeYML|71yb8j!k%OmTY6|l^P%Tnt849 zG=}=$m(75w;!vYtJ|`L8SXT(<{Qg@OCp-U>xHwh899D##8GpZI2_@t2flYg*@p?{# zav1+Ii(rtEbf(HDCPw&s7x;%iYGo*Nk@q=vudc08YN79>frBc|y6`2Q{WU+c@q({rL;aURe2>dA?lzlf*eK;^ z@hu$J@bzDZyV^ZWipv!W)cC>c8Ss8xTP7lQtmf9m@%UsLD9^}0?ysYB_SLzt4U9$d z;pL`I&X&(GZfiOafdGxK3^FATSVhLc&(+G63?czFMtQlfo5@~NgzqwchJ?8`|D_?@ZcXM+bHRx+0NVHkS>nAvUw z%t6)j=W!lgiQ#qVW6<42hTr+xgdD%Ou6UjUea+Tl%;D+X5i!!T&S#;1pMliEgMrIEMpFgEaV?!A%(eX|R!9j9QL$ zY<%+75rm!h#7xO1@57iIH6;+N`Rw5IVI9-jEow>s3*5+qA``_1413VIDvisRqJC4u z5QH9&WAliA+jBRkzBdgB?p&Fi0Io9MIg89VyP(gqgRVDmCB2W4%z{&gJ0wHy`|w2v zCLpjQyCmDM@tcL>OVPrTW)x3xW+B>yuDSeo*sbN4Qg`?**4u%_H?yZ!c|4fjlfVQ% z@n&B4)1EB(1phj*EBz&=Jw|{4o5DG{U*_E%+jRNTE?7`5HzBC#$w-jrb146WK}7&@ z!=1+R3R~;-`NwC4cFFv=h~*TZt#4 zo|c)7j)<3W&GhMt3_<5lC=R(eppAUUClVI?0rxYRRU|ac@n=PU)VtQjY7``VZK~h7 zb--|TROrSI_swqlzQ8XXd-VFyB<6wi-7S-FgcpB9z;&1ThNG2rO3{B(gFKL;z_>ld;Rug~( zX`-sRn@p@_a^w1jjVmS}Z;8Emh?L^j^QMdraS1Xg?()Jq8t%Di{!)Q5&hzlBZwYNW zhY1;V|MJ5@|I}OsmOfLK9GHXHEy(vwo9DOtu)=p~lcT%NSnWX90W2y0o)P(m zP7p`mu$Z6aafy3A#Zq8@ zihBtE#W1&^qx!XvI7SuZppucnT;G2NIv61nES?$vXn#&-u$Lec$lOm&8Obb*E)@gf z){Cw#KeO>!d@EBd6WZctKlA}cHhecx4iifc+D80YC;X{ohDJ&yT71$##&wN$1FA>c z*7`xMFamToUqD#cjirp zB0QGgkf#jWe$!y%bSr4PE3bYKp%N8N{kMJJC{aP&$Fc*V*H}Z}{ieG~&(Ch%;DnCU z6n2T7W%SC`uuean=K#9WcW^JdmkivQppV_H0UxcQ0tyY^Bm%{5wO;kNKa^J~JpEc@ ze`bo6u(_Uye#TX95rq=`yn2a4I)+RyHmbkh2#;gLL<9GsV<{C$P)&E^I;et0Fm#|9&fK{lvpD^l?VN&UgD@k<@OZ#|^VI6wcvX!`Fk!_Skac7lX$!_@XD;=~9wbJ_($37=VFf+O5{8iTk2xP+|5j0k#G;=AB zF$%2;+B2G-okLYTz8`6?PBY^N7Cd6-!LfEr38>4-WW?U%3!Z5g6FcQ2lXr!HgUJ>! zMkHZkey5t0_&Z8>pqg)U=HF7j3jQ+B3aAN~NR!U&G*g>bU>G@ZJp8_NQv2)qZ6X+f zqlD{*jt@0{(Qn%uq zA`oi}Lvo0UeDaeq%{Dzh*yb6UfAR_vPC62F&6hC0^hLyeDLO4@_UYZ234x4tA{apg zBW{zS6g8~L#9_^&VH)&a?OuianQbw&De`X3vXaNijGx95Xk7?9nr$@>t?>-OWcH?B zaXXjhfBn>Nx8dq6+Qq6WoF8+Y^8t(;)q_FX0Q!HsL6?J#LtEM;ZI4rVvo1v+{*BQ_ zXphTBt!z<>vW;q)Sw=mECe?@5@r>~-TV)O9j4L7mc)#TI077{L#M+qCtmR=x*QJI_ zdb*gO<3bB~uSCCj^N-;5M~4BxwR_+7K40!layZxH{Y4>xhWcfr%s0%3CqjWYuy7PSor`C z$X?=A-FRs6TJ8c#{RIiy{LKrkgeEAvY!Y>5Wxr* zinXBBJ_`F_?>x#huI<1b4MXVwc6K4Z6)$h+6+!-md_ML${CI{xXx#S+AC6+Aahq!# z)%Fve%;Jx6f(3%CEM{NJ?`xY^PbA~uBNkkVli1@F_q1UsiT@j6O<9z!>Q8nk1X}3F z)HzIJBc7Yp+`;rlk>7>fNjYD+y;nBvMNtsk0*4lmxWJpyDD>CLHh+E@5`jva6PEy; zOf>osrVLBG1{aB7M8RO|piA$!sn!d-Cohg2r`juD>#YnADu$*TjQn}p;)N6GAb<$R2W9i4SE&G_U`EXC855CNJO2UOy}FxuejTXqTuDcm zGn^Sx5+1bV3&jz^2n5yTv3p}+l<)PXHaj>_26hR)?76^C9>{nhN#(pQZ#)Js(=cX= zF^wJt?-%=-Jk%+U?UN#;P4jp7yZP{-*KmfDzDz&e*uz(HlD_k}Au|I@6rH zOwgtuU`T?vVFT{6iyOaXDG1?0yPJI0di>jm{gYA2hC}1WUnN8^f(S+s!3ZK4K?Ea+ zU<472Ac7G@FoFn15Wxr{7(oOhh+qT}j9_}OI9k@fAL$dlb3*-cJj_b-4H#aRA|nx+ z7ASn92P+(Na|E~hibhmn1T&Ua?shIIX?oJJvpdsaV$k?TTe9}LNa_q;hf2@PI*TD}Gnsu={ z2S@luvHKCetioU?xrGQu{NDs4#0q1xNl2dhyirxw6A2PDluR-9$$nYO3dfsyKd@YE zDS7q&@JcuJKt`;7b8WKzUAf43x!tl}7 z5h^Js6gSyrt)8-l>ImMua~uZ3KT^8>B^{;9e12HMyY6(;4{Pby!)10^B9;XSitMIN zjbg5t#k1egr85AMD_1=%yPgM`8-U;Z3mG8d5&xs`2qG9k1S5!G1QCoNf)W42!H6#i z8Im8(dSd3f*cO)5`6=c?MY%`azjqQKlwEzu0mQB70~16ud@2_FBu84+#JB^Fb@E## zSw*n4e>9pKnDt7OMs=TOrR4zcuK1yGXoeLyg6vM_K%VRK<4BUQOJ|*1iw4hyPaZA6 zebW~6;61Ci4`t^L(?XIBJ+)7hi(>RX-thenM5A#!S`}!N`u9F2t^rmsgE!jqi?$y| zu3)2P^mp2I=S(?dz&2z@kUOP}+rLBn^Z^spdRdldtHu-Jvz! zc5=Mp5l6{g+X!hYDl;*Rh*7e@=e!u}9Vwo^qJGU2?DFwXR`--CmKcv+Bt0 zvnMZ5{vpA6 zX0YQa2TSyXS@ui{K(}HsAJBSjroXyM4hpg{-Hv%k1z6sD^p23(%h>)9elZ9m)xsaF zOHqSDGN7>Z?%q%p5Em4!D}z+eLjv3&w=(VO+d0Vc+yRqc5!h*ih9gMOo_^ZROk@h} z%)^FT9~8)r+LPxcJ|VB)43!YJ{2&C9?HAMj$Ofjm%aK;>V~cwV5^!zc{&Yb7UpU}u znL3Kzk@ zssGw0&|l9te8>hbW-aGVlIg+Ex1tlH&>t=bmldbM`KgCsGE^%yLDor;@;?{VjEzGH z|L!cZn7vmZ#pIrC5;g$^eg;pA9v)_FkbT3bVKZ-X2K4h|0Lg&72Yteu)$1qy!M*$Z zArHFKsth^W6C-Nmd=;y-%L=+CnRybmvi4Vju&28b8|C}O9O|}Q>;Do4kOa}ZO0kc& zm_x#eObO0(f3m5L8!y9LY4gvszvva$%2Cu0q#qb=z9ZLOT!?)qml5Zjxw{b;GY=x< zU*dBSCJzM@P#}12*igw%8$=PWv;(3;E~;NSw8WNH0u#F%4o*T93~zs$y5Ww%kWRcM z`~Ez?mu1qionA6}WvQJap1fCjY$>43p)M^5DGbM~?P;);5+)1wXvEIQLG6@ghT#Do zSs^?<4LD^ViRXE5k+_%u=`+LG&-2Lb#P=KP>AZ5>{zn`k2#fX0Xt$uU#=1U~cFC*K z3mLatmklI7fp0${oU^S2ON=*l1((wzGw|I$&?{Yj98jY2KM?DkEIL3u>`Ue)ml0B? zKkK*oF!E-{DxbuI9g$NIHPrtqxenAS1boSriHVEDz#|CQlOArW>GRIrjaorQ&3E|K zigLTl*^U(8^$Bg&lk{1j*lFAOP)MU4TN3={8hZR|R#N6wlkE29-1~jgjt^hE*_LG{ zviqKdfZB)kHovb@ay~U03Qd$}X0BL;BuOiPow`c+K2P5ZXL}!;^2~Sl2aKceMHv}N zKU7k}%f!Z#9==;8y%SyWy}CtC0tKt$Mi%2zo4(p=)NJzG`0APjJ4olLOtfYp$l~~UW%_olh@L> zR-U#=M&!3IeVLT^)m*_^Ra2e~ODO6lpmBrqB%eCeb{n>EbnkMdr^3<44I++-Ic}lD z1bzm?bCvw}-;&^~vBg^=mG8Off`U4bn-t80wF~l86Q4=ZUrk92OWFUUBOPpVg#DP_ z)ais|YT2R|CX|LztQOpNBxC`B#Ypw(x=8E$@fWUV8?shF%xv!Uu-eWlbHG)+WVV`Xv9Mz&dB}Wc-)md#So=3dYdP_B} zt`3E>Vm9UO#JNz@gs$*n&@@Wb<&EJtzLfa>Yqm^KTB-O(&v!{|L*eNncvKlT2y!pb}x8A zFZeW&b>HPqUz0iBan`8%YaBdy2fleCQdzHV^8(l;A8=jqW?8#2J3(q`05tsCXk7X~ zUZ@nqr{5$XLa9g8r*n6wQeCmJ8T)q?u(M+&0p-7m7SR)44hLcsdJC(OH?{}#fO}~W zcCXqj^#-*#)6a&2tVU0MgNzIXoPB;VDRsfONos4JnLK_xQ& zG}e5r7b@992R{nNSqx)hj@&A3$1c@=P~d-l=N7ofTXrHYJh=ElbB}wNF_aS7EK&2> zjKhOOq|N7%mvv^4NoP8r*6U8Mc7-(1gZ?4&k`#erM3nK9g%B85#F-YCL~*FQOURVH z#=3*PcsHMu^3)f8PAB1AkCya4`8vGoM^?Uj^ad4U6jD`I1rtsIq7SB1A;6V?ATfx! zmGnYq+UOS{qfP~$;5X!&K27%L4)^B-^4wX!-mAAyNS!Yn6JE zmhW%+c9IK}3}Vs-KxOG@laKp@h) zhi95GzwkX&j^{PMkPxuxME#4Oqvc7|*?NHxV!5Yf?fUB{)}g=nnja{bHc!+@0*Ees4@KS1*Ltkm#4v#$2zzh0FL`ezONYOz1gOl z^!03b+h&D2J4H6BeGUT4y6f-{I2fhrFCQmE8*XJIE9Lr?E2L%U`Gv8=D0n;i#XL67 z3x1HOp{1z3x9lgD9E_XS+_%+nXPxP?0^RG|C8q-_^!;lRUv{xoK)*G2VT0BQZ{a_R zyZDZSCA45{r={2SS;f5nRcPs6^KGPjPng>gzEIB^3%*S5xO z-fM_k?T7HcJ;{@C^&-!qg~<2m73$~T%qd%EuSMPJNg}==o&@riZ>GEnUKNHR==Dy1 zW(_gYf7R!iYPs4cxKrgJ#Bl}DsZN7GngM5A=cDJCSpZf6`SZK`;NU9RX0@vt^~WV4 zkrR&FA%}aww1sotXl1nB(Cy(@-|h45W;yuun*|2`Z3{oa{1obO-(jauyg7JLs!Lvj z)0*PNA3RGGo*Fvc;O72rtRe;(ZZ?Q@F`#+=E@5yqq|ikU5>8>*E@FID?IsiibP0=1)Y70hiEWdOOH%4=9g zfq_5~g`Fva0tvlz+*t>4#!`pj!iX!|S6*bO>06MdbUB7cPrnQ!UJn>L1>n0$4;k({ zBl$LW6U#!`er7M)#iTjzI27F6^dV$7cI=m`RCY+gX2Iyu55X-HG~n@XTRf|3oCXzF zcRvC&8#myoJ}khj*87dq$Zqd#XLC zB%R#-Kt=JxZ)7@zvfGn>ILsUjMLhtW_={ZBy^pd8z6&C`+ByO%CEqZez_|*jH0PPb z&C(ySjBnEaD5UI7kH=>^0X!Ya#4wh3zFmA|W5~u##xU9VXQKj>(DK3$Wii zgQISXK3hpJ+4hr8@tvNOyUL#e{e#oDj3}f4KS#fP-X$}6j47?9Ev5WLg<;yWq02g# z0izH#6AM@$!BdX$-R(I>Ql>tT48fbROzwTVU9n4k|7Jn@m<+0VQmlBC7IXA9 zhm>!1xT)3{h*5Y`NL`M#;HM%rages8#Z}?KBCkf4Oa-~yE@tWExd1SM$KBD#QQPu#L^NrCxWYL2Usd79 zN-J0R_qAr%UJr_T!_is8NbNH3t@e@eo?lN(SFI$r$J0p~%_o|IG5sba2+|~AsbDNg zh|+ELIFT|=aCL3p+JC;gyE?PFHycksmJNnyl)~Rb6rT{PNp=5BTXnSo!~@O7b;jp} zRB$I3)sfmqC`sg|?l(4J9Q|_eDSjnVr|vdh1$;R{ohXDBYG8b1j9$t}y4_h~gzb9x zK2!>TrEuixYOYT?umnk$-8l!)&H||hW$_9xN^vkKA{)U*P zYp+el&Xbg~Y2N59(tbXFy>{d@+9zvX`oeEL=%mCYX6>_<)s=C%vryfkQk1<|=5@=i zN=LJgVNCAAS&{I(r=9a)Z;4Be^R%Pxf**x>YbOfK&!2(4gbIp(GalAE`~J@L&QVcg z#`5s;I{yoDOi4t4ve58)==Ict6-oq7E#&HvJ5!O+{-U8~-}Jqc^Ujn1)!m)HL%}zC z94AuQ#%)d1Bo*DoWXlpp$u3fs5DJ;HWEqovX0kL15p~;UOl2)=!dPlXWQ&>M4iVWV zGsrduGh@cg({p|~=eo}GJZF2Zb6w|r|Ag;P-|zc}&+Cy%>$)4n$b=(_0-RL}P^Gm6=_|KK>&YQJt?qxbny>lYozR@;!D$V5rfJ)f-#H zu}A&-iWP#;?wG6BunNg&0$U^P31z{RBOWD4a#N#+5)HFe9EQV(Q#8>BoFNbq&8b6Z z0;wmJ$ z#e$AsX{^U~NS3BuJ16w0!^wtLvGK8P_v^&N5%yOylYBIZ8mmsdIaS?Ng3Ho+%d(XI zet<^+RFbcml23|fuAeVM{CZ*wTNxpb4Upa@f zUqCY|dRZsBMDfrcTyN9nD^5=UW79z#1NgqP_`_QDU++fwUS1nHe{JgtgfAJ!E@^hp zPJL!7mg6jgvbPD1I~NWjM+Nw2ticFQcUF3bx+XXx?{yTzB{Ok$zdk4IE+@-rUVphS zB^o$+r}VNwuRB|L-84C}3AjO(#=9G;VdXMLBj6s6Jud@5h~>?g`F5&u1l%UMLUSv9 zB_!UXQFvH+&n$C+GoCNjS#5vLDjDCi0k|l$*=!_m9$$1kg!GaOF5Rd&92>a8*(|vw z)({L-U2TVxfq7UtTMsk?QhjoPN%o^uZiz68C_AV*xZ%?mQz6Z_tFy~zA6nE%HYe@&X-`?QYQZpQ7l+Awuo;G~FiC`1O zso@VOpHaYc_WlQ7fp1JtgR=ETh?GU;I_1JbwXDm0f0zXPEa$ebtMI2nd1>3BR>oaJ z@ScLT7fxtKDpEeN^-NNcDb{{?K_SL(v&wlIDxla#RT$e0ZZ~SPIQOl;z?(!an7a** zz;#Dl0%jC8dRN*EK(a59LR~ACL=Os1>{MM%S==6}8J#USmSTFk>4I4|(d+ZLuvh&< zRR#;}0@-3;zm^!5N4SypZP~wzv%Z8iyFw|5lMZj1QXSjIvZk_`LfjMeBE6+M2I+;6 zjrJKgiuHl_>?eRePg%mj9lX)Ev?D*QP^~(RR9MiFvSJI;&hyt&`G1{W zzE4xg#7-H$io0(bBDrfUt-}7Zo}@;&+8~?YB3w1924!hJ0f;xUF%Rwff54+Wvc`y@X zs(KfRoWT^UkX&qv{60Wd!uUJ&xI3%uNbKt{2=HOfL+I;`f$r)bhxatY>CAVh7cS*@ z>n`F9;ZsMD;8u!jj!Fekc?80r>Y_01YqQl60kY9snF$ur$@Ys9kfEiP?V#SB*NWGS zZxG}up35C{HhDy#mH_==+SQ&=r8?3f1~K0yTq5^pA^gTqj?5zqj|0-p2LW4p!)n$` zT2z&C*U(!`$5{Kjs}}3AhqB^b;_XVqnwE~F)9>F;Ra6-F?KATbK7|DNWE3;$J^gQ6^(H?GF-IJ0 zXHeNRwRQ}4?@@yst7+#MfS@payhOIO+WF=Wt7Z&cyUhxd+Nn4RYxu4ss8LHTTF`J* zdfg$lE{&kl*rjN18YNdcL&G>*hj(&`O52a!*od<2gA_aIaFX77ndI~feDO5Z^aO7r z?=G01G3~*_%s$;(RF<8pG!Clro@uflXDlHxWpVSfALoyVncfLEfjWBPYDASD;JN0g zlC+oCYPSGcX54Qb&gW6pEj)4bSEIdPuHGl4MaGbbZIWz|W(T|U%12#JiGCKnGERRb zjLfjkw)#?S$Fzs}_1$r$PA%x~m^n^;11oXiOJye=d3dz`%RvtmhwIut@ z7|R(DgA)veEh*k_B(Tid>U+~BoY6{c83Qs%sm|h_TwSd2RDuRBXp+Rq$#dfq8OD6U zK~&8aDO4kn{xXJXgFhY{h{nRlYMH@LF+Q6FfXLqD^{?s)1ccm_TOTb+o;MR4Vg#-) zVgQ5D)pR9<>cwXWt~;l|sZrf?-Wt4QMtDQy+Twxr9gYT zo=Zrm;ah8c=L^rp0C=#`c+p=3-|4V?wdX3WTCJ~Q_iR}F?C1CU*fMyvA9VWfD_JEj z@S;|lwFF))pUA7V5XjdOEO7?ITC1)&SWN2o?UiC=ZX3!NZ9j3_@HyjSX`X)T^X;Db z%-zT1ZUW{Hb^K}#;!lY|qSoVmu^x6Ql^`>9jL~=}0{)Ntu-AXF4-fty*5%wJmihc6 ze_NN!{TE#h_fOO1y#Al-a-Tmv{~&c&*0&Ve?Dr-{Ja`yo?gLzpG5px2t)ZVO*yz>% zUPYl@?&rhDNS8Q6)QdS-i*ub?`89WAeZ4Et`0lU!E@hC!e3saM!d7Mvru^9TG--J< z<_K@PgJ3wtvbu_RT8He}M6%>S+03>HLfqqixq!rM-1mv1d~(cjtPFDb@uP4>ER?&N zvqeHO3Z4JXT13z6-0$1Qh$M-;(F>I`%#sU3?*L}{9VS!HPSb`Gqp(v#jf;mWEqJ;A zSeN^EeHelHU)1IJasQk?{6E#@0IGUk9vpE&xhR&(o>=V>a%>q*&y^w7-0v=S zmaaC(XLikFmA-5iVGoU0y^R3}%N8yj$_xY1hKyT!oiC4+T^P`PT$~$CFPC_m#ApNZ z-Jo#FdF9}IUEb4U55WF&fV555v#luP|9ZZYv1>OKM0w2 zt)r&OTs?~kb)>rYYQ6iqbi!_l@yhjp{(o*QLjI5NWAvL_zh4fMIqhoup-D|9B4d#) zR1<%WvUuWQ=V7$s<%MjyNujx1-NDG*v;fet4K@)F395hjT!hn77bS?)q-c}PTWQkm z5&9?n#p(+4{L%N^Mg2$e^5aL}7!u^V@!Vj}eA?amvm;{Qc?<&Gr6UhVWLX95uAfSh zC`uTrdRo{&?D62~BLL>7Pk1=H|2gnC>gxx6fS)~fUPT0VpEj|iQ?b4dh}L08?Pb&V zYLeTlZ1KkOH6AfoB2)jGc7a1Bc7>l)NzblO1UI6eu89qD7pPUX)+MapybaVzj^Yf^ z=sT#)kzhTp-@oQzt?uapIShZUa5MS{^pHqbZ{)oxaT9^4e3#Y6KVR_&6;Vx0;39hB zR6aVsXq3PRIJ3*b6^`|n%xTx9bdipykL**1$EH7r-o;ORj-@_-|4r94=+?k4YN%oM zGJnKiH*oOXb}_81fXiQd5N2kiLa;{Vi5rz%WY4%9~8@i*Ba_ zoLZvx9F)D&;`gP1zx6&kGI~9u(&br?Ry~m}@tL@={`GF}xlKNisVVvk;nvc#Ql zO%y}xuz988Qji$xS}*Zchv6HdqTN=79-P-ef+IdODKH;ST<87Kc@#R(z!GvPaOhU( TKmSqS*Rip1xKwlTX5wD}cM(}@ From 2563e20099036b3305702bd4ab4dfa331d8b76d4 Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sun, 28 Apr 2019 21:11:29 -0700 Subject: [PATCH 15/35] Strip example page. Simplify for test cases --- index.html | 144 ++++++++++++----------------------------------------- 1 file changed, 31 insertions(+), 113 deletions(-) diff --git a/index.html b/index.html index 8ec89e7..48d9243 100755 --- a/index.html +++ b/index.html @@ -1,126 +1,44 @@ - + - Color Thief - - - - - - - - + -

- -
- -
-
-

Examples

-
-
-
- -
-
-

Try it yourself

-
-
Drag an image here
-
Drop it!
-
-
-
-
- - - - - - - - - - + + - - - - - - - - - (function() { - var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - + + + From 621ae20cd336b2755195d5382dfcc5b60e39f102 Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sun, 28 Apr 2019 21:12:26 -0700 Subject: [PATCH 16/35] Discontinue using SASS. Simplify CSS for test page --- examples/css/screen.css | 89 +++++++- examples/sass/_normalize.sass | 224 ------------------- examples/sass/screen.sass | 405 ---------------------------------- 3 files changed, 88 insertions(+), 630 deletions(-) delete mode 100644 examples/sass/_normalize.sass delete mode 100644 examples/sass/screen.sass diff --git a/examples/css/screen.css b/examples/css/screen.css index 783b394..f903654 100644 --- a/examples/css/screen.css +++ b/examples/css/screen.css @@ -1 +1,88 @@ -article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{background:#fff;color:#000;font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{font-size:2em;margin:0.67em 0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}mark{background:#ff0;color:#000}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{border:1px solid silver;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}button,input{line-height:normal}button,select{text-transform:none}button,html input[type='button'],input[type='reset'],input[type='submit']{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}input[type='checkbox'],input[type='radio']{box-sizing:border-box;padding:0}input[type='search']{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type='search']::-webkit-search-cancel-button,input[type='search']::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}html{font:87%/1.5 "Karla","lucida grande",sans-serif,sans-serif;font-weight:400}@media (min-width: 40rem){html{font-size:100%}}@media (min-width: 64rem){html{font-size:106%}}body{color:#777;background-color:#f3f3f3}h1,h2,h3,h4,h5{color:#222;line-height:1.2em;font-family:"Montserrat","Helvetica",sans-serif;font-weight:700}h1{font-size:4rem;margin:0 0 0.2em 0;line-height:1.1em}@media (min-width: 40rem){h1{font-size:4.5rem}}@media (min-width: 64rem){h1{font-size:5rem}}h2{color:#e67e39;margin-bottom:1.5rem;font-size:1.5rem;text-transform:uppercase}@media (min-width: 40rem){h2{font-size:2rem}}h3{font-size:1.2rem;margin-bottom:0.5rem}p{margin:0 auto 2em auto;text-align:left}.lead{max-width:50rem;margin-bottom:1.4rem;font-size:1.1rem}@media (min-width: 40rem){.lead{font-size:1.25rem}}strong{font-weight:bold}a{color:#4ae;text-decoration:none}a:hover{text-decoration:underline}::-moz-selection,::selection{background:#e67e39;color:#fff}code{color:#aaa;-webkit-border-radius:8px;-moz-border-radius:8px;-ms-border-radius:8px;-o-border-radius:8px;border-radius:8px;font-family:Consolas,Courier,monospace;font-size:0.9rem;padding:0.1rem 0.3rem;position:relative;top:-1px}ul{margin:0;text-align:left}@media (min-width: 40rem){ul{display:inline-block}}.button{display:block;padding:0.7rem 2rem;margin-bottom:0.5rem;border:none;color:#fff;background-color:#4ae;font-size:1.1rem;font-weight:bold;text-transform:uppercase;-webkit-border-radius:8px;-moz-border-radius:8px;-ms-border-radius:8px;-o-border-radius:8px;border-radius:8px;vertical-align:middle;white-space:nowrap}.button:hover{background:#1595ea;text-decoration:none}@media (min-width: 40rem){.button{display:inline-block;margin:0 0.25rem}}.button-minor{padding:0.35rem 1rem;border:2px solid #4ae;color:#4ae;background-color:transparent;font-size:0.8rem}.button-minor:hover{color:#fff}hr{border:0;border-top:2px solid #e6e6e6;margin:2rem auto;width:3rem}@media (min-width: 40rem){hr{margin:2.5rem auto}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}body{margin:0;padding:0;background:#f3f3f3}section{border-top:2px solid #e6e6e6;text-align:center;padding:1.5rem 0}section:first-of-type{border-top:none}@media (min-width: 40rem){section{padding:2rem 0}}.container{margin:0 auto;max-width:40rem;width:90%}header{padding:4rem 0 2rem 0;background-color:#fff;text-align:center}header p{text-align:center}@media (min-width: 40rem){header{padding:2rem 0}}.image-section{margin-bottom:80px}.image-section .image-wrap{position:relative;line-height:1em}.examples-section .image-section .target-image{-moz-border-radius-bottomleft:8px;-webkit-border-bottom-left-radius:8px;border-bottom-left-radius:8px;-moz-border-radius-bottomright:8px;-webkit-border-bottom-right-radius:8px;border-bottom-right-radius:8px}.examples-section .image-section.with-color-thief-output .target-image{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}.run-functions-button{position:absolute;top:50%;left:50%;width:8rem;height:8rem;margin-top:-4rem;margin-left:-4rem;border:none;-webkit-border-radius:50%;-moz-border-radius:50%;-ms-border-radius:50%;-o-border-radius:50%;border-radius:50%;color:#777;background-color:#fdf485;font-size:2rem;font-weight:bold;cursor:pointer;text-transform:uppercase;outline:none}.run-functions-button:hover{-webkit-transform:scale(1.1, 1.1);-moz-transform:scale(1.1, 1.1);-ms-transform:scale(1.1, 1.1);-o-transform:scale(1.1, 1.1);transform:scale(1.1, 1.1);-webkit-transition:-webkit-transform 0.2s;-moz-transition:-moz-transform 0.2s;-o-transition:-o-transform 0.2s;transition:transform 0.2s}.run-functions-button:active{-webkit-transform:scale(0.9, 0.9);-moz-transform:scale(0.9, 0.9);-ms-transform:scale(0.9, 0.9);-o-transform:scale(0.9, 0.9);transform:scale(0.9, 0.9)}.run-functions-button.hide{background-color:#fdf485;color:#777;-webkit-transition:-webkit-transform 0.8s,top 0.8s cubic-bezier(0.22, -0.37, 0.75, 0.75);-moz-transition:-moz-transform 0.8s,top 0.8s cubic-bezier(0.22, -0.37, 0.75, 0.75);-o-transition:-o-transform 0.8s,top 0.8s cubic-bezier(0.22, -0.37, 0.75, 0.75);transition:transform 0.8s,top 0.8s cubic-bezier(0.22, -0.37, 0.75, 0.75);top:105%;-webkit-transform:scale(0, 0);-moz-transform:scale(0, 0);-ms-transform:scale(0, 0);-o-transform:scale(0, 0);transform:scale(0, 0)}.touch .touch-label{display:inline}.touch .no-touch-label{display:none}.no-touch .touch-label{display:none}.no-touch .no-touch-label{display:inline}.target-image{display:block;width:100%;-moz-border-radius-topleft:8px;-webkit-border-top-left-radius:8px;border-top-left-radius:8px;-moz-border-radius-topright:8px;-webkit-border-top-right-radius:8px;border-top-right-radius:8px}.color-thief-output{display:none;padding:1.5rem;background-color:#fff;border:1px solid #e6e6e6;border-top-width:0;-moz-border-radius-bottomleft:8px;-webkit-border-bottom-left-radius:8px;border-bottom-left-radius:8px;-moz-border-radius-bottomright:8px;-webkit-border-bottom-right-radius:8px;border-bottom-right-radius:8px}.function-title{margin-top:0}.function{margin-bottom:1.5rem}.swatch{display:inline-block;margin:0;background:#ddd}@media (min-width: 40rem){.swatch{margin-right:-2px}}.get-color .swatch{width:6rem;height:3rem}.get-palette .swatch{width:3rem;height:2rem}@media (min-width: 40rem){.get-palette .swatch{width:4rem;height:2.7rem}}canvas{display:none}footer{padding:2rem 0;background-color:#fff;text-align:center}footer p{text-align:center}footer .button{margin-top:0.5rem}.sharing-section{position:fixed;z-index:10;top:20px;right:0}.drag-drop-section{display:none}.drop-zone{height:25rem;margin-bottom:4rem;background-color:#222;-webkit-border-radius:8px;-moz-border-radius:8px;-ms-border-radius:8px;-o-border-radius:8px;border-radius:8px}.drop-zone.dragging{font-weight:700;-webkit-box-shadow:inset 0 0 0 8px #4ae;-moz-box-shadow:inset 0 0 0 8px #4ae;box-shadow:inset 0 0 0 8px #4ae}.drop-zone.dragging .drop-zone-label{color:#4ae}.drop-zone.dragging .default-label{display:none}.drop-zone.dragging .dragging-label{display:block}.drop-zone-label{position:relative;top:11rem;color:#fdf485;font-size:1.8rem;text-align:center;pointer-events:none;text-transform:uppercase;-webkit-border-radius:8px;-moz-border-radius:8px;-ms-border-radius:8px;-o-border-radius:8px;border-radius:8px}@media (min-width: 40rem){.drop-zone-label{top:10.5rem;font-size:2.4rem}}.dragging-label{display:none}.dropped-image .run-functions-button{display:none} +:root { + /* Colors */ + --color: #000; + --bg-color: #f9f9f9; + --primary-color: #fc4c02; + --secondary-color: #f68727; + --code-color: var(--primary-color); + --code-bg-color: #fff; + + /* Typography */ + --font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + --code-font: Menlo, Consolas, Monaco, Lucida Console, monospace; + --bold: 700; + --x-bold: 900; + --line-height: 1.5em; + --line-height-heading: 1.3em; + + /* Breakpoints */ + --sm-screen: 640px; +} + +/* Base + * *----------------------------------------------- */ +* { + box-sizing: border-box; +} + +body { + margin: 0; + padding: 0; + background: var(--bg-color); +} + +/* Typography + * *----------------------------------------------- */ + +html { + font-size: 16px; +} + +body, +input, +button, +select, +textarea { + font-family: var(--font); + font-size: 1rem; + line-height: var(--line-height); + -webkit-font-smoothing: antialiased; +} + +h1, h2, h3, h4, h5 { + margin-bottom: 0.5em; + font-weight: var(--x-bold); + line-height: var(--line-height-heading); + letter-spacing: -0.005em; +} + +h2 { + font-size: 1.06rem; +} + + +/* -- Layout ------------------------------------------------------------------ */ + +/* -- Examples -- */ +.image-section { + border-bottom: 1px solid #ccc; + padding: 16px 16px 32px 16px; + margin-bottom: 32px; +} + +.swatch { + display: inline-block; + margin: 0; + background: #dddddd; +} + +.get-color .swatch { + width: 6rem; + height: 3rem; +} + +.get-palette .swatch { + width: 3rem; + height: 2rem; +} + diff --git a/examples/sass/_normalize.sass b/examples/sass/_normalize.sass deleted file mode 100644 index 055e45e..0000000 --- a/examples/sass/_normalize.sass +++ /dev/null @@ -1,224 +0,0 @@ -/**! normalize.css v2.1.1 | MIT License | git.io/normalize - -// HTML5 display definitions - -// Correct `block` display not defined in IE 8/9. -article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary - display: block - -// Correct `inline-block` display not defined in IE 8/9. -audio, canvas, video - display: inline-block - -audio:not([controls]) - // Prevent modern browsers from displaying `audio` without controls. - display: none - - // Remove excess height in iOS 5 devices. - height: 0 - -// Address styling not present in IE 8/9. -[hidden] - display: none - - -// Base - -html - // Prevent system color scheme's background color being used in Firefox, IE, and Opera. - background: #fff - - // Prevent system color scheme's text color being used in Firefox, IE, and Opera. - color: #000 - - // Set default font family to sans-serif. - font-family: sans-serif - - // Prevent iOS text size adjust after orientation change, without disabling user zoom. - -ms-text-size-adjust: 100% - -webkit-text-size-adjust: 100% - -// Remove default margin. -body - margin: 0 - - -// Links - -a - // Address `outline` inconsistency between Chrome and other browsers. - &:focus - outline: thin dotted - - // Improve readability when focused and also mouse hovered in all browsers. - &:active, &:hover - outline: 0 - - -// Typography - -// Address variable `h1` font-size and margin within `section` and `article` contexts in Firefox 4+, Safari 5, and Chrome. -h1 - font-size: 2em - margin: 0.67em 0 - -// Address styling not present in IE 8/9, Safari 5, and Chrome. -abbr[title] - border-bottom: 1px dotted - -// Address style set to `bolder` in Firefox 4+, Safari 5, and Chrome. -b, strong - font-weight: bold - -// Address styling not present in Safari 5 and Chrome. -dfn - font-style: italic - -// Address differences between Firefox and other browsers. -hr - -moz-box-sizing: content-box - box-sizing: content-box - height: 0 - -// Address styling not present in IE 8/9. -mark - background: #ff0 - color: #000 - -// Correct font family set oddly in Safari 5 and Chrome. -code, kbd, pre, samp - font-family: monospace, serif - font-size: 1em - -// Improve readability of pre-formatted text in all browsers. -pre - white-space: pre-wrap - -// Set consistent quote types. -q - quotes: '\201C' '\201D' '\2018' '\2019' - -// Address inconsistent and variable font size in all browsers. -small - font-size: 80% - -// Prevent `sub` and `sup` affecting `line-height` in all browsers. -sub, sup - font-size: 75% - line-height: 0 - position: relative - vertical-align: baseline - -sup - top: -0.5em - -sub - bottom: -0.25em - - -// Embedded content - -// Remove border when inside `a` element in IE 8/9. -img - border: 0 - -// Correct overflow displayed oddly in IE 9. -svg:not(:root) - overflow: hidden - - -// Figures - -// Address margin not present in IE 8/9 and Safari 5. -figure - margin: 0 - - -// Forms - -// Define consistent border, margin, and padding. -fieldset - border: 1px solid #c0c0c0 - margin: 0 2px - padding: 0.35em 0.625em 0.75em - -legend - // Correct `color` not being inherited in IE 8/9. - border: 0 - - // Remove padding so people aren't caught out if they zero out fieldsets. - padding: 0 - -button, input, select, textarea - // Correct font family not being inherited in all browsers. - font-family: inherit - - // Correct font size not being inherited in all browsers. - font-size: 100% - - // Address margins set differently in Firefox 4+, Safari 5, and Chrome. - margin: 0 - -// Address Firefox 4+ setting `line-height` on `input` using `!important` in the UA stylesheet. -button, input - line-height: normal - -// Address inconsistent `text-transform` inheritance for `button` and `select`. -// All other form control elements do not inherit `text-transform` values. -// Correct `button` style inheritance in Chrome, Safari 5+, and IE 8+. -// Correct `select` style inheritance in Firefox 4+ and Opera. -button, select - text-transform: none - -button, html input[type='button'], input[type='reset'], input[type='submit'] - // Avoid the WebKit bug in Android 4.0.* where `html input[type='button'] { -webkit-appearance: button }` destroys native `audio` and `video` controls. - // Correct inability to style clickable `input` types in iOS. - -webkit-appearance: button - - // Improve usability and consistency of cursor style between image-type `input` and others. - cursor: pointer - -// Re-set default cursor for disabled elements. -button[disabled], html input[disabled] - cursor: default - -input - &[type='checkbox'], &[type='radio'] - // Address box sizing set to `content-box` in IE 8/9. - box-sizing: border-box - - // Remove excess padding in IE 8/9. - padding: 0 - - &[type='search'] - // Address `appearance` set to `searchfield` in Safari 5 and Chrome. - -webkit-appearance: textfield - - // Address `box-sizing` set to `border-box` in Safari 5 and Chrome (include `-moz` to future-proof). - -moz-box-sizing: content-box - -webkit-box-sizing: content-box - box-sizing: content-box - - // Remove inner padding and search cancel button in Safari 5 and Chrome on OS X. - &::-webkit-search-cancel-button, &::-webkit-search-decoration - -webkit-appearance: none - -// Remove inner padding and border in Firefox 4+. -button::-moz-focus-inner, input::-moz-focus-inner - border: 0 - padding: 0 - -textarea - // Remove default vertical scrollbar in IE 8/9. - overflow: auto - - // Improve readability and alignment in all browsers. - vertical-align: top - - -// Tables - -// Remove most spacing between table cells. -table - border-collapse: collapse - border-spacing: 0 \ No newline at end of file diff --git a/examples/sass/screen.sass b/examples/sass/screen.sass deleted file mode 100644 index fb4bb2f..0000000 --- a/examples/sass/screen.sass +++ /dev/null @@ -1,405 +0,0 @@ -@import "compass/css3" -@import "compass/utilities/general/clearfix" - -@import "normalize" - -// COLORS & BACKGROUNDS -------------------------------------------------------- - -$yellow: #fdf485 -$orange: #e67e39 -$blue: #4ae -$green: #61c227 -$gray: #777 -$gray-light: #aaa -$gray-dark: #222 - -$color: $gray -$bg-color: #f3f3f3 -$border-color: darken($bg-color, 5%) -$header-bg-color: #fff -$section-heading-color: $orange -$heading-color: $gray-dark -$link-color: $blue -$code-color: $gray-light - -// TYPE -------------------------------------------------------- - -$body-font-family: "Karla", "lucida grande", sans-serif -$heading-font-family: "Montserrat", "Helvetica", sans-serif -$code-font-family: "Karla", "lucida grande", sans-serif - -// LAYOUT -------------------------------------------------------- - -$gutter: 30px -$max-column-width: 600px - -$sharing-section-z-index: 10 - -// UI COMPONENTS -------------------------------------------------------- - -$radius: 8px - - -/* Typography - *----------------------------------------------- */ - -html - font: 87% / 1.5 $body-font-family, sans-serif - font-weight: 400 - -@media (min-width: 40rem) - html - font-size: 100% - -@media (min-width: 64rem) - html - font-size: 106% - -body - color: $color - background-color: $bg-color - -h1, h2, h3, h4, h5 - color: $heading-color - line-height: 1.2em - font-family: $heading-font-family - font-weight: 700 - -h1 - font-size: 4rem - margin: 0 0 0.2em 0 - line-height: 1.1em - -@media (min-width: 40rem) - h1 - font-size: 4.5rem - -@media (min-width: 64rem) - h1 - font-size: 5rem - -h2 - color: $section-heading-color - margin-bottom: 1.5rem - font-size: 1.5rem - text-transform: uppercase - -@media (min-width: 40rem) - h2 - font-size: 2rem - -h3 - font-size: 1.2rem - margin-bottom: .5rem - -p - margin: 0 auto 2em auto - text-align: left - -.lead - max-width: 50rem - margin-bottom: 1.4rem - font-size: 1.1rem - -@media (min-width: 40rem) - .lead - font-size: 1.25rem - -strong - font-weight: bold - -a - color: $link-color - text-decoration: none - &:hover - text-decoration: underline - -::-moz-selection, -::selection - background: $orange - color: white - - -/* Code - * ========================================================================== */ - -code - color: $code-color - +border-radius($radius) - font-family: Consolas, Courier, monospace - font-size: 0.9rem - padding: 0.1rem 0.3rem - position: relative - top: -1px - - -/* Lists - * ========================================================================== */ - -ul - margin: 0 - text-align: left - -@media (min-width: 40rem) - ul - display: inline-block - - -/* Buttons - * ========================================================================== */ - -.button - display: block - padding: 0.7rem 2rem - margin-bottom: 0.5rem - border: none - color: #fff - background-color: $link-color - font-size: 1.1rem - font-weight: bold - text-transform: uppercase - +border-radius($radius) - vertical-align: middle - white-space: nowrap - &:hover - background: darken($link-color, 10%) - text-decoration: none - -@media (min-width: 40rem) - .button - display: inline-block - margin: 0 0.25rem - -.button-minor - padding: 0.35rem 1rem - border: 2px solid $link-color - color: $link-color - background-color: transparent - font-size: 0.8rem - &:hover - color: white - - -/* Elements - * ========================================================================== */ - -hr - border: 0 - border-top: 2px solid $border-color - margin: 2rem auto - width: 3rem - -@media (min-width: 40rem) - hr - margin: 2.5rem auto - -/* -- Layout ------------------------------------------------------------------ */ - -*, *:before, *:after - +box-sizing("border-box") - -body - margin: 0 - padding: 0 - background: $bg-color - -section - border-top: 2px solid $border-color - text-align: center - padding: 1.5rem 0 - &:first-of-type - border-top: none - -@media (min-width: 40rem) - section - padding: 2rem 0 - -.container - margin: 0 auto - max-width: 40rem - width: 90% - -/* -- Header -- */ - -header - padding: 4rem 0 2rem 0 - background-color: $header-bg-color - text-align: center - p - text-align: center - -@media (min-width: 40rem) - header - padding: 2rem 0 - - -/* -- Examples -- */ - -.image-section - margin-bottom: 80px - .image-wrap - position: relative - line-height: 1em - -.examples-section - .image-section - .target-image - +border-bottom-radius($radius) - .image-section.with-color-thief-output - .target-image - +border-bottom-radius(0) - -.run-functions-button - position: absolute - top: 50% - left: 50% - width: 8rem - height: 8rem - margin-top: -4rem - margin-left: -4rem - border: none - +border-radius(50%) - color: $color - background-color: $yellow - font-size: 2rem - font-weight: bold - cursor: pointer - text-transform: uppercase - outline: none - &:hover - +scale(1.1) - +transition(transform .2s) - &:active - +scale(0.9) - &.hide - background-color: $yellow - color: $color - +transition(transform .6s, top .6s cubic-bezier(0.220, -0.370, 0.750, 0.750)) - top: 105% - +scale(0) - -// Use Modernizr to check for touch support -.touch - .touch-label - display: inline - .no-touch-label - display: none -.no-touch - .touch-label - display: none - .no-touch-label - display: inline - -.target-image - display: block - width: 100% - +border-top-radius($radius) - -.color-thief-output - display: none - padding: 1.5rem - background-color: white - border: 1px solid $border-color - border-top-width: 0 - +border-bottom-radius($radius) - -.function-title - margin-top: 0 - -.function - margin-bottom: 1.5rem - -.swatch - display: inline-block - margin: 0 - background: #dddddd - -@media (min-width: 40rem) - .swatch - margin-right: -2px - -.get-color - .swatch - width: 6rem - height: 3rem - -.get-palette - .swatch - width: 3rem - height: 2rem - -@media (min-width: 40rem) - .get-palette - .swatch - width: 4rem - height: 2.7rem - -canvas - display: none - - -/* -- Credits -- */ - -footer - padding: 2rem 0 - background-color: $header-bg-color - text-align: center - p - text-align: center - .button - margin-top: 0.5rem - -/* -- Sharing -- */ - -.sharing-section - position: fixed - z-index: $sharing-section-z-index - top: 20px - right: 0 - - -/* -- Drag and drop ------------------------------------------------------------------ */ - -.drag-drop-section - display: none - -.drop-zone - height: 25rem - margin-bottom: 4rem - background-color: $gray-dark - +border-radius($radius) - &.dragging - font-weight: 700 - +box-shadow(inset 0 0 0 8px $link-color) - .drop-zone-label - color: $link-color - .default-label - display: none - .dragging-label - display: block - -.drop-zone-label - position: relative - top: 11rem - color: $yellow - font-size: 1.8rem - text-align: center - pointer-events: none - text-transform: uppercase - +border-radius($radius) - -@media (min-width: 40rem) - .drop-zone-label - top: 10.5rem - font-size: 2.4rem - -.dragging-label - display: none - -.dropped-image - .run-functions-button - display: none - .targetImage - // width: 100% - - From e251daa01fba56f60625f8d77c2fea0292cc3a97 Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sun, 28 Apr 2019 21:12:48 -0700 Subject: [PATCH 17/35] Update demo code to be test specific. Remove jQuery --- examples/js/demo.js | 173 +++++++++++--------------------------------- 1 file changed, 42 insertions(+), 131 deletions(-) diff --git a/examples/js/demo.js b/examples/js/demo.js index f4db550..47a4d1c 100644 --- a/examples/js/demo.js +++ b/examples/js/demo.js @@ -1,137 +1,48 @@ -/*! Modernizr 2.6.2 (Custom Build) | MIT & BSD - * Build: http://modernizr.com/download/#-canvas-draganddrop-touch-shiv-cssclasses-teststyles-hasevent-prefixes-css_pointerevents-file_api-load - */ -;window.Modernizr=function(a,b,c){function x(a){j.cssText=a}function y(a,b){return x(m.join(a+";")+(b||""))}function z(a,b){return typeof a===b}function A(a,b){return!!~(""+a).indexOf(b)}function B(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:z(f,"function")?f.bind(d||b):f}return!1}var d="2.6.2",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m=" -webkit- -moz- -o- -ms- ".split(" "),n={},o={},p={},q=[],r=q.slice,s,t=function(a,c,d,e){var f,i,j,k,l=b.createElement("div"),m=b.body,n=m||b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),l.appendChild(j);return f=["­",'"].join(""),l.id=h,(m?l:n).innerHTML+=f,n.appendChild(l),m||(n.style.background="",n.style.overflow="hidden",k=g.style.overflow,g.style.overflow="hidden",g.appendChild(n)),i=c(l,a),m?l.parentNode.removeChild(l):(n.parentNode.removeChild(n),g.style.overflow=k),!!i},u=function(){function d(d,e){e=e||b.createElement(a[d]||"div"),d="on"+d;var f=d in e;return f||(e.setAttribute||(e=b.createElement("div")),e.setAttribute&&e.removeAttribute&&(e.setAttribute(d,""),f=z(e[d],"function"),z(e[d],"undefined")||(e[d]=c),e.removeAttribute(d))),e=null,f}var a={select:"input",change:"input",submit:"form",reset:"form",error:"img",load:"img",abort:"img"};return d}(),v={}.hasOwnProperty,w;!z(v,"undefined")&&!z(v.call,"undefined")?w=function(a,b){return v.call(a,b)}:w=function(a,b){return b in a&&z(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=r.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(r.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(r.call(arguments)))};return e}),n.canvas=function(){var a=b.createElement("canvas");return!!a.getContext&&!!a.getContext("2d")},n.touch=function(){var c;return"ontouchstart"in a||a.DocumentTouch&&b instanceof DocumentTouch?c=!0:t(["@media (",m.join("touch-enabled),("),h,")","{#modernizr{top:9px;position:absolute}}"].join(""),function(a){c=a.offsetTop===9}),c},n.draganddrop=function(){var a=b.createElement("div");return"draggable"in a||"ondragstart"in a&&"ondrop"in a};for(var C in n)w(n,C)&&(s=C.toLowerCase(),e[s]=n[C](),q.push((e[s]?"":"no-")+s));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)w(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},x(""),i=k=null,function(a,b){function k(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function l(){var a=r.elements;return typeof a=="string"?a.split(" "):a}function m(a){var b=i[a[g]];return b||(b={},h++,a[g]=h,i[h]=b),b}function n(a,c,f){c||(c=b);if(j)return c.createElement(a);f||(f=m(c));var g;return f.cache[a]?g=f.cache[a].cloneNode():e.test(a)?g=(f.cache[a]=f.createElem(a)).cloneNode():g=f.createElem(a),g.canHaveChildren&&!d.test(a)?f.frag.appendChild(g):g}function o(a,c){a||(a=b);if(j)return a.createDocumentFragment();c=c||m(a);var d=c.frag.cloneNode(),e=0,f=l(),g=f.length;for(;e",f="hidden"in a,j=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){f=!0,j=!0}})();var r={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,supportsUnknownElements:j,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:q,createElement:n,createDocumentFragment:o};a.html5=r,q(b)}(this,b),e._version=d,e._prefixes=m,e.hasEvent=u,e.testStyles=t,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+q.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f { + const section = image.closest('.image-section'); + if (this.complete) { + showColorsForImage(image, section); + } else { + image.addEventListener('load', function() { + showColorsForImage(image, section); + }); } - } - - function isMobile() { - // Implementation of http://detectmobilebrowsers.com/ - var check = false; - (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); - return check; - }; - -}); +}) From 2ffa707ae0bdc2ebdad4701e6839ec204e12a8b5 Mon Sep 17 00:00:00 2001 From: Lokesh Dhakar Date: Sun, 28 Apr 2019 22:10:32 -0700 Subject: [PATCH 18/35] Cleanup: remove unused jquery, tabs to spaces --- examples/css/screen.css | 111 +- examples/js/demo.js | 48 +- examples/js/jquery.js | 9111 --------------------------------------- index.html | 23 +- 4 files changed, 100 insertions(+), 9193 deletions(-) delete mode 100644 examples/js/jquery.js diff --git a/examples/css/screen.css b/examples/css/screen.css index f903654..bc1d830 100644 --- a/examples/css/screen.css +++ b/examples/css/screen.css @@ -1,88 +1,95 @@ :root { - /* Colors */ - --color: #000; - --bg-color: #f9f9f9; - --primary-color: #fc4c02; - --secondary-color: #f68727; - --code-color: var(--primary-color); - --code-bg-color: #fff; - - /* Typography */ - --font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; - --code-font: Menlo, Consolas, Monaco, Lucida Console, monospace; - --bold: 700; - --x-bold: 900; - --line-height: 1.5em; - --line-height-heading: 1.3em; - - /* Breakpoints */ - --sm-screen: 640px; + /* Colors */ + --color: #000; + --bg-color: #f9f9f9; + --primary-color: #fc4c02; + --secondary-color: #f68727; + --muted-color: #999; + --code-color: var(--primary-color); + --code-bg-color: #fff; + + /* Typography */ + --font: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; + --code-font: Menlo, Consolas, Monaco, Lucida Console, monospace; + --bold: 700; + --x-bold: 900; + --line-height: 1.5em; + --line-height-heading: 1.3em; + + /* Breakpoints */ + --sm-screen: 640px; } /* Base * *----------------------------------------------- */ * { - box-sizing: border-box; + box-sizing: border-box; } body { - margin: 0; - padding: 0; - background: var(--bg-color); + margin: 0; + padding: 0; + background: var(--bg-color); } /* Typography * *----------------------------------------------- */ html { - font-size: 16px; + font-size: 16px; + font-family: var(--font); + line-height: var(--line-height); + -webkit-font-smoothing: antialiased; } -body, -input, -button, -select, -textarea { - font-family: var(--font); - font-size: 1rem; - line-height: var(--line-height); - -webkit-font-smoothing: antialiased; +h1, +h2, +h3 { + font-weight: var(--x-bold); + line-height: var(--line-height-heading); + letter-spacing: -0.005em; } -h1, h2, h3, h4, h5 { - margin-bottom: 0.5em; - font-weight: var(--x-bold); - line-height: var(--line-height-heading); - letter-spacing: -0.005em; +h2 { + margin: 0 0 0.25em 0; + font-size: 1.5rem; } -h2 { - font-size: 1.06rem; +h3 { + margin: 1em 0 0.25em 0; + font-size: 1.06rem; +} + +code { + font-family: var(--code-font); + overflow-wrap: break-word; } /* -- Layout ------------------------------------------------------------------ */ -/* -- Examples -- */ .image-section { - border-bottom: 1px solid #ccc; - padding: 16px 16px 32px 16px; - margin-bottom: 32px; + border-bottom: 1px solid #ccc; + padding: 16px 16px 32px 16px; + margin-bottom: 32px; } .swatch { - display: inline-block; - margin: 0; - background: #dddddd; + display: inline-block; + background: #dddddd; } -.get-color .swatch { - width: 6rem; - height: 3rem; +.color .swatch { + width: 6rem; + height: 3rem; } -.get-palette .swatch { - width: 3rem; - height: 2rem; +.palette .swatch { + width: 3rem; + height: 2rem; } +.time { + color: var(--muted-color); + font-weight: normal; +} diff --git a/examples/js/demo.js b/examples/js/demo.js index 47a4d1c..7f045fc 100644 --- a/examples/js/demo.js +++ b/examples/js/demo.js @@ -1,26 +1,3 @@ -// Run Color Thief functions and display results below image. -// We also log execution time of functions for display. -const showColorsForImage = function(image, section) { - const start = Date.now(); - const color = colorThief.getColor(image); - const elapsedTimeForGetColor = Date.now() - start; - const palette = colorThief.getPalette(image); - const elapsedTimeForGetPalette = Date.now() - start + elapsedTimeForGetColor; - - const output = { - color: color, - colorStr: color.toString(), - palette: palette, - paletteStr: palette.toString(), - elapsedTimeForGetColor: elapsedTimeForGetColor, - elapsedTimeForGetPalette: elapsedTimeForGetPalette - }; - const ouputHTML = Mustache.to_html(document.getElementById('output-tpl').innerHTML, output); - - const outputEl = section.querySelector('.output'); - outputEl.innerHTML = ouputHTML; -}; - var colorThief = new ColorThief(); var images = [ @@ -36,6 +13,7 @@ var images = [ var examplesHTML = Mustache.to_html(document.getElementById('image-tpl').innerHTML, images); document.getElementById('example-images').innerHTML = examplesHTML; +// Once images are loaded, process them document.querySelectorAll('.image').forEach((image) => { const section = image.closest('.image-section'); if (this.complete) { @@ -46,3 +24,27 @@ document.querySelectorAll('.image').forEach((image) => { }); } }) + +// Run Color Thief functions and display results below image. +// We also log execution time of functions for display. +const showColorsForImage = function(image, section) { + const file = section.src; + const start = Date.now(); + const color = colorThief.getColor(image); + const elapsedTimeForGetColor = Date.now() - start; + const palette = colorThief.getPalette(image); + const elapsedTimeForGetPalette = Date.now() - start + elapsedTimeForGetColor; + + const output = { + color: color, + colorStr: color.toString(), + palette: palette, + paletteStr: palette.toString(), + elapsedTimeForGetColor: elapsedTimeForGetColor, + elapsedTimeForGetPalette: elapsedTimeForGetPalette + }; + const ouputHTML = Mustache.to_html(document.getElementById('output-tpl').innerHTML, output); + + const outputEl = section.querySelector('.output'); + outputEl.innerHTML = ouputHTML; +}; diff --git a/examples/js/jquery.js b/examples/js/jquery.js deleted file mode 100644 index f7f4227..0000000 --- a/examples/js/jquery.js +++ /dev/null @@ -1,9111 +0,0 @@ -/*! - * jQuery JavaScript Library v2.1.0 - * http://jquery.com/ - * - * Includes Sizzle.js - * http://sizzlejs.com/ - * - * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2014-01-23T21:10Z - */ - -(function( global, factory ) { - - if ( typeof module === "object" && typeof module.exports === "object" ) { - // For CommonJS and CommonJS-like environments where a proper window is present, - // execute the factory and get jQuery - // For environments that do not inherently posses a window with a document - // (such as Node.js), expose a jQuery-making factory as module.exports - // This accentuates the need for the creation of a real window - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Can't do this because several apps including ASP.NET trace -// the stack via arguments.caller.callee and Firefox dies if -// you try to trace through "use strict" call chains. (#13335) -// Support: Firefox 18+ -// - -var arr = []; - -var slice = arr.slice; - -var concat = arr.concat; - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var trim = "".trim; - -var support = {}; - - - -var - // Use the correct document accordingly with window argument (sandbox) - document = window.document, - - version = "2.1.0", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }, - - // Matches dashed string for camelizing - rmsPrefix = /^-ms-/, - rdashAlpha = /-([\da-z])/gi, - - // Used by jQuery.camelCase as callback to replace() - fcamelCase = function( all, letter ) { - return letter.toUpperCase(); - }; - -jQuery.fn = jQuery.prototype = { - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // Start with an empty selector - selector: "", - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - return num != null ? - - // Return a 'clean' array - ( num < 0 ? this[ num + this.length ] : this[ num ] ) : - - // Return just the object - slice.call( this ); - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - ret.context = this.context; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - // (You can seed the arguments with an array of args, but this is - // only used internally.) - each: function( callback, args ) { - return jQuery.each( this, callback, args ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map(this, function( elem, i ) { - return callback.call( elem, i, elem ); - })); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(null); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[0] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !jQuery.isFunction(target) ) { - target = {}; - } - - // extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - // Only deal with non-null/undefined values - if ( (options = arguments[ i ]) != null ) { - // Extend the base object - for ( name in options ) { - src = target[ name ]; - copy = options[ name ]; - - // Prevent never-ending loop - if ( target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { - if ( copyIsArray ) { - copyIsArray = false; - clone = src && jQuery.isArray(src) ? src : []; - - } else { - clone = src && jQuery.isPlainObject(src) ? src : {}; - } - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend({ - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - // See test/unit/core.js for details concerning isFunction. - // Since version 1.3, DOM methods and functions like alert - // aren't supported. They return false on IE (#2968). - isFunction: function( obj ) { - return jQuery.type(obj) === "function"; - }, - - isArray: Array.isArray, - - isWindow: function( obj ) { - return obj != null && obj === obj.window; - }, - - isNumeric: function( obj ) { - // parseFloat NaNs numeric-cast false positives (null|true|false|"") - // ...but misinterprets leading-number strings, particularly hex literals ("0x...") - // subtraction forces infinities to NaN - return obj - parseFloat( obj ) >= 0; - }, - - isPlainObject: function( obj ) { - // Not plain objects: - // - Any object or value whose internal [[Class]] property is not "[object Object]" - // - DOM nodes - // - window - if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { - return false; - } - - // Support: Firefox <20 - // The try/catch suppresses exceptions thrown when attempting to access - // the "constructor" property of certain host objects, ie. |window.location| - // https://bugzilla.mozilla.org/show_bug.cgi?id=814622 - try { - if ( obj.constructor && - !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { - return false; - } - } catch ( e ) { - return false; - } - - // If the function hasn't returned already, we're confident that - // |obj| is a plain object, created by {} or constructed with new Object - return true; - }, - - isEmptyObject: function( obj ) { - var name; - for ( name in obj ) { - return false; - } - return true; - }, - - type: function( obj ) { - if ( obj == null ) { - return obj + ""; - } - // Support: Android < 4.0, iOS < 6 (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call(obj) ] || "object" : - typeof obj; - }, - - // Evaluates a script in a global context - globalEval: function( code ) { - var script, - indirect = eval; - - code = jQuery.trim( code ); - - if ( code ) { - // If the code includes a valid, prologue position - // strict mode pragma, execute code by injecting a - // script tag into the document. - if ( code.indexOf("use strict") === 1 ) { - script = document.createElement("script"); - script.text = code; - document.head.appendChild( script ).parentNode.removeChild( script ); - } else { - // Otherwise, avoid the DOM node creation, insertion - // and removal by using an indirect global eval - indirect( code ); - } - } - }, - - // Convert dashed to camelCase; used by the css and data modules - // Microsoft forgot to hump their vendor prefix (#9572) - camelCase: function( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); - }, - - nodeName: function( elem, name ) { - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, - - // args is for internal usage only - each: function( obj, callback, args ) { - var value, - i = 0, - length = obj.length, - isArray = isArraylike( obj ); - - if ( args ) { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.apply( obj[ i ], args ); - - if ( value === false ) { - break; - } - } - } - - // A special, fast, case for the most common use of each - } else { - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } else { - for ( i in obj ) { - value = callback.call( obj[ i ], i, obj[ i ] ); - - if ( value === false ) { - break; - } - } - } - } - - return obj; - }, - - trim: function( text ) { - return text == null ? "" : trim.call( text ); - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArraylike( Object(arr) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var value, - i = 0, - length = elems.length, - isArray = isArraylike( elems ), - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArray ) { - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return concat.apply( [], ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // Bind a function to a context, optionally partially applying any - // arguments. - proxy: function( fn, context ) { - var tmp, args, proxy; - - if ( typeof context === "string" ) { - tmp = fn[ context ]; - context = fn; - fn = tmp; - } - - // Quick check to determine if target is callable, in the spec - // this throws a TypeError, but we will just return undefined. - if ( !jQuery.isFunction( fn ) ) { - return undefined; - } - - // Simulated bind - args = slice.call( arguments, 2 ); - proxy = function() { - return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); - }; - - // Set the guid of unique handler to the same of original handler, so it can be removed - proxy.guid = fn.guid = fn.guid || jQuery.guid++; - - return proxy; - }, - - now: Date.now, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -}); - -// Populate the class2type map -jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -}); - -function isArraylike( obj ) { - var length = obj.length, - type = jQuery.type( obj ); - - if ( type === "function" || jQuery.isWindow( obj ) ) { - return false; - } - - if ( obj.nodeType === 1 && length ) { - return true; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v1.10.16 - * http://sizzlejs.com/ - * - * Copyright 2013 jQuery Foundation, Inc. and other contributors - * Released under the MIT license - * http://jquery.org/license - * - * Date: 2014-01-13 - */ -(function( window ) { - -var i, - support, - Expr, - getText, - isXML, - compile, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + -(new Date()), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // General-purpose constants - strundefined = typeof undefined, - MAX_NEGATIVE = 1 << 31, - - // Instance methods - hasOwn = ({}).hasOwnProperty, - arr = [], - pop = arr.pop, - push_native = arr.push, - push = arr.push, - slice = arr.slice, - // Use a stripped-down indexOf if we can't use a native one - indexOf = arr.indexOf || function( elem ) { - var i = 0, - len = this.length; - for ( ; i < len; i++ ) { - if ( this[i] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - // http://www.w3.org/TR/css3-syntax/#characters - characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", - - // Loosely modeled on CSS identifier characters - // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors - // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier - identifier = characterEncoding.replace( "w", "w#" ), - - // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace + - "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]", - - // Prefer arguments quoted, - // then not containing pseudos/brackets, - // then attribute selectors/non-parenthetical expressions, - // then anything else - // These preferences are here to reduce the number of selectors - // needing tokenize in the PSEUDO preFilter - pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), - - rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + characterEncoding + ")" ), - "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), - "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + - "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + - "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + - whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - rescape = /'|\\/g, - - // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), - funescape = function( _, escaped, escapedWhitespace ) { - var high = "0x" + escaped - 0x10000; - // NaN means non-codepoint - // Support: Firefox - // Workaround erroneous numeric interpretation of +"0x" - return high !== high || escapedWhitespace ? - escaped : - high < 0 ? - // BMP codepoint - String.fromCharCode( high + 0x10000 ) : - // Supplemental Plane codepoint (surrogate pair) - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }; - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - (arr = slice.call( preferredDoc.childNodes )), - preferredDoc.childNodes - ); - // Support: Android<4.0 - // Detect silently failing push.apply - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - push_native.apply( target, slice.call(els) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - // Can't trust NodeList.length - while ( (target[j++] = els[i++]) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var match, elem, m, nodeType, - // QSA vars - i, groups, old, nid, newContext, newSelector; - - if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { - setDocument( context ); - } - - context = context || document; - results = results || []; - - if ( !selector || typeof selector !== "string" ) { - return results; - } - - if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) { - return []; - } - - if ( documentIsHTML && !seed ) { - - // Shortcuts - if ( (match = rquickExpr.exec( selector )) ) { - // Speed-up: Sizzle("#ID") - if ( (m = match[1]) ) { - if ( nodeType === 9 ) { - elem = context.getElementById( m ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document (jQuery #6963) - if ( elem && elem.parentNode ) { - // Handle the case where IE, Opera, and Webkit return items - // by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - } else { - // Context is not a document - if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && - contains( context, elem ) && elem.id === m ) { - results.push( elem ); - return results; - } - } - - // Speed-up: Sizzle("TAG") - } else if ( match[2] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Speed-up: Sizzle(".CLASS") - } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) { - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // QSA path - if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { - nid = old = expando; - newContext = context; - newSelector = nodeType === 9 && selector; - - // qSA works strangely on Element-rooted queries - // We can work around this by specifying an extra ID on the root - // and working up from there (Thanks to Andrew Dupont for the technique) - // IE 8 doesn't work on object elements - if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { - groups = tokenize( selector ); - - if ( (old = context.getAttribute("id")) ) { - nid = old.replace( rescape, "\\$&" ); - } else { - context.setAttribute( "id", nid ); - } - nid = "[id='" + nid + "'] "; - - i = groups.length; - while ( i-- ) { - groups[i] = nid + toSelector( groups[i] ); - } - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; - newSelector = groups.join(","); - } - - if ( newSelector ) { - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch(qsaError) { - } finally { - if ( !old ) { - context.removeAttribute("id"); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {Function(string, Object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return (cache[ key + " " ] = value); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created div and expects a boolean result - */ -function assert( fn ) { - var div = document.createElement("div"); - - try { - return !!fn( div ); - } catch (e) { - return false; - } finally { - // Remove from its parent by default - if ( div.parentNode ) { - div.parentNode.removeChild( div ); - } - // release memory in IE - div = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split("|"), - i = attrs.length; - - while ( i-- ) { - Expr.attrHandle[ arr[i] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - ( ~b.sourceIndex || MAX_NEGATIVE ) - - ( ~a.sourceIndex || MAX_NEGATIVE ); - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( (cur = cur.nextSibling) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return (name === "input" || name === "button") && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction(function( argument ) { - argument = +argument; - return markFunction(function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ (j = matchIndexes[i]) ] ) { - seed[j] = !(matches[j] = seed[j]); - } - } - }); - }); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== strundefined && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - // documentElement is verified for cases where it doesn't yet exist - // (such as loading iframes in IE - #4833) - var documentElement = elem && (elem.ownerDocument || elem).documentElement; - return documentElement ? documentElement.nodeName !== "HTML" : false; -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, - doc = node ? node.ownerDocument || node : preferredDoc, - parent = doc.defaultView; - - // If no document and documentElement is available, return - if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Set our document - document = doc; - docElem = doc.documentElement; - - // Support tests - documentIsHTML = !isXML( doc ); - - // Support: IE>8 - // If iframe document is assigned to "document" variable and if iframe has been reloaded, - // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 - // IE6-8 do not support the defaultView property so parent will be undefined - if ( parent && parent !== parent.top ) { - // IE11 does not have attachEvent, so all must suffer - if ( parent.addEventListener ) { - parent.addEventListener( "unload", function() { - setDocument(); - }, false ); - } else if ( parent.attachEvent ) { - parent.attachEvent( "onunload", function() { - setDocument(); - }); - } - } - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans) - support.attributes = assert(function( div ) { - div.className = "i"; - return !div.getAttribute("className"); - }); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert(function( div ) { - div.appendChild( doc.createComment("") ); - return !div.getElementsByTagName("*").length; - }); - - // Check if getElementsByClassName can be trusted - support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) { - div.innerHTML = "
"; - - // Support: Safari<4 - // Catch class over-caching - div.firstChild.className = "i"; - // Support: Opera<10 - // Catch gEBCN failure to find non-leading classes - return div.getElementsByClassName("i").length === 2; - }); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert(function( div ) { - docElem.appendChild( div ).id = expando; - return !doc.getElementsByName || !doc.getElementsByName( expando ).length; - }); - - // ID find and filter - if ( support.getById ) { - Expr.find["ID"] = function( id, context ) { - if ( typeof context.getElementById !== strundefined && documentIsHTML ) { - var m = context.getElementById( id ); - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - return m && m.parentNode ? [m] : []; - } - }; - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute("id") === attrId; - }; - }; - } else { - // Support: IE6/7 - // getElementById is not reliable as a find shortcut - delete Expr.find["ID"]; - - Expr.filter["ID"] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id"); - return node && node.value === attrId; - }; - }; - } - - // Tag - Expr.find["TAG"] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== strundefined ) { - return context.getElementsByTagName( tag ); - } - } : - function( tag, context ) { - var elem, - tmp = [], - i = 0, - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( (elem = results[i++]) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See http://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert(function( div ) { - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // http://bugs.jquery.com/ticket/12359 - div.innerHTML = ""; - - // Support: IE8, Opera 10-12 - // Nothing should be selected when empty strings follow ^= or $= or *= - if ( div.querySelectorAll("[t^='']").length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !div.querySelectorAll("[selected]").length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":checked").length ) { - rbuggyQSA.push(":checked"); - } - }); - - assert(function( div ) { - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = doc.createElement("input"); - input.setAttribute( "type", "hidden" ); - div.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( div.querySelectorAll("[name=d]").length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( !div.querySelectorAll(":enabled").length ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Opera 10-11 does not throw on post-comma invalid pseudos - div.querySelectorAll("*,:x"); - rbuggyQSA.push(",.*:"); - }); - } - - if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector) )) ) { - - assert(function( div ) { - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( div, "div" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( div, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - }); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully does not implement inclusive descendent - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - )); - } : - function( a, b ) { - if ( b ) { - while ( (b = b.parentNode) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { - - // Choose the first element that is related to our preferred document - if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { - return -1; - } - if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - return a === doc ? -1 : - b === doc ? 1 : - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( (cur = cur.parentNode) ) { - ap.unshift( cur ); - } - cur = b; - while ( (cur = cur.parentNode) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[i] === bp[i] ) { - i++; - } - - return i ? - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[i], bp[i] ) : - - // Otherwise nodes in our document sort first - ap[i] === preferredDoc ? -1 : - bp[i] === preferredDoc ? 1 : - 0; - }; - - return doc; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - // Make sure that attribute selectors are quoted - expr = expr.replace( rattributeQuotes, "='$1']" ); - - if ( support.matchesSelector && documentIsHTML && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch(e) {} - } - - return Sizzle( expr, document, null, [elem] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - // Set document vars if needed - if ( ( context.ownerDocument || context ) !== document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - // Set document vars if needed - if ( ( elem.ownerDocument || elem ) !== document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - (val = elem.getAttributeNode(name)) && val.specified ? - val.value : - null; -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( (elem = results[i++]) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - // If no nodeType, this is expected to be an array - while ( (node = elem[i++]) ) { - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[1] = match[1].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape ); - - if ( match[2] === "~=" ) { - match[3] = " " + match[3] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[1] = match[1].toLowerCase(); - - if ( match[1].slice( 0, 3 ) === "nth" ) { - // nth-* requires argument - if ( !match[3] ) { - Sizzle.error( match[0] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); - match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); - - // other types prohibit arguments - } else if ( match[3] ) { - Sizzle.error( match[0] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[5] && match[2]; - - if ( matchExpr["CHILD"].test( match[0] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[3] && match[4] !== undefined ) { - match[2] = match[4]; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - // Get excess from tokenize (recursively) - (excess = tokenize( unquoted, true )) && - // advance to the next closing parenthesis - (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { - - // excess is a negative index - match[0] = match[0].slice( 0, excess ); - match[2] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { return true; } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && - classCache( className, function( elem ) { - return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" ); - }); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - }; - }, - - "CHILD": function( type, what, argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, context, xml ) { - var cache, outerCache, node, diff, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( (node = node[ dir ]) ) { - if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { - return false; - } - } - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - // Seek `elem` from a previously-cached index - outerCache = parent[ expando ] || (parent[ expando ] = {}); - cache = outerCache[ type ] || []; - nodeIndex = cache[0] === dirruns && cache[1]; - diff = cache[0] === dirruns && cache[2]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( (node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - (diff = nodeIndex = 0) || start.pop()) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - outerCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - // Use previously-cached element index if available - } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { - diff = cache[1]; - - // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) - } else { - // Use the same loop as above to seek `elem` from the start - while ( (node = ++nodeIndex && node && node[ dir ] || - (diff = nodeIndex = 0) || start.pop()) ) { - - if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { - // Cache the index of each encountered element - if ( useCache ) { - (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction(function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf.call( seed, matched[i] ); - seed[ idx ] = !( matches[ idx ] = matched[i] ); - } - }) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - // Potentially complex pseudos - "not": markFunction(function( selector ) { - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction(function( seed, matches, context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( (elem = unmatched[i]) ) { - seed[i] = !(matches[i] = elem); - } - } - }) : - function( elem, context, xml ) { - input[0] = elem; - matcher( input, null, xml, results ); - return !results.pop(); - }; - }), - - "has": markFunction(function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - }), - - "contains": markFunction(function( text ) { - return function( elem ) { - return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; - }; - }), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - // lang value must be a valid identifier - if ( !ridentifier.test(lang || "") ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( (elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); - return false; - }; - }), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); - }, - - // Boolean properties - "enabled": function( elem ) { - return elem.disabled === false; - }, - - "disabled": function( elem ) { - return elem.disabled === true; - }, - - "checked": function( elem ) { - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); - }, - - "selected": function( elem ) { - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos["empty"]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo(function() { - return [ 0 ]; - }), - - "last": createPositionalPseudo(function( matchIndexes, length ) { - return [ length - 1 ]; - }), - - "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - }), - - "even": createPositionalPseudo(function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "odd": createPositionalPseudo(function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }), - - "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - }) - } -}; - -Expr.pseudos["nth"] = Expr.pseudos["eq"]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -function tokenize( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || (match = rcomma.exec( soFar )) ) { - if ( match ) { - // Don't consume trailing commas as valid - soFar = soFar.slice( match[0].length ) || soFar; - } - groups.push( (tokens = []) ); - } - - matched = false; - - // Combinators - if ( (match = rcombinators.exec( soFar )) ) { - matched = match.shift(); - tokens.push({ - value: matched, - // Cast descendant combinators to space - type: match[0].replace( rtrim, " " ) - }); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || - (match = preFilters[ type ]( match ))) ) { - matched = match.shift(); - tokens.push({ - value: matched, - type: type, - matches: match - }); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -} - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[i].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - checkNonElements = base && dir === "parentNode", - doneName = done++; - - return combinator.first ? - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching - if ( xml ) { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( (elem = elem[ dir ]) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || (elem[ expando ] = {}); - if ( (oldCache = outerCache[ dir ]) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return (newCache[ 2 ] = oldCache[ 2 ]); - } else { - // Reuse newcache so results back-propagate to previous elements - outerCache[ dir ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { - return true; - } - } - } - } - } - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[i]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[0]; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( (elem = unmatched[i]) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction(function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( (elem = temp[i]) ) { - matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) ) { - // Restore matcherIn since elem is not yet a final match - temp.push( (matcherIn[i] = elem) ); - } - } - postFinder( null, (matcherOut = []), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( (elem = matcherOut[i]) && - (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) { - - seed[temp] = !(results[temp] = elem); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - }); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[0].type ], - implicitRelative = leadingRelative || Expr.relative[" "], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf.call( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - return ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - (checkContext = context).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - } ]; - - for ( ; i < len; i++ ) { - if ( (matcher = Expr.relative[ tokens[i].type ]) ) { - matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; - } else { - matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[j].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), - len = elems.length; - - if ( outermost ) { - outermostContext = context !== document && context; - } - - // Add elements passing elementMatchers directly to results - // Keep `i` a string if there are no elements so `matchedCount` will be "00" below - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && (elem = elems[i]) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - while ( (matcher = elementMatchers[j++]) ) { - if ( matcher( elem, context, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - // They will have gone through all possible matchers - if ( (elem = !matcher && elem) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // Apply set filters to unmatched elements - matchedCount += i; - if ( bySet && i !== matchedCount ) { - j = 0; - while ( (matcher = setMatchers[j++]) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !(unmatched[i] || setMatched[i]) ) { - setMatched[i] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - // Generate a function of recursive functions that can be used to check each element - if ( !group ) { - group = tokenize( selector ); - } - i = group.length; - while ( i-- ) { - cached = matcherFromTokens( group[i] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); - } - return cached; -}; - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[i], results ); - } - return results; -} - -function select( selector, context, results, seed ) { - var i, tokens, token, type, find, - match = tokenize( selector ); - - if ( !seed ) { - // Try to minimize operations if there is only one group - if ( match.length === 1 ) { - - // Take a shortcut and set the context if the root selector is an ID - tokens = match[0] = match[0].slice( 0 ); - if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && - support.getById && context.nodeType === 9 && documentIsHTML && - Expr.relative[ tokens[1].type ] ) { - - context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; - if ( !context ) { - return results; - } - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[i]; - - // Abort if we hit a combinator - if ( Expr.relative[ (type = token.type) ] ) { - break; - } - if ( (find = Expr.find[ type ]) ) { - // Search, expanding context for leading sibling combinators - if ( (seed = find( - token.matches[0].replace( runescape, funescape ), - rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context - )) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - } - - // Compile and execute a filtering function - // Provide `match` to avoid retokenization if we modified the selector above - compile( selector, match )( - seed, - context, - !documentIsHTML, - results, - rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -} - -// One-time assignments - -// Sort stability -support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; - -// Support: Chrome<14 -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert(function( div1 ) { - // Should return 1, but returns 4 (following) - return div1.compareDocumentPosition( document.createElement("div") ) & 1; -}); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert(function( div ) { - div.innerHTML = ""; - return div.firstChild.getAttribute("href") === "#" ; -}) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - }); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert(function( div ) { - div.innerHTML = ""; - div.firstChild.setAttribute( "value", "" ); - return div.firstChild.getAttribute( "value" ) === ""; -}) ) { - addHandle( "value", function( elem, name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - }); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert(function( div ) { - return div.getAttribute("disabled") == null; -}) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - (val = elem.getAttributeNode( name )) && val.specified ? - val.value : - null; - } - }); -} - -return Sizzle; - -})( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; -jQuery.expr[":"] = jQuery.expr.pseudos; -jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; - - - -var rneedsContext = jQuery.expr.match.needsContext; - -var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/); - - - -var risSimple = /^.[^:#\[\.,]*$/; - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( jQuery.isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - /* jshint -W018 */ - return !!qualifier.call( elem, i, elem ) !== not; - }); - - } - - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - }); - - } - - if ( typeof qualifier === "string" ) { - if ( risSimple.test( qualifier ) ) { - return jQuery.filter( qualifier, elements, not ); - } - - qualifier = jQuery.filter( qualifier, elements ); - } - - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) >= 0 ) !== not; - }); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - return elems.length === 1 && elem.nodeType === 1 ? - jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : - jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - })); -}; - -jQuery.fn.extend({ - find: function( selector ) { - var i, - len = this.length, - ret = [], - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter(function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - }) ); - } - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - // Needed because $( selector, context ) becomes $( context ).find( selector ) - ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); - ret.selector = this.selector ? this.selector + " " + selector : selector; - return ret; - }, - filter: function( selector ) { - return this.pushStack( winnow(this, selector || [], false) ); - }, - not: function( selector ) { - return this.pushStack( winnow(this, selector || [], true) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -}); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, - - init = jQuery.fn.init = function( selector, context ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) { - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && (match[1] || !context) ) { - - // HANDLE: $(html) -> $(array) - if ( match[1] ) { - context = context instanceof jQuery ? context[0] : context; - - // scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[1], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - // Properties of context are called as methods if possible - if ( jQuery.isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[2] ); - - // Check parentNode to catch when Blackberry 4.6 returns - // nodes that are no longer in the document #6963 - if ( elem && elem.parentNode ) { - // Inject the element directly into the jQuery object - this.length = 1; - this[0] = elem; - } - - this.context = document; - this.selector = selector; - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || rootjQuery ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this.context = this[0] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( jQuery.isFunction( selector ) ) { - return typeof rootjQuery.ready !== "undefined" ? - rootjQuery.ready( selector ) : - // Execute immediately if ready is not present - selector( jQuery ); - } - - if ( selector.selector !== undefined ) { - this.selector = selector.selector; - this.context = selector.context; - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - // methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.extend({ - dir: function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; - }, - - sibling: function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; - } -}); - -jQuery.fn.extend({ - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter(function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[i] ) ) { - return true; - } - } - }); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? - jQuery( selectors, context || this.context ) : - 0; - - for ( ; i < l; i++ ) { - for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) { - // Always skip document fragments - if ( cur.nodeType < 11 && (pos ? - pos.index(cur) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector(cur, selectors)) ) { - - matched.push( cur ); - break; - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched ); - }, - - // Determine the position of an element within - // the matched set of elements - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.unique( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter(selector) - ); - } -}); - -function sibling( cur, dir ) { - while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each({ - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return jQuery.dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, i, until ) { - return jQuery.dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return jQuery.dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return jQuery.dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, i, until ) { - return jQuery.dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, i, until ) { - return jQuery.dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return jQuery.sibling( elem.firstChild ); - }, - contents: function( elem ) { - return elem.contentDocument || jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.unique( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -}); -var rnotwhite = (/\S+/g); - - - -// String to Object options format cache -var optionsCache = {}; - -// Convert String-formatted options into Object-formatted ones and store in cache -function createOptions( options ) { - var object = optionsCache[ options ] = {}; - jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { - object[ flag ] = true; - }); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - ( optionsCache[ options ] || createOptions( options ) ) : - jQuery.extend( {}, options ); - - var // Last fire value (for non-forgettable lists) - memory, - // Flag to know if list was already fired - fired, - // Flag to know if list is currently firing - firing, - // First callback to fire (used internally by add and fireWith) - firingStart, - // End of the loop when firing - firingLength, - // Index of currently firing callback (modified by remove if needed) - firingIndex, - // Actual callback list - list = [], - // Stack of fire calls for repeatable lists - stack = !options.once && [], - // Fire callbacks - fire = function( data ) { - memory = options.memory && data; - fired = true; - firingIndex = firingStart || 0; - firingStart = 0; - firingLength = list.length; - firing = true; - for ( ; list && firingIndex < firingLength; firingIndex++ ) { - if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) { - memory = false; // To prevent further calls using add - break; - } - } - firing = false; - if ( list ) { - if ( stack ) { - if ( stack.length ) { - fire( stack.shift() ); - } - } else if ( memory ) { - list = []; - } else { - self.disable(); - } - } - }, - // Actual Callbacks object - self = { - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - // First, we save the current length - var start = list.length; - (function add( args ) { - jQuery.each( args, function( _, arg ) { - var type = jQuery.type( arg ); - if ( type === "function" ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && type !== "string" ) { - // Inspect recursively - add( arg ); - } - }); - })( arguments ); - // Do we need to add the callbacks to the - // current firing batch? - if ( firing ) { - firingLength = list.length; - // With memory, if we're not firing then - // we should call right away - } else if ( memory ) { - firingStart = start; - fire( memory ); - } - } - return this; - }, - // Remove a callback from the list - remove: function() { - if ( list ) { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - // Handle firing indexes - if ( firing ) { - if ( index <= firingLength ) { - firingLength--; - } - if ( index <= firingIndex ) { - firingIndex--; - } - } - } - }); - } - return this; - }, - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length ); - }, - // Remove all callbacks from the list - empty: function() { - list = []; - firingLength = 0; - return this; - }, - // Have the list do nothing anymore - disable: function() { - list = stack = memory = undefined; - return this; - }, - // Is it disabled? - disabled: function() { - return !list; - }, - // Lock the list in its current state - lock: function() { - stack = undefined; - if ( !memory ) { - self.disable(); - } - return this; - }, - // Is it locked? - locked: function() { - return !stack; - }, - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( list && ( !fired || stack ) ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - if ( firing ) { - stack.push( args ); - } else { - fire( args ); - } - } - return this; - }, - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -jQuery.extend({ - - Deferred: function( func ) { - var tuples = [ - // action, add listener, listener list, final state - [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ], - [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ], - [ "notify", "progress", jQuery.Callbacks("memory") ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - then: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - return jQuery.Deferred(function( newDefer ) { - jQuery.each( tuples, function( i, tuple ) { - var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; - // deferred[ done | fail | progress ] for forwarding actions to newDefer - deferred[ tuple[1] ](function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && jQuery.isFunction( returned.promise ) ) { - returned.promise() - .done( newDefer.resolve ) - .fail( newDefer.reject ) - .progress( newDefer.notify ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments ); - } - }); - }); - fns = null; - }).promise(); - }, - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Keep pipe for back-compat - promise.pipe = promise.then; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 3 ]; - - // promise[ done | fail | progress ] = list.add - promise[ tuple[1] ] = list.add; - - // Handle state - if ( stateString ) { - list.add(function() { - // state = [ resolved | rejected ] - state = stateString; - - // [ reject_list | resolve_list ].disable; progress_list.lock - }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); - } - - // deferred[ resolve | reject | notify ] - deferred[ tuple[0] ] = function() { - deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments ); - return this; - }; - deferred[ tuple[0] + "With" ] = list.fireWith; - }); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( subordinate /* , ..., subordinateN */ ) { - var i = 0, - resolveValues = slice.call( arguments ), - length = resolveValues.length, - - // the count of uncompleted subordinates - remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, - - // the master Deferred. If resolveValues consist of only a single Deferred, just use that. - deferred = remaining === 1 ? subordinate : jQuery.Deferred(), - - // Update function for both resolve and progress values - updateFunc = function( i, contexts, values ) { - return function( value ) { - contexts[ i ] = this; - values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( values === progressValues ) { - deferred.notifyWith( contexts, values ); - } else if ( !( --remaining ) ) { - deferred.resolveWith( contexts, values ); - } - }; - }, - - progressValues, progressContexts, resolveContexts; - - // add listeners to Deferred subordinates; treat others as resolved - if ( length > 1 ) { - progressValues = new Array( length ); - progressContexts = new Array( length ); - resolveContexts = new Array( length ); - for ( ; i < length; i++ ) { - if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { - resolveValues[ i ].promise() - .done( updateFunc( i, resolveContexts, resolveValues ) ) - .fail( deferred.reject ) - .progress( updateFunc( i, progressContexts, progressValues ) ); - } else { - --remaining; - } - } - } - - // if we're not waiting on anything, resolve the master - if ( !remaining ) { - deferred.resolveWith( resolveContexts, resolveValues ); - } - - return deferred.promise(); - } -}); - - -// The deferred used on DOM ready -var readyList; - -jQuery.fn.ready = function( fn ) { - // Add the callback - jQuery.ready.promise().done( fn ); - - return this; -}; - -jQuery.extend({ - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Hold (or release) the ready event - holdReady: function( hold ) { - if ( hold ) { - jQuery.readyWait++; - } else { - jQuery.ready( true ); - } - }, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - - // Trigger any bound ready events - if ( jQuery.fn.trigger ) { - jQuery( document ).trigger("ready").off("ready"); - } - } -}); - -/** - * The ready event handler and self cleanup method - */ -function completed() { - document.removeEventListener( "DOMContentLoaded", completed, false ); - window.removeEventListener( "load", completed, false ); - jQuery.ready(); -} - -jQuery.ready.promise = function( obj ) { - if ( !readyList ) { - - readyList = jQuery.Deferred(); - - // Catch cases where $(document).ready() is called after the browser event has already occurred. - // we once tried to use readyState "interactive" here, but it caused issues like the one - // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15 - if ( document.readyState === "complete" ) { - // Handle it asynchronously to allow scripts the opportunity to delay ready - setTimeout( jQuery.ready ); - - } else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed, false ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed, false ); - } - } - return readyList.promise( obj ); -}; - -// Kick off the DOM ready check even if the user does not -jQuery.ready.promise(); - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( jQuery.type( key ) === "object" ) { - chainable = true; - for ( i in key ) { - jQuery.access( elems, fn, i, key[i], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !jQuery.isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) ); - } - } - } - - return chainable ? - elems : - - // Gets - bulk ? - fn.call( elems ) : - len ? fn( elems[0], key ) : emptyGet; -}; - - -/** - * Determines whether an object can have data - */ -jQuery.acceptData = function( owner ) { - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - /* jshint -W018 */ - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - -function Data() { - // Support: Android < 4, - // Old WebKit does not have Object.preventExtensions/freeze method, - // return new empty object instead with no [[set]] accessor - Object.defineProperty( this.cache = {}, 0, { - get: function() { - return {}; - } - }); - - this.expando = jQuery.expando + Math.random(); -} - -Data.uid = 1; -Data.accepts = jQuery.acceptData; - -Data.prototype = { - key: function( owner ) { - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return the key for a frozen object. - if ( !Data.accepts( owner ) ) { - return 0; - } - - var descriptor = {}, - // Check if the owner object already has a cache key - unlock = owner[ this.expando ]; - - // If not, create one - if ( !unlock ) { - unlock = Data.uid++; - - // Secure it in a non-enumerable, non-writable property - try { - descriptor[ this.expando ] = { value: unlock }; - Object.defineProperties( owner, descriptor ); - - // Support: Android < 4 - // Fallback to a less secure definition - } catch ( e ) { - descriptor[ this.expando ] = unlock; - jQuery.extend( owner, descriptor ); - } - } - - // Ensure the cache object - if ( !this.cache[ unlock ] ) { - this.cache[ unlock ] = {}; - } - - return unlock; - }, - set: function( owner, data, value ) { - var prop, - // There may be an unlock assigned to this node, - // if there is no entry for this "owner", create one inline - // and set the unlock as though an owner entry had always existed - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - // Handle: [ owner, key, value ] args - if ( typeof data === "string" ) { - cache[ data ] = value; - - // Handle: [ owner, { properties } ] args - } else { - // Fresh assignments by object are shallow copied - if ( jQuery.isEmptyObject( cache ) ) { - jQuery.extend( this.cache[ unlock ], data ); - // Otherwise, copy the properties one-by-one to the cache object - } else { - for ( prop in data ) { - cache[ prop ] = data[ prop ]; - } - } - } - return cache; - }, - get: function( owner, key ) { - // Either a valid cache is found, or will be created. - // New caches will be created and the unlock returned, - // allowing direct access to the newly created - // empty data object. A valid owner object must be provided. - var cache = this.cache[ this.key( owner ) ]; - - return key === undefined ? - cache : cache[ key ]; - }, - access: function( owner, key, value ) { - var stored; - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ((key && typeof key === "string") && value === undefined) ) { - - stored = this.get( owner, key ); - - return stored !== undefined ? - stored : this.get( owner, jQuery.camelCase(key) ); - } - - // [*]When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, name, camel, - unlock = this.key( owner ), - cache = this.cache[ unlock ]; - - if ( key === undefined ) { - this.cache[ unlock ] = {}; - - } else { - // Support array or space separated string of keys - if ( jQuery.isArray( key ) ) { - // If "name" is an array of keys... - // When data is initially created, via ("key", "val") signature, - // keys will be converted to camelCase. - // Since there is no way to tell _how_ a key was added, remove - // both plain key and camelCase key. #12786 - // This will only penalize the array argument path. - name = key.concat( key.map( jQuery.camelCase ) ); - } else { - camel = jQuery.camelCase( key ); - // Try the string as a key before any manipulation - if ( key in cache ) { - name = [ key, camel ]; - } else { - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - name = camel; - name = name in cache ? - [ name ] : ( name.match( rnotwhite ) || [] ); - } - } - - i = name.length; - while ( i-- ) { - delete cache[ name[ i ] ]; - } - } - }, - hasData: function( owner ) { - return !jQuery.isEmptyObject( - this.cache[ owner[ this.expando ] ] || {} - ); - }, - discard: function( owner ) { - if ( owner[ this.expando ] ) { - delete this.cache[ owner[ this.expando ] ]; - } - } -}; -var data_priv = new Data(); - -var data_user = new Data(); - - - -/* - Implementation Summary - - 1. Enforce API surface and semantic compatibility with 1.9.x branch - 2. Improve the module's maintainability by reducing the storage - paths to a single mechanism. - 3. Use the same single mechanism to support "private" and "user" data. - 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) - 5. Avoid exposing implementation details on user objects (eg. expando properties) - 6. Provide a clear path for implementation upgrade to WeakMap in 2014 -*/ -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /([A-Z])/g; - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = data === "true" ? true : - data === "false" ? false : - data === "null" ? null : - // Only convert to a number if it doesn't change the string - +data + "" === data ? +data : - rbrace.test( data ) ? jQuery.parseJSON( data ) : - data; - } catch( e ) {} - - // Make sure we set the data so it isn't changed later - data_user.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend({ - hasData: function( elem ) { - return data_user.hasData( elem ) || data_priv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return data_user.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - data_user.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to data_priv methods, these can be deprecated. - _data: function( elem, name, data ) { - return data_priv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - data_priv.remove( elem, name ); - } -}); - -jQuery.fn.extend({ - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = data_user.get( elem ); - - if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - name = attrs[ i ].name; - - if ( name.indexOf( "data-" ) === 0 ) { - name = jQuery.camelCase( name.slice(5) ); - dataAttr( elem, name, data[ name ] ); - } - } - data_priv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each(function() { - data_user.set( this, key ); - }); - } - - return access( this, function( value ) { - var data, - camelKey = jQuery.camelCase( key ); - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - // Attempt to get data from the cache - // with the key as-is - data = data_user.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to get data from the cache - // with the key camelized - data = data_user.get( elem, camelKey ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, camelKey, undefined ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each(function() { - // First, attempt to store a copy or reference of any - // data that might've been store with a camelCased key. - var data = data_user.get( this, camelKey ); - - // For HTML5 data-* attribute interop, we have to - // store property names with dashes in a camelCase form. - // This might not apply to all properties...* - data_user.set( this, camelKey, value ); - - // *... In the case of properties that might _actually_ - // have dashes, we need to also store a copy of that - // unchanged property. - if ( key.indexOf("-") !== -1 && data !== undefined ) { - data_user.set( this, key, value ); - } - }); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each(function() { - data_user.remove( this, key ); - }); - } -}); - - -jQuery.extend({ - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = data_priv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || jQuery.isArray( data ) ) { - queue = data_priv.access( elem, type, jQuery.makeArray(data) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // not intended for public consumption - generates a queueHooks object, or returns the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return data_priv.get( elem, key ) || data_priv.access( elem, key, { - empty: jQuery.Callbacks("once memory").add(function() { - data_priv.remove( elem, [ type + "queue", key ] ); - }) - }); - } -}); - -jQuery.fn.extend({ - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[0], type ); - } - - return data === undefined ? - this : - this.each(function() { - var queue = jQuery.queue( this, type, data ); - - // ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[0] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - }); - }, - dequeue: function( type ) { - return this.each(function() { - jQuery.dequeue( this, type ); - }); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = data_priv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -}); -var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source; - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var isHidden = function( elem, el ) { - // isHidden might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem ); - }; - -var rcheckableType = (/^(?:checkbox|radio)$/i); - - - -(function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ); - - // #11217 - WebKit loses check when the name is after the checked attribute - div.innerHTML = ""; - - // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 - // old WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Make sure textarea (and checkbox) defaultValue is properly cloned - // Support: IE9-IE11+ - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; -})(); -var strundefined = typeof undefined; - - - -support.focusinBubbles = "onfocusin" in window; - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|contextmenu)|click/, - rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)$/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.get( elem ); - - // Don't attach events to noData or text/comment nodes (but allow plain objects) - if ( !elemData ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !(events = elemData.events) ) { - events = elemData.events = {}; - } - if ( !(eventHandle = elemData.handle) ) { - eventHandle = elemData.handle = function( e ) { - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend({ - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join(".") - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !(handlers = events[ type ]) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle, false ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = data_priv.hasData( elem ) && data_priv.get( elem ); - - if ( !elemData || !(events = elemData.events) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnotwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[t] ) || []; - type = origType = tmp[1]; - namespaces = ( tmp[2] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - delete elemData.handle; - data_priv.remove( elem, "events" ); - } - }, - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : []; - - cur = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf(".") >= 0 ) { - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split("."); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf(":") < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join("."); - event.namespace_re = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === (elem.ownerDocument || document) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) { - - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && jQuery.acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) && - jQuery.acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - elem[ type ](); - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - dispatch: function( event ) { - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( event ); - - var i, j, ret, matched, handleObj, - handlerQueue = [], - args = slice.call( arguments ), - handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[0] = event; - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) { - - // Triggered event must either 1) have no namespace, or - // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace). - if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler ) - .apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( (event.result = ret) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, matches, sel, handleObj, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - // Black-hole SVG instance trees (#13180) - // Avoid non-left-click bubbling in Firefox (#3861) - if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.disabled !== true || event.type !== "click" ) { - matches = []; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matches[ sel ] === undefined ) { - matches[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) >= 0 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matches[ sel ] ) { - matches.push( handleObj ); - } - } - if ( matches.length ) { - handlerQueue.push({ elem: cur, handlers: matches }); - } - } - } - } - - // Add the remaining (directly-bound) handlers - if ( delegateCount < handlers.length ) { - handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) }); - } - - return handlerQueue; - }, - - // Includes some event props shared by KeyEvent and MouseEvent - props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "), - - fixHooks: {}, - - keyHooks: { - props: "char charCode key keyCode".split(" "), - filter: function( event, original ) { - - // Add which for key events - if ( event.which == null ) { - event.which = original.charCode != null ? original.charCode : original.keyCode; - } - - return event; - } - }, - - mouseHooks: { - props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "), - filter: function( event, original ) { - var eventDoc, doc, body, - button = original.button; - - // Calculate pageX/Y if missing and clientX/Y available - if ( event.pageX == null && original.clientX != null ) { - eventDoc = event.target.ownerDocument || document; - doc = eventDoc.documentElement; - body = eventDoc.body; - - event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 ); - event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 ); - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - // Note: button is not normalized, so don't use it - if ( !event.which && button !== undefined ) { - event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); - } - - return event; - } - }, - - fix: function( event ) { - if ( event[ jQuery.expando ] ) { - return event; - } - - // Create a writable copy of the event object and normalize some properties - var i, prop, copy, - type = event.type, - originalEvent = event, - fixHook = this.fixHooks[ type ]; - - if ( !fixHook ) { - this.fixHooks[ type ] = fixHook = - rmouseEvent.test( type ) ? this.mouseHooks : - rkeyEvent.test( type ) ? this.keyHooks : - {}; - } - copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; - - event = new jQuery.Event( originalEvent ); - - i = copy.length; - while ( i-- ) { - prop = copy[ i ]; - event[ prop ] = originalEvent[ prop ]; - } - - // Support: Cordova 2.5 (WebKit) (#13255) - // All events should have a target; Cordova deviceready doesn't - if ( !event.target ) { - event.target = document; - } - - // Support: Safari 6.0+, Chrome < 28 - // Target should not be a text node (#504, #13143) - if ( event.target.nodeType === 3 ) { - event.target = event.target.parentNode; - } - - return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; - }, - - special: { - load: { - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - focus: { - // Fire native event if possible so blur/focus sequence is correct - trigger: function() { - if ( this !== safeActiveElement() && this.focus ) { - this.focus(); - return false; - } - }, - delegateType: "focusin" - }, - blur: { - trigger: function() { - if ( this === safeActiveElement() && this.blur ) { - this.blur(); - return false; - } - }, - delegateType: "focusout" - }, - click: { - // For checkbox, fire native event so checked state will be right - trigger: function() { - if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) { - this.click(); - return false; - } - }, - - // For cross-browser consistency, don't fire native .click() on links - _default: function( event ) { - return jQuery.nodeName( event.target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined ) { - event.originalEvent.returnValue = event.result; - } - } - } - }, - - simulate: function( type, elem, event, bubble ) { - // Piggyback on a donor event to simulate a different one. - // Fake originalEvent to avoid donor's stopPropagation, but if the - // simulated event prevents default then we do the same on the donor. - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true, - originalEvent: {} - } - ); - if ( bubble ) { - jQuery.event.trigger( e, null, elem ); - } else { - jQuery.event.dispatch.call( elem, e ); - } - if ( e.isDefaultPrevented() ) { - event.preventDefault(); - } - } -}; - -jQuery.removeEvent = function( elem, type, handle ) { - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle, false ); - } -}; - -jQuery.Event = function( src, props ) { - // Allow instantiation without the 'new' keyword - if ( !(this instanceof jQuery.Event) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - // Support: Android < 4.0 - src.defaultPrevented === undefined && - src.getPreventDefault && src.getPreventDefault() ? - returnTrue : - returnFalse; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || jQuery.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && e.preventDefault ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && e.stopPropagation ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - this.isImmediatePropagationStopped = returnTrue; - this.stopPropagation(); - } -}; - -// Create mouseenter/leave events using mouseover/out and event-time checks -// Support: Chrome 15+ -jQuery.each({ - mouseenter: "mouseover", - mouseleave: "mouseout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mousenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || (related !== target && !jQuery.contains( target, related )) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -}); - -// Create "bubbling" focus and blur events -// Support: Firefox, Chrome, Safari -if ( !support.focusinBubbles ) { - jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - var doc = this.ownerDocument || this, - attaches = data_priv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - data_priv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this, - attaches = data_priv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - data_priv.remove( doc, fix ); - - } else { - data_priv.access( doc, fix, attaches ); - } - } - }; - }); -} - -jQuery.fn.extend({ - - on: function( types, selector, data, fn, /*INTERNAL*/ one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - this.on( type, selector, data, types[ type ], one ); - } - return this; - } - - if ( data == null && fn == null ) { - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return this; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return this.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - }); - }, - one: function( types, selector, data, fn ) { - return this.on( types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each(function() { - jQuery.event.remove( this, types, fn, selector ); - }); - }, - - trigger: function( type, data ) { - return this.each(function() { - jQuery.event.trigger( type, data, this ); - }); - }, - triggerHandler: function( type, data ) { - var elem = this[0]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -}); - - -var - rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - rtagName = /<([\w:]+)/, - rhtml = /<|&#?\w+;/, - rnoInnerhtml = /<(?:script|style|link)/i, - // checked="checked" or checked - rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, - rscriptType = /^$|\/(?:java|ecma)script/i, - rscriptTypeMasked = /^true\/(.*)/, - rcleanScript = /^\s*\s*$/g, - - // We have to close these tags to support XHTML (#13200) - wrapMap = { - - // Support: IE 9 - option: [ 1, "" ], - - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] - }; - -// Support: IE 9 -wrapMap.optgroup = wrapMap.option; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: 1.x compatibility -// Manipulating tables requires a tbody -function manipulationTarget( elem, content ) { - return jQuery.nodeName( elem, "table" ) && - jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? - - elem.getElementsByTagName("tbody")[0] || - elem.appendChild( elem.ownerDocument.createElement("tbody") ) : - elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - var match = rscriptTypeMasked.exec( elem.type ); - - if ( match ) { - elem.type = match[ 1 ]; - } else { - elem.removeAttribute("type"); - } - - return elem; -} - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - data_priv.set( - elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" ) - ); - } -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( data_priv.hasData( src ) ) { - pdataOld = data_priv.access( src ); - pdataCur = data_priv.set( dest, pdataOld ); - events = pdataOld.events; - - if ( events ) { - delete pdataCur.handle; - pdataCur.events = {}; - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( data_user.hasData( src ) ) { - udataOld = data_user.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - data_user.set( dest, udataCur ); - } -} - -function getAll( context, tag ) { - var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) : - context.querySelectorAll ? context.querySelectorAll( tag || "*" ) : - []; - - return tag === undefined || tag && jQuery.nodeName( context, tag ) ? - jQuery.merge( [ context ], ret ) : - ret; -} - -// Support: IE >= 9 -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -jQuery.extend({ - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = jQuery.contains( elem.ownerDocument, elem ); - - // Support: IE >= 9 - // Fix Cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - buildFragment: function( elems, context, scripts, selection ) { - var elem, tmp, tag, wrap, contains, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( jQuery.type( elem ) === "object" ) { - // Support: QtWebKit - // jQuery.merge because push.apply(_, arraylike) throws - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement("div") ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1>" ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: QtWebKit - // jQuery.merge because push.apply(_, arraylike) throws - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Fixes #12346 - // Support: Webkit, IE - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( (elem = nodes[ i++ ]) ) { - - // #4087 - If origin and destination elements are the same, and this is - // that element, do not do anything - if ( selection && jQuery.inArray( elem, selection ) !== -1 ) { - continue; - } - - contains = jQuery.contains( elem.ownerDocument, elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( contains ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( (elem = tmp[ j++ ]) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; - }, - - cleanData: function( elems ) { - var data, elem, events, type, key, j, - special = jQuery.event.special, - i = 0; - - for ( ; (elem = elems[ i ]) !== undefined; i++ ) { - if ( jQuery.acceptData( elem ) ) { - key = elem[ data_priv.expando ]; - - if ( key && (data = data_priv.cache[ key ]) ) { - events = Object.keys( data.events || {} ); - if ( events.length ) { - for ( j = 0; (type = events[j]) !== undefined; j++ ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - if ( data_priv.cache[ key ] ) { - // Discard any remaining `private` data - delete data_priv.cache[ key ]; - } - } - } - // Discard any remaining `user` data - delete data_user.cache[ elem[ data_user.expando ] ]; - } - } -}); - -jQuery.fn.extend({ - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each(function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - }); - }, null, value, arguments.length ); - }, - - append: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - }); - }, - - prepend: function() { - return this.domManip( arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - }); - }, - - before: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - }); - }, - - after: function() { - return this.domManip( arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - }); - }, - - remove: function( selector, keepData /* Internal Use Only */ ) { - var elem, - elems = selector ? jQuery.filter( selector, this ) : this, - i = 0; - - for ( ; (elem = elems[i]) != null; i++ ) { - if ( !keepData && elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem ) ); - } - - if ( elem.parentNode ) { - if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) { - setGlobalEval( getAll( elem, "script" ) ); - } - elem.parentNode.removeChild( elem ); - } - } - - return this; - }, - - empty: function() { - var elem, - i = 0; - - for ( ; (elem = this[i]) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map(function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - }); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = value.replace( rxhtmlTag, "<$1>" ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var arg = arguments[ 0 ]; - - // Make the changes, replacing each context element with the new content - this.domManip( arguments, function( elem ) { - arg = this.parentNode; - - jQuery.cleanData( getAll( this ) ); - - if ( arg ) { - arg.replaceChild( elem, this ); - } - }); - - // Force removal if there was no new content (e.g., from empty arguments) - return arg && (arg.length || arg.nodeType) ? this : this.remove(); - }, - - detach: function( selector ) { - return this.remove( selector, true ); - }, - - domManip: function( args, callback ) { - - // Flatten any nested arrays - args = concat.apply( [], args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = this.length, - set = this, - iNoClone = l - 1, - value = args[ 0 ], - isFunction = jQuery.isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( isFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return this.each(function( index ) { - var self = set.eq( index ); - if ( isFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - self.domManip( args, callback ); - }); - } - - if ( l ) { - fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - if ( first ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - // Support: QtWebKit - // jQuery.merge because push.apply(_, arraylike) throws - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( this[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) { - - if ( node.src ) { - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl ) { - jQuery._evalUrl( node.src ); - } - } else { - jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) ); - } - } - } - } - } - } - - return this; - } -}); - -jQuery.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: QtWebKit - // .get() because push.apply(_, arraylike) throws - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -}); - - -var iframe, - elemdisplay = {}; - -/** - * Retrieve the actual display of a element - * @param {String} name nodeName of the element - * @param {Object} doc Document object - */ -// Called only from within defaultDisplay -function actualDisplay( name, doc ) { - var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), - - // getDefaultComputedStyle might be reliably used only on attached element - display = window.getDefaultComputedStyle ? - - // Use of this method is a temporary fix (more like optmization) until something better comes along, - // since it was removed from specification and supported only in FF - window.getDefaultComputedStyle( elem[ 0 ] ).display : jQuery.css( elem[ 0 ], "display" ); - - // We don't have any data stored on the element, - // so use "detach" method as fast way to get rid of the element - elem.detach(); - - return display; -} - -/** - * Try to determine the default display value of an element - * @param {String} nodeName - */ -function defaultDisplay( nodeName ) { - var doc = document, - display = elemdisplay[ nodeName ]; - - if ( !display ) { - display = actualDisplay( nodeName, doc ); - - // If the simple way fails, read from inside an iframe - if ( display === "none" || !display ) { - - // Use the already-created iframe if possible - iframe = (iframe || jQuery( "